ssl.c 1.0 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #if defined(OPENSSL_EXTRA) && !defined(_WIN32)
  26. /* turn on GNU extensions for XISASCII */
  27. #undef _GNU_SOURCE
  28. #define _GNU_SOURCE
  29. #endif
  30. #if !defined(WOLFCRYPT_ONLY) || defined(OPENSSL_EXTRA) || \
  31. defined(OPENSSL_EXTRA_X509_SMALL)
  32. #include <wolfssl/internal.h>
  33. #include <wolfssl/error-ssl.h>
  34. #include <wolfssl/wolfcrypt/coding.h>
  35. #include <wolfssl/wolfcrypt/kdf.h>
  36. #ifdef NO_INLINE
  37. #include <wolfssl/wolfcrypt/misc.h>
  38. #else
  39. #define WOLFSSL_MISC_INCLUDED
  40. #include <wolfcrypt/src/misc.c>
  41. #endif
  42. #ifdef HAVE_ERRNO_H
  43. #include <errno.h>
  44. #endif
  45. #if !defined(WOLFSSL_ALLOW_NO_SUITES) && !defined(WOLFCRYPT_ONLY)
  46. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
  47. && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \
  48. && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  49. #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README"
  50. #endif
  51. #ifdef WOLFSSL_CERT_GEN
  52. /* need access to Cert struct for creating certificate */
  53. #include <wolfssl/wolfcrypt/asn_public.h>
  54. #endif
  55. #endif
  56. #if !defined(WOLFCRYPT_ONLY) && (defined(OPENSSL_EXTRA) \
  57. || defined(OPENSSL_EXTRA_X509_SMALL) \
  58. || defined(HAVE_WEBSERVER) || defined(WOLFSSL_KEY_GEN))
  59. #include <wolfssl/openssl/evp.h>
  60. /* openssl headers end, wolfssl internal headers next */
  61. #endif
  62. #include <wolfssl/wolfcrypt/wc_encrypt.h>
  63. #ifndef NO_RSA
  64. #include <wolfssl/wolfcrypt/rsa.h>
  65. #endif
  66. #ifdef OPENSSL_EXTRA
  67. /* openssl headers begin */
  68. #include <wolfssl/openssl/ssl.h>
  69. #include <wolfssl/openssl/aes.h>
  70. #ifndef WOLFCRYPT_ONLY
  71. #include <wolfssl/openssl/hmac.h>
  72. #include <wolfssl/openssl/cmac.h>
  73. #endif
  74. #include <wolfssl/openssl/crypto.h>
  75. #include <wolfssl/openssl/des.h>
  76. #include <wolfssl/openssl/bn.h>
  77. #include <wolfssl/openssl/buffer.h>
  78. #include <wolfssl/openssl/dh.h>
  79. #include <wolfssl/openssl/rsa.h>
  80. #include <wolfssl/openssl/fips_rand.h>
  81. #include <wolfssl/openssl/pem.h>
  82. #include <wolfssl/openssl/ec.h>
  83. #include <wolfssl/openssl/ec25519.h>
  84. #include <wolfssl/openssl/ed25519.h>
  85. #include <wolfssl/openssl/ec448.h>
  86. #include <wolfssl/openssl/ed448.h>
  87. #include <wolfssl/openssl/ecdsa.h>
  88. #include <wolfssl/openssl/ecdh.h>
  89. #include <wolfssl/openssl/err.h>
  90. #include <wolfssl/openssl/modes.h>
  91. #include <wolfssl/openssl/opensslv.h>
  92. #include <wolfssl/openssl/rc4.h>
  93. #include <wolfssl/openssl/stack.h>
  94. #include <wolfssl/openssl/x509_vfy.h>
  95. /* openssl headers end, wolfssl internal headers next */
  96. #include <wolfssl/wolfcrypt/hmac.h>
  97. #include <wolfssl/wolfcrypt/random.h>
  98. #include <wolfssl/wolfcrypt/des3.h>
  99. #include <wolfssl/wolfcrypt/ecc.h>
  100. #include <wolfssl/wolfcrypt/md4.h>
  101. #include <wolfssl/wolfcrypt/md5.h>
  102. #include <wolfssl/wolfcrypt/arc4.h>
  103. #include <wolfssl/wolfcrypt/curve25519.h>
  104. #include <wolfssl/wolfcrypt/ed25519.h>
  105. #include <wolfssl/wolfcrypt/curve448.h>
  106. #if defined(HAVE_PQC)
  107. #if defined(HAVE_FALCON)
  108. #include <wolfssl/wolfcrypt/falcon.h>
  109. #endif /* HAVE_FALCON */
  110. #if defined(HAVE_DILITHIUM)
  111. #include <wolfssl/wolfcrypt/dilithium.h>
  112. #endif /* HAVE_DILITHIUM */
  113. #endif /* HAVE_PQC */
  114. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  115. #ifdef HAVE_OCSP
  116. #include <wolfssl/openssl/ocsp.h>
  117. #endif
  118. #include <wolfssl/openssl/lhash.h>
  119. #include <wolfssl/openssl/txt_db.h>
  120. #endif /* WITH_STUNNEL */
  121. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  122. #include <wolfssl/wolfcrypt/sha512.h>
  123. #endif
  124. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  125. && !defined(WC_NO_RNG)
  126. #include <wolfssl/wolfcrypt/srp.h>
  127. #endif
  128. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  129. #include <wolfssl/wolfcrypt/pkcs7.h>
  130. #endif
  131. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  132. #include <wolfssl/openssl/pkcs7.h>
  133. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  134. #endif
  135. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  136. #include <wolfssl/openssl/x509v3.h>
  137. int wolfssl_bn_get_value(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  138. int wolfssl_bn_set_value(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  139. #endif
  140. #if defined(WOLFSSL_QT)
  141. #include <wolfssl/wolfcrypt/sha.h>
  142. #endif
  143. #ifdef NO_ASN
  144. #include <wolfssl/wolfcrypt/dh.h>
  145. #endif
  146. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  147. #ifdef WOLFSSL_SYS_CA_CERTS
  148. #ifdef _WIN32
  149. #include <windows.h>
  150. #include <wincrypt.h>
  151. /* mingw gcc does not support pragma comment, and the
  152. * linking with crypt32 is handled in configure.ac */
  153. #if !defined(__MINGW32__) && !defined(__MINGW64__)
  154. #pragma comment(lib, "crypt32")
  155. #endif
  156. #endif
  157. #if defined(__APPLE__) && defined(HAVE_SECURITY_SECTRUSTSETTINGS_H)
  158. #include <Security/SecTrustSettings.h>
  159. #endif
  160. #endif /* WOLFSSL_SYS_CA_CERTS */
  161. /*
  162. * OPENSSL_COMPATIBLE_DEFAULTS:
  163. * Enable default behaviour that is compatible with OpenSSL. For example
  164. * SSL_CTX by default doesn't verify the loaded certs. Enabling this
  165. * should make porting to new projects easier.
  166. * WOLFSSL_CHECK_ALERT_ON_ERR:
  167. * Check for alerts during the handshake in the event of an error.
  168. * NO_SESSION_CACHE_REF:
  169. * wolfSSL_get_session on a client will return a reference to the internal
  170. * ClientCache by default for backwards compatibility. This define will
  171. * make wolfSSL_get_session return a reference to ssl->session. The returned
  172. * pointer will be freed with the related WOLFSSL object.
  173. * SESSION_CACHE_DYNAMIC_MEM:
  174. * Dynamically allocate sessions for the session cache from the heap, as
  175. * opposed to the default which allocates from the stack. Allocates
  176. * memory only when a session is added to the cache, frees memory after the
  177. * session is no longer being used. Recommended for memory-constrained
  178. * systems.
  179. * WOLFSSL_SYS_CA_CERTS
  180. * Enables ability to load system CA certs from the OS via
  181. * wolfSSL_CTX_load_system_CA_certs.
  182. */
  183. #define WOLFSSL_SSL_MISC_INCLUDED
  184. #include "src/ssl_misc.c"
  185. #define WOLFSSL_EVP_INCLUDED
  186. #include "wolfcrypt/src/evp.c"
  187. /* Crypto code uses EVP APIs. */
  188. #define WOLFSSL_SSL_CRYPTO_INCLUDED
  189. #include "src/ssl_crypto.c"
  190. #ifndef WOLFCRYPT_ONLY
  191. #define WOLFSSL_SSL_CERTMAN_INCLUDED
  192. #include "src/ssl_certman.c"
  193. #endif
  194. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  195. !defined(WOLFCRYPT_ONLY)
  196. /* Convert shortname to NID.
  197. *
  198. * For OpenSSL compatibility.
  199. *
  200. * This function shouldn't exist!
  201. * Uses defines in wolfssl/openssl/evp.h.
  202. * Uses EccEnumToNID which uses defines in wolfssl/openssl/ec.h.
  203. *
  204. * @param [in] sn Short name of OID.
  205. * @return NID corresponding to shortname on success.
  206. * @return NID_undef when not recognized.
  207. */
  208. int wc_OBJ_sn2nid(const char *sn)
  209. {
  210. const struct {
  211. const char *sn;
  212. int nid;
  213. } sn2nid[] = {
  214. #ifndef NO_CERTS
  215. {WOLFSSL_COMMON_NAME, NID_commonName},
  216. {WOLFSSL_COUNTRY_NAME, NID_countryName},
  217. {WOLFSSL_LOCALITY_NAME, NID_localityName},
  218. {WOLFSSL_STATE_NAME, NID_stateOrProvinceName},
  219. {WOLFSSL_ORG_NAME, NID_organizationName},
  220. {WOLFSSL_ORGUNIT_NAME, NID_organizationalUnitName},
  221. #ifdef WOLFSSL_CERT_NAME_ALL
  222. {WOLFSSL_NAME, NID_name},
  223. {WOLFSSL_INITIALS, NID_initials},
  224. {WOLFSSL_GIVEN_NAME, NID_givenName},
  225. {WOLFSSL_DNQUALIFIER, NID_dnQualifier},
  226. #endif
  227. {WOLFSSL_EMAIL_ADDR, NID_emailAddress},
  228. #endif
  229. {"SHA1", NID_sha1},
  230. {NULL, -1}};
  231. int i;
  232. #ifdef HAVE_ECC
  233. char curveName[ECC_MAXNAME + 1];
  234. int eccEnum;
  235. #endif
  236. WOLFSSL_ENTER("wc_OBJ_sn2nid");
  237. for(i=0; sn2nid[i].sn != NULL; i++) {
  238. if (XSTRCMP(sn, sn2nid[i].sn) == 0) {
  239. return sn2nid[i].nid;
  240. }
  241. }
  242. #ifdef HAVE_ECC
  243. if (XSTRLEN(sn) > ECC_MAXNAME)
  244. return NID_undef;
  245. /* Nginx uses this OpenSSL string. */
  246. if (XSTRCMP(sn, "prime256v1") == 0)
  247. sn = "SECP256R1";
  248. /* OpenSSL allows lowercase curve names */
  249. for (i = 0; i < (int)(sizeof(curveName) - 1) && *sn; i++) {
  250. curveName[i] = (char)XTOUPPER((unsigned char) *sn++);
  251. }
  252. curveName[i] = '\0';
  253. /* find based on name and return NID */
  254. for (i = 0;
  255. #ifndef WOLFSSL_ECC_CURVE_STATIC
  256. ecc_sets[i].size != 0 && ecc_sets[i].name != NULL;
  257. #else
  258. ecc_sets[i].size != 0;
  259. #endif
  260. i++) {
  261. if (XSTRCMP(curveName, ecc_sets[i].name) == 0) {
  262. eccEnum = ecc_sets[i].id;
  263. /* Convert enum value in ecc_curve_id to OpenSSL NID */
  264. return EccEnumToNID(eccEnum);
  265. }
  266. }
  267. #endif /* HAVE_ECC */
  268. return NID_undef;
  269. }
  270. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  271. #ifndef WOLFCRYPT_ONLY
  272. #if !defined(NO_RSA) || !defined(NO_DH) || defined(HAVE_ECC) || \
  273. (defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && !defined(NO_DSA))
  274. #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */
  275. static WC_RNG globalRNG;
  276. static int initGlobalRNG = 0;
  277. static WC_MAYBE_UNUSED wolfSSL_Mutex globalRNGMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(globalRNGMutex);
  278. #ifndef WOLFSSL_MUTEX_INITIALIZER
  279. static int globalRNGMutex_valid = 0;
  280. #endif
  281. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  282. static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL;
  283. #endif
  284. WC_RNG* wolfssl_get_global_rng(void)
  285. {
  286. WC_RNG* ret = NULL;
  287. if (initGlobalRNG == 0)
  288. WOLFSSL_MSG("Global RNG no Init");
  289. else
  290. ret = &globalRNG;
  291. return ret;
  292. }
  293. /* Make a global RNG and return.
  294. *
  295. * @return Global RNG on success.
  296. * @return NULL on error.
  297. */
  298. WC_RNG* wolfssl_make_global_rng(void)
  299. {
  300. WC_RNG* ret;
  301. #ifdef HAVE_GLOBAL_RNG
  302. /* Get the global random number generator instead. */
  303. ret = wolfssl_get_global_rng();
  304. #ifdef OPENSSL_EXTRA
  305. if (ret == NULL) {
  306. /* Create a global random if possible. */
  307. (void)wolfSSL_RAND_Init();
  308. ret = wolfssl_get_global_rng();
  309. }
  310. #endif
  311. #else
  312. WOLFSSL_ERROR_MSG("Bad RNG Init");
  313. ret = NULL;
  314. #endif
  315. return ret;
  316. }
  317. /* Too many defines to check explicitly - prototype it and always include
  318. * for RSA, DH, ECC and DSA for BN. */
  319. WC_RNG* wolfssl_make_rng(WC_RNG* rng, int* local);
  320. /* Make a random number generator or get global if possible.
  321. *
  322. * Global may not be available and NULL will be returned.
  323. *
  324. * @param [in, out] rng Local random number generator.
  325. * @param [out] local Local random number generator returned.
  326. * @return NULL on failure.
  327. * @return A random number generator object.
  328. */
  329. WC_RNG* wolfssl_make_rng(WC_RNG* rng, int* local)
  330. {
  331. WC_RNG* ret = NULL;
  332. /* Assume not local until one created. */
  333. *local = 0;
  334. #ifdef WOLFSSL_SMALL_STACK
  335. /* Allocate RNG object . */
  336. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  337. #endif
  338. /* Check we have a local RNG object and initialize. */
  339. if ((rng != NULL) && (wc_InitRng(rng) == 0)) {
  340. ret = rng;
  341. *local = 1;
  342. }
  343. if (ret == NULL) {
  344. #ifdef HAVE_GLOBAL_RNG
  345. WOLFSSL_MSG("Bad RNG Init, trying global");
  346. #endif
  347. ret = wolfssl_make_global_rng();
  348. }
  349. if (ret != rng) {
  350. #ifdef WOLFSSL_SMALL_STACK
  351. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  352. #endif
  353. }
  354. return ret;
  355. }
  356. #endif
  357. #ifdef OPENSSL_EXTRA
  358. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  359. * OPENSSL_EXTRA where RAND callbacks are not used */
  360. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  361. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  362. static wolfSSL_Mutex gRandMethodMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(gRandMethodMutex);
  363. #ifndef WOLFSSL_MUTEX_INITIALIZER
  364. static int gRandMethodsInit = 0;
  365. #endif
  366. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  367. #endif /* OPENSSL_EXTRA */
  368. #define WOLFSSL_SSL_BN_INCLUDED
  369. #include "src/ssl_bn.c"
  370. #ifndef OPENSSL_EXTRA_NO_ASN1
  371. #define WOLFSSL_SSL_ASN1_INCLUDED
  372. #include "src/ssl_asn1.c"
  373. #endif /* OPENSSL_EXTRA_NO_ASN1 */
  374. #define WOLFSSL_PK_INCLUDED
  375. #include "src/pk.c"
  376. #include <wolfssl/wolfcrypt/hpke.h>
  377. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  378. const WOLF_EC_NIST_NAME kNistCurves[] = {
  379. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  380. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  381. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  382. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  383. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  384. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  385. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  386. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  387. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  388. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  389. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  390. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  391. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  392. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  393. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  394. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  395. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  396. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  397. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  398. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  399. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  400. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  401. #ifdef HAVE_PQC
  402. {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
  403. {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
  404. {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
  405. #ifdef HAVE_LIBOQS
  406. {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1},
  407. {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3},
  408. {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5},
  409. #endif
  410. #endif
  411. #ifdef WOLFSSL_SM2
  412. {XSTR_SIZEOF("SM2"), "SM2", NID_sm2},
  413. #endif
  414. {0, NULL, 0},
  415. };
  416. #endif
  417. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  418. /* create the hpke key and ech config to send to clients */
  419. int wolfSSL_CTX_GenerateEchConfig(WOLFSSL_CTX* ctx, const char* publicName,
  420. word16 kemId, word16 kdfId, word16 aeadId)
  421. {
  422. int ret = 0;
  423. word16 encLen = DHKEM_X25519_ENC_LEN;
  424. #ifdef WOLFSSL_SMALL_STACK
  425. Hpke* hpke = NULL;
  426. WC_RNG* rng;
  427. #else
  428. Hpke hpke[1];
  429. WC_RNG rng[1];
  430. #endif
  431. if (ctx == NULL || publicName == NULL)
  432. return BAD_FUNC_ARG;
  433. #ifdef WOLFSSL_SMALL_STACK
  434. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  435. if (rng == NULL)
  436. return MEMORY_E;
  437. #endif
  438. ret = wc_InitRng(rng);
  439. if (ret != 0) {
  440. #ifdef WOLFSSL_SMALL_STACK
  441. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  442. #endif
  443. return ret;
  444. }
  445. ctx->echConfigs = (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  446. ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  447. if (ctx->echConfigs == NULL)
  448. ret = MEMORY_E;
  449. else
  450. XMEMSET(ctx->echConfigs, 0, sizeof(WOLFSSL_EchConfig));
  451. /* set random config id */
  452. if (ret == 0)
  453. ret = wc_RNG_GenerateByte(rng, &ctx->echConfigs->configId);
  454. /* if 0 is selected for algorithms use default, may change with draft */
  455. if (kemId == 0)
  456. kemId = DHKEM_X25519_HKDF_SHA256;
  457. if (kdfId == 0)
  458. kdfId = HKDF_SHA256;
  459. if (aeadId == 0)
  460. aeadId = HPKE_AES_128_GCM;
  461. if (ret == 0) {
  462. /* set the kem id */
  463. ctx->echConfigs->kemId = kemId;
  464. /* set the cipher suite, only 1 for now */
  465. ctx->echConfigs->numCipherSuites = 1;
  466. ctx->echConfigs->cipherSuites = (EchCipherSuite*)XMALLOC(
  467. sizeof(EchCipherSuite), ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  468. if (ctx->echConfigs->cipherSuites == NULL) {
  469. ret = MEMORY_E;
  470. }
  471. else {
  472. ctx->echConfigs->cipherSuites[0].kdfId = kdfId;
  473. ctx->echConfigs->cipherSuites[0].aeadId = aeadId;
  474. }
  475. }
  476. #ifdef WOLFSSL_SMALL_STACK
  477. if (ret == 0) {
  478. hpke = (Hpke*)XMALLOC(sizeof(Hpke), ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  479. if (hpke == NULL)
  480. ret = MEMORY_E;
  481. }
  482. #endif
  483. if (ret == 0)
  484. ret = wc_HpkeInit(hpke, kemId, kdfId, aeadId, ctx->heap);
  485. /* generate the receiver private key */
  486. if (ret == 0)
  487. ret = wc_HpkeGenerateKeyPair(hpke, &ctx->echConfigs->receiverPrivkey,
  488. rng);
  489. /* done with RNG */
  490. wc_FreeRng(rng);
  491. /* serialize the receiver key */
  492. if (ret == 0)
  493. ret = wc_HpkeSerializePublicKey(hpke, ctx->echConfigs->receiverPrivkey,
  494. ctx->echConfigs->receiverPubkey, &encLen);
  495. if (ret == 0) {
  496. ctx->echConfigs->publicName = (char*)XMALLOC(XSTRLEN(publicName) + 1,
  497. ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  498. if (ctx->echConfigs->publicName == NULL) {
  499. ret = MEMORY_E;
  500. }
  501. else {
  502. XMEMCPY(ctx->echConfigs->publicName, publicName,
  503. XSTRLEN(publicName) + 1);
  504. }
  505. }
  506. if (ret != 0) {
  507. if (ctx->echConfigs) {
  508. XFREE(ctx->echConfigs->cipherSuites, ctx->heap,
  509. DYNAMIC_TYPE_TMP_BUFFER);
  510. XFREE(ctx->echConfigs->publicName, ctx->heap,
  511. DYNAMIC_TYPE_TMP_BUFFER);
  512. XFREE(ctx->echConfigs, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  513. /* set to null to avoid double free in cleanup */
  514. ctx->echConfigs = NULL;
  515. }
  516. }
  517. if (ret == 0)
  518. ret = WOLFSSL_SUCCESS;
  519. #ifdef WOLFSSL_SMALL_STACK
  520. XFREE(hpke, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  521. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  522. #endif
  523. return ret;
  524. }
  525. /* get the ech configs that the server context is using */
  526. int wolfSSL_CTX_GetEchConfigs(WOLFSSL_CTX* ctx, byte* output,
  527. word32* outputLen) {
  528. if (ctx == NULL || outputLen == NULL)
  529. return BAD_FUNC_ARG;
  530. /* if we don't have ech configs */
  531. if (ctx->echConfigs == NULL) {
  532. return WOLFSSL_FATAL_ERROR;
  533. }
  534. return GetEchConfigsEx(ctx->echConfigs, output, outputLen);
  535. }
  536. /* set the ech config from base64 for our client ssl object, base64 is the
  537. * format ech configs are sent using dns records */
  538. int wolfSSL_SetEchConfigsBase64(WOLFSSL* ssl, char* echConfigs64,
  539. word32 echConfigs64Len)
  540. {
  541. int ret = 0;
  542. word32 decodedLen = echConfigs64Len * 3 / 4 + 1;
  543. byte* decodedConfigs;
  544. if (ssl == NULL || echConfigs64 == NULL || echConfigs64Len == 0)
  545. return BAD_FUNC_ARG;
  546. /* already have ech configs */
  547. if (ssl->options.useEch == 1) {
  548. return WOLFSSL_FATAL_ERROR;
  549. }
  550. decodedConfigs = (byte*)XMALLOC(decodedLen, ssl->heap,
  551. DYNAMIC_TYPE_TMP_BUFFER);
  552. if (decodedConfigs == NULL)
  553. return MEMORY_E;
  554. decodedConfigs[decodedLen - 1] = 0;
  555. /* decode the echConfigs */
  556. ret = Base64_Decode((byte*)echConfigs64, echConfigs64Len,
  557. decodedConfigs, &decodedLen);
  558. if (ret != 0) {
  559. XFREE(decodedConfigs, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  560. return ret;
  561. }
  562. ret = wolfSSL_SetEchConfigs(ssl, decodedConfigs, decodedLen);
  563. XFREE(decodedConfigs, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  564. return ret;
  565. }
  566. /* set the ech config from a raw buffer, this is the format ech configs are
  567. * sent using retry_configs from the ech server */
  568. int wolfSSL_SetEchConfigs(WOLFSSL* ssl, const byte* echConfigs,
  569. word32 echConfigsLen)
  570. {
  571. int ret = 0;
  572. int i;
  573. int j;
  574. word16 totalLength;
  575. word16 version;
  576. word16 length;
  577. word16 hpkePubkeyLen;
  578. word16 cipherSuitesLen;
  579. word16 publicNameLen;
  580. WOLFSSL_EchConfig* configList = NULL;
  581. WOLFSSL_EchConfig* workingConfig = NULL;
  582. WOLFSSL_EchConfig* lastConfig = NULL;
  583. byte* echConfig = NULL;
  584. if (ssl == NULL || echConfigs == NULL || echConfigsLen == 0)
  585. return BAD_FUNC_ARG;
  586. /* already have ech configs */
  587. if (ssl->options.useEch == 1) {
  588. return WOLFSSL_FATAL_ERROR;
  589. }
  590. /* check that the total length is well formed */
  591. ato16(echConfigs, &totalLength);
  592. if (totalLength != echConfigsLen - 2) {
  593. return WOLFSSL_FATAL_ERROR;
  594. }
  595. /* skip the total length uint16_t */
  596. i = 2;
  597. do {
  598. echConfig = (byte*)echConfigs + i;
  599. ato16(echConfig, &version);
  600. ato16(echConfig + 2, &length);
  601. /* if the version does not match */
  602. if (version != TLSX_ECH) {
  603. /* we hit the end of the configs */
  604. if ( (word32)i + 2 >= echConfigsLen ) {
  605. break;
  606. }
  607. /* skip this config, +4 for version and length */
  608. i += length + 4;
  609. continue;
  610. }
  611. /* check if the length will overrun the buffer */
  612. if ((word32)i + length + 4 > echConfigsLen) {
  613. break;
  614. }
  615. if (workingConfig == NULL) {
  616. workingConfig =
  617. (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  618. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  619. configList = workingConfig;
  620. if (workingConfig != NULL) {
  621. workingConfig->next = NULL;
  622. }
  623. }
  624. else {
  625. lastConfig = workingConfig;
  626. workingConfig->next =
  627. (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  628. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  629. workingConfig = workingConfig->next;
  630. }
  631. if (workingConfig == NULL) {
  632. ret = MEMORY_E;
  633. break;
  634. }
  635. XMEMSET(workingConfig, 0, sizeof(WOLFSSL_EchConfig));
  636. /* rawLen */
  637. workingConfig->rawLen = length + 4;
  638. /* raw body */
  639. workingConfig->raw = (byte*)XMALLOC(workingConfig->rawLen,
  640. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  641. if (workingConfig->raw == NULL) {
  642. ret = MEMORY_E;
  643. break;
  644. }
  645. XMEMCPY(workingConfig->raw, echConfig, workingConfig->rawLen);
  646. /* skip over version and length */
  647. echConfig += 4;
  648. /* configId, 1 byte */
  649. workingConfig->configId = *(echConfig);
  650. echConfig++;
  651. /* kemId, 2 bytes */
  652. ato16(echConfig, &workingConfig->kemId);
  653. echConfig += 2;
  654. /* hpke public_key length, 2 bytes */
  655. ato16(echConfig, &hpkePubkeyLen);
  656. echConfig += 2;
  657. /* hpke public_key */
  658. XMEMCPY(workingConfig->receiverPubkey, echConfig, hpkePubkeyLen);
  659. echConfig += hpkePubkeyLen;
  660. /* cipherSuitesLen */
  661. ato16(echConfig, &cipherSuitesLen);
  662. workingConfig->cipherSuites = (EchCipherSuite*)XMALLOC(cipherSuitesLen,
  663. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  664. if (workingConfig->cipherSuites == NULL) {
  665. ret = MEMORY_E;
  666. break;
  667. }
  668. echConfig += 2;
  669. workingConfig->numCipherSuites = cipherSuitesLen / 4;
  670. /* cipherSuites */
  671. for (j = 0; j < workingConfig->numCipherSuites; j++) {
  672. ato16(echConfig + j * 4, &workingConfig->cipherSuites[j].kdfId);
  673. ato16(echConfig + j * 4 + 2,
  674. &workingConfig->cipherSuites[j].aeadId);
  675. }
  676. echConfig += cipherSuitesLen;
  677. /* publicNameLen */
  678. ato16(echConfig, &publicNameLen);
  679. workingConfig->publicName = (char*)XMALLOC(publicNameLen + 1,
  680. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  681. if (workingConfig->publicName == NULL) {
  682. ret = MEMORY_E;
  683. break;
  684. }
  685. echConfig += 2;
  686. /* publicName */
  687. XMEMCPY(workingConfig->publicName, echConfig, publicNameLen);
  688. /* null terminated */
  689. workingConfig->publicName[publicNameLen] = 0;
  690. /* add length to go to next config, +4 for version and length */
  691. i += length + 4;
  692. /* check that we support this config */
  693. for (j = 0; j < HPKE_SUPPORTED_KEM_LEN; j++) {
  694. if (hpkeSupportedKem[j] == workingConfig->kemId)
  695. break;
  696. }
  697. /* if we don't support the kem or at least one cipher suite */
  698. if (j >= HPKE_SUPPORTED_KEM_LEN ||
  699. EchConfigGetSupportedCipherSuite(workingConfig) < 0)
  700. {
  701. XFREE(workingConfig->cipherSuites, ssl->heap,
  702. DYNAMIC_TYPE_TMP_BUFFER);
  703. XFREE(workingConfig->publicName, ssl->heap,
  704. DYNAMIC_TYPE_TMP_BUFFER);
  705. XFREE(workingConfig->raw, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  706. workingConfig = lastConfig;
  707. }
  708. } while ((word32)i < echConfigsLen);
  709. /* if we found valid configs */
  710. if (ret == 0 && configList != NULL) {
  711. ssl->options.useEch = 1;
  712. ssl->echConfigs = configList;
  713. return WOLFSSL_SUCCESS;
  714. }
  715. workingConfig = configList;
  716. while (workingConfig != NULL) {
  717. lastConfig = workingConfig;
  718. workingConfig = workingConfig->next;
  719. XFREE(lastConfig->cipherSuites, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  720. XFREE(lastConfig->publicName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  721. XFREE(lastConfig->raw, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  722. XFREE(lastConfig, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  723. }
  724. if (ret == 0)
  725. return WOLFSSL_FATAL_ERROR;
  726. return ret;
  727. }
  728. /* get the raw ech config from our struct */
  729. int GetEchConfig(WOLFSSL_EchConfig* config, byte* output, word32* outputLen)
  730. {
  731. int i;
  732. word16 totalLen = 0;
  733. if (config == NULL || (output == NULL && outputLen == NULL))
  734. return BAD_FUNC_ARG;
  735. /* 2 for version */
  736. totalLen += 2;
  737. /* 2 for length */
  738. totalLen += 2;
  739. /* 1 for configId */
  740. totalLen += 1;
  741. /* 2 for kemId */
  742. totalLen += 2;
  743. /* 2 for hpke_len */
  744. totalLen += 2;
  745. /* hpke_pub_key */
  746. switch (config->kemId) {
  747. case DHKEM_P256_HKDF_SHA256:
  748. totalLen += DHKEM_P256_ENC_LEN;
  749. break;
  750. case DHKEM_P384_HKDF_SHA384:
  751. totalLen += DHKEM_P384_ENC_LEN;
  752. break;
  753. case DHKEM_P521_HKDF_SHA512:
  754. totalLen += DHKEM_P521_ENC_LEN;
  755. break;
  756. case DHKEM_X25519_HKDF_SHA256:
  757. totalLen += DHKEM_X25519_ENC_LEN;
  758. break;
  759. case DHKEM_X448_HKDF_SHA512:
  760. totalLen += DHKEM_X448_ENC_LEN;
  761. break;
  762. }
  763. /* cipherSuitesLen */
  764. totalLen += 2;
  765. /* cipherSuites */
  766. totalLen += config->numCipherSuites * 4;
  767. /* public name len */
  768. totalLen += 2;
  769. /* public name */
  770. totalLen += XSTRLEN(config->publicName);
  771. /* trailing zeros */
  772. totalLen += 2;
  773. if (output == NULL) {
  774. *outputLen = totalLen;
  775. return LENGTH_ONLY_E;
  776. }
  777. if (totalLen > *outputLen) {
  778. *outputLen = totalLen;
  779. return INPUT_SIZE_E;
  780. }
  781. /* version */
  782. c16toa(TLSX_ECH, output);
  783. output += 2;
  784. /* length - 4 for version and length itself */
  785. c16toa(totalLen - 4, output);
  786. output += 2;
  787. /* configId */
  788. *output = config->configId;
  789. output++;
  790. /* kemId */
  791. c16toa(config->kemId, output);
  792. output += 2;
  793. /* length and key itself */
  794. switch (config->kemId) {
  795. case DHKEM_P256_HKDF_SHA256:
  796. c16toa(DHKEM_P256_ENC_LEN, output);
  797. output += 2;
  798. XMEMCPY(output, config->receiverPubkey, DHKEM_P256_ENC_LEN);
  799. output += DHKEM_P256_ENC_LEN;
  800. break;
  801. case DHKEM_P384_HKDF_SHA384:
  802. c16toa(DHKEM_P384_ENC_LEN, output);
  803. output += 2;
  804. XMEMCPY(output, config->receiverPubkey, DHKEM_P384_ENC_LEN);
  805. output += DHKEM_P384_ENC_LEN;
  806. break;
  807. case DHKEM_P521_HKDF_SHA512:
  808. c16toa(DHKEM_P521_ENC_LEN, output);
  809. output += 2;
  810. XMEMCPY(output, config->receiverPubkey, DHKEM_P521_ENC_LEN);
  811. output += DHKEM_P521_ENC_LEN;
  812. break;
  813. case DHKEM_X25519_HKDF_SHA256:
  814. c16toa(DHKEM_X25519_ENC_LEN, output);
  815. output += 2;
  816. XMEMCPY(output, config->receiverPubkey, DHKEM_X25519_ENC_LEN);
  817. output += DHKEM_X25519_ENC_LEN;
  818. break;
  819. case DHKEM_X448_HKDF_SHA512:
  820. c16toa(DHKEM_X448_ENC_LEN, output);
  821. output += 2;
  822. XMEMCPY(output, config->receiverPubkey, DHKEM_X448_ENC_LEN);
  823. output += DHKEM_X448_ENC_LEN;
  824. break;
  825. }
  826. /* cipherSuites len */
  827. c16toa(config->numCipherSuites * 4, output);
  828. output += 2;
  829. /* cipherSuites */
  830. for (i = 0; i < config->numCipherSuites; i++) {
  831. c16toa(config->cipherSuites[i].kdfId, output);
  832. output += 2;
  833. c16toa(config->cipherSuites[i].aeadId, output);
  834. output += 2;
  835. }
  836. /* publicName len */
  837. c16toa(XSTRLEN(config->publicName), output);
  838. output += 2;
  839. /* publicName */
  840. XMEMCPY(output, config->publicName,
  841. XSTRLEN(config->publicName));
  842. output += XSTRLEN(config->publicName);
  843. /* terminating zeros */
  844. c16toa(0, output);
  845. /* output += 2; */
  846. *outputLen = totalLen;
  847. return 0;
  848. }
  849. /* wrapper function to get ech configs from application code */
  850. int wolfSSL_GetEchConfigs(WOLFSSL* ssl, byte* output, word32* outputLen)
  851. {
  852. if (ssl == NULL || outputLen == NULL)
  853. return BAD_FUNC_ARG;
  854. /* if we don't have ech configs */
  855. if (ssl->options.useEch != 1) {
  856. return WOLFSSL_FATAL_ERROR;
  857. }
  858. return GetEchConfigsEx(ssl->echConfigs, output, outputLen);
  859. }
  860. /* get the raw ech configs from our linked list of ech config structs */
  861. int GetEchConfigsEx(WOLFSSL_EchConfig* configs, byte* output, word32* outputLen)
  862. {
  863. int ret = 0;
  864. WOLFSSL_EchConfig* workingConfig = NULL;
  865. byte* outputStart = output;
  866. word32 totalLen = 2;
  867. word32 workingOutputLen;
  868. if (configs == NULL || outputLen == NULL)
  869. return BAD_FUNC_ARG;
  870. workingOutputLen = *outputLen - totalLen;
  871. /* skip over total length which we fill in later */
  872. if (output != NULL)
  873. output += 2;
  874. workingConfig = configs;
  875. while (workingConfig != NULL) {
  876. /* get this config */
  877. ret = GetEchConfig(workingConfig, output, &workingOutputLen);
  878. if (output != NULL)
  879. output += workingOutputLen;
  880. /* add this config's length to the total length */
  881. totalLen += workingOutputLen;
  882. if (totalLen > *outputLen)
  883. workingOutputLen = 0;
  884. else
  885. workingOutputLen = *outputLen - totalLen;
  886. /* only error we break on, other 2 we need to keep finding length */
  887. if (ret == BAD_FUNC_ARG)
  888. return BAD_FUNC_ARG;
  889. workingConfig = workingConfig->next;
  890. }
  891. if (output == NULL) {
  892. *outputLen = totalLen;
  893. return LENGTH_ONLY_E;
  894. }
  895. if (totalLen > *outputLen) {
  896. *outputLen = totalLen;
  897. return INPUT_SIZE_E;
  898. }
  899. /* total size -2 for size itself */
  900. c16toa(totalLen - 2, outputStart);
  901. *outputLen = totalLen;
  902. return WOLFSSL_SUCCESS;
  903. }
  904. #endif /* WOLFSSL_TLS13 && HAVE_ECH */
  905. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  906. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  907. #endif
  908. #ifdef WOLFSSL_SESSION_EXPORT
  909. /* Used to import a serialized TLS session.
  910. * WARNING: buf contains sensitive information about the state and is best to be
  911. * encrypted before storing if stored.
  912. *
  913. * @param ssl WOLFSSL structure to import the session into
  914. * @param buf serialized session
  915. * @param sz size of buffer 'buf'
  916. * @return the number of bytes read from buffer 'buf'
  917. */
  918. int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  919. {
  920. if (ssl == NULL || buf == NULL) {
  921. return BAD_FUNC_ARG;
  922. }
  923. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  924. }
  925. /* Used to export a serialized TLS session.
  926. * WARNING: buf contains sensitive information about the state and is best to be
  927. * encrypted before storing if stored.
  928. *
  929. * @param ssl WOLFSSL structure to export the session from
  930. * @param buf output of serialized session
  931. * @param sz size in bytes set in 'buf'
  932. * @return the number of bytes written into buffer 'buf'
  933. */
  934. int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  935. {
  936. if (ssl == NULL || sz == NULL) {
  937. return BAD_FUNC_ARG;
  938. }
  939. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  940. }
  941. #ifdef WOLFSSL_DTLS
  942. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  943. {
  944. WOLFSSL_ENTER("wolfSSL_session_import");
  945. if (ssl == NULL || buf == NULL) {
  946. return BAD_FUNC_ARG;
  947. }
  948. /* sanity checks on buffer and protocol are done in internal function */
  949. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  950. }
  951. /* Sets the function to call for serializing the session. This function is
  952. * called right after the handshake is completed. */
  953. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  954. {
  955. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  956. /* purposefully allow func to be NULL */
  957. if (ctx == NULL) {
  958. return BAD_FUNC_ARG;
  959. }
  960. ctx->dtls_export = func;
  961. return WOLFSSL_SUCCESS;
  962. }
  963. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  964. * function is called right after the handshake is completed. */
  965. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  966. {
  967. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  968. /* purposefully allow func to be NULL */
  969. if (ssl == NULL) {
  970. return BAD_FUNC_ARG;
  971. }
  972. ssl->dtls_export = func;
  973. return WOLFSSL_SUCCESS;
  974. }
  975. /* This function allows for directly serializing a session rather than using
  976. * callbacks. It has less overhead by removing a temporary buffer and gives
  977. * control over when the session gets serialized. When using callbacks the
  978. * session is always serialized immediately after the handshake is finished.
  979. *
  980. * buf is the argument to contain the serialized session
  981. * sz is the size of the buffer passed in
  982. * ssl is the WOLFSSL struct to serialize
  983. * returns the size of serialized session on success, 0 on no action, and
  984. * negative value on error */
  985. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  986. {
  987. WOLFSSL_ENTER("wolfSSL_dtls_export");
  988. if (ssl == NULL || sz == NULL) {
  989. return BAD_FUNC_ARG;
  990. }
  991. if (buf == NULL) {
  992. *sz = MAX_EXPORT_BUFFER;
  993. return 0;
  994. }
  995. /* if not DTLS do nothing */
  996. if (!ssl->options.dtls) {
  997. WOLFSSL_MSG("Currently only DTLS export is supported");
  998. return 0;
  999. }
  1000. /* copy over keys, options, and dtls state struct */
  1001. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  1002. }
  1003. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  1004. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  1005. * sequence number, epoch, AEAD state etc.
  1006. *
  1007. * buf is the argument to contain the serialized state, if null then set "sz" to
  1008. * buffer size required
  1009. * sz is the size of the buffer passed in
  1010. * ssl is the WOLFSSL struct to serialize
  1011. * returns the size of serialized session on success, 0 on no action, and
  1012. * negative value on error */
  1013. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  1014. unsigned int* sz)
  1015. {
  1016. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  1017. if (ssl == NULL || sz == NULL) {
  1018. return BAD_FUNC_ARG;
  1019. }
  1020. if (buf == NULL) {
  1021. *sz = MAX_EXPORT_STATE_BUFFER;
  1022. return 0;
  1023. }
  1024. /* if not DTLS do nothing */
  1025. if (!ssl->options.dtls) {
  1026. WOLFSSL_MSG("Currently only DTLS export state is supported");
  1027. return 0;
  1028. }
  1029. /* copy over keys, options, and dtls state struct */
  1030. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  1031. }
  1032. /* returns 0 on success */
  1033. int wolfSSL_send_session(WOLFSSL* ssl)
  1034. {
  1035. int ret;
  1036. byte* buf;
  1037. word32 bufSz = MAX_EXPORT_BUFFER;
  1038. WOLFSSL_ENTER("wolfSSL_send_session");
  1039. if (ssl == NULL) {
  1040. return BAD_FUNC_ARG;
  1041. }
  1042. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1043. if (buf == NULL) {
  1044. return MEMORY_E;
  1045. }
  1046. /* if not DTLS do nothing */
  1047. if (!ssl->options.dtls) {
  1048. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1049. WOLFSSL_MSG("Currently only DTLS export is supported");
  1050. return 0;
  1051. }
  1052. /* copy over keys, options, and dtls state struct */
  1053. ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS);
  1054. if (ret < 0) {
  1055. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1056. return ret;
  1057. }
  1058. /* if no error ret has size of buffer */
  1059. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  1060. if (ret != WOLFSSL_SUCCESS) {
  1061. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1062. return ret;
  1063. }
  1064. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1065. return 0;
  1066. }
  1067. #endif /* WOLFSSL_DTLS */
  1068. #endif /* WOLFSSL_SESSION_EXPORT */
  1069. /* prevent multiple mutex initializations */
  1070. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  1071. static WOLFSSL_GLOBAL wolfSSL_Mutex inits_count_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(inits_count_mutex); /* init ref count mutex */
  1072. #ifndef WOLFSSL_MUTEX_INITIALIZER
  1073. static WOLFSSL_GLOBAL int inits_count_mutex_valid = 0;
  1074. #endif
  1075. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  1076. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  1077. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  1078. success is freed when ctx is freed.
  1079. */
  1080. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  1081. {
  1082. WOLFSSL_CTX* ctx = NULL;
  1083. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  1084. if (initRefCount == 0) {
  1085. /* user no longer forced to call Init themselves */
  1086. int ret = wolfSSL_Init();
  1087. if (ret != WOLFSSL_SUCCESS) {
  1088. WOLFSSL_MSG("wolfSSL_Init failed");
  1089. WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
  1090. if (method != NULL) {
  1091. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  1092. }
  1093. return NULL;
  1094. }
  1095. }
  1096. if (method == NULL)
  1097. return ctx;
  1098. ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  1099. if (ctx) {
  1100. int ret;
  1101. ret = InitSSL_Ctx(ctx, method, heap);
  1102. #ifdef WOLFSSL_STATIC_MEMORY
  1103. if (heap != NULL) {
  1104. ctx->onHeapHint = 1; /* free the memory back to heap when done */
  1105. }
  1106. #endif
  1107. if (ret < 0) {
  1108. WOLFSSL_MSG("Init CTX failed");
  1109. wolfSSL_CTX_free(ctx);
  1110. ctx = NULL;
  1111. }
  1112. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  1113. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  1114. else {
  1115. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  1116. if (ctx->srp == NULL){
  1117. WOLFSSL_MSG("Init CTX failed");
  1118. wolfSSL_CTX_free(ctx);
  1119. return NULL;
  1120. }
  1121. XMEMSET(ctx->srp, 0, sizeof(Srp));
  1122. }
  1123. #endif
  1124. }
  1125. else {
  1126. WOLFSSL_MSG("Alloc CTX failed, method freed");
  1127. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  1128. }
  1129. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  1130. if (ctx) {
  1131. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  1132. wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
  1133. if (wolfSSL_CTX_set_min_proto_version(ctx,
  1134. (method->version.major == DTLS_MAJOR) ?
  1135. DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS ||
  1136. #ifdef HAVE_ANON
  1137. wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS ||
  1138. #endif
  1139. wolfSSL_CTX_set_group_messages(ctx) != WOLFSSL_SUCCESS) {
  1140. WOLFSSL_MSG("Setting OpenSSL CTX defaults failed");
  1141. wolfSSL_CTX_free(ctx);
  1142. ctx = NULL;
  1143. }
  1144. }
  1145. #endif
  1146. WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
  1147. return ctx;
  1148. }
  1149. WOLFSSL_ABI
  1150. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  1151. {
  1152. #ifdef WOLFSSL_HEAP_TEST
  1153. /* if testing the heap hint then set top level CTX to have test value */
  1154. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  1155. #else
  1156. return wolfSSL_CTX_new_ex(method, NULL);
  1157. #endif
  1158. }
  1159. /* increases CTX reference count to track proper time to "free" */
  1160. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  1161. {
  1162. int ret;
  1163. wolfSSL_RefInc(&ctx->ref, &ret);
  1164. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  1165. return ((ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  1166. #else
  1167. (void)ret;
  1168. return WOLFSSL_SUCCESS;
  1169. #endif
  1170. }
  1171. WOLFSSL_ABI
  1172. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  1173. {
  1174. WOLFSSL_ENTER("wolfSSL_CTX_free");
  1175. if (ctx) {
  1176. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  1177. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  1178. if (ctx->srp != NULL) {
  1179. if (ctx->srp_password != NULL){
  1180. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  1181. ctx->srp_password = NULL;
  1182. }
  1183. wc_SrpTerm(ctx->srp);
  1184. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  1185. ctx->srp = NULL;
  1186. }
  1187. #endif
  1188. FreeSSL_Ctx(ctx);
  1189. }
  1190. WOLFSSL_LEAVE("wolfSSL_CTX_free", 0);
  1191. }
  1192. #ifdef HAVE_ENCRYPT_THEN_MAC
  1193. /**
  1194. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  1195. * The default value: enabled.
  1196. *
  1197. * ctx SSL/TLS context.
  1198. * set Whether to allow or not: 1 is allow and 0 is disallow.
  1199. * returns WOLFSSL_SUCCESS
  1200. */
  1201. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  1202. {
  1203. ctx->disallowEncThenMac = !set;
  1204. return WOLFSSL_SUCCESS;
  1205. }
  1206. /**
  1207. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  1208. * The default value comes from context.
  1209. *
  1210. * ctx SSL/TLS context.
  1211. * set Whether to allow or not: 1 is allow and 0 is disallow.
  1212. * returns WOLFSSL_SUCCESS
  1213. */
  1214. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  1215. {
  1216. ssl->options.disallowEncThenMac = !set;
  1217. return WOLFSSL_SUCCESS;
  1218. }
  1219. #endif
  1220. #ifdef SINGLE_THREADED
  1221. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  1222. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  1223. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  1224. {
  1225. WC_RNG* rng;
  1226. int ret;
  1227. if (ctx == NULL) {
  1228. return BAD_FUNC_ARG;
  1229. }
  1230. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  1231. if (rng == NULL) {
  1232. return MEMORY_E;
  1233. }
  1234. #ifndef HAVE_FIPS
  1235. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  1236. #else
  1237. ret = wc_InitRng(rng);
  1238. #endif
  1239. if (ret != 0) {
  1240. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1241. return ret;
  1242. }
  1243. ctx->rng = rng;
  1244. return WOLFSSL_SUCCESS;
  1245. }
  1246. #endif
  1247. WOLFSSL_ABI
  1248. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  1249. {
  1250. WOLFSSL* ssl = NULL;
  1251. int ret = 0;
  1252. WOLFSSL_ENTER("wolfSSL_new");
  1253. if (ctx == NULL) {
  1254. WOLFSSL_MSG("wolfSSL_new ctx is null");
  1255. return NULL;
  1256. }
  1257. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  1258. if (ssl == NULL) {
  1259. WOLFSSL_MSG_EX("ssl xmalloc failed to allocate %d bytes",
  1260. (int)sizeof(WOLFSSL));
  1261. }
  1262. else {
  1263. ret = InitSSL(ssl, ctx, 0);
  1264. if (ret < 0) {
  1265. WOLFSSL_MSG_EX("wolfSSL_new failed during InitSSL. err = %d", ret);
  1266. FreeSSL(ssl, ctx->heap);
  1267. ssl = NULL;
  1268. }
  1269. else if (ret == 0) {
  1270. WOLFSSL_MSG("wolfSSL_new InitSSL success");
  1271. }
  1272. else {
  1273. /* Only success (0) or negative values should ever be seen. */
  1274. WOLFSSL_MSG_EX("WARNING: wolfSSL_new unexpected InitSSL return"
  1275. " value = %d", ret);
  1276. } /* InitSSL check */
  1277. } /* ssl XMALLOC success */
  1278. WOLFSSL_LEAVE("wolfSSL_new InitSSL =", ret);
  1279. (void)ret;
  1280. return ssl;
  1281. }
  1282. WOLFSSL_ABI
  1283. void wolfSSL_free(WOLFSSL* ssl)
  1284. {
  1285. WOLFSSL_ENTER("wolfSSL_free");
  1286. if (ssl) {
  1287. WOLFSSL_MSG_EX("Free SSL: %p", (wc_ptr_t)ssl);
  1288. FreeSSL(ssl, ssl->ctx->heap);
  1289. }
  1290. else {
  1291. WOLFSSL_MSG("Free SSL: wolfSSL_free already null");
  1292. }
  1293. WOLFSSL_LEAVE("wolfSSL_free", 0);
  1294. }
  1295. int wolfSSL_is_server(WOLFSSL* ssl)
  1296. {
  1297. if (ssl == NULL)
  1298. return BAD_FUNC_ARG;
  1299. return ssl->options.side == WOLFSSL_SERVER_END;
  1300. }
  1301. #ifdef HAVE_WRITE_DUP
  1302. /*
  1303. * Release resources around WriteDup object
  1304. *
  1305. * ssl WOLFSSL object
  1306. *
  1307. * no return, destruction so make best attempt
  1308. */
  1309. void FreeWriteDup(WOLFSSL* ssl)
  1310. {
  1311. int doFree = 0;
  1312. WOLFSSL_ENTER("FreeWriteDup");
  1313. if (ssl->dupWrite) {
  1314. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  1315. ssl->dupWrite->dupCount--;
  1316. if (ssl->dupWrite->dupCount == 0) {
  1317. doFree = 1;
  1318. } else {
  1319. WOLFSSL_MSG("WriteDup count not zero, no full free");
  1320. }
  1321. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1322. }
  1323. }
  1324. if (doFree) {
  1325. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  1326. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  1327. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  1328. }
  1329. }
  1330. /*
  1331. * duplicate existing ssl members into dup needed for writing
  1332. *
  1333. * dup write only WOLFSSL
  1334. * ssl existing WOLFSSL
  1335. *
  1336. * 0 on success
  1337. */
  1338. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  1339. {
  1340. word16 tmp_weOwnRng;
  1341. /* shared dupWrite setup */
  1342. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  1343. DYNAMIC_TYPE_WRITEDUP);
  1344. if (ssl->dupWrite == NULL) {
  1345. return MEMORY_E;
  1346. }
  1347. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  1348. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  1349. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  1350. ssl->dupWrite = NULL;
  1351. return BAD_MUTEX_E;
  1352. }
  1353. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  1354. dup->dupWrite = ssl->dupWrite; /* each side uses */
  1355. tmp_weOwnRng = dup->options.weOwnRng;
  1356. /* copy write parts over to dup writer */
  1357. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  1358. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  1359. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  1360. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  1361. XMEMCPY(&dup->version, &ssl->version, sizeof(ProtocolVersion));
  1362. XMEMCPY(&dup->chVersion, &ssl->chVersion, sizeof(ProtocolVersion));
  1363. #ifdef HAVE_ONE_TIME_AUTH
  1364. #ifdef HAVE_POLY1305
  1365. if (ssl->auth.setup && ssl->auth.poly1305 != NULL) {
  1366. dup->auth.poly1305 =
  1367. (Poly1305*)XMALLOC(sizeof(Poly1305), dup->heap, DYNAMIC_TYPE_CIPHER);
  1368. if (dup->auth.poly1305 == NULL)
  1369. return MEMORY_E;
  1370. dup->auth.setup = 1;
  1371. }
  1372. #endif
  1373. #endif
  1374. /* dup side now owns encrypt/write ciphers */
  1375. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  1376. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  1377. dup->CBIOSend = ssl->CBIOSend;
  1378. #ifdef OPENSSL_EXTRA
  1379. dup->cbioFlag = ssl->cbioFlag;
  1380. #endif
  1381. dup->wfd = ssl->wfd;
  1382. dup->wflags = ssl->wflags;
  1383. #ifndef WOLFSSL_AEAD_ONLY
  1384. dup->hmac = ssl->hmac;
  1385. #endif
  1386. #ifdef HAVE_TRUNCATED_HMAC
  1387. dup->truncated_hmac = ssl->truncated_hmac;
  1388. #endif
  1389. /* Restore rng option */
  1390. dup->options.weOwnRng = tmp_weOwnRng;
  1391. /* unique side dup setup */
  1392. dup->dupSide = WRITE_DUP_SIDE;
  1393. ssl->dupSide = READ_DUP_SIDE;
  1394. return 0;
  1395. }
  1396. /*
  1397. * duplicate a WOLFSSL object post handshake for writing only
  1398. * turn existing object into read only. Allows concurrent access from two
  1399. * different threads.
  1400. *
  1401. * ssl existing WOLFSSL object
  1402. *
  1403. * return dup'd WOLFSSL object on success
  1404. */
  1405. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  1406. {
  1407. WOLFSSL* dup = NULL;
  1408. int ret = 0;
  1409. (void)ret;
  1410. WOLFSSL_ENTER("wolfSSL_write_dup");
  1411. if (ssl == NULL) {
  1412. return ssl;
  1413. }
  1414. if (ssl->options.handShakeDone == 0) {
  1415. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  1416. return NULL;
  1417. }
  1418. if (ssl->dupWrite) {
  1419. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  1420. return NULL;
  1421. }
  1422. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  1423. if (dup) {
  1424. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  1425. FreeSSL(dup, ssl->ctx->heap);
  1426. dup = NULL;
  1427. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  1428. FreeSSL(dup, ssl->ctx->heap);
  1429. dup = NULL;
  1430. }
  1431. }
  1432. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  1433. return dup;
  1434. }
  1435. /*
  1436. * Notify write dup side of fatal error or close notify
  1437. *
  1438. * ssl WOLFSSL object
  1439. * err Notify err
  1440. *
  1441. * 0 on success
  1442. */
  1443. int NotifyWriteSide(WOLFSSL* ssl, int err)
  1444. {
  1445. int ret;
  1446. WOLFSSL_ENTER("NotifyWriteSide");
  1447. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  1448. if (ret == 0) {
  1449. ssl->dupWrite->dupErr = err;
  1450. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1451. }
  1452. return ret;
  1453. }
  1454. #endif /* HAVE_WRITE_DUP */
  1455. #ifdef HAVE_POLY1305
  1456. /* set if to use old poly 1 for yes 0 to use new poly */
  1457. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  1458. {
  1459. (void)ssl;
  1460. (void)value;
  1461. #ifndef WOLFSSL_NO_TLS12
  1462. WOLFSSL_ENTER("wolfSSL_use_old_poly");
  1463. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  1464. "is depreciated");
  1465. ssl->options.oldPoly = (word16)value;
  1466. WOLFSSL_LEAVE("wolfSSL_use_old_poly", 0);
  1467. #endif
  1468. return 0;
  1469. }
  1470. #endif
  1471. WOLFSSL_ABI
  1472. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  1473. {
  1474. int ret;
  1475. WOLFSSL_ENTER("wolfSSL_set_fd");
  1476. if (ssl == NULL) {
  1477. return BAD_FUNC_ARG;
  1478. }
  1479. ret = wolfSSL_set_read_fd(ssl, fd);
  1480. if (ret == WOLFSSL_SUCCESS) {
  1481. ret = wolfSSL_set_write_fd(ssl, fd);
  1482. }
  1483. return ret;
  1484. }
  1485. #ifdef WOLFSSL_DTLS
  1486. int wolfSSL_set_dtls_fd_connected(WOLFSSL* ssl, int fd)
  1487. {
  1488. int ret;
  1489. WOLFSSL_ENTER("wolfSSL_set_dtls_fd_connected");
  1490. if (ssl == NULL) {
  1491. return BAD_FUNC_ARG;
  1492. }
  1493. ret = wolfSSL_set_fd(ssl, fd);
  1494. if (ret == WOLFSSL_SUCCESS)
  1495. ssl->buffers.dtlsCtx.connected = 1;
  1496. return ret;
  1497. }
  1498. #endif
  1499. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  1500. {
  1501. WOLFSSL_ENTER("wolfSSL_set_read_fd");
  1502. if (ssl == NULL) {
  1503. return BAD_FUNC_ARG;
  1504. }
  1505. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  1506. ssl->IOCB_ReadCtx = &ssl->rfd;
  1507. #ifdef WOLFSSL_DTLS
  1508. ssl->buffers.dtlsCtx.connected = 0;
  1509. if (ssl->options.dtls) {
  1510. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  1511. ssl->buffers.dtlsCtx.rfd = fd;
  1512. }
  1513. #endif
  1514. WOLFSSL_LEAVE("wolfSSL_set_read_fd", WOLFSSL_SUCCESS);
  1515. return WOLFSSL_SUCCESS;
  1516. }
  1517. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  1518. {
  1519. WOLFSSL_ENTER("wolfSSL_set_write_fd");
  1520. if (ssl == NULL) {
  1521. return BAD_FUNC_ARG;
  1522. }
  1523. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  1524. ssl->IOCB_WriteCtx = &ssl->wfd;
  1525. #ifdef WOLFSSL_DTLS
  1526. ssl->buffers.dtlsCtx.connected = 0;
  1527. if (ssl->options.dtls) {
  1528. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  1529. ssl->buffers.dtlsCtx.wfd = fd;
  1530. }
  1531. #endif
  1532. WOLFSSL_LEAVE("wolfSSL_set_write_fd", WOLFSSL_SUCCESS);
  1533. return WOLFSSL_SUCCESS;
  1534. }
  1535. /**
  1536. * Get the name of cipher at priority level passed in.
  1537. */
  1538. char* wolfSSL_get_cipher_list(int priority)
  1539. {
  1540. const CipherSuiteInfo* ciphers = GetCipherNames();
  1541. if (priority >= GetCipherNamesSize() || priority < 0) {
  1542. return 0;
  1543. }
  1544. return (char*)ciphers[priority].name;
  1545. }
  1546. /**
  1547. * Get the name of cipher at priority level passed in.
  1548. */
  1549. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  1550. {
  1551. if (ssl == NULL) {
  1552. return NULL;
  1553. }
  1554. else {
  1555. const char* cipher;
  1556. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  1557. if (priority == 0) {
  1558. return (char*)cipher;
  1559. }
  1560. else {
  1561. return NULL;
  1562. }
  1563. }
  1564. else {
  1565. return wolfSSL_get_cipher_list(priority);
  1566. }
  1567. }
  1568. }
  1569. int wolfSSL_get_ciphers(char* buf, int len)
  1570. {
  1571. const CipherSuiteInfo* ciphers = GetCipherNames();
  1572. int ciphersSz = GetCipherNamesSize();
  1573. int i;
  1574. if (buf == NULL || len <= 0)
  1575. return BAD_FUNC_ARG;
  1576. /* Add each member to the buffer delimited by a : */
  1577. for (i = 0; i < ciphersSz; i++) {
  1578. int cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  1579. if (cipherNameSz + 1 < len) {
  1580. XSTRNCPY(buf, ciphers[i].name, len);
  1581. buf += cipherNameSz;
  1582. if (i < ciphersSz - 1)
  1583. *buf++ = ':';
  1584. *buf = 0;
  1585. len -= cipherNameSz + 1;
  1586. }
  1587. else
  1588. return BUFFER_E;
  1589. }
  1590. return WOLFSSL_SUCCESS;
  1591. }
  1592. #ifndef NO_ERROR_STRINGS
  1593. /* places a list of all supported cipher suites in TLS_* format into "buf"
  1594. * return WOLFSSL_SUCCESS on success */
  1595. int wolfSSL_get_ciphers_iana(char* buf, int len)
  1596. {
  1597. const CipherSuiteInfo* ciphers = GetCipherNames();
  1598. int ciphersSz = GetCipherNamesSize();
  1599. int i;
  1600. int cipherNameSz;
  1601. if (buf == NULL || len <= 0)
  1602. return BAD_FUNC_ARG;
  1603. /* Add each member to the buffer delimited by a : */
  1604. for (i = 0; i < ciphersSz; i++) {
  1605. #ifndef NO_CIPHER_SUITE_ALIASES
  1606. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  1607. continue;
  1608. #endif
  1609. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  1610. if (cipherNameSz + 1 < len) {
  1611. XSTRNCPY(buf, ciphers[i].name_iana, len);
  1612. buf += cipherNameSz;
  1613. if (i < ciphersSz - 1)
  1614. *buf++ = ':';
  1615. *buf = 0;
  1616. len -= cipherNameSz + 1;
  1617. }
  1618. else
  1619. return BUFFER_E;
  1620. }
  1621. return WOLFSSL_SUCCESS;
  1622. }
  1623. #endif /* NO_ERROR_STRINGS */
  1624. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  1625. {
  1626. const char* cipher;
  1627. if (ssl == NULL)
  1628. return NULL;
  1629. cipher = wolfSSL_get_cipher_name_iana(ssl);
  1630. len = min(len, (int)(XSTRLEN(cipher) + 1));
  1631. XMEMCPY(buf, cipher, len);
  1632. return buf;
  1633. }
  1634. int wolfSSL_get_fd(const WOLFSSL* ssl)
  1635. {
  1636. int fd = -1;
  1637. WOLFSSL_ENTER("wolfSSL_get_fd");
  1638. if (ssl) {
  1639. fd = ssl->rfd;
  1640. }
  1641. WOLFSSL_LEAVE("wolfSSL_get_fd", fd);
  1642. return fd;
  1643. }
  1644. int wolfSSL_dtls(WOLFSSL* ssl)
  1645. {
  1646. int dtlsOpt = 0;
  1647. if (ssl)
  1648. dtlsOpt = ssl->options.dtls;
  1649. return dtlsOpt;
  1650. }
  1651. #if !defined(NO_CERTS)
  1652. /* Set whether mutual authentication is required for connections.
  1653. * Server side only.
  1654. *
  1655. * ctx The SSL/TLS CTX object.
  1656. * req 1 to indicate required and 0 when not.
  1657. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  1658. * 0 on success.
  1659. */
  1660. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  1661. {
  1662. if (ctx == NULL)
  1663. return BAD_FUNC_ARG;
  1664. if (ctx->method->side == WOLFSSL_CLIENT_END)
  1665. return SIDE_ERROR;
  1666. ctx->mutualAuth = (byte)req;
  1667. return 0;
  1668. }
  1669. /* Set whether mutual authentication is required for the connection.
  1670. * Server side only.
  1671. *
  1672. * ssl The SSL/TLS object.
  1673. * req 1 to indicate required and 0 when not.
  1674. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  1675. * SIDE_ERROR when not a client and 0 on success.
  1676. */
  1677. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  1678. {
  1679. if (ssl == NULL)
  1680. return BAD_FUNC_ARG;
  1681. if (ssl->options.side == WOLFSSL_SERVER_END)
  1682. return SIDE_ERROR;
  1683. ssl->options.mutualAuth = (word16)req;
  1684. return 0;
  1685. }
  1686. #endif /* NO_CERTS */
  1687. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  1688. int wolfSSL_CTX_set_AcceptFilter(
  1689. WOLFSSL_CTX *ctx,
  1690. NetworkFilterCallback_t AcceptFilter,
  1691. void *AcceptFilter_arg)
  1692. {
  1693. if (ctx == NULL)
  1694. return BAD_FUNC_ARG;
  1695. ctx->AcceptFilter = AcceptFilter;
  1696. ctx->AcceptFilter_arg = AcceptFilter_arg;
  1697. return 0;
  1698. }
  1699. int wolfSSL_set_AcceptFilter(
  1700. WOLFSSL *ssl,
  1701. NetworkFilterCallback_t AcceptFilter,
  1702. void *AcceptFilter_arg)
  1703. {
  1704. if (ssl == NULL)
  1705. return BAD_FUNC_ARG;
  1706. ssl->AcceptFilter = AcceptFilter;
  1707. ssl->AcceptFilter_arg = AcceptFilter_arg;
  1708. return 0;
  1709. }
  1710. int wolfSSL_CTX_set_ConnectFilter(
  1711. WOLFSSL_CTX *ctx,
  1712. NetworkFilterCallback_t ConnectFilter,
  1713. void *ConnectFilter_arg)
  1714. {
  1715. if (ctx == NULL)
  1716. return BAD_FUNC_ARG;
  1717. ctx->ConnectFilter = ConnectFilter;
  1718. ctx->ConnectFilter_arg = ConnectFilter_arg;
  1719. return 0;
  1720. }
  1721. int wolfSSL_set_ConnectFilter(
  1722. WOLFSSL *ssl,
  1723. NetworkFilterCallback_t ConnectFilter,
  1724. void *ConnectFilter_arg)
  1725. {
  1726. if (ssl == NULL)
  1727. return BAD_FUNC_ARG;
  1728. ssl->ConnectFilter = ConnectFilter;
  1729. ssl->ConnectFilter_arg = ConnectFilter_arg;
  1730. return 0;
  1731. }
  1732. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  1733. #ifndef WOLFSSL_LEANPSK
  1734. #if defined(WOLFSSL_DTLS) && defined(XINET_PTON) && \
  1735. !defined(WOLFSSL_NO_SOCK) && defined(HAVE_SOCKADDR)
  1736. void* wolfSSL_dtls_create_peer(int port, char* ip)
  1737. {
  1738. SOCKADDR_IN *addr;
  1739. addr = (SOCKADDR_IN*)XMALLOC(sizeof(*addr), NULL,
  1740. DYNAMIC_TYPE_SOCKADDR);
  1741. if (addr == NULL) {
  1742. return NULL;
  1743. }
  1744. addr->sin_family = AF_INET;
  1745. addr->sin_port = XHTONS((word16)port);
  1746. if (XINET_PTON(AF_INET, ip, &addr->sin_addr) < 1) {
  1747. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1748. return NULL;
  1749. }
  1750. return addr;
  1751. }
  1752. int wolfSSL_dtls_free_peer(void* addr)
  1753. {
  1754. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1755. return WOLFSSL_SUCCESS;
  1756. }
  1757. #endif
  1758. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  1759. {
  1760. #ifdef WOLFSSL_DTLS
  1761. void* sa;
  1762. if (ssl == NULL)
  1763. return WOLFSSL_FAILURE;
  1764. if (peer == NULL || peerSz == 0) {
  1765. if (ssl->buffers.dtlsCtx.peer.sa != NULL)
  1766. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1767. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1768. ssl->buffers.dtlsCtx.peer.sz = 0;
  1769. ssl->buffers.dtlsCtx.peer.bufSz = 0;
  1770. ssl->buffers.dtlsCtx.userSet = 0;
  1771. return WOLFSSL_SUCCESS;
  1772. }
  1773. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  1774. if (sa != NULL) {
  1775. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1776. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1777. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1778. }
  1779. XMEMCPY(sa, peer, peerSz);
  1780. ssl->buffers.dtlsCtx.peer.sa = sa;
  1781. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  1782. ssl->buffers.dtlsCtx.peer.bufSz = peerSz;
  1783. ssl->buffers.dtlsCtx.userSet = 1;
  1784. return WOLFSSL_SUCCESS;
  1785. }
  1786. return WOLFSSL_FAILURE;
  1787. #else
  1788. (void)ssl;
  1789. (void)peer;
  1790. (void)peerSz;
  1791. return WOLFSSL_NOT_IMPLEMENTED;
  1792. #endif
  1793. }
  1794. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  1795. {
  1796. #ifdef WOLFSSL_DTLS
  1797. if (ssl == NULL) {
  1798. return WOLFSSL_FAILURE;
  1799. }
  1800. if (peer != NULL && peerSz != NULL
  1801. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  1802. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1803. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  1804. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  1805. return WOLFSSL_SUCCESS;
  1806. }
  1807. return WOLFSSL_FAILURE;
  1808. #else
  1809. (void)ssl;
  1810. (void)peer;
  1811. (void)peerSz;
  1812. return WOLFSSL_NOT_IMPLEMENTED;
  1813. #endif
  1814. }
  1815. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  1816. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  1817. {
  1818. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp");
  1819. if (ctx == NULL)
  1820. return BAD_FUNC_ARG;
  1821. ctx->dtlsSctp = 1;
  1822. return WOLFSSL_SUCCESS;
  1823. }
  1824. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  1825. {
  1826. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp");
  1827. if (ssl == NULL)
  1828. return BAD_FUNC_ARG;
  1829. ssl->options.dtlsSctp = 1;
  1830. return WOLFSSL_SUCCESS;
  1831. }
  1832. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  1833. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  1834. defined(WOLFSSL_DTLS)
  1835. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  1836. {
  1837. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  1838. return BAD_FUNC_ARG;
  1839. ctx->dtlsMtuSz = newMtu;
  1840. return WOLFSSL_SUCCESS;
  1841. }
  1842. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  1843. {
  1844. if (ssl == NULL)
  1845. return BAD_FUNC_ARG;
  1846. if (newMtu > MAX_RECORD_SIZE) {
  1847. ssl->error = BAD_FUNC_ARG;
  1848. return WOLFSSL_FAILURE;
  1849. }
  1850. ssl->dtlsMtuSz = newMtu;
  1851. return WOLFSSL_SUCCESS;
  1852. }
  1853. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  1854. #ifdef WOLFSSL_SRTP
  1855. static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = {
  1856. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits
  1857. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1858. {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) },
  1859. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits
  1860. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1861. {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) },
  1862. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */
  1863. {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)},
  1864. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */
  1865. {"SRTP_NULL_SHA1_32", SRTP_NULL_SHA1_32, ((112 * 2) / 8)},
  1866. /* AES GCM 128, Salt: 96-bits, Auth GCM Tag 128-bits
  1867. * (master_key:128bits + master_salt:96bits) * 2 = 448 bits (56) */
  1868. {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM, (((128 + 96) * 2) / 8) },
  1869. /* AES GCM 256, Salt: 96-bits, Auth GCM Tag 128-bits
  1870. * (master_key:256bits + master_salt:96bits) * 2 = 704 bits (88) */
  1871. {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM, (((256 + 96) * 2) / 8) },
  1872. };
  1873. static const WOLFSSL_SRTP_PROTECTION_PROFILE* DtlsSrtpFindProfile(
  1874. const char* profile_str, word32 profile_str_len, unsigned long id)
  1875. {
  1876. int i;
  1877. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1878. for (i=0;
  1879. i<(int)(sizeof(gSrtpProfiles)/sizeof(WOLFSSL_SRTP_PROTECTION_PROFILE));
  1880. i++) {
  1881. if (profile_str != NULL) {
  1882. word32 srtp_profile_len = (word32)XSTRLEN(gSrtpProfiles[i].name);
  1883. if (srtp_profile_len == profile_str_len &&
  1884. XMEMCMP(gSrtpProfiles[i].name, profile_str, profile_str_len)
  1885. == 0) {
  1886. profile = &gSrtpProfiles[i];
  1887. break;
  1888. }
  1889. }
  1890. else if (id != 0 && gSrtpProfiles[i].id == id) {
  1891. profile = &gSrtpProfiles[i];
  1892. break;
  1893. }
  1894. }
  1895. return profile;
  1896. }
  1897. /* profile_str: accepts ":" colon separated list of SRTP profiles */
  1898. static int DtlsSrtpSelProfiles(word16* id, const char* profile_str)
  1899. {
  1900. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile;
  1901. const char *current, *next = NULL;
  1902. word32 length = 0, current_length;
  1903. *id = 0; /* reset destination ID's */
  1904. if (profile_str == NULL) {
  1905. return WOLFSSL_FAILURE;
  1906. }
  1907. /* loop on end of line or colon ":" */
  1908. next = profile_str;
  1909. length = (word32)XSTRLEN(profile_str);
  1910. do {
  1911. current = next;
  1912. next = XSTRSTR(current, ":");
  1913. if (next) {
  1914. current_length = (word32)(next - current);
  1915. ++next; /* ++ needed to skip ':' */
  1916. } else {
  1917. current_length = (word32)XSTRLEN(current);
  1918. }
  1919. if (current_length < length)
  1920. length = current_length;
  1921. profile = DtlsSrtpFindProfile(current, current_length, 0);
  1922. if (profile != NULL) {
  1923. *id |= (1 << profile->id); /* selected bit based on ID */
  1924. }
  1925. } while (next != NULL);
  1926. return WOLFSSL_SUCCESS;
  1927. }
  1928. int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char* profile_str)
  1929. {
  1930. int ret = WOLFSSL_FAILURE;
  1931. if (ctx != NULL) {
  1932. ret = DtlsSrtpSelProfiles(&ctx->dtlsSrtpProfiles, profile_str);
  1933. }
  1934. return ret;
  1935. }
  1936. int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char* profile_str)
  1937. {
  1938. int ret = WOLFSSL_FAILURE;
  1939. if (ssl != NULL) {
  1940. ret = DtlsSrtpSelProfiles(&ssl->dtlsSrtpProfiles, profile_str);
  1941. }
  1942. return ret;
  1943. }
  1944. const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(
  1945. WOLFSSL* ssl)
  1946. {
  1947. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1948. if (ssl) {
  1949. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1950. }
  1951. return profile;
  1952. }
  1953. #ifndef NO_WOLFSSL_STUB
  1954. WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* wolfSSL_get_srtp_profiles(
  1955. WOLFSSL* ssl)
  1956. {
  1957. /* Not yet implemented - should return list of available SRTP profiles
  1958. * ssl->dtlsSrtpProfiles */
  1959. (void)ssl;
  1960. return NULL;
  1961. }
  1962. #endif
  1963. #define DTLS_SRTP_KEYING_MATERIAL_LABEL "EXTRACTOR-dtls_srtp"
  1964. int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl,
  1965. unsigned char* out, size_t* olen)
  1966. {
  1967. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1968. if (ssl == NULL || olen == NULL) {
  1969. return BAD_FUNC_ARG;
  1970. }
  1971. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1972. if (profile == NULL) {
  1973. WOLFSSL_MSG("Not using DTLS SRTP");
  1974. return EXT_MISSING;
  1975. }
  1976. if (out == NULL) {
  1977. *olen = profile->kdfBits;
  1978. return LENGTH_ONLY_E;
  1979. }
  1980. if (*olen < (size_t)profile->kdfBits) {
  1981. return BUFFER_E;
  1982. }
  1983. return wolfSSL_export_keying_material(ssl, out, profile->kdfBits,
  1984. DTLS_SRTP_KEYING_MATERIAL_LABEL,
  1985. XSTR_SIZEOF(DTLS_SRTP_KEYING_MATERIAL_LABEL), NULL, 0, 0);
  1986. }
  1987. #endif /* WOLFSSL_SRTP */
  1988. #ifdef WOLFSSL_DTLS_DROP_STATS
  1989. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  1990. word32* macDropCount, word32* replayDropCount)
  1991. {
  1992. int ret;
  1993. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats");
  1994. if (ssl == NULL)
  1995. ret = BAD_FUNC_ARG;
  1996. else {
  1997. ret = WOLFSSL_SUCCESS;
  1998. if (macDropCount != NULL)
  1999. *macDropCount = ssl->macDropCount;
  2000. if (replayDropCount != NULL)
  2001. *replayDropCount = ssl->replayDropCount;
  2002. }
  2003. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats", ret);
  2004. return ret;
  2005. }
  2006. #endif /* WOLFSSL_DTLS_DROP_STATS */
  2007. #if defined(WOLFSSL_MULTICAST)
  2008. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  2009. {
  2010. int ret = 0;
  2011. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id");
  2012. if (ctx == NULL || id > 255)
  2013. ret = BAD_FUNC_ARG;
  2014. if (ret == 0) {
  2015. ctx->haveEMS = 0;
  2016. ctx->haveMcast = 1;
  2017. ctx->mcastID = (byte)id;
  2018. #ifndef WOLFSSL_USER_IO
  2019. ctx->CBIORecv = EmbedReceiveFromMcast;
  2020. #endif /* WOLFSSL_USER_IO */
  2021. ret = WOLFSSL_SUCCESS;
  2022. }
  2023. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id", ret);
  2024. return ret;
  2025. }
  2026. int wolfSSL_mcast_get_max_peers(void)
  2027. {
  2028. return WOLFSSL_MULTICAST_PEERS;
  2029. }
  2030. #ifdef WOLFSSL_DTLS
  2031. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  2032. word32 second, word32 high)
  2033. {
  2034. word32 newCur = 0;
  2035. if (cur < first)
  2036. newCur = first;
  2037. else if (cur < second)
  2038. newCur = second;
  2039. else if (cur < high)
  2040. newCur = high;
  2041. return newCur;
  2042. }
  2043. #endif /* WOLFSSL_DTLS */
  2044. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  2045. const byte* preMasterSecret, word32 preMasterSz,
  2046. const byte* clientRandom, const byte* serverRandom,
  2047. const byte* suite)
  2048. {
  2049. int ret = 0;
  2050. WOLFSSL_ENTER("wolfSSL_set_secret");
  2051. if (ssl == NULL || preMasterSecret == NULL ||
  2052. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  2053. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  2054. ret = BAD_FUNC_ARG;
  2055. }
  2056. if (ret == 0 && ssl->arrays->preMasterSecret == NULL) {
  2057. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  2058. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  2059. DYNAMIC_TYPE_SECRET);
  2060. if (ssl->arrays->preMasterSecret == NULL) {
  2061. ret = MEMORY_E;
  2062. }
  2063. }
  2064. if (ret == 0) {
  2065. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  2066. XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz);
  2067. ssl->arrays->preMasterSz = preMasterSz;
  2068. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  2069. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  2070. ssl->options.cipherSuite0 = suite[0];
  2071. ssl->options.cipherSuite = suite[1];
  2072. ret = SetCipherSpecs(ssl);
  2073. }
  2074. if (ret == 0)
  2075. ret = MakeTlsMasterSecret(ssl);
  2076. if (ret == 0) {
  2077. ssl->keys.encryptionOn = 1;
  2078. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  2079. }
  2080. if (ret == 0) {
  2081. if (ssl->options.dtls) {
  2082. #ifdef WOLFSSL_DTLS
  2083. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  2084. int i;
  2085. ssl->keys.dtls_epoch = epoch;
  2086. for (i = 0, peerSeq = ssl->keys.peerSeq;
  2087. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  2088. i++, peerSeq++) {
  2089. peerSeq->nextEpoch = epoch;
  2090. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  2091. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  2092. peerSeq->nextSeq_lo = 0;
  2093. peerSeq->nextSeq_hi = 0;
  2094. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  2095. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  2096. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  2097. ssl->ctx->mcastFirstSeq,
  2098. ssl->ctx->mcastSecondSeq,
  2099. ssl->ctx->mcastMaxSeq);
  2100. }
  2101. #else
  2102. (void)epoch;
  2103. #endif
  2104. }
  2105. FreeHandshakeResources(ssl);
  2106. ret = WOLFSSL_SUCCESS;
  2107. }
  2108. else {
  2109. if (ssl)
  2110. ssl->error = ret;
  2111. ret = WOLFSSL_FATAL_ERROR;
  2112. }
  2113. WOLFSSL_LEAVE("wolfSSL_set_secret", ret);
  2114. return ret;
  2115. }
  2116. #ifdef WOLFSSL_DTLS
  2117. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int sub)
  2118. {
  2119. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  2120. int ret = WOLFSSL_SUCCESS;
  2121. int i;
  2122. WOLFSSL_ENTER("wolfSSL_mcast_peer_add");
  2123. if (ssl == NULL || peerId > 255)
  2124. return BAD_FUNC_ARG;
  2125. if (!sub) {
  2126. /* Make sure it isn't already present, while keeping the first
  2127. * open spot. */
  2128. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2129. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  2130. p = &ssl->keys.peerSeq[i];
  2131. if (ssl->keys.peerSeq[i].peerId == peerId) {
  2132. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  2133. p = NULL;
  2134. }
  2135. }
  2136. if (p != NULL) {
  2137. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  2138. p->peerId = peerId;
  2139. p->highwaterMark = UpdateHighwaterMark(0,
  2140. ssl->ctx->mcastFirstSeq,
  2141. ssl->ctx->mcastSecondSeq,
  2142. ssl->ctx->mcastMaxSeq);
  2143. }
  2144. else {
  2145. WOLFSSL_MSG("No room in peer list.");
  2146. ret = -1;
  2147. }
  2148. }
  2149. else {
  2150. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2151. if (ssl->keys.peerSeq[i].peerId == peerId)
  2152. p = &ssl->keys.peerSeq[i];
  2153. }
  2154. if (p != NULL) {
  2155. p->peerId = INVALID_PEER_ID;
  2156. }
  2157. else {
  2158. WOLFSSL_MSG("Peer not found in list.");
  2159. }
  2160. }
  2161. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add", ret);
  2162. return ret;
  2163. }
  2164. /* If peerId is in the list of peers and its last sequence number is non-zero,
  2165. * return 1, otherwise return 0. */
  2166. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  2167. {
  2168. int known = 0;
  2169. int i;
  2170. WOLFSSL_ENTER("wolfSSL_mcast_peer_known");
  2171. if (ssl == NULL || peerId > 255) {
  2172. return BAD_FUNC_ARG;
  2173. }
  2174. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2175. if (ssl->keys.peerSeq[i].peerId == peerId) {
  2176. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  2177. ssl->keys.peerSeq[i].nextSeq_lo) {
  2178. known = 1;
  2179. }
  2180. break;
  2181. }
  2182. }
  2183. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known", known);
  2184. return known;
  2185. }
  2186. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  2187. word32 first, word32 second,
  2188. CallbackMcastHighwater cb)
  2189. {
  2190. if (ctx == NULL || (second && first > second) ||
  2191. first > maxSeq || second > maxSeq || cb == NULL) {
  2192. return BAD_FUNC_ARG;
  2193. }
  2194. ctx->mcastHwCb = cb;
  2195. ctx->mcastFirstSeq = first;
  2196. ctx->mcastSecondSeq = second;
  2197. ctx->mcastMaxSeq = maxSeq;
  2198. return WOLFSSL_SUCCESS;
  2199. }
  2200. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  2201. {
  2202. if (ssl == NULL || ctx == NULL)
  2203. return BAD_FUNC_ARG;
  2204. ssl->mcastHwCbCtx = ctx;
  2205. return WOLFSSL_SUCCESS;
  2206. }
  2207. #endif /* WOLFSSL_DTLS */
  2208. #endif /* WOLFSSL_MULTICAST */
  2209. #endif /* WOLFSSL_LEANPSK */
  2210. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  2211. int wolfSSL_negotiate(WOLFSSL* ssl)
  2212. {
  2213. int err = WOLFSSL_FATAL_ERROR;
  2214. WOLFSSL_ENTER("wolfSSL_negotiate");
  2215. if (ssl == NULL)
  2216. return WOLFSSL_FATAL_ERROR;
  2217. #ifndef NO_WOLFSSL_SERVER
  2218. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2219. #ifdef WOLFSSL_TLS13
  2220. if (IsAtLeastTLSv1_3(ssl->version))
  2221. err = wolfSSL_accept_TLSv13(ssl);
  2222. else
  2223. #endif
  2224. err = wolfSSL_accept(ssl);
  2225. }
  2226. #endif
  2227. #ifndef NO_WOLFSSL_CLIENT
  2228. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  2229. #ifdef WOLFSSL_TLS13
  2230. if (IsAtLeastTLSv1_3(ssl->version))
  2231. err = wolfSSL_connect_TLSv13(ssl);
  2232. else
  2233. #endif
  2234. err = wolfSSL_connect(ssl);
  2235. }
  2236. #endif
  2237. (void)ssl;
  2238. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  2239. return err;
  2240. }
  2241. WOLFSSL_ABI
  2242. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  2243. {
  2244. if (ssl) {
  2245. return ssl->rng;
  2246. }
  2247. return NULL;
  2248. }
  2249. #ifndef WOLFSSL_LEANPSK
  2250. /* object size based on build */
  2251. int wolfSSL_GetObjectSize(void)
  2252. {
  2253. #ifdef SHOW_SIZES
  2254. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  2255. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  2256. #ifndef NO_RC4
  2257. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  2258. #endif
  2259. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  2260. #ifndef NO_DES3
  2261. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  2262. #endif
  2263. #ifdef HAVE_CHACHA
  2264. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  2265. #endif
  2266. #ifdef WOLFSSL_SM4
  2267. printf("\tsizeof sm4 = %lu\n", (unsigned long)sizeof(Sm4));
  2268. #endif
  2269. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  2270. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  2271. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  2272. #ifndef NO_MD5
  2273. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  2274. #endif
  2275. #ifndef NO_SHA
  2276. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  2277. #endif
  2278. #ifdef WOLFSSL_SHA224
  2279. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  2280. #endif
  2281. #ifndef NO_SHA256
  2282. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  2283. #endif
  2284. #ifdef WOLFSSL_SHA384
  2285. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  2286. #endif
  2287. #ifdef WOLFSSL_SHA384
  2288. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  2289. #endif
  2290. #ifdef WOLFSSL_SM3
  2291. printf("\tsizeof sm3 = %lu\n", (unsigned long)sizeof(Sm3));
  2292. #endif
  2293. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  2294. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  2295. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  2296. #ifndef NO_RSA
  2297. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  2298. #endif
  2299. #ifdef HAVE_ECC
  2300. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  2301. #endif
  2302. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  2303. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  2304. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  2305. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  2306. #endif
  2307. return sizeof(WOLFSSL);
  2308. }
  2309. int wolfSSL_CTX_GetObjectSize(void)
  2310. {
  2311. return sizeof(WOLFSSL_CTX);
  2312. }
  2313. int wolfSSL_METHOD_GetObjectSize(void)
  2314. {
  2315. return sizeof(WOLFSSL_METHOD);
  2316. }
  2317. #endif
  2318. #ifdef WOLFSSL_STATIC_MEMORY
  2319. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  2320. unsigned char* buf, unsigned int sz,
  2321. int flag, int maxSz)
  2322. {
  2323. WOLFSSL_HEAP* heap;
  2324. WOLFSSL_HEAP_HINT* hint;
  2325. word32 idx = 0;
  2326. if (ctx == NULL || buf == NULL) {
  2327. return BAD_FUNC_ARG;
  2328. }
  2329. if (*ctx == NULL && method == NULL) {
  2330. return BAD_FUNC_ARG;
  2331. }
  2332. if (*ctx == NULL || (*ctx)->heap == NULL) {
  2333. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  2334. return BUFFER_E; /* not enough memory for structures */
  2335. }
  2336. heap = (WOLFSSL_HEAP*)buf;
  2337. idx += sizeof(WOLFSSL_HEAP);
  2338. if (wolfSSL_init_memory_heap(heap) != 0) {
  2339. return WOLFSSL_FAILURE;
  2340. }
  2341. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  2342. idx += sizeof(WOLFSSL_HEAP_HINT);
  2343. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  2344. hint->memory = heap;
  2345. if (*ctx && (*ctx)->heap == NULL) {
  2346. (*ctx)->heap = (void*)hint;
  2347. }
  2348. }
  2349. else {
  2350. #ifdef WOLFSSL_HEAP_TEST
  2351. /* do not load in memory if test has been set */
  2352. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  2353. return WOLFSSL_SUCCESS;
  2354. }
  2355. #endif
  2356. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  2357. heap = hint->memory;
  2358. }
  2359. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  2360. WOLFSSL_MSG("Error partitioning memory");
  2361. return WOLFSSL_FAILURE;
  2362. }
  2363. /* create ctx if needed */
  2364. if (*ctx == NULL) {
  2365. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  2366. if (*ctx == NULL) {
  2367. WOLFSSL_MSG("Error creating ctx");
  2368. return WOLFSSL_FAILURE;
  2369. }
  2370. }
  2371. /* determine what max applies too */
  2372. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  2373. heap->maxIO = maxSz;
  2374. }
  2375. else { /* general memory used in handshakes */
  2376. heap->maxHa = maxSz;
  2377. }
  2378. heap->flag |= flag;
  2379. (void)maxSz;
  2380. (void)method;
  2381. return WOLFSSL_SUCCESS;
  2382. }
  2383. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  2384. {
  2385. if (ssl == NULL) {
  2386. return BAD_FUNC_ARG;
  2387. }
  2388. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  2389. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  2390. if (mem_stats != NULL && ssl->heap != NULL) {
  2391. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  2392. WOLFSSL_HEAP* heap = hint->memory;
  2393. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  2394. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  2395. }
  2396. }
  2397. return (ssl->heap) ? 1 : 0;
  2398. }
  2399. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  2400. {
  2401. if (ctx == NULL) {
  2402. return BAD_FUNC_ARG;
  2403. }
  2404. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  2405. /* fill out statistics if wanted */
  2406. if (mem_stats != NULL && ctx->heap != NULL) {
  2407. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  2408. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  2409. return MEMORY_E;
  2410. }
  2411. }
  2412. return (ctx->heap) ? 1 : 0;
  2413. }
  2414. #endif /* WOLFSSL_STATIC_MEMORY */
  2415. /* return max record layer size plaintext input size */
  2416. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  2417. {
  2418. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  2419. if (ssl == NULL)
  2420. return BAD_FUNC_ARG;
  2421. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2422. WOLFSSL_MSG("Handshake not complete yet");
  2423. return BAD_FUNC_ARG;
  2424. }
  2425. return wolfSSL_GetMaxFragSize(ssl, OUTPUT_RECORD_SIZE);
  2426. }
  2427. /* return record layer size of plaintext input size */
  2428. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  2429. {
  2430. int maxSize;
  2431. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  2432. if (inSz < 0)
  2433. return BAD_FUNC_ARG;
  2434. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  2435. if (maxSize < 0)
  2436. return maxSize; /* error */
  2437. if (inSz > maxSize)
  2438. return INPUT_SIZE_E;
  2439. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  2440. }
  2441. #ifdef HAVE_ECC
  2442. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  2443. {
  2444. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  2445. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  2446. return BAD_FUNC_ARG;
  2447. }
  2448. ctx->minEccKeySz = keySz / 8;
  2449. #ifndef NO_CERTS
  2450. ctx->cm->minEccKeySz = keySz / 8;
  2451. #endif
  2452. return WOLFSSL_SUCCESS;
  2453. }
  2454. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  2455. {
  2456. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  2457. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  2458. return BAD_FUNC_ARG;
  2459. }
  2460. ssl->options.minEccKeySz = keySz / 8;
  2461. return WOLFSSL_SUCCESS;
  2462. }
  2463. #endif /* HAVE_ECC */
  2464. #ifndef NO_RSA
  2465. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  2466. {
  2467. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  2468. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  2469. return BAD_FUNC_ARG;
  2470. }
  2471. ctx->minRsaKeySz = keySz / 8;
  2472. ctx->cm->minRsaKeySz = keySz / 8;
  2473. return WOLFSSL_SUCCESS;
  2474. }
  2475. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  2476. {
  2477. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  2478. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  2479. return BAD_FUNC_ARG;
  2480. }
  2481. ssl->options.minRsaKeySz = keySz / 8;
  2482. return WOLFSSL_SUCCESS;
  2483. }
  2484. #endif /* !NO_RSA */
  2485. #ifndef NO_DH
  2486. #ifdef OPENSSL_EXTRA
  2487. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  2488. {
  2489. int pSz, gSz;
  2490. byte *p, *g;
  2491. int ret = 0;
  2492. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  2493. if (!ssl || !dh)
  2494. return BAD_FUNC_ARG;
  2495. /* Get needed size for p and g */
  2496. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  2497. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  2498. if (pSz <= 0 || gSz <= 0)
  2499. return -1;
  2500. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2501. if (!p)
  2502. return MEMORY_E;
  2503. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2504. if (!g) {
  2505. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2506. return MEMORY_E;
  2507. }
  2508. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  2509. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  2510. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  2511. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  2512. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2513. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2514. return pSz > 0 && gSz > 0 ? ret : -1;
  2515. }
  2516. #endif /* OPENSSL_EXTRA */
  2517. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  2518. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  2519. const unsigned char* g, int gSz)
  2520. {
  2521. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  2522. if (ssl == NULL || p == NULL || g == NULL)
  2523. return BAD_FUNC_ARG;
  2524. if ((word16)pSz < ssl->options.minDhKeySz)
  2525. return DH_KEY_SIZE_E;
  2526. if ((word16)pSz > ssl->options.maxDhKeySz)
  2527. return DH_KEY_SIZE_E;
  2528. /* this function is for server only */
  2529. if (ssl->options.side == WOLFSSL_CLIENT_END)
  2530. return SIDE_ERROR;
  2531. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2532. !defined(HAVE_SELFTEST)
  2533. ssl->options.dhKeyTested = 0;
  2534. ssl->options.dhDoKeyTest = 1;
  2535. #endif
  2536. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  2537. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2538. ssl->buffers.serverDH_P.buffer = NULL;
  2539. }
  2540. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  2541. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2542. ssl->buffers.serverDH_G.buffer = NULL;
  2543. }
  2544. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  2545. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  2546. DYNAMIC_TYPE_PUBLIC_KEY);
  2547. if (ssl->buffers.serverDH_P.buffer == NULL)
  2548. return MEMORY_E;
  2549. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  2550. DYNAMIC_TYPE_PUBLIC_KEY);
  2551. if (ssl->buffers.serverDH_G.buffer == NULL) {
  2552. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2553. ssl->buffers.serverDH_P.buffer = NULL;
  2554. return MEMORY_E;
  2555. }
  2556. ssl->buffers.serverDH_P.length = pSz;
  2557. ssl->buffers.serverDH_G.length = gSz;
  2558. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  2559. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  2560. ssl->options.haveDH = 1;
  2561. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  2562. word16 havePSK;
  2563. word16 haveRSA;
  2564. int keySz = 0;
  2565. int ret;
  2566. #ifndef NO_PSK
  2567. havePSK = ssl->options.havePSK;
  2568. #else
  2569. havePSK = 0;
  2570. #endif
  2571. #ifdef NO_RSA
  2572. haveRSA = 0;
  2573. #else
  2574. haveRSA = 1;
  2575. #endif
  2576. #ifndef NO_CERTS
  2577. keySz = ssl->buffers.keySz;
  2578. #endif
  2579. ret = AllocateSuites(ssl);
  2580. if (ret != 0)
  2581. return ret;
  2582. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  2583. ssl->options.haveDH, ssl->options.haveECDSAsig,
  2584. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  2585. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  2586. ssl->options.useAnon, TRUE, ssl->options.side);
  2587. }
  2588. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  2589. return WOLFSSL_SUCCESS;
  2590. }
  2591. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2592. !defined(HAVE_SELFTEST)
  2593. /* Enables or disables the session's DH key prime test. */
  2594. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  2595. {
  2596. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  2597. if (ssl == NULL)
  2598. return BAD_FUNC_ARG;
  2599. if (!enable)
  2600. ssl->options.dhDoKeyTest = 0;
  2601. else
  2602. ssl->options.dhDoKeyTest = 1;
  2603. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  2604. return WOLFSSL_SUCCESS;
  2605. }
  2606. #endif
  2607. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  2608. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  2609. const unsigned char* g, int gSz)
  2610. {
  2611. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  2612. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  2613. if ((word16)pSz < ctx->minDhKeySz)
  2614. return DH_KEY_SIZE_E;
  2615. if ((word16)pSz > ctx->maxDhKeySz)
  2616. return DH_KEY_SIZE_E;
  2617. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2618. !defined(HAVE_SELFTEST)
  2619. {
  2620. WC_RNG rng;
  2621. int error, freeKey = 0;
  2622. #ifdef WOLFSSL_SMALL_STACK
  2623. DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  2624. if (checkKey == NULL)
  2625. return MEMORY_E;
  2626. #else
  2627. DhKey checkKey[1];
  2628. #endif
  2629. error = wc_InitRng(&rng);
  2630. if (!error)
  2631. error = wc_InitDhKey(checkKey);
  2632. if (!error) {
  2633. freeKey = 1;
  2634. error = wc_DhSetCheckKey(checkKey,
  2635. p, pSz, g, gSz, NULL, 0, 0, &rng);
  2636. }
  2637. if (freeKey)
  2638. wc_FreeDhKey(checkKey);
  2639. #ifdef WOLFSSL_SMALL_STACK
  2640. XFREE(checkKey, NULL, DYNAMIC_TYPE_DH);
  2641. #endif
  2642. wc_FreeRng(&rng);
  2643. if (error)
  2644. return error;
  2645. ctx->dhKeyTested = 1;
  2646. }
  2647. #endif
  2648. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2649. ctx->serverDH_P.buffer = NULL;
  2650. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2651. ctx->serverDH_G.buffer = NULL;
  2652. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2653. if (ctx->serverDH_P.buffer == NULL)
  2654. return MEMORY_E;
  2655. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2656. if (ctx->serverDH_G.buffer == NULL) {
  2657. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2658. ctx->serverDH_P.buffer = NULL;
  2659. return MEMORY_E;
  2660. }
  2661. ctx->serverDH_P.length = pSz;
  2662. ctx->serverDH_G.length = gSz;
  2663. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  2664. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  2665. ctx->haveDH = 1;
  2666. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  2667. return WOLFSSL_SUCCESS;
  2668. }
  2669. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  2670. {
  2671. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2672. return BAD_FUNC_ARG;
  2673. ctx->minDhKeySz = keySz_bits / 8;
  2674. return WOLFSSL_SUCCESS;
  2675. }
  2676. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  2677. {
  2678. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2679. return BAD_FUNC_ARG;
  2680. ssl->options.minDhKeySz = keySz_bits / 8;
  2681. return WOLFSSL_SUCCESS;
  2682. }
  2683. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  2684. {
  2685. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2686. return BAD_FUNC_ARG;
  2687. ctx->maxDhKeySz = keySz_bits / 8;
  2688. return WOLFSSL_SUCCESS;
  2689. }
  2690. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  2691. {
  2692. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2693. return BAD_FUNC_ARG;
  2694. ssl->options.maxDhKeySz = keySz_bits / 8;
  2695. return WOLFSSL_SUCCESS;
  2696. }
  2697. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  2698. {
  2699. if (ssl == NULL)
  2700. return BAD_FUNC_ARG;
  2701. return (ssl->options.dhKeySz * 8);
  2702. }
  2703. #endif /* !NO_DH */
  2704. WOLFSSL_ABI
  2705. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  2706. {
  2707. int ret;
  2708. WOLFSSL_ENTER("wolfSSL_write");
  2709. if (ssl == NULL || data == NULL || sz < 0)
  2710. return BAD_FUNC_ARG;
  2711. #ifdef WOLFSSL_QUIC
  2712. if (WOLFSSL_IS_QUIC(ssl)) {
  2713. WOLFSSL_MSG("SSL_write() on QUIC not allowed");
  2714. return BAD_FUNC_ARG;
  2715. }
  2716. #endif
  2717. #ifdef HAVE_WRITE_DUP
  2718. { /* local variable scope */
  2719. int dupErr = 0; /* local copy */
  2720. ret = 0;
  2721. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  2722. WOLFSSL_MSG("Read dup side cannot write");
  2723. return WRITE_DUP_WRITE_E;
  2724. }
  2725. if (ssl->dupWrite) {
  2726. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  2727. return BAD_MUTEX_E;
  2728. }
  2729. dupErr = ssl->dupWrite->dupErr;
  2730. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  2731. }
  2732. if (ret != 0) {
  2733. ssl->error = ret; /* high priority fatal error */
  2734. return WOLFSSL_FATAL_ERROR;
  2735. }
  2736. if (dupErr != 0) {
  2737. WOLFSSL_MSG("Write dup error from other side");
  2738. ssl->error = dupErr;
  2739. return WOLFSSL_FATAL_ERROR;
  2740. }
  2741. }
  2742. #endif
  2743. #ifdef HAVE_ERRNO_H
  2744. errno = 0;
  2745. #endif
  2746. #ifdef OPENSSL_EXTRA
  2747. if (ssl->CBIS != NULL) {
  2748. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  2749. ssl->cbmode = SSL_CB_WRITE;
  2750. }
  2751. #endif
  2752. ret = SendData(ssl, data, sz);
  2753. WOLFSSL_LEAVE("wolfSSL_write", ret);
  2754. if (ret < 0)
  2755. return WOLFSSL_FATAL_ERROR;
  2756. else
  2757. return ret;
  2758. }
  2759. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  2760. {
  2761. int ret;
  2762. WOLFSSL_ENTER("wolfSSL_read_internal");
  2763. if (ssl == NULL || data == NULL || sz < 0)
  2764. return BAD_FUNC_ARG;
  2765. #ifdef WOLFSSL_QUIC
  2766. if (WOLFSSL_IS_QUIC(ssl)) {
  2767. WOLFSSL_MSG("SSL_read() on QUIC not allowed");
  2768. return BAD_FUNC_ARG;
  2769. }
  2770. #endif
  2771. #if defined(WOLFSSL_ERROR_CODE_OPENSSL) && defined(OPENSSL_EXTRA)
  2772. /* This additional logic is meant to simulate following openSSL behavior:
  2773. * After bidirectional SSL_shutdown complete, SSL_read returns 0 and
  2774. * SSL_get_error_code returns SSL_ERROR_ZERO_RETURN.
  2775. * This behavior is used to know the disconnect of the underlying
  2776. * transport layer.
  2777. *
  2778. * In this logic, CBIORecv is called with a read size of 0 to check the
  2779. * transport layer status. It also returns WOLFSSL_FAILURE so that
  2780. * SSL_read does not return a positive number on failure.
  2781. */
  2782. /* make sure bidirectional TLS shutdown completes */
  2783. if (ssl->error == WOLFSSL_ERROR_SYSCALL || ssl->options.shutdownDone) {
  2784. /* ask the underlying transport the connection is closed */
  2785. if (ssl->CBIORecv(ssl, (char*)data, 0, ssl->IOCB_ReadCtx) ==
  2786. WOLFSSL_CBIO_ERR_CONN_CLOSE) {
  2787. ssl->options.isClosed = 1;
  2788. ssl->error = WOLFSSL_ERROR_ZERO_RETURN;
  2789. }
  2790. return WOLFSSL_FAILURE;
  2791. }
  2792. #endif
  2793. #ifdef HAVE_WRITE_DUP
  2794. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  2795. WOLFSSL_MSG("Write dup side cannot read");
  2796. return WRITE_DUP_READ_E;
  2797. }
  2798. #endif
  2799. #ifdef HAVE_ERRNO_H
  2800. errno = 0;
  2801. #endif
  2802. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  2803. #ifdef HAVE_WRITE_DUP
  2804. if (ssl->dupWrite) {
  2805. if (ssl->error != 0 && ssl->error != WANT_READ
  2806. #ifdef WOLFSSL_ASYNC_CRYPT
  2807. && ssl->error != WC_PENDING_E
  2808. #endif
  2809. ) {
  2810. int notifyErr;
  2811. WOLFSSL_MSG("Notifying write side of fatal read error");
  2812. notifyErr = NotifyWriteSide(ssl, ssl->error);
  2813. if (notifyErr < 0) {
  2814. ret = ssl->error = notifyErr;
  2815. }
  2816. }
  2817. }
  2818. #endif
  2819. WOLFSSL_LEAVE("wolfSSL_read_internal", ret);
  2820. if (ret < 0)
  2821. return WOLFSSL_FATAL_ERROR;
  2822. else
  2823. return ret;
  2824. }
  2825. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  2826. {
  2827. WOLFSSL_ENTER("wolfSSL_peek");
  2828. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  2829. }
  2830. WOLFSSL_ABI
  2831. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  2832. {
  2833. WOLFSSL_ENTER("wolfSSL_read");
  2834. #ifdef OPENSSL_EXTRA
  2835. if (ssl == NULL) {
  2836. return BAD_FUNC_ARG;
  2837. }
  2838. if (ssl->CBIS != NULL) {
  2839. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  2840. ssl->cbmode = SSL_CB_READ;
  2841. }
  2842. #endif
  2843. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  2844. }
  2845. #ifdef WOLFSSL_MULTICAST
  2846. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  2847. {
  2848. int ret = 0;
  2849. WOLFSSL_ENTER("wolfSSL_mcast_read");
  2850. if (ssl == NULL)
  2851. return BAD_FUNC_ARG;
  2852. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  2853. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  2854. *id = ssl->keys.curPeerId;
  2855. return ret;
  2856. }
  2857. #endif /* WOLFSSL_MULTICAST */
  2858. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  2859. WOLFSSL_ABI
  2860. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  2861. {
  2862. if (ssl == NULL)
  2863. return BAD_FUNC_ARG;
  2864. ssl->devId = devId;
  2865. return WOLFSSL_SUCCESS;
  2866. }
  2867. WOLFSSL_ABI
  2868. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  2869. {
  2870. if (ctx == NULL)
  2871. return BAD_FUNC_ARG;
  2872. ctx->devId = devId;
  2873. return WOLFSSL_SUCCESS;
  2874. }
  2875. /* helpers to get device id and heap */
  2876. WOLFSSL_ABI
  2877. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2878. {
  2879. int devId = INVALID_DEVID;
  2880. if (ssl != NULL)
  2881. devId = ssl->devId;
  2882. if (ctx != NULL && devId == INVALID_DEVID)
  2883. devId = ctx->devId;
  2884. return devId;
  2885. }
  2886. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2887. {
  2888. void* heap = NULL;
  2889. if (ctx != NULL)
  2890. heap = ctx->heap;
  2891. else if (ssl != NULL)
  2892. heap = ssl->heap;
  2893. return heap;
  2894. }
  2895. #ifdef HAVE_SNI
  2896. WOLFSSL_ABI
  2897. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  2898. {
  2899. if (ssl == NULL)
  2900. return BAD_FUNC_ARG;
  2901. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  2902. }
  2903. WOLFSSL_ABI
  2904. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  2905. word16 size)
  2906. {
  2907. if (ctx == NULL)
  2908. return BAD_FUNC_ARG;
  2909. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  2910. }
  2911. #ifndef NO_WOLFSSL_SERVER
  2912. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  2913. {
  2914. if (ssl && ssl->extensions)
  2915. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  2916. }
  2917. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  2918. {
  2919. if (ctx && ctx->extensions)
  2920. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  2921. }
  2922. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  2923. {
  2924. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  2925. }
  2926. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  2927. {
  2928. if (data)
  2929. *data = NULL;
  2930. if (ssl && ssl->extensions)
  2931. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  2932. return 0;
  2933. }
  2934. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  2935. byte type, byte* sni, word32* inOutSz)
  2936. {
  2937. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  2938. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  2939. return BAD_FUNC_ARG;
  2940. }
  2941. #endif /* NO_WOLFSSL_SERVER */
  2942. #endif /* HAVE_SNI */
  2943. #ifdef HAVE_TRUSTED_CA
  2944. int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  2945. const byte* certId, word32 certIdSz)
  2946. {
  2947. if (ssl == NULL)
  2948. return BAD_FUNC_ARG;
  2949. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  2950. if (certId != NULL || certIdSz != 0)
  2951. return BAD_FUNC_ARG;
  2952. }
  2953. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  2954. if (certId == NULL || certIdSz == 0)
  2955. return BAD_FUNC_ARG;
  2956. }
  2957. #ifndef NO_SHA
  2958. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  2959. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  2960. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  2961. return BAD_FUNC_ARG;
  2962. }
  2963. #endif
  2964. else
  2965. return BAD_FUNC_ARG;
  2966. return TLSX_UseTrustedCA(&ssl->extensions,
  2967. type, certId, certIdSz, ssl->heap);
  2968. }
  2969. #endif /* HAVE_TRUSTED_CA */
  2970. #ifdef HAVE_MAX_FRAGMENT
  2971. #ifndef NO_WOLFSSL_CLIENT
  2972. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  2973. {
  2974. if (ssl == NULL)
  2975. return BAD_FUNC_ARG;
  2976. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  2977. /* The following is a non-standard way to reconfigure the max packet size
  2978. post-handshake for wolfSSL_write/wolfSSL_read */
  2979. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  2980. switch (mfl) {
  2981. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2982. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2983. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2984. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2985. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2986. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2987. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  2988. }
  2989. return WOLFSSL_SUCCESS;
  2990. }
  2991. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  2992. /* This call sets the max fragment TLS extension, which gets sent to server.
  2993. The server_hello response is what sets the `ssl->max_fragment` in
  2994. TLSX_MFL_Parse */
  2995. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  2996. }
  2997. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  2998. {
  2999. if (ctx == NULL)
  3000. return BAD_FUNC_ARG;
  3001. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  3002. }
  3003. #endif /* NO_WOLFSSL_CLIENT */
  3004. #endif /* HAVE_MAX_FRAGMENT */
  3005. #ifdef HAVE_TRUNCATED_HMAC
  3006. #ifndef NO_WOLFSSL_CLIENT
  3007. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  3008. {
  3009. if (ssl == NULL)
  3010. return BAD_FUNC_ARG;
  3011. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  3012. }
  3013. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  3014. {
  3015. if (ctx == NULL)
  3016. return BAD_FUNC_ARG;
  3017. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  3018. }
  3019. #endif /* NO_WOLFSSL_CLIENT */
  3020. #endif /* HAVE_TRUNCATED_HMAC */
  3021. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  3022. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  3023. {
  3024. WOLFSSL_ENTER("wolfSSL_UseOCSPStapling");
  3025. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  3026. return BAD_FUNC_ARG;
  3027. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  3028. options, NULL, ssl->heap, ssl->devId);
  3029. }
  3030. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  3031. byte options)
  3032. {
  3033. WOLFSSL_ENTER("wolfSSL_CTX_UseOCSPStapling");
  3034. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  3035. return BAD_FUNC_ARG;
  3036. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  3037. options, NULL, ctx->heap, ctx->devId);
  3038. }
  3039. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  3040. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  3041. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  3042. {
  3043. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  3044. return BAD_FUNC_ARG;
  3045. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  3046. options, ssl->heap, ssl->devId);
  3047. }
  3048. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  3049. byte options)
  3050. {
  3051. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  3052. return BAD_FUNC_ARG;
  3053. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  3054. options, ctx->heap, ctx->devId);
  3055. }
  3056. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  3057. /* Elliptic Curves */
  3058. #if defined(HAVE_SUPPORTED_CURVES)
  3059. static int isValidCurveGroup(word16 name)
  3060. {
  3061. switch (name) {
  3062. case WOLFSSL_ECC_SECP160K1:
  3063. case WOLFSSL_ECC_SECP160R1:
  3064. case WOLFSSL_ECC_SECP160R2:
  3065. case WOLFSSL_ECC_SECP192K1:
  3066. case WOLFSSL_ECC_SECP192R1:
  3067. case WOLFSSL_ECC_SECP224K1:
  3068. case WOLFSSL_ECC_SECP224R1:
  3069. case WOLFSSL_ECC_SECP256K1:
  3070. case WOLFSSL_ECC_SECP256R1:
  3071. case WOLFSSL_ECC_SECP384R1:
  3072. case WOLFSSL_ECC_SECP521R1:
  3073. case WOLFSSL_ECC_BRAINPOOLP256R1:
  3074. case WOLFSSL_ECC_BRAINPOOLP384R1:
  3075. case WOLFSSL_ECC_BRAINPOOLP512R1:
  3076. case WOLFSSL_ECC_SM2P256V1:
  3077. case WOLFSSL_ECC_X25519:
  3078. case WOLFSSL_ECC_X448:
  3079. case WOLFSSL_FFDHE_2048:
  3080. case WOLFSSL_FFDHE_3072:
  3081. case WOLFSSL_FFDHE_4096:
  3082. case WOLFSSL_FFDHE_6144:
  3083. case WOLFSSL_FFDHE_8192:
  3084. #ifdef HAVE_PQC
  3085. case WOLFSSL_KYBER_LEVEL1:
  3086. case WOLFSSL_KYBER_LEVEL3:
  3087. case WOLFSSL_KYBER_LEVEL5:
  3088. #ifdef HAVE_LIBOQS
  3089. case WOLFSSL_P256_KYBER_LEVEL1:
  3090. case WOLFSSL_P384_KYBER_LEVEL3:
  3091. case WOLFSSL_P521_KYBER_LEVEL5:
  3092. #endif
  3093. #endif
  3094. return 1;
  3095. default:
  3096. return 0;
  3097. }
  3098. }
  3099. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  3100. {
  3101. if (ssl == NULL || !isValidCurveGroup(name))
  3102. return BAD_FUNC_ARG;
  3103. ssl->options.userCurves = 1;
  3104. #if defined(NO_TLS)
  3105. return WOLFSSL_FAILURE;
  3106. #else
  3107. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  3108. #endif /* NO_TLS */
  3109. }
  3110. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  3111. {
  3112. if (ctx == NULL || !isValidCurveGroup(name))
  3113. return BAD_FUNC_ARG;
  3114. ctx->userCurves = 1;
  3115. #if defined(NO_TLS)
  3116. return WOLFSSL_FAILURE;
  3117. #else
  3118. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  3119. #endif /* NO_TLS */
  3120. }
  3121. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  3122. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  3123. int count)
  3124. {
  3125. int i;
  3126. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  3127. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  3128. if (count == 0) {
  3129. WOLFSSL_MSG("Group count is zero");
  3130. return WOLFSSL_FAILURE;
  3131. }
  3132. for (i = 0; i < count; i++) {
  3133. if (isValidCurveGroup((word16)groups[i])) {
  3134. _groups[i] = groups[i];
  3135. }
  3136. #ifdef HAVE_ECC
  3137. else {
  3138. /* groups may be populated with curve NIDs */
  3139. int oid = nid2oid(groups[i], oidCurveType);
  3140. int name = (int)GetCurveByOID(oid);
  3141. if (name == 0) {
  3142. WOLFSSL_MSG("Invalid group name");
  3143. return WOLFSSL_FAILURE;
  3144. }
  3145. _groups[i] = name;
  3146. }
  3147. #else
  3148. else {
  3149. WOLFSSL_MSG("Invalid group name");
  3150. return WOLFSSL_FAILURE;
  3151. }
  3152. #endif
  3153. }
  3154. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  3155. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  3156. }
  3157. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  3158. {
  3159. int i;
  3160. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  3161. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  3162. if (count == 0) {
  3163. WOLFSSL_MSG("Group count is zero");
  3164. return WOLFSSL_FAILURE;
  3165. }
  3166. for (i = 0; i < count; i++) {
  3167. if (isValidCurveGroup((word16)groups[i])) {
  3168. _groups[i] = groups[i];
  3169. }
  3170. #ifdef HAVE_ECC
  3171. else {
  3172. /* groups may be populated with curve NIDs */
  3173. int oid = nid2oid(groups[i], oidCurveType);
  3174. int name = (int)GetCurveByOID(oid);
  3175. if (name == 0) {
  3176. WOLFSSL_MSG("Invalid group name");
  3177. return WOLFSSL_FAILURE;
  3178. }
  3179. _groups[i] = name;
  3180. }
  3181. #else
  3182. else {
  3183. WOLFSSL_MSG("Invalid group name");
  3184. return WOLFSSL_FAILURE;
  3185. }
  3186. #endif
  3187. }
  3188. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  3189. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  3190. }
  3191. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  3192. #endif /* HAVE_SUPPORTED_CURVES */
  3193. /* Application-Layer Protocol Negotiation */
  3194. #ifdef HAVE_ALPN
  3195. WOLFSSL_ABI
  3196. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  3197. word32 protocol_name_listSz, byte options)
  3198. {
  3199. char *list, *ptr, **token;
  3200. word16 len;
  3201. int idx = 0;
  3202. int ret = WOLFSSL_FAILURE;
  3203. WOLFSSL_ENTER("wolfSSL_UseALPN");
  3204. if (ssl == NULL || protocol_name_list == NULL)
  3205. return BAD_FUNC_ARG;
  3206. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  3207. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  3208. WOLFSSL_MAX_ALPN_NUMBER)) {
  3209. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  3210. return BAD_FUNC_ARG;
  3211. }
  3212. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  3213. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  3214. WOLFSSL_MSG("Invalid arguments, options not supported");
  3215. return BAD_FUNC_ARG;
  3216. }
  3217. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  3218. DYNAMIC_TYPE_ALPN);
  3219. if (list == NULL) {
  3220. WOLFSSL_MSG("Memory failure");
  3221. return MEMORY_ERROR;
  3222. }
  3223. token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN);
  3224. if (token == NULL) {
  3225. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  3226. WOLFSSL_MSG("Memory failure");
  3227. return MEMORY_ERROR;
  3228. }
  3229. XMEMSET(token, 0, sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1));
  3230. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  3231. list[protocol_name_listSz] = '\0';
  3232. /* read all protocol name from the list */
  3233. token[idx] = XSTRTOK(list, ",", &ptr);
  3234. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  3235. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  3236. /* add protocol name list in the TLS extension in reverse order */
  3237. while ((idx--) > 0) {
  3238. len = (word16)XSTRLEN(token[idx]);
  3239. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  3240. ssl->heap);
  3241. if (ret != WOLFSSL_SUCCESS) {
  3242. WOLFSSL_MSG("TLSX_UseALPN failure");
  3243. break;
  3244. }
  3245. }
  3246. XFREE(token, ssl->heap, DYNAMIC_TYPE_ALPN);
  3247. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  3248. return ret;
  3249. }
  3250. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  3251. {
  3252. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  3253. (void **)protocol_name, size);
  3254. }
  3255. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  3256. {
  3257. int i, len;
  3258. char *p;
  3259. byte *s;
  3260. if (ssl == NULL || list == NULL || listSz == NULL)
  3261. return BAD_FUNC_ARG;
  3262. if (ssl->alpn_peer_requested == NULL
  3263. || ssl->alpn_peer_requested_length == 0)
  3264. return BUFFER_ERROR;
  3265. /* ssl->alpn_peer_requested are the original bytes sent in a ClientHello,
  3266. * formatted as (len-byte chars+)+. To turn n protocols into a
  3267. * comma-separated C string, one needs (n-1) commas and a final 0 byte
  3268. * which has the same length as the original.
  3269. * The returned length is the strlen() of the C string, so -1 of that. */
  3270. *listSz = ssl->alpn_peer_requested_length-1;
  3271. *list = p = (char *)XMALLOC(ssl->alpn_peer_requested_length, ssl->heap,
  3272. DYNAMIC_TYPE_TLSX);
  3273. if (p == NULL)
  3274. return MEMORY_ERROR;
  3275. for (i = 0, s = ssl->alpn_peer_requested;
  3276. i < ssl->alpn_peer_requested_length;
  3277. p += len, i += len)
  3278. {
  3279. if (i)
  3280. *p++ = ',';
  3281. len = s[i++];
  3282. /* guard against bad length bytes. */
  3283. if (i + len > ssl->alpn_peer_requested_length) {
  3284. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  3285. *list = NULL;
  3286. return WOLFSSL_FAILURE;
  3287. }
  3288. XMEMCPY(p, s + i, len);
  3289. }
  3290. *p = 0;
  3291. return WOLFSSL_SUCCESS;
  3292. }
  3293. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  3294. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  3295. {
  3296. if (ssl == NULL) {
  3297. return BAD_FUNC_ARG;
  3298. }
  3299. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  3300. *list = NULL;
  3301. return WOLFSSL_SUCCESS;
  3302. }
  3303. #endif /* HAVE_ALPN */
  3304. /* Secure Renegotiation */
  3305. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  3306. /* user is forcing ability to use secure renegotiation, we discourage it */
  3307. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  3308. {
  3309. int ret = BAD_FUNC_ARG;
  3310. #if defined(NO_TLS)
  3311. (void)ssl;
  3312. #else
  3313. if (ssl)
  3314. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  3315. if (ret == WOLFSSL_SUCCESS) {
  3316. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  3317. if (extension)
  3318. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  3319. }
  3320. #endif /* !NO_TLS */
  3321. return ret;
  3322. }
  3323. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  3324. {
  3325. if (ctx == NULL)
  3326. return BAD_FUNC_ARG;
  3327. ctx->useSecureReneg = 1;
  3328. return WOLFSSL_SUCCESS;
  3329. }
  3330. #ifdef HAVE_SECURE_RENEGOTIATION
  3331. /* do a secure renegotiation handshake, user forced, we discourage */
  3332. static int _Rehandshake(WOLFSSL* ssl)
  3333. {
  3334. int ret;
  3335. if (ssl == NULL)
  3336. return BAD_FUNC_ARG;
  3337. if (IsAtLeastTLSv1_3(ssl->version)) {
  3338. WOLFSSL_MSG("Secure Renegotiation not supported in TLS 1.3");
  3339. return SECURE_RENEGOTIATION_E;
  3340. }
  3341. if (ssl->secure_renegotiation == NULL) {
  3342. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  3343. return SECURE_RENEGOTIATION_E;
  3344. }
  3345. if (ssl->secure_renegotiation->enabled == 0) {
  3346. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  3347. return SECURE_RENEGOTIATION_E;
  3348. }
  3349. #ifdef WOLFSSL_DTLS
  3350. if (ssl->options.dtls && ssl->keys.dtls_epoch == 0xFFFF) {
  3351. WOLFSSL_MSG("Secure Renegotiation not allowed. Epoch would wrap");
  3352. return SECURE_RENEGOTIATION_E;
  3353. }
  3354. #endif
  3355. /* If the client started the renegotiation, the server will already
  3356. * have processed the client's hello. */
  3357. if (ssl->options.side != WOLFSSL_SERVER_END ||
  3358. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  3359. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  3360. if (!ssl->options.handShakeDone) {
  3361. WOLFSSL_MSG("Can't renegotiate until initial "
  3362. "handshake complete");
  3363. return SECURE_RENEGOTIATION_E;
  3364. }
  3365. else {
  3366. WOLFSSL_MSG("Renegotiation already started. "
  3367. "Moving it forward.");
  3368. ret = wolfSSL_negotiate(ssl);
  3369. if (ret == WOLFSSL_SUCCESS)
  3370. ssl->secure_rene_count++;
  3371. return ret;
  3372. }
  3373. }
  3374. /* reset handshake states */
  3375. ssl->options.sendVerify = 0;
  3376. ssl->options.serverState = NULL_STATE;
  3377. ssl->options.clientState = NULL_STATE;
  3378. ssl->options.connectState = CONNECT_BEGIN;
  3379. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  3380. ssl->options.handShakeState = NULL_STATE;
  3381. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  3382. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  3383. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  3384. #if !defined(NO_WOLFSSL_SERVER)
  3385. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3386. ret = SendHelloRequest(ssl);
  3387. if (ret != 0) {
  3388. ssl->error = ret;
  3389. return WOLFSSL_FATAL_ERROR;
  3390. }
  3391. }
  3392. #endif /* !NO_WOLFSSL_SERVER */
  3393. ret = InitHandshakeHashes(ssl);
  3394. if (ret != 0) {
  3395. ssl->error = ret;
  3396. return WOLFSSL_FATAL_ERROR;
  3397. }
  3398. }
  3399. ret = wolfSSL_negotiate(ssl);
  3400. if (ret == WOLFSSL_SUCCESS)
  3401. ssl->secure_rene_count++;
  3402. return ret;
  3403. }
  3404. /* do a secure renegotiation handshake, user forced, we discourage */
  3405. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  3406. {
  3407. int ret;
  3408. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  3409. if (ssl == NULL)
  3410. return WOLFSSL_FAILURE;
  3411. #ifdef HAVE_SESSION_TICKET
  3412. ret = WOLFSSL_SUCCESS;
  3413. #endif
  3414. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3415. /* Reset option to send certificate verify. */
  3416. ssl->options.sendVerify = 0;
  3417. /* Reset resuming flag to do full secure handshake. */
  3418. ssl->options.resuming = 0;
  3419. }
  3420. else {
  3421. /* Reset resuming flag to do full secure handshake. */
  3422. ssl->options.resuming = 0;
  3423. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_CLIENT)
  3424. /* Clearing the ticket. */
  3425. ret = wolfSSL_UseSessionTicket(ssl);
  3426. #endif
  3427. }
  3428. /* CLIENT/SERVER: Reset peer authentication for full secure handshake. */
  3429. ssl->options.peerAuthGood = 0;
  3430. #ifdef HAVE_SESSION_TICKET
  3431. if (ret == WOLFSSL_SUCCESS)
  3432. #endif
  3433. ret = _Rehandshake(ssl);
  3434. return ret;
  3435. }
  3436. #ifndef NO_WOLFSSL_CLIENT
  3437. /* do a secure resumption handshake, user forced, we discourage */
  3438. int wolfSSL_SecureResume(WOLFSSL* ssl)
  3439. {
  3440. WOLFSSL_ENTER("wolfSSL_SecureResume");
  3441. if (ssl == NULL)
  3442. return BAD_FUNC_ARG;
  3443. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3444. ssl->error = SIDE_ERROR;
  3445. return WOLFSSL_FATAL_ERROR;
  3446. }
  3447. return _Rehandshake(ssl);
  3448. }
  3449. #endif /* NO_WOLFSSL_CLIENT */
  3450. #endif /* HAVE_SECURE_RENEGOTIATION */
  3451. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  3452. {
  3453. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  3454. if (!ssl || !ssl->secure_renegotiation)
  3455. return WOLFSSL_FAILURE;
  3456. return ssl->secure_renegotiation->enabled;
  3457. }
  3458. #endif /* HAVE_SECURE_RENEGOTIATION_INFO */
  3459. #if defined(HAVE_SESSION_TICKET)
  3460. /* Session Ticket */
  3461. #if !defined(NO_WOLFSSL_SERVER)
  3462. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  3463. {
  3464. if (ctx == NULL)
  3465. return BAD_FUNC_ARG;
  3466. ctx->noTicketTls12 = 1;
  3467. return WOLFSSL_SUCCESS;
  3468. }
  3469. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  3470. {
  3471. if (ssl == NULL)
  3472. return BAD_FUNC_ARG;
  3473. ssl->options.noTicketTls12 = 1;
  3474. return WOLFSSL_SUCCESS;
  3475. }
  3476. /* WOLFSSL_SUCCESS on ok */
  3477. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  3478. {
  3479. if (ctx == NULL)
  3480. return BAD_FUNC_ARG;
  3481. ctx->ticketEncCb = cb;
  3482. return WOLFSSL_SUCCESS;
  3483. }
  3484. /* set hint interval, WOLFSSL_SUCCESS on ok */
  3485. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  3486. {
  3487. if (ctx == NULL)
  3488. return BAD_FUNC_ARG;
  3489. ctx->ticketHint = hint;
  3490. return WOLFSSL_SUCCESS;
  3491. }
  3492. /* set user context, WOLFSSL_SUCCESS on ok */
  3493. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  3494. {
  3495. if (ctx == NULL)
  3496. return BAD_FUNC_ARG;
  3497. ctx->ticketEncCtx = userCtx;
  3498. return WOLFSSL_SUCCESS;
  3499. }
  3500. /* get user context - returns userCtx on success, NULL on failure */
  3501. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  3502. {
  3503. if (ctx == NULL)
  3504. return NULL;
  3505. return ctx->ticketEncCtx;
  3506. }
  3507. #ifdef WOLFSSL_TLS13
  3508. /* set the maximum number of tickets to send
  3509. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  3510. */
  3511. int wolfSSL_CTX_set_num_tickets(WOLFSSL_CTX* ctx, size_t mxTickets)
  3512. {
  3513. if (ctx == NULL)
  3514. return WOLFSSL_FAILURE;
  3515. ctx->maxTicketTls13 = (unsigned int)mxTickets;
  3516. return WOLFSSL_SUCCESS;
  3517. }
  3518. /* get the maximum number of tickets to send
  3519. * return number of tickets set to be sent
  3520. */
  3521. size_t wolfSSL_CTX_get_num_tickets(WOLFSSL_CTX* ctx)
  3522. {
  3523. if (ctx == NULL)
  3524. return 0;
  3525. return (size_t)ctx->maxTicketTls13;
  3526. }
  3527. #endif /* WOLFSSL_TLS13 */
  3528. #endif /* !NO_WOLFSSL_SERVER */
  3529. #if !defined(NO_WOLFSSL_CLIENT)
  3530. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  3531. {
  3532. if (ssl == NULL)
  3533. return BAD_FUNC_ARG;
  3534. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  3535. }
  3536. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  3537. {
  3538. if (ctx == NULL)
  3539. return BAD_FUNC_ARG;
  3540. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  3541. }
  3542. int wolfSSL_get_SessionTicket(WOLFSSL* ssl, byte* buf, word32* bufSz)
  3543. {
  3544. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  3545. return BAD_FUNC_ARG;
  3546. if (ssl->session->ticketLen <= *bufSz) {
  3547. XMEMCPY(buf, ssl->session->ticket, ssl->session->ticketLen);
  3548. *bufSz = ssl->session->ticketLen;
  3549. }
  3550. else
  3551. *bufSz = 0;
  3552. return WOLFSSL_SUCCESS;
  3553. }
  3554. int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  3555. word32 bufSz)
  3556. {
  3557. if (ssl == NULL || (buf == NULL && bufSz > 0))
  3558. return BAD_FUNC_ARG;
  3559. if (bufSz > 0) {
  3560. /* Ticket will fit into static ticket */
  3561. if (bufSz <= SESSION_TICKET_LEN) {
  3562. if (ssl->session->ticketLenAlloc > 0) {
  3563. XFREE(ssl->session->ticket, ssl->session->heap,
  3564. DYNAMIC_TYPE_SESSION_TICK);
  3565. ssl->session->ticketLenAlloc = 0;
  3566. ssl->session->ticket = ssl->session->staticTicket;
  3567. }
  3568. }
  3569. else { /* Ticket requires dynamic ticket storage */
  3570. if (ssl->session->ticketLen < bufSz) { /* is dyn buffer big enough */
  3571. if (ssl->session->ticketLenAlloc > 0) {
  3572. XFREE(ssl->session->ticket, ssl->session->heap,
  3573. DYNAMIC_TYPE_SESSION_TICK);
  3574. }
  3575. ssl->session->ticket = (byte*)XMALLOC(bufSz, ssl->session->heap,
  3576. DYNAMIC_TYPE_SESSION_TICK);
  3577. if(ssl->session->ticket == NULL) {
  3578. ssl->session->ticket = ssl->session->staticTicket;
  3579. ssl->session->ticketLenAlloc = 0;
  3580. return MEMORY_ERROR;
  3581. }
  3582. ssl->session->ticketLenAlloc = (word16)bufSz;
  3583. }
  3584. }
  3585. XMEMCPY(ssl->session->ticket, buf, bufSz);
  3586. }
  3587. ssl->session->ticketLen = (word16)bufSz;
  3588. return WOLFSSL_SUCCESS;
  3589. }
  3590. int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  3591. CallbackSessionTicket cb, void* ctx)
  3592. {
  3593. if (ssl == NULL)
  3594. return BAD_FUNC_ARG;
  3595. ssl->session_ticket_cb = cb;
  3596. ssl->session_ticket_ctx = ctx;
  3597. return WOLFSSL_SUCCESS;
  3598. }
  3599. #endif /* !NO_WOLFSSL_CLIENT */
  3600. #endif /* HAVE_SESSION_TICKET */
  3601. #ifdef HAVE_EXTENDED_MASTER
  3602. #ifndef NO_WOLFSSL_CLIENT
  3603. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  3604. {
  3605. if (ctx == NULL)
  3606. return BAD_FUNC_ARG;
  3607. ctx->haveEMS = 0;
  3608. return WOLFSSL_SUCCESS;
  3609. }
  3610. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  3611. {
  3612. if (ssl == NULL)
  3613. return BAD_FUNC_ARG;
  3614. ssl->options.haveEMS = 0;
  3615. return WOLFSSL_SUCCESS;
  3616. }
  3617. #endif
  3618. #endif
  3619. #ifndef WOLFSSL_LEANPSK
  3620. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  3621. {
  3622. int ret;
  3623. int oldFlags;
  3624. WOLFSSL_ENTER("wolfSSL_send");
  3625. if (ssl == NULL || data == NULL || sz < 0)
  3626. return BAD_FUNC_ARG;
  3627. oldFlags = ssl->wflags;
  3628. ssl->wflags = flags;
  3629. ret = wolfSSL_write(ssl, data, sz);
  3630. ssl->wflags = oldFlags;
  3631. WOLFSSL_LEAVE("wolfSSL_send", ret);
  3632. return ret;
  3633. }
  3634. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  3635. {
  3636. int ret;
  3637. int oldFlags;
  3638. WOLFSSL_ENTER("wolfSSL_recv");
  3639. if (ssl == NULL || data == NULL || sz < 0)
  3640. return BAD_FUNC_ARG;
  3641. oldFlags = ssl->rflags;
  3642. ssl->rflags = flags;
  3643. ret = wolfSSL_read(ssl, data, sz);
  3644. ssl->rflags = oldFlags;
  3645. WOLFSSL_LEAVE("wolfSSL_recv", ret);
  3646. return ret;
  3647. }
  3648. #endif
  3649. /* WOLFSSL_SUCCESS on ok */
  3650. WOLFSSL_ABI
  3651. int wolfSSL_shutdown(WOLFSSL* ssl)
  3652. {
  3653. int ret = WOLFSSL_FATAL_ERROR;
  3654. WOLFSSL_ENTER("wolfSSL_shutdown");
  3655. if (ssl == NULL)
  3656. return WOLFSSL_FATAL_ERROR;
  3657. if (ssl->options.quietShutdown) {
  3658. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  3659. ret = WOLFSSL_SUCCESS;
  3660. }
  3661. else {
  3662. /* try to send close notify, not an error if can't */
  3663. if (!ssl->options.isClosed && !ssl->options.connReset &&
  3664. !ssl->options.sentNotify) {
  3665. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  3666. if (ssl->error < 0) {
  3667. WOLFSSL_ERROR(ssl->error);
  3668. return WOLFSSL_FATAL_ERROR;
  3669. }
  3670. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  3671. if (ssl->options.closeNotify) {
  3672. ret = WOLFSSL_SUCCESS;
  3673. ssl->options.shutdownDone = 1;
  3674. }
  3675. else {
  3676. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3677. WOLFSSL_LEAVE("wolfSSL_shutdown", ret);
  3678. return ret;
  3679. }
  3680. }
  3681. #ifdef WOLFSSL_SHUTDOWNONCE
  3682. if (ssl->options.isClosed || ssl->options.connReset) {
  3683. /* Shutdown has already occurred.
  3684. * Caller is free to ignore this error. */
  3685. return SSL_SHUTDOWN_ALREADY_DONE_E;
  3686. }
  3687. #endif
  3688. /* call wolfSSL_shutdown again for bidirectional shutdown */
  3689. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  3690. ret = ProcessReply(ssl);
  3691. if ((ret == ZERO_RETURN) || (ret == SOCKET_ERROR_E)) {
  3692. /* simulate OpenSSL behavior */
  3693. ssl->options.shutdownDone = 1;
  3694. /* Clear error */
  3695. ssl->error = WOLFSSL_ERROR_NONE;
  3696. ret = WOLFSSL_SUCCESS;
  3697. } else if (ret == MEMORY_E) {
  3698. ret = WOLFSSL_FATAL_ERROR;
  3699. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  3700. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3701. } else {
  3702. WOLFSSL_ERROR(ssl->error);
  3703. ret = WOLFSSL_FATAL_ERROR;
  3704. }
  3705. }
  3706. }
  3707. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3708. /* reset WOLFSSL structure state for possible reuse */
  3709. if (ret == WOLFSSL_SUCCESS) {
  3710. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  3711. WOLFSSL_MSG("could not clear WOLFSSL");
  3712. ret = WOLFSSL_FATAL_ERROR;
  3713. }
  3714. }
  3715. #endif
  3716. WOLFSSL_LEAVE("wolfSSL_shutdown", ret);
  3717. return ret;
  3718. }
  3719. /* get current error state value */
  3720. int wolfSSL_state(WOLFSSL* ssl)
  3721. {
  3722. if (ssl == NULL) {
  3723. return BAD_FUNC_ARG;
  3724. }
  3725. return ssl->error;
  3726. }
  3727. WOLFSSL_ABI
  3728. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  3729. {
  3730. WOLFSSL_ENTER("wolfSSL_get_error");
  3731. if (ret > 0)
  3732. return WOLFSSL_ERROR_NONE;
  3733. if (ssl == NULL)
  3734. return BAD_FUNC_ARG;
  3735. WOLFSSL_LEAVE("wolfSSL_get_error", ssl->error);
  3736. /* make sure converted types are handled in SetErrorString() too */
  3737. if (ssl->error == WANT_READ)
  3738. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  3739. else if (ssl->error == WANT_WRITE)
  3740. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  3741. else if (ssl->error == ZERO_RETURN || ssl->options.shutdownDone)
  3742. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  3743. #ifdef OPENSSL_EXTRA
  3744. else if (ssl->error == SOCKET_PEER_CLOSED_E)
  3745. return WOLFSSL_ERROR_SYSCALL; /* convert to OpenSSL type */
  3746. #endif
  3747. #if defined(WOLFSSL_HAPROXY)
  3748. return GetX509Error(ssl->error);
  3749. #else
  3750. return (ssl->error);
  3751. #endif
  3752. }
  3753. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  3754. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  3755. {
  3756. if (ssl && h) {
  3757. *h = ssl->alert_history;
  3758. }
  3759. return WOLFSSL_SUCCESS;
  3760. }
  3761. #ifdef OPENSSL_EXTRA
  3762. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  3763. int wolfSSL_want(WOLFSSL* ssl)
  3764. {
  3765. int rw_state = SSL_NOTHING;
  3766. if (ssl) {
  3767. if (ssl->error == WANT_READ)
  3768. rw_state = SSL_READING;
  3769. else if (ssl->error == WANT_WRITE)
  3770. rw_state = SSL_WRITING;
  3771. }
  3772. return rw_state;
  3773. }
  3774. #endif
  3775. /* return TRUE if current error is want read */
  3776. int wolfSSL_want_read(WOLFSSL* ssl)
  3777. {
  3778. WOLFSSL_ENTER("wolfSSL_want_read");
  3779. if (ssl->error == WANT_READ)
  3780. return 1;
  3781. return 0;
  3782. }
  3783. /* return TRUE if current error is want write */
  3784. int wolfSSL_want_write(WOLFSSL* ssl)
  3785. {
  3786. WOLFSSL_ENTER("wolfSSL_want_write");
  3787. if (ssl->error == WANT_WRITE)
  3788. return 1;
  3789. return 0;
  3790. }
  3791. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  3792. {
  3793. WOLFSSL_ENTER("wolfSSL_ERR_error_string");
  3794. if (data) {
  3795. SetErrorString((int)errNumber, data);
  3796. return data;
  3797. }
  3798. else {
  3799. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  3800. SetErrorString((int)errNumber, tmp);
  3801. return tmp;
  3802. }
  3803. }
  3804. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  3805. {
  3806. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  3807. if (len >= WOLFSSL_MAX_ERROR_SZ)
  3808. wolfSSL_ERR_error_string(e, buf);
  3809. else {
  3810. WOLFSSL_MSG("Error buffer too short, truncating");
  3811. if (len) {
  3812. char tmp[WOLFSSL_MAX_ERROR_SZ];
  3813. wolfSSL_ERR_error_string(e, tmp);
  3814. XMEMCPY(buf, tmp, len-1);
  3815. buf[len-1] = '\0';
  3816. }
  3817. }
  3818. }
  3819. /* don't free temporary arrays at end of handshake */
  3820. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  3821. {
  3822. if (ssl)
  3823. ssl->options.saveArrays = 1;
  3824. }
  3825. /* user doesn't need temporary arrays anymore, Free */
  3826. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  3827. {
  3828. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  3829. ssl->options.saveArrays = 0;
  3830. FreeArrays(ssl, 1);
  3831. }
  3832. }
  3833. /* Set option to indicate that the resources are not to be freed after
  3834. * handshake.
  3835. *
  3836. * ssl The SSL/TLS object.
  3837. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3838. */
  3839. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  3840. {
  3841. if (ssl == NULL)
  3842. return BAD_FUNC_ARG;
  3843. ssl->options.keepResources = 1;
  3844. return 0;
  3845. }
  3846. /* Free the handshake resources after handshake.
  3847. *
  3848. * ssl The SSL/TLS object.
  3849. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3850. */
  3851. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  3852. {
  3853. if (ssl == NULL)
  3854. return BAD_FUNC_ARG;
  3855. FreeHandshakeResources(ssl);
  3856. return 0;
  3857. }
  3858. /* Use the client's order of preference when matching cipher suites.
  3859. *
  3860. * ssl The SSL/TLS context object.
  3861. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3862. */
  3863. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  3864. {
  3865. if (ctx == NULL)
  3866. return BAD_FUNC_ARG;
  3867. ctx->useClientOrder = 1;
  3868. return 0;
  3869. }
  3870. /* Use the client's order of preference when matching cipher suites.
  3871. *
  3872. * ssl The SSL/TLS object.
  3873. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3874. */
  3875. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  3876. {
  3877. if (ssl == NULL)
  3878. return BAD_FUNC_ARG;
  3879. ssl->options.useClientOrder = 1;
  3880. return 0;
  3881. }
  3882. #ifdef WOLFSSL_DTLS
  3883. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  3884. {
  3885. #ifndef WOLFSSL_AEAD_ONLY
  3886. Keys* keys = NULL;
  3887. (void)epochOrder;
  3888. if (ssl == NULL)
  3889. return NULL;
  3890. #ifdef HAVE_SECURE_RENEGOTIATION
  3891. switch (epochOrder) {
  3892. case PEER_ORDER:
  3893. if (IsDtlsMsgSCRKeys(ssl))
  3894. keys = &ssl->secure_renegotiation->tmp_keys;
  3895. else
  3896. keys = &ssl->keys;
  3897. break;
  3898. case PREV_ORDER:
  3899. keys = &ssl->keys;
  3900. break;
  3901. case CUR_ORDER:
  3902. if (DtlsUseSCRKeys(ssl))
  3903. keys = &ssl->secure_renegotiation->tmp_keys;
  3904. else
  3905. keys = &ssl->keys;
  3906. break;
  3907. default:
  3908. WOLFSSL_MSG("Unknown epoch order");
  3909. return NULL;
  3910. }
  3911. #else
  3912. keys = &ssl->keys;
  3913. #endif
  3914. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3915. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3916. return keys->client_write_MAC_secret;
  3917. else
  3918. return keys->server_write_MAC_secret;
  3919. #else
  3920. (void)ssl;
  3921. (void)verify;
  3922. (void)epochOrder;
  3923. return NULL;
  3924. #endif
  3925. }
  3926. #endif /* WOLFSSL_DTLS */
  3927. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  3928. {
  3929. #ifndef WOLFSSL_AEAD_ONLY
  3930. if (ssl == NULL)
  3931. return NULL;
  3932. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3933. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3934. return ssl->keys.client_write_MAC_secret;
  3935. else
  3936. return ssl->keys.server_write_MAC_secret;
  3937. #else
  3938. (void)ssl;
  3939. (void)verify;
  3940. return NULL;
  3941. #endif
  3942. }
  3943. int wolfSSL_GetSide(WOLFSSL* ssl)
  3944. {
  3945. if (ssl)
  3946. return ssl->options.side;
  3947. return BAD_FUNC_ARG;
  3948. }
  3949. #ifdef ATOMIC_USER
  3950. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  3951. {
  3952. if (ctx)
  3953. ctx->MacEncryptCb = cb;
  3954. }
  3955. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  3956. {
  3957. if (ssl)
  3958. ssl->MacEncryptCtx = ctx;
  3959. }
  3960. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  3961. {
  3962. if (ssl)
  3963. return ssl->MacEncryptCtx;
  3964. return NULL;
  3965. }
  3966. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  3967. {
  3968. if (ctx)
  3969. ctx->DecryptVerifyCb = cb;
  3970. }
  3971. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  3972. {
  3973. if (ssl)
  3974. ssl->DecryptVerifyCtx = ctx;
  3975. }
  3976. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  3977. {
  3978. if (ssl)
  3979. return ssl->DecryptVerifyCtx;
  3980. return NULL;
  3981. }
  3982. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3983. /**
  3984. * Set the callback, against the context, that encrypts then MACs.
  3985. *
  3986. * ctx SSL/TLS context.
  3987. * cb Callback function to use with Encrypt-Then-MAC.
  3988. */
  3989. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  3990. {
  3991. if (ctx)
  3992. ctx->EncryptMacCb = cb;
  3993. }
  3994. /**
  3995. * Set the context to use with callback that encrypts then MACs.
  3996. *
  3997. * ssl SSL/TLS object.
  3998. * ctx Callback function's context.
  3999. */
  4000. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  4001. {
  4002. if (ssl)
  4003. ssl->EncryptMacCtx = ctx;
  4004. }
  4005. /**
  4006. * Get the context being used with callback that encrypts then MACs.
  4007. *
  4008. * ssl SSL/TLS object.
  4009. * returns callback function's context or NULL if SSL/TLS object is NULL.
  4010. */
  4011. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  4012. {
  4013. if (ssl)
  4014. return ssl->EncryptMacCtx;
  4015. return NULL;
  4016. }
  4017. /**
  4018. * Set the callback, against the context, that MAC verifies then decrypts.
  4019. *
  4020. * ctx SSL/TLS context.
  4021. * cb Callback function to use with Encrypt-Then-MAC.
  4022. */
  4023. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  4024. {
  4025. if (ctx)
  4026. ctx->VerifyDecryptCb = cb;
  4027. }
  4028. /**
  4029. * Set the context to use with callback that MAC verifies then decrypts.
  4030. *
  4031. * ssl SSL/TLS object.
  4032. * ctx Callback function's context.
  4033. */
  4034. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  4035. {
  4036. if (ssl)
  4037. ssl->VerifyDecryptCtx = ctx;
  4038. }
  4039. /**
  4040. * Get the context being used with callback that MAC verifies then decrypts.
  4041. *
  4042. * ssl SSL/TLS object.
  4043. * returns callback function's context or NULL if SSL/TLS object is NULL.
  4044. */
  4045. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  4046. {
  4047. if (ssl)
  4048. return ssl->VerifyDecryptCtx;
  4049. return NULL;
  4050. }
  4051. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  4052. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  4053. {
  4054. if (ssl)
  4055. return ssl->keys.client_write_key;
  4056. return NULL;
  4057. }
  4058. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  4059. {
  4060. if (ssl)
  4061. return ssl->keys.client_write_IV;
  4062. return NULL;
  4063. }
  4064. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  4065. {
  4066. if (ssl)
  4067. return ssl->keys.server_write_key;
  4068. return NULL;
  4069. }
  4070. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  4071. {
  4072. if (ssl)
  4073. return ssl->keys.server_write_IV;
  4074. return NULL;
  4075. }
  4076. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  4077. {
  4078. if (ssl)
  4079. return ssl->specs.key_size;
  4080. return BAD_FUNC_ARG;
  4081. }
  4082. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  4083. {
  4084. if (ssl)
  4085. return ssl->specs.iv_size;
  4086. return BAD_FUNC_ARG;
  4087. }
  4088. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  4089. {
  4090. if (ssl)
  4091. return ssl->specs.bulk_cipher_algorithm;
  4092. return BAD_FUNC_ARG;
  4093. }
  4094. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  4095. {
  4096. if (ssl == NULL)
  4097. return BAD_FUNC_ARG;
  4098. #ifndef WOLFSSL_AEAD_ONLY
  4099. if (ssl->specs.cipher_type == block)
  4100. return WOLFSSL_BLOCK_TYPE;
  4101. if (ssl->specs.cipher_type == stream)
  4102. return WOLFSSL_STREAM_TYPE;
  4103. #endif
  4104. if (ssl->specs.cipher_type == aead)
  4105. return WOLFSSL_AEAD_TYPE;
  4106. return -1;
  4107. }
  4108. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  4109. {
  4110. if (ssl == NULL)
  4111. return BAD_FUNC_ARG;
  4112. return ssl->specs.block_size;
  4113. }
  4114. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  4115. {
  4116. if (ssl == NULL)
  4117. return BAD_FUNC_ARG;
  4118. return ssl->specs.aead_mac_size;
  4119. }
  4120. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  4121. {
  4122. if (ssl == NULL)
  4123. return BAD_FUNC_ARG;
  4124. if (ssl->options.tls1_1)
  4125. return 1;
  4126. return 0;
  4127. }
  4128. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  4129. {
  4130. /* AEAD ciphers don't have HMAC keys */
  4131. if (ssl)
  4132. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  4133. return BAD_FUNC_ARG;
  4134. }
  4135. #ifdef WORD64_AVAILABLE
  4136. int wolfSSL_GetPeerSequenceNumber(WOLFSSL* ssl, word64 *seq)
  4137. {
  4138. if ((ssl == NULL) || (seq == NULL))
  4139. return BAD_FUNC_ARG;
  4140. *seq = ((word64)ssl->keys.peer_sequence_number_hi << 32) |
  4141. ssl->keys.peer_sequence_number_lo;
  4142. return !(*seq);
  4143. }
  4144. int wolfSSL_GetSequenceNumber(WOLFSSL* ssl, word64 *seq)
  4145. {
  4146. if ((ssl == NULL) || (seq == NULL))
  4147. return BAD_FUNC_ARG;
  4148. *seq = ((word64)ssl->keys.sequence_number_hi << 32) |
  4149. ssl->keys.sequence_number_lo;
  4150. return !(*seq);
  4151. }
  4152. #endif
  4153. #endif /* ATOMIC_USER */
  4154. #ifndef NO_CERTS
  4155. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  4156. {
  4157. WOLFSSL_CERT_MANAGER* cm = NULL;
  4158. if (ctx)
  4159. cm = ctx->cm;
  4160. return cm;
  4161. }
  4162. #endif /* NO_CERTS */
  4163. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) \
  4164. && defined(XFPRINTF)
  4165. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  4166. {
  4167. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  4168. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  4169. SetErrorString(err, data);
  4170. if (XFPRINTF(fp, "%s", data) < 0)
  4171. WOLFSSL_MSG("fprintf failed in wolfSSL_ERR_print_errors_fp");
  4172. }
  4173. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  4174. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  4175. {
  4176. wc_ERR_print_errors_fp(fp);
  4177. }
  4178. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  4179. void *u), void *u)
  4180. {
  4181. wc_ERR_print_errors_cb(cb, u);
  4182. }
  4183. #endif
  4184. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM && XFPRINTF */
  4185. /*
  4186. * TODO This ssl parameter needs to be changed to const once our ABI checker
  4187. * stops flagging qualifier additions as ABI breaking.
  4188. */
  4189. WOLFSSL_ABI
  4190. int wolfSSL_pending(WOLFSSL* ssl)
  4191. {
  4192. WOLFSSL_ENTER("wolfSSL_pending");
  4193. if (ssl == NULL)
  4194. return WOLFSSL_FAILURE;
  4195. return ssl->buffers.clearOutputBuffer.length;
  4196. }
  4197. int wolfSSL_has_pending(const WOLFSSL* ssl)
  4198. {
  4199. WOLFSSL_ENTER("wolfSSL_has_pending");
  4200. if (ssl == NULL)
  4201. return WOLFSSL_FAILURE;
  4202. return ssl->buffers.clearOutputBuffer.length > 0;
  4203. }
  4204. #ifndef WOLFSSL_LEANPSK
  4205. /* turn on handshake group messages for context */
  4206. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  4207. {
  4208. if (ctx == NULL)
  4209. return BAD_FUNC_ARG;
  4210. ctx->groupMessages = 1;
  4211. return WOLFSSL_SUCCESS;
  4212. }
  4213. #endif
  4214. #ifndef NO_WOLFSSL_CLIENT
  4215. /* connect enough to get peer cert chain */
  4216. int wolfSSL_connect_cert(WOLFSSL* ssl)
  4217. {
  4218. int ret;
  4219. if (ssl == NULL)
  4220. return WOLFSSL_FAILURE;
  4221. ssl->options.certOnly = 1;
  4222. ret = wolfSSL_connect(ssl);
  4223. ssl->options.certOnly = 0;
  4224. return ret;
  4225. }
  4226. #endif
  4227. #ifndef WOLFSSL_LEANPSK
  4228. /* turn on handshake group messages for ssl object */
  4229. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  4230. {
  4231. if (ssl == NULL)
  4232. return BAD_FUNC_ARG;
  4233. ssl->options.groupMessages = 1;
  4234. return WOLFSSL_SUCCESS;
  4235. }
  4236. /* make minVersion the internal equivalent SSL version */
  4237. static int SetMinVersionHelper(byte* minVersion, int version)
  4238. {
  4239. #ifdef NO_TLS
  4240. (void)minVersion;
  4241. #endif
  4242. switch (version) {
  4243. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  4244. case WOLFSSL_SSLV3:
  4245. *minVersion = SSLv3_MINOR;
  4246. break;
  4247. #endif
  4248. #ifndef NO_TLS
  4249. #ifndef NO_OLD_TLS
  4250. #ifdef WOLFSSL_ALLOW_TLSV10
  4251. case WOLFSSL_TLSV1:
  4252. *minVersion = TLSv1_MINOR;
  4253. break;
  4254. #endif
  4255. case WOLFSSL_TLSV1_1:
  4256. *minVersion = TLSv1_1_MINOR;
  4257. break;
  4258. #endif
  4259. #ifndef WOLFSSL_NO_TLS12
  4260. case WOLFSSL_TLSV1_2:
  4261. *minVersion = TLSv1_2_MINOR;
  4262. break;
  4263. #endif
  4264. #endif
  4265. #ifdef WOLFSSL_TLS13
  4266. case WOLFSSL_TLSV1_3:
  4267. *minVersion = TLSv1_3_MINOR;
  4268. break;
  4269. #endif
  4270. #ifdef WOLFSSL_DTLS
  4271. case WOLFSSL_DTLSV1:
  4272. *minVersion = DTLS_MINOR;
  4273. break;
  4274. case WOLFSSL_DTLSV1_2:
  4275. *minVersion = DTLSv1_2_MINOR;
  4276. break;
  4277. #ifdef WOLFSSL_DTLS13
  4278. case WOLFSSL_DTLSV1_3:
  4279. *minVersion = DTLSv1_3_MINOR;
  4280. break;
  4281. #endif /* WOLFSSL_DTLS13 */
  4282. #endif /* WOLFSSL_DTLS */
  4283. default:
  4284. WOLFSSL_MSG("Bad function argument");
  4285. return BAD_FUNC_ARG;
  4286. }
  4287. return WOLFSSL_SUCCESS;
  4288. }
  4289. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  4290. WOLFSSL_ABI
  4291. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  4292. {
  4293. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  4294. if (ctx == NULL) {
  4295. WOLFSSL_MSG("Bad function argument");
  4296. return BAD_FUNC_ARG;
  4297. }
  4298. return SetMinVersionHelper(&ctx->minDowngrade, version);
  4299. }
  4300. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  4301. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  4302. {
  4303. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  4304. if (ssl == NULL) {
  4305. WOLFSSL_MSG("Bad function argument");
  4306. return BAD_FUNC_ARG;
  4307. }
  4308. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  4309. }
  4310. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  4311. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  4312. {
  4313. if (ssl == NULL)
  4314. return BAD_FUNC_ARG;
  4315. if (ssl->version.major == SSLv3_MAJOR) {
  4316. switch (ssl->version.minor) {
  4317. case SSLv3_MINOR :
  4318. return WOLFSSL_SSLV3;
  4319. case TLSv1_MINOR :
  4320. return WOLFSSL_TLSV1;
  4321. case TLSv1_1_MINOR :
  4322. return WOLFSSL_TLSV1_1;
  4323. case TLSv1_2_MINOR :
  4324. return WOLFSSL_TLSV1_2;
  4325. case TLSv1_3_MINOR :
  4326. return WOLFSSL_TLSV1_3;
  4327. default:
  4328. break;
  4329. }
  4330. }
  4331. return VERSION_ERROR;
  4332. }
  4333. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  4334. {
  4335. word16 haveRSA = 1;
  4336. word16 havePSK = 0;
  4337. int keySz = 0;
  4338. WOLFSSL_ENTER("wolfSSL_SetVersion");
  4339. if (ssl == NULL) {
  4340. WOLFSSL_MSG("Bad function argument");
  4341. return BAD_FUNC_ARG;
  4342. }
  4343. switch (version) {
  4344. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  4345. case WOLFSSL_SSLV3:
  4346. ssl->version = MakeSSLv3();
  4347. break;
  4348. #endif
  4349. #ifndef NO_TLS
  4350. #ifndef NO_OLD_TLS
  4351. #ifdef WOLFSSL_ALLOW_TLSV10
  4352. case WOLFSSL_TLSV1:
  4353. ssl->version = MakeTLSv1();
  4354. break;
  4355. #endif
  4356. case WOLFSSL_TLSV1_1:
  4357. ssl->version = MakeTLSv1_1();
  4358. break;
  4359. #endif
  4360. #ifndef WOLFSSL_NO_TLS12
  4361. case WOLFSSL_TLSV1_2:
  4362. ssl->version = MakeTLSv1_2();
  4363. break;
  4364. #endif
  4365. #ifdef WOLFSSL_TLS13
  4366. case WOLFSSL_TLSV1_3:
  4367. ssl->version = MakeTLSv1_3();
  4368. break;
  4369. #endif /* WOLFSSL_TLS13 */
  4370. #endif
  4371. default:
  4372. WOLFSSL_MSG("Bad function argument");
  4373. return BAD_FUNC_ARG;
  4374. }
  4375. #ifdef NO_RSA
  4376. haveRSA = 0;
  4377. #endif
  4378. #ifndef NO_PSK
  4379. havePSK = ssl->options.havePSK;
  4380. #endif
  4381. #ifndef NO_CERTS
  4382. keySz = ssl->buffers.keySz;
  4383. #endif
  4384. if (AllocateSuites(ssl) != 0)
  4385. return WOLFSSL_FAILURE;
  4386. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4387. ssl->options.haveDH, ssl->options.haveECDSAsig,
  4388. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  4389. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  4390. ssl->options.useAnon, TRUE, ssl->options.side);
  4391. return WOLFSSL_SUCCESS;
  4392. }
  4393. #endif /* !leanpsk */
  4394. #ifndef NO_CERTS
  4395. /* hash is the SHA digest of name, just use first 32 bits as hash */
  4396. static WC_INLINE word32 HashSigner(const byte* hash)
  4397. {
  4398. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  4399. }
  4400. /* does CA already exist on signer list */
  4401. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  4402. {
  4403. Signer* signers;
  4404. int ret = 0;
  4405. word32 row;
  4406. if (cm == NULL || hash == NULL) {
  4407. return ret;
  4408. }
  4409. row = HashSigner(hash);
  4410. if (wc_LockMutex(&cm->caLock) != 0) {
  4411. return ret;
  4412. }
  4413. signers = cm->caTable[row];
  4414. while (signers) {
  4415. byte* subjectHash;
  4416. #ifndef NO_SKID
  4417. subjectHash = signers->subjectKeyIdHash;
  4418. #else
  4419. subjectHash = signers->subjectNameHash;
  4420. #endif
  4421. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4422. ret = 1; /* success */
  4423. break;
  4424. }
  4425. signers = signers->next;
  4426. }
  4427. wc_UnLockMutex(&cm->caLock);
  4428. return ret;
  4429. }
  4430. #ifdef WOLFSSL_TRUST_PEER_CERT
  4431. /* hash is the SHA digest of name, just use first 32 bits as hash */
  4432. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  4433. {
  4434. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  4435. }
  4436. /* does trusted peer already exist on signer list */
  4437. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DecodedCert* cert)
  4438. {
  4439. TrustedPeerCert* tp;
  4440. int ret = 0;
  4441. word32 row = TrustedPeerHashSigner(cert->subjectHash);
  4442. if (wc_LockMutex(&cm->tpLock) != 0)
  4443. return ret;
  4444. tp = cm->tpTable[row];
  4445. while (tp) {
  4446. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4447. SIGNER_DIGEST_SIZE) == 0)
  4448. ret = 1;
  4449. #ifndef NO_SKID
  4450. if (cert->extSubjKeyIdSet) {
  4451. /* Compare SKID as well if available */
  4452. if (ret == 1 && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4453. SIGNER_DIGEST_SIZE) != 0)
  4454. ret = 0;
  4455. }
  4456. #endif
  4457. if (ret == 1)
  4458. break;
  4459. tp = tp->next;
  4460. }
  4461. wc_UnLockMutex(&cm->tpLock);
  4462. return ret;
  4463. }
  4464. /* return Trusted Peer if found, otherwise NULL
  4465. type is what to match on
  4466. */
  4467. TrustedPeerCert* GetTrustedPeer(void* vp, DecodedCert* cert)
  4468. {
  4469. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4470. TrustedPeerCert* ret = NULL;
  4471. TrustedPeerCert* tp = NULL;
  4472. word32 row;
  4473. if (cm == NULL || cert == NULL)
  4474. return NULL;
  4475. row = TrustedPeerHashSigner(cert->subjectHash);
  4476. if (wc_LockMutex(&cm->tpLock) != 0)
  4477. return ret;
  4478. tp = cm->tpTable[row];
  4479. while (tp) {
  4480. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4481. SIGNER_DIGEST_SIZE) == 0)
  4482. ret = tp;
  4483. #ifndef NO_SKID
  4484. if (cert->extSubjKeyIdSet) {
  4485. /* Compare SKID as well if available */
  4486. if (ret != NULL && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4487. SIGNER_DIGEST_SIZE) != 0)
  4488. ret = NULL;
  4489. }
  4490. #endif
  4491. if (ret != NULL)
  4492. break;
  4493. tp = tp->next;
  4494. }
  4495. wc_UnLockMutex(&cm->tpLock);
  4496. return ret;
  4497. }
  4498. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  4499. {
  4500. if (tp == NULL || cert == NULL)
  4501. return BAD_FUNC_ARG;
  4502. /* subject key id or subject hash has been compared when searching
  4503. tpTable for the cert from function GetTrustedPeer */
  4504. /* compare signatures */
  4505. if (tp->sigLen == cert->sigLength) {
  4506. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  4507. return WOLFSSL_FAILURE;
  4508. }
  4509. }
  4510. else {
  4511. return WOLFSSL_FAILURE;
  4512. }
  4513. return WOLFSSL_SUCCESS;
  4514. }
  4515. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4516. /* return CA if found, otherwise NULL */
  4517. Signer* GetCA(void* vp, byte* hash)
  4518. {
  4519. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4520. Signer* ret = NULL;
  4521. Signer* signers;
  4522. word32 row = 0;
  4523. if (cm == NULL || hash == NULL)
  4524. return NULL;
  4525. row = HashSigner(hash);
  4526. if (wc_LockMutex(&cm->caLock) != 0)
  4527. return ret;
  4528. signers = cm->caTable[row];
  4529. while (signers) {
  4530. byte* subjectHash;
  4531. #ifndef NO_SKID
  4532. subjectHash = signers->subjectKeyIdHash;
  4533. #else
  4534. subjectHash = signers->subjectNameHash;
  4535. #endif
  4536. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4537. ret = signers;
  4538. break;
  4539. }
  4540. signers = signers->next;
  4541. }
  4542. wc_UnLockMutex(&cm->caLock);
  4543. return ret;
  4544. }
  4545. #ifdef WOLFSSL_AKID_NAME
  4546. Signer* GetCAByAKID(void* vp, const byte* issuer, word32 issuerSz,
  4547. const byte* serial, word32 serialSz)
  4548. {
  4549. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4550. Signer* ret = NULL;
  4551. Signer* signers;
  4552. byte nameHash[SIGNER_DIGEST_SIZE];
  4553. byte serialHash[SIGNER_DIGEST_SIZE];
  4554. word32 row;
  4555. if (cm == NULL || issuer == NULL || issuerSz == 0 ||
  4556. serial == NULL || serialSz == 0)
  4557. return NULL;
  4558. if (CalcHashId(issuer, issuerSz, nameHash) != 0 ||
  4559. CalcHashId(serial, serialSz, serialHash) != 0)
  4560. return NULL;
  4561. if (wc_LockMutex(&cm->caLock) != 0)
  4562. return ret;
  4563. /* Unfortunately we need to look through the entire table */
  4564. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4565. for (signers = cm->caTable[row]; signers != NULL;
  4566. signers = signers->next) {
  4567. if (XMEMCMP(signers->subjectNameHash, nameHash, SIGNER_DIGEST_SIZE)
  4568. == 0 && XMEMCMP(signers->serialHash, serialHash,
  4569. SIGNER_DIGEST_SIZE) == 0) {
  4570. ret = signers;
  4571. break;
  4572. }
  4573. }
  4574. }
  4575. wc_UnLockMutex(&cm->caLock);
  4576. return ret;
  4577. }
  4578. #endif
  4579. #ifndef NO_SKID
  4580. /* return CA if found, otherwise NULL. Walk through hash table. */
  4581. Signer* GetCAByName(void* vp, byte* hash)
  4582. {
  4583. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4584. Signer* ret = NULL;
  4585. Signer* signers;
  4586. word32 row;
  4587. if (cm == NULL)
  4588. return NULL;
  4589. if (wc_LockMutex(&cm->caLock) != 0)
  4590. return ret;
  4591. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4592. signers = cm->caTable[row];
  4593. while (signers && ret == NULL) {
  4594. if (XMEMCMP(hash, signers->subjectNameHash,
  4595. SIGNER_DIGEST_SIZE) == 0) {
  4596. ret = signers;
  4597. }
  4598. signers = signers->next;
  4599. }
  4600. }
  4601. wc_UnLockMutex(&cm->caLock);
  4602. return ret;
  4603. }
  4604. #endif
  4605. #ifdef WOLFSSL_TRUST_PEER_CERT
  4606. /* add a trusted peer cert to linked list */
  4607. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  4608. {
  4609. int ret = 0;
  4610. int row = 0;
  4611. TrustedPeerCert* peerCert;
  4612. DecodedCert* cert;
  4613. DerBuffer* der = *pDer;
  4614. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  4615. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4616. DYNAMIC_TYPE_DCERT);
  4617. if (cert == NULL) {
  4618. FreeDer(&der);
  4619. return MEMORY_E;
  4620. }
  4621. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4622. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  4623. FreeDecodedCert(cert);
  4624. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4625. FreeDer(&der);
  4626. return ret;
  4627. }
  4628. WOLFSSL_MSG("\tParsed new trusted peer cert");
  4629. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  4630. DYNAMIC_TYPE_CERT);
  4631. if (peerCert == NULL) {
  4632. FreeDecodedCert(cert);
  4633. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4634. FreeDer(&der);
  4635. return MEMORY_E;
  4636. }
  4637. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  4638. #ifndef IGNORE_NAME_CONSTRAINTS
  4639. if (peerCert->permittedNames)
  4640. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  4641. if (peerCert->excludedNames)
  4642. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  4643. #endif
  4644. if (AlreadyTrustedPeer(cm, cert)) {
  4645. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4646. FreeTrustedPeer(peerCert, cm->heap);
  4647. (void)ret;
  4648. }
  4649. else {
  4650. /* add trusted peer signature */
  4651. peerCert->sigLen = cert->sigLength;
  4652. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  4653. DYNAMIC_TYPE_SIGNATURE);
  4654. if (peerCert->sig == NULL) {
  4655. FreeDecodedCert(cert);
  4656. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4657. FreeTrustedPeer(peerCert, cm->heap);
  4658. FreeDer(&der);
  4659. return MEMORY_E;
  4660. }
  4661. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  4662. /* add trusted peer name */
  4663. peerCert->nameLen = cert->subjectCNLen;
  4664. peerCert->name = cert->subjectCN;
  4665. #ifndef IGNORE_NAME_CONSTRAINTS
  4666. peerCert->permittedNames = cert->permittedNames;
  4667. peerCert->excludedNames = cert->excludedNames;
  4668. #endif
  4669. /* add SKID when available and hash of name */
  4670. #ifndef NO_SKID
  4671. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  4672. SIGNER_DIGEST_SIZE);
  4673. #endif
  4674. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  4675. SIGNER_DIGEST_SIZE);
  4676. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  4677. cert->subjectCN = 0;
  4678. #ifndef IGNORE_NAME_CONSTRAINTS
  4679. cert->permittedNames = NULL;
  4680. cert->excludedNames = NULL;
  4681. #endif
  4682. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4683. if (wc_LockMutex(&cm->tpLock) == 0) {
  4684. peerCert->next = cm->tpTable[row];
  4685. cm->tpTable[row] = peerCert; /* takes ownership */
  4686. wc_UnLockMutex(&cm->tpLock);
  4687. }
  4688. else {
  4689. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  4690. FreeDecodedCert(cert);
  4691. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4692. FreeTrustedPeer(peerCert, cm->heap);
  4693. FreeDer(&der);
  4694. return BAD_MUTEX_E;
  4695. }
  4696. }
  4697. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  4698. FreeDecodedCert(cert);
  4699. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4700. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  4701. FreeDer(&der);
  4702. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  4703. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  4704. return WOLFSSL_SUCCESS;
  4705. }
  4706. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4707. /* owns der, internal now uses too */
  4708. /* type flag ids from user or from chain received during verify
  4709. don't allow chain ones to be added w/o isCA extension */
  4710. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  4711. {
  4712. int ret;
  4713. Signer* signer = NULL;
  4714. word32 row;
  4715. byte* subjectHash;
  4716. #ifdef WOLFSSL_SMALL_STACK
  4717. DecodedCert* cert = NULL;
  4718. #else
  4719. DecodedCert cert[1];
  4720. #endif
  4721. DerBuffer* der = *pDer;
  4722. WOLFSSL_MSG("Adding a CA");
  4723. if (cm == NULL) {
  4724. FreeDer(pDer);
  4725. return BAD_FUNC_ARG;
  4726. }
  4727. #ifdef WOLFSSL_SMALL_STACK
  4728. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4729. DYNAMIC_TYPE_DCERT);
  4730. if (cert == NULL) {
  4731. FreeDer(pDer);
  4732. return MEMORY_E;
  4733. }
  4734. #endif
  4735. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4736. ret = ParseCert(cert, CA_TYPE, verify, cm);
  4737. WOLFSSL_MSG("\tParsed new CA");
  4738. #ifndef NO_SKID
  4739. subjectHash = cert->extSubjKeyId;
  4740. #else
  4741. subjectHash = cert->subjectHash;
  4742. #endif
  4743. /* check CA key size */
  4744. if (verify) {
  4745. switch (cert->keyOID) {
  4746. #ifndef NO_RSA
  4747. #ifdef WC_RSA_PSS
  4748. case RSAPSSk:
  4749. #endif
  4750. case RSAk:
  4751. if (cm->minRsaKeySz < 0 ||
  4752. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  4753. ret = RSA_KEY_SIZE_E;
  4754. WOLFSSL_MSG("\tCA RSA key size error");
  4755. }
  4756. break;
  4757. #endif /* !NO_RSA */
  4758. #ifdef HAVE_ECC
  4759. case ECDSAk:
  4760. if (cm->minEccKeySz < 0 ||
  4761. cert->pubKeySize < (word16)cm->minEccKeySz) {
  4762. ret = ECC_KEY_SIZE_E;
  4763. WOLFSSL_MSG("\tCA ECC key size error");
  4764. }
  4765. break;
  4766. #endif /* HAVE_ECC */
  4767. #ifdef HAVE_ED25519
  4768. case ED25519k:
  4769. if (cm->minEccKeySz < 0 ||
  4770. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  4771. ret = ECC_KEY_SIZE_E;
  4772. WOLFSSL_MSG("\tCA ECC key size error");
  4773. }
  4774. break;
  4775. #endif /* HAVE_ED25519 */
  4776. #ifdef HAVE_ED448
  4777. case ED448k:
  4778. if (cm->minEccKeySz < 0 ||
  4779. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  4780. ret = ECC_KEY_SIZE_E;
  4781. WOLFSSL_MSG("\tCA ECC key size error");
  4782. }
  4783. break;
  4784. #endif /* HAVE_ED448 */
  4785. #if defined(HAVE_PQC)
  4786. #if defined(HAVE_FALCON)
  4787. case FALCON_LEVEL1k:
  4788. if (cm->minFalconKeySz < 0 ||
  4789. FALCON_LEVEL1_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4790. ret = FALCON_KEY_SIZE_E;
  4791. WOLFSSL_MSG("\tCA Falcon level 1 key size error");
  4792. }
  4793. break;
  4794. case FALCON_LEVEL5k:
  4795. if (cm->minFalconKeySz < 0 ||
  4796. FALCON_LEVEL5_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4797. ret = FALCON_KEY_SIZE_E;
  4798. WOLFSSL_MSG("\tCA Falcon level 5 key size error");
  4799. }
  4800. break;
  4801. #endif /* HAVE_FALCON */
  4802. #if defined(HAVE_DILITHIUM)
  4803. case DILITHIUM_LEVEL2k:
  4804. if (cm->minDilithiumKeySz < 0 ||
  4805. DILITHIUM_LEVEL2_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4806. ret = DILITHIUM_KEY_SIZE_E;
  4807. WOLFSSL_MSG("\tCA Dilithium level 2 key size error");
  4808. }
  4809. break;
  4810. case DILITHIUM_LEVEL3k:
  4811. if (cm->minDilithiumKeySz < 0 ||
  4812. DILITHIUM_LEVEL3_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4813. ret = DILITHIUM_KEY_SIZE_E;
  4814. WOLFSSL_MSG("\tCA Dilithium level 3 key size error");
  4815. }
  4816. break;
  4817. case DILITHIUM_LEVEL5k:
  4818. if (cm->minDilithiumKeySz < 0 ||
  4819. DILITHIUM_LEVEL5_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4820. ret = DILITHIUM_KEY_SIZE_E;
  4821. WOLFSSL_MSG("\tCA Dilithium level 5 key size error");
  4822. }
  4823. break;
  4824. #endif /* HAVE_DILITHIUM */
  4825. #endif /* HAVE_PQC */
  4826. default:
  4827. WOLFSSL_MSG("\tNo key size check done on CA");
  4828. break; /* no size check if key type is not in switch */
  4829. }
  4830. }
  4831. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  4832. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  4833. ret = NOT_CA_ERROR;
  4834. }
  4835. #ifndef ALLOW_INVALID_CERTSIGN
  4836. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  4837. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  4838. /* Intermediate CA certs are required to have the keyCertSign
  4839. * extension set. User loaded root certs are not. */
  4840. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  4841. ret = NOT_CA_ERROR;
  4842. }
  4843. #endif
  4844. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  4845. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4846. (void)ret;
  4847. }
  4848. else if (ret == 0) {
  4849. /* take over signer parts */
  4850. signer = MakeSigner(cm->heap);
  4851. if (!signer)
  4852. ret = MEMORY_ERROR;
  4853. }
  4854. #if defined(WOLFSSL_AKID_NAME) || defined(HAVE_CRL)
  4855. if (ret == 0 && signer != NULL)
  4856. ret = CalcHashId(cert->serial, cert->serialSz, signer->serialHash);
  4857. #endif
  4858. if (ret == 0 && signer != NULL) {
  4859. #ifdef WOLFSSL_SIGNER_DER_CERT
  4860. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  4861. }
  4862. if (ret == 0 && signer != NULL) {
  4863. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  4864. #endif
  4865. signer->keyOID = cert->keyOID;
  4866. if (cert->pubKeyStored) {
  4867. signer->publicKey = cert->publicKey;
  4868. signer->pubKeySize = cert->pubKeySize;
  4869. }
  4870. #ifdef WOLFSSL_DUAL_ALG_CERTS
  4871. signer->sapkiDer = cert->sapkiDer;
  4872. signer->sapkiLen = cert->sapkiLen;
  4873. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  4874. if (cert->subjectCNStored) {
  4875. signer->nameLen = cert->subjectCNLen;
  4876. signer->name = cert->subjectCN;
  4877. }
  4878. signer->maxPathLen = cert->maxPathLen;
  4879. signer->selfSigned = cert->selfSigned;
  4880. #ifndef IGNORE_NAME_CONSTRAINTS
  4881. signer->permittedNames = cert->permittedNames;
  4882. signer->excludedNames = cert->excludedNames;
  4883. #endif
  4884. #ifndef NO_SKID
  4885. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  4886. SIGNER_DIGEST_SIZE);
  4887. #endif
  4888. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  4889. SIGNER_DIGEST_SIZE);
  4890. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  4891. XMEMCPY(signer->issuerNameHash, cert->issuerHash,
  4892. SIGNER_DIGEST_SIZE);
  4893. #endif
  4894. #ifdef HAVE_OCSP
  4895. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  4896. KEYID_SIZE);
  4897. #endif
  4898. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  4899. : 0xFFFF;
  4900. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  4901. cert->publicKey = 0; /* in case lock fails don't free here. */
  4902. cert->subjectCN = 0;
  4903. #ifndef IGNORE_NAME_CONSTRAINTS
  4904. cert->permittedNames = NULL;
  4905. cert->excludedNames = NULL;
  4906. #endif
  4907. signer->type = (byte)type;
  4908. #ifndef NO_SKID
  4909. row = HashSigner(signer->subjectKeyIdHash);
  4910. #else
  4911. row = HashSigner(signer->subjectNameHash);
  4912. #endif
  4913. if (wc_LockMutex(&cm->caLock) == 0) {
  4914. signer->next = cm->caTable[row];
  4915. cm->caTable[row] = signer; /* takes ownership */
  4916. wc_UnLockMutex(&cm->caLock);
  4917. if (cm->caCacheCallback)
  4918. cm->caCacheCallback(der->buffer, (int)der->length, type);
  4919. }
  4920. else {
  4921. WOLFSSL_MSG("\tCA Mutex Lock failed");
  4922. ret = BAD_MUTEX_E;
  4923. }
  4924. }
  4925. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  4926. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  4927. /* be used for peer's cert verification */
  4928. /* TSIP is only able to handle USER CA, and only one CA. */
  4929. /* Therefore, it doesn't need to call TSIP again if there is already */
  4930. /* verified CA. */
  4931. if ( ret == 0 && signer != NULL ) {
  4932. signer->cm_idx = row;
  4933. if (type == WOLFSSL_USER_CA) {
  4934. if ((ret = wc_Renesas_cmn_RootCertVerify(cert->source, cert->maxIdx,
  4935. cert->sigCtx.CertAtt.pubkey_n_start,
  4936. cert->sigCtx.CertAtt.pubkey_n_len - 1,
  4937. cert->sigCtx.CertAtt.pubkey_e_start,
  4938. cert->sigCtx.CertAtt.pubkey_e_len - 1,
  4939. row/* cm index */))
  4940. < 0)
  4941. WOLFSSL_MSG("Renesas_RootCertVerify() failed");
  4942. else
  4943. WOLFSSL_MSG("Renesas_RootCertVerify() succeed or skipped");
  4944. }
  4945. }
  4946. #endif /* TSIP or SCE */
  4947. WOLFSSL_MSG("\tFreeing Parsed CA");
  4948. FreeDecodedCert(cert);
  4949. if (ret != 0 && signer != NULL)
  4950. FreeSigner(signer, cm->heap);
  4951. #ifdef WOLFSSL_SMALL_STACK
  4952. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4953. #endif
  4954. WOLFSSL_MSG("\tFreeing der CA");
  4955. FreeDer(pDer);
  4956. WOLFSSL_MSG("\t\tOK Freeing der CA");
  4957. WOLFSSL_LEAVE("AddCA", ret);
  4958. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  4959. }
  4960. #endif /* !NO_CERTS */
  4961. #ifndef NO_SESSION_CACHE
  4962. /* basic config gives a cache with 33 sessions, adequate for clients and
  4963. embedded servers
  4964. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  4965. with titanic amounts of memory with long session ID timeouts and high
  4966. levels of traffic.
  4967. ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased
  4968. performance with large session caches
  4969. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  4970. allows over 13,000 new sessions per minute or over 200 new sessions per
  4971. second
  4972. BIG_SESSION_CACHE yields 20,027 sessions
  4973. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  4974. aren't under heavy load, basically allows 200 new sessions per minute
  4975. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  4976. or systems where the default of is too much RAM.
  4977. SessionCache takes about 2K, ClientCache takes about 3Kbytes
  4978. MICRO_SESSION_CACHE only stores 1 session, good for embedded clients
  4979. or systems where memory is at a premium.
  4980. SessionCache takes about 400 bytes, ClientCache takes 576 bytes
  4981. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  4982. SessionCache takes about 13K bytes, ClientCache takes 17K bytes
  4983. */
  4984. #if defined(TITAN_SESSION_CACHE)
  4985. #define SESSIONS_PER_ROW 31
  4986. #define SESSION_ROWS 64937
  4987. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  4988. #define ENABLE_SESSION_CACHE_ROW_LOCK
  4989. #endif
  4990. #elif defined(HUGE_SESSION_CACHE)
  4991. #define SESSIONS_PER_ROW 11
  4992. #define SESSION_ROWS 5981
  4993. #elif defined(BIG_SESSION_CACHE)
  4994. #define SESSIONS_PER_ROW 7
  4995. #define SESSION_ROWS 2861
  4996. #elif defined(MEDIUM_SESSION_CACHE)
  4997. #define SESSIONS_PER_ROW 5
  4998. #define SESSION_ROWS 211
  4999. #elif defined(SMALL_SESSION_CACHE)
  5000. #define SESSIONS_PER_ROW 2
  5001. #define SESSION_ROWS 3
  5002. #elif defined(MICRO_SESSION_CACHE)
  5003. #define SESSIONS_PER_ROW 1
  5004. #define SESSION_ROWS 1
  5005. #else
  5006. #define SESSIONS_PER_ROW 3
  5007. #define SESSION_ROWS 11
  5008. #endif
  5009. #define INVALID_SESSION_ROW (-1)
  5010. #ifdef NO_SESSION_CACHE_ROW_LOCK
  5011. #undef ENABLE_SESSION_CACHE_ROW_LOCK
  5012. #endif
  5013. typedef struct SessionRow {
  5014. int nextIdx; /* where to place next one */
  5015. int totalCount; /* sessions ever on this row */
  5016. #ifdef SESSION_CACHE_DYNAMIC_MEM
  5017. WOLFSSL_SESSION* Sessions[SESSIONS_PER_ROW];
  5018. void* heap;
  5019. #else
  5020. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  5021. #endif
  5022. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  5023. /* not included in import/export */
  5024. wolfSSL_RwLock row_lock;
  5025. int lock_valid;
  5026. #endif
  5027. } SessionRow;
  5028. #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2))
  5029. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  5030. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  5031. static WOLFSSL_GLOBAL word32 PeakSessions;
  5032. #endif
  5033. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  5034. #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&(row)->row_lock)
  5035. #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&(row)->row_lock)
  5036. #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&(row)->row_lock);
  5037. #else
  5038. static WOLFSSL_GLOBAL wolfSSL_RwLock session_lock; /* SessionCache lock */
  5039. static WOLFSSL_GLOBAL int session_lock_valid = 0;
  5040. #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&session_lock)
  5041. #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&session_lock)
  5042. #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&session_lock);
  5043. #endif
  5044. #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE)
  5045. #error ClientCache is required when not using NO_SESSION_CACHE_REF
  5046. #endif
  5047. #ifndef NO_CLIENT_CACHE
  5048. #ifndef CLIENT_SESSIONS_MULTIPLIER
  5049. #ifdef NO_SESSION_CACHE_REF
  5050. #define CLIENT_SESSIONS_MULTIPLIER 1
  5051. #else
  5052. /* ClientSession objects are lightweight (compared to
  5053. * WOLFSSL_SESSION) so to decrease chance that user will reuse
  5054. * the wrong session, increase the ClientCache size. This will
  5055. * make the entire ClientCache about the size of one
  5056. * WOLFSSL_SESSION object. */
  5057. #define CLIENT_SESSIONS_MULTIPLIER 8
  5058. #endif
  5059. #endif
  5060. #define CLIENT_SESSIONS_PER_ROW \
  5061. (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER)
  5062. #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER)
  5063. #if CLIENT_SESSIONS_PER_ROW > 65535
  5064. #error CLIENT_SESSIONS_PER_ROW too big
  5065. #endif
  5066. #if CLIENT_SESSION_ROWS > 65535
  5067. #error CLIENT_SESSION_ROWS too big
  5068. #endif
  5069. struct ClientSession {
  5070. word16 serverRow; /* SessionCache Row id */
  5071. word16 serverIdx; /* SessionCache Idx (column) */
  5072. word32 sessionIDHash;
  5073. };
  5074. #ifndef WOLFSSL_CLIENT_SESSION_DEFINED
  5075. typedef struct ClientSession ClientSession;
  5076. #define WOLFSSL_CLIENT_SESSION_DEFINED
  5077. #endif
  5078. typedef struct ClientRow {
  5079. int nextIdx; /* where to place next one */
  5080. int totalCount; /* sessions ever on this row */
  5081. ClientSession Clients[CLIENT_SESSIONS_PER_ROW];
  5082. } ClientRow;
  5083. static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS];
  5084. /* Client Cache */
  5085. /* uses session mutex */
  5086. static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(clisession_mutex); /* ClientCache mutex */
  5087. #ifndef WOLFSSL_MUTEX_INITIALIZER
  5088. static WOLFSSL_GLOBAL int clisession_mutex_valid = 0;
  5089. #endif
  5090. #endif /* !NO_CLIENT_CACHE */
  5091. void EvictSessionFromCache(WOLFSSL_SESSION* session)
  5092. {
  5093. #ifdef HAVE_EX_DATA
  5094. int save_ownExData = session->ownExData;
  5095. session->ownExData = 1; /* Make sure ex_data access doesn't lead back
  5096. * into the cache. */
  5097. #endif
  5098. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  5099. if (session->rem_sess_cb != NULL) {
  5100. session->rem_sess_cb(NULL, session);
  5101. session->rem_sess_cb = NULL;
  5102. }
  5103. #endif
  5104. ForceZero(session->masterSecret, SECRET_LEN);
  5105. XMEMSET(session->sessionID, 0, ID_LEN);
  5106. session->sessionIDSz = 0;
  5107. #ifdef HAVE_SESSION_TICKET
  5108. if (session->ticketLenAlloc > 0) {
  5109. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  5110. session->ticket = session->staticTicket;
  5111. session->ticketLen = 0;
  5112. session->ticketLenAlloc = 0;
  5113. }
  5114. #endif
  5115. #ifdef HAVE_EX_DATA
  5116. session->ownExData = save_ownExData;
  5117. #endif
  5118. }
  5119. #endif /* !NO_SESSION_CACHE */
  5120. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  5121. static int wolfSSL_RAND_InitMutex(void);
  5122. #endif
  5123. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  5124. static void AtExitCleanup(void)
  5125. {
  5126. if (initRefCount > 0) {
  5127. initRefCount = 1;
  5128. (void)wolfSSL_Cleanup();
  5129. }
  5130. }
  5131. #endif
  5132. WOLFSSL_ABI
  5133. int wolfSSL_Init(void)
  5134. {
  5135. int ret = WOLFSSL_SUCCESS;
  5136. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  5137. int i;
  5138. #endif
  5139. WOLFSSL_ENTER("wolfSSL_Init");
  5140. #ifndef WOLFSSL_MUTEX_INITIALIZER
  5141. if (inits_count_mutex_valid == 0) {
  5142. if (wc_InitMutex(&inits_count_mutex) != 0) {
  5143. WOLFSSL_MSG("Bad Init Mutex count");
  5144. return BAD_MUTEX_E;
  5145. }
  5146. else {
  5147. inits_count_mutex_valid = 1;
  5148. }
  5149. }
  5150. #endif /* !WOLFSSL_MUTEX_INITIALIZER */
  5151. if (wc_LockMutex(&inits_count_mutex) != 0) {
  5152. WOLFSSL_MSG("Bad Lock Mutex count");
  5153. return BAD_MUTEX_E;
  5154. }
  5155. #if FIPS_VERSION_GE(5,1)
  5156. if ((ret == WOLFSSL_SUCCESS) && (initRefCount == 0)) {
  5157. ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL);
  5158. if (ret == 0)
  5159. ret = WOLFSSL_SUCCESS;
  5160. }
  5161. #endif
  5162. if ((ret == WOLFSSL_SUCCESS) && (initRefCount == 0)) {
  5163. /* Initialize crypto for use with TLS connection */
  5164. if (wolfCrypt_Init() != 0) {
  5165. WOLFSSL_MSG("Bad wolfCrypt Init");
  5166. ret = WC_INIT_E;
  5167. }
  5168. #if defined(HAVE_GLOBAL_RNG) && !defined(WOLFSSL_MUTEX_INITIALIZER)
  5169. if (ret == WOLFSSL_SUCCESS) {
  5170. if (wc_InitMutex(&globalRNGMutex) != 0) {
  5171. WOLFSSL_MSG("Bad Init Mutex rng");
  5172. ret = BAD_MUTEX_E;
  5173. }
  5174. else {
  5175. globalRNGMutex_valid = 1;
  5176. }
  5177. }
  5178. #endif
  5179. #ifdef WC_RNG_SEED_CB
  5180. wc_SetSeed_Cb(wc_GenerateSeed);
  5181. #endif
  5182. #ifdef OPENSSL_EXTRA
  5183. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  5184. if ((ret == WOLFSSL_SUCCESS) && (wolfSSL_RAND_InitMutex() != 0)) {
  5185. ret = BAD_MUTEX_E;
  5186. }
  5187. #endif
  5188. if ((ret == WOLFSSL_SUCCESS) &&
  5189. (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS)) {
  5190. WOLFSSL_MSG("wolfSSL_RAND_seed failed");
  5191. ret = WC_INIT_E;
  5192. }
  5193. #endif
  5194. #ifndef NO_SESSION_CACHE
  5195. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  5196. for (i = 0; i < SESSION_ROWS; ++i) {
  5197. SessionCache[i].lock_valid = 0;
  5198. }
  5199. for (i = 0; (ret == WOLFSSL_SUCCESS) && (i < SESSION_ROWS); ++i) {
  5200. if (wc_InitRwLock(&SessionCache[i].row_lock) != 0) {
  5201. WOLFSSL_MSG("Bad Init Mutex session");
  5202. ret = BAD_MUTEX_E;
  5203. }
  5204. else {
  5205. SessionCache[i].lock_valid = 1;
  5206. }
  5207. }
  5208. #else
  5209. if (ret == WOLFSSL_SUCCESS) {
  5210. if (wc_InitRwLock(&session_lock) != 0) {
  5211. WOLFSSL_MSG("Bad Init Mutex session");
  5212. ret = BAD_MUTEX_E;
  5213. }
  5214. else {
  5215. session_lock_valid = 1;
  5216. }
  5217. }
  5218. #endif
  5219. #ifndef NO_CLIENT_CACHE
  5220. #ifndef WOLFSSL_MUTEX_INITIALIZER
  5221. if (ret == WOLFSSL_SUCCESS) {
  5222. if (wc_InitMutex(&clisession_mutex) != 0) {
  5223. WOLFSSL_MSG("Bad Init Mutex session");
  5224. ret = BAD_MUTEX_E;
  5225. }
  5226. else {
  5227. clisession_mutex_valid = 1;
  5228. }
  5229. }
  5230. #endif
  5231. #endif
  5232. #endif
  5233. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  5234. /* OpenSSL registers cleanup using atexit */
  5235. if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) {
  5236. WOLFSSL_MSG("Bad atexit registration");
  5237. ret = WC_INIT_E;
  5238. }
  5239. #endif
  5240. }
  5241. if (ret == WOLFSSL_SUCCESS) {
  5242. initRefCount++;
  5243. }
  5244. wc_UnLockMutex(&inits_count_mutex);
  5245. if (ret != WOLFSSL_SUCCESS) {
  5246. initRefCount = 1; /* Force cleanup */
  5247. (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */
  5248. }
  5249. return ret;
  5250. }
  5251. #ifndef NO_CERTS
  5252. /* process user cert chain to pass during the handshake */
  5253. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5254. long sz, int format, int type, WOLFSSL* ssl,
  5255. long* used, EncryptedInfo* info, int verify)
  5256. {
  5257. int ret = 0;
  5258. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  5259. if ((type == CA_TYPE) && (ctx == NULL)) {
  5260. WOLFSSL_MSG("Need context for CA load");
  5261. return BAD_FUNC_ARG;
  5262. }
  5263. /* we may have a user cert chain, try to consume */
  5264. if ((type == CERT_TYPE || type == CHAIN_CERT_TYPE || type == CA_TYPE) &&
  5265. (info->consumed < sz)) {
  5266. #ifdef WOLFSSL_SMALL_STACK
  5267. byte staticBuffer[1]; /* force heap usage */
  5268. #else
  5269. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  5270. #endif
  5271. byte* chainBuffer = staticBuffer;
  5272. int dynamicBuffer = 0;
  5273. word32 bufferSz;
  5274. long consumed = info->consumed;
  5275. word32 idx = 0;
  5276. int gotOne = 0;
  5277. #ifdef WOLFSSL_TLS13
  5278. int cnt = 0;
  5279. #endif
  5280. /* Calculate max possible size, including max headers */
  5281. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  5282. if (bufferSz > sizeof(staticBuffer)) {
  5283. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  5284. /* will shrink to actual size */
  5285. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  5286. if (chainBuffer == NULL) {
  5287. return MEMORY_E;
  5288. }
  5289. dynamicBuffer = 1;
  5290. }
  5291. WOLFSSL_MSG("Processing Cert Chain");
  5292. while (consumed < sz) {
  5293. DerBuffer* part = NULL;
  5294. word32 remain = (word32)(sz - consumed);
  5295. info->consumed = 0;
  5296. if (format == WOLFSSL_FILETYPE_PEM) {
  5297. #ifdef WOLFSSL_PEM_TO_DER
  5298. ret = PemToDer(buff + consumed, remain, type, &part,
  5299. heap, info, NULL);
  5300. #else
  5301. ret = NOT_COMPILED_IN;
  5302. #endif
  5303. }
  5304. else {
  5305. int length = remain;
  5306. if (format == WOLFSSL_FILETYPE_ASN1) {
  5307. /* get length of der (read sequence) */
  5308. word32 inOutIdx = 0;
  5309. if (GetSequence(buff + consumed, &inOutIdx, &length,
  5310. remain) < 0) {
  5311. ret = ASN_NO_PEM_HEADER;
  5312. }
  5313. length += inOutIdx; /* include leading sequence */
  5314. }
  5315. info->consumed = length;
  5316. if (ret == 0) {
  5317. ret = AllocDer(&part, length, type, heap);
  5318. if (ret == 0) {
  5319. XMEMCPY(part->buffer, buff + consumed, length);
  5320. }
  5321. }
  5322. }
  5323. if (ret == 0) {
  5324. gotOne = 1;
  5325. #ifdef WOLFSSL_TLS13
  5326. cnt++;
  5327. #endif
  5328. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  5329. WOLFSSL_MSG(" Cert Chain bigger than buffer. "
  5330. "Consider increasing MAX_CHAIN_DEPTH");
  5331. ret = BUFFER_E;
  5332. }
  5333. else {
  5334. c32to24(part->length, &chainBuffer[idx]);
  5335. idx += CERT_HEADER_SZ;
  5336. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  5337. idx += part->length;
  5338. consumed += info->consumed;
  5339. if (used)
  5340. *used += info->consumed;
  5341. }
  5342. /* add CA's to certificate manager */
  5343. if (ret == 0 && type == CA_TYPE) {
  5344. /* verify CA unless user set to no verify */
  5345. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  5346. if (ret == WOLFSSL_SUCCESS) {
  5347. ret = 0; /* converted success case */
  5348. }
  5349. gotOne = 0; /* don't exit loop for CA type */
  5350. }
  5351. }
  5352. FreeDer(&part);
  5353. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  5354. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  5355. break;
  5356. }
  5357. if (ret < 0) {
  5358. WOLFSSL_MSG(" Error in Cert in Chain");
  5359. if (dynamicBuffer)
  5360. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  5361. return ret;
  5362. }
  5363. WOLFSSL_MSG(" Consumed another Cert in Chain");
  5364. }
  5365. WOLFSSL_MSG("Finished Processing Cert Chain");
  5366. /* only retain actual size used */
  5367. ret = 0;
  5368. if (idx > 0) {
  5369. if (ssl) {
  5370. if (ssl->buffers.weOwnCertChain) {
  5371. FreeDer(&ssl->buffers.certChain);
  5372. }
  5373. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  5374. if (ret == 0) {
  5375. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  5376. idx);
  5377. ssl->buffers.weOwnCertChain = 1;
  5378. }
  5379. #ifdef WOLFSSL_TLS13
  5380. ssl->buffers.certChainCnt = cnt;
  5381. #endif
  5382. } else if (ctx) {
  5383. FreeDer(&ctx->certChain);
  5384. ret = AllocDer(&ctx->certChain, idx, type, heap);
  5385. if (ret == 0) {
  5386. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  5387. }
  5388. #ifdef WOLFSSL_TLS13
  5389. ctx->certChainCnt = cnt;
  5390. #endif
  5391. }
  5392. }
  5393. if (dynamicBuffer)
  5394. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  5395. }
  5396. return ret;
  5397. }
  5398. #ifndef NO_RSA
  5399. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  5400. (HAVE_FIPS_VERSION > 2))
  5401. static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5402. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5403. int devId)
  5404. {
  5405. int ret;
  5406. (void)devId;
  5407. *idx = 0;
  5408. ret = wc_RsaPrivateKeyValidate(der->buffer, idx, keySz, der->length);
  5409. #ifdef WOLF_PRIVATE_KEY_ID
  5410. if ((ret != 0) && (devId != INVALID_DEVID
  5411. #ifdef HAVE_PK_CALLBACKS
  5412. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5413. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5414. #endif
  5415. )) {
  5416. word32 nSz;
  5417. /* if using crypto or PK callbacks, try public key decode */
  5418. *idx = 0;
  5419. ret = wc_RsaPublicKeyDecode_ex(der->buffer, idx, der->length, NULL,
  5420. &nSz, NULL, NULL);
  5421. if (ret == 0) {
  5422. *keySz = (int)nSz;
  5423. }
  5424. }
  5425. #endif
  5426. if (ret != 0) {
  5427. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  5428. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  5429. WOLFSSL_MSG("RSA decode failed and other algorithms "
  5430. "not enabled to try");
  5431. ret = WOLFSSL_BAD_FILE;
  5432. #else
  5433. if (*keyFormat == 0) {
  5434. /* Format unknown so keep trying. */
  5435. ret = 0; /* continue trying other algorithms */
  5436. }
  5437. #endif
  5438. }
  5439. else {
  5440. /* check that the size of the RSA key is enough */
  5441. int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz;
  5442. if (*keySz < minRsaSz) {
  5443. ret = RSA_KEY_SIZE_E;
  5444. WOLFSSL_MSG("Private Key size too small");
  5445. }
  5446. if (ssl) {
  5447. ssl->buffers.keyType = rsa_sa_algo;
  5448. ssl->buffers.keySz = *keySz;
  5449. }
  5450. else {
  5451. ctx->privateKeyType = rsa_sa_algo;
  5452. ctx->privateKeySz = *keySz;
  5453. }
  5454. *keyFormat = RSAk;
  5455. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5456. ssl->options.haveStaticECC = 0;
  5457. *resetSuites = 1;
  5458. }
  5459. }
  5460. return ret;
  5461. }
  5462. #else
  5463. static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5464. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5465. void* heap, int devId)
  5466. {
  5467. int ret;
  5468. /* make sure RSA key can be used */
  5469. #ifdef WOLFSSL_SMALL_STACK
  5470. RsaKey* key;
  5471. #else
  5472. RsaKey key[1];
  5473. #endif
  5474. #ifdef WOLFSSL_SMALL_STACK
  5475. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  5476. if (key == NULL)
  5477. return MEMORY_E;
  5478. #endif
  5479. ret = wc_InitRsaKey_ex(key, heap, devId);
  5480. if (ret == 0) {
  5481. *idx = 0;
  5482. ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length);
  5483. #ifdef WOLF_PRIVATE_KEY_ID
  5484. if (ret != 0 && (devId != INVALID_DEVID
  5485. #ifdef HAVE_PK_CALLBACKS
  5486. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5487. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5488. #endif
  5489. )) {
  5490. /* if using crypto or PK callbacks, try public key decode */
  5491. *idx = 0;
  5492. ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length);
  5493. }
  5494. #endif
  5495. if (ret != 0) {
  5496. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  5497. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  5498. WOLFSSL_MSG("RSA decode failed and other algorithms "
  5499. "not enabled to try");
  5500. ret = WOLFSSL_BAD_FILE;
  5501. #else
  5502. if (*keyFormat == 0) {
  5503. /* Format unknown so keep trying. */
  5504. ret = 0; /* continue trying other algorithms */
  5505. }
  5506. #endif
  5507. }
  5508. else {
  5509. /* check that the size of the RSA key is enough */
  5510. int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz;
  5511. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  5512. if (*keySz < minRsaSz) {
  5513. ret = RSA_KEY_SIZE_E;
  5514. WOLFSSL_MSG("Private Key size too small");
  5515. }
  5516. if (ssl) {
  5517. ssl->buffers.keyType = rsa_sa_algo;
  5518. ssl->buffers.keySz = *keySz;
  5519. }
  5520. else {
  5521. ctx->privateKeyType = rsa_sa_algo;
  5522. ctx->privateKeySz = *keySz;
  5523. }
  5524. *keyFormat = RSAk;
  5525. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5526. ssl->options.haveStaticECC = 0;
  5527. *resetSuites = 1;
  5528. }
  5529. }
  5530. wc_FreeRsaKey(key);
  5531. }
  5532. #ifdef WOLFSSL_SMALL_STACK
  5533. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  5534. #endif
  5535. return ret;
  5536. }
  5537. #endif
  5538. #endif /* !NO_RSA */
  5539. #ifdef HAVE_ECC
  5540. static int ProcessBufferTryDecodeEcc(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5541. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5542. void* heap, int devId)
  5543. {
  5544. int ret = 0;
  5545. /* make sure ECC key can be used */
  5546. #ifdef WOLFSSL_SMALL_STACK
  5547. ecc_key* key;
  5548. #else
  5549. ecc_key key[1];
  5550. #endif
  5551. #ifdef WOLFSSL_SMALL_STACK
  5552. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  5553. if (key == NULL)
  5554. return MEMORY_E;
  5555. #endif
  5556. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  5557. *idx = 0;
  5558. ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length);
  5559. #ifdef WOLF_PRIVATE_KEY_ID
  5560. if (ret != 0 && (devId != INVALID_DEVID
  5561. #ifdef HAVE_PK_CALLBACKS
  5562. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5563. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5564. #endif
  5565. )) {
  5566. /* if using crypto or PK callbacks, try public key decode */
  5567. *idx = 0;
  5568. ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length);
  5569. }
  5570. #endif
  5571. if (ret == 0) {
  5572. /* check for minimum ECC key size and then free */
  5573. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5574. *keySz = wc_ecc_size(key);
  5575. if (*keySz < minKeySz) {
  5576. WOLFSSL_MSG("ECC private key too small");
  5577. ret = ECC_KEY_SIZE_E;
  5578. }
  5579. *keyFormat = ECDSAk;
  5580. if (ssl) {
  5581. ssl->options.haveStaticECC = 1;
  5582. ssl->buffers.keyType = ecc_dsa_sa_algo;
  5583. #ifdef WOLFSSL_SM2
  5584. if (key->dp->id == ECC_SM2P256V1)
  5585. ssl->buffers.keyType = sm2_sa_algo;
  5586. else
  5587. #endif
  5588. ssl->buffers.keyType = ecc_dsa_sa_algo;
  5589. ssl->buffers.keySz = *keySz;
  5590. }
  5591. else {
  5592. ctx->haveStaticECC = 1;
  5593. ctx->privateKeyType = ecc_dsa_sa_algo;
  5594. #ifdef WOLFSSL_SM2
  5595. if (key->dp->id == ECC_SM2P256V1)
  5596. ctx->privateKeyType = sm2_sa_algo;
  5597. else
  5598. #endif
  5599. ctx->privateKeyType = ecc_dsa_sa_algo;
  5600. ctx->privateKeySz = *keySz;
  5601. }
  5602. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5603. *resetSuites = 1;
  5604. }
  5605. }
  5606. else if (*keyFormat == 0) {
  5607. ret = 0; /* continue trying other algorithms */
  5608. }
  5609. wc_ecc_free(key);
  5610. }
  5611. #ifdef WOLFSSL_SMALL_STACK
  5612. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5613. #endif
  5614. return ret;
  5615. }
  5616. #endif /* HAVE_ECC */
  5617. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  5618. static int ProcessBufferTryDecodeEd25519(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5619. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5620. void* heap, int devId)
  5621. {
  5622. int ret;
  5623. /* make sure Ed25519 key can be used */
  5624. #ifdef WOLFSSL_SMALL_STACK
  5625. ed25519_key* key;
  5626. #else
  5627. ed25519_key key[1];
  5628. #endif
  5629. #ifdef WOLFSSL_SMALL_STACK
  5630. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  5631. DYNAMIC_TYPE_ED25519);
  5632. if (key == NULL)
  5633. return MEMORY_E;
  5634. #endif
  5635. ret = wc_ed25519_init_ex(key, heap, devId);
  5636. if (ret == 0) {
  5637. *idx = 0;
  5638. ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length);
  5639. #ifdef WOLF_PRIVATE_KEY_ID
  5640. if (ret != 0 && (devId != INVALID_DEVID
  5641. #ifdef HAVE_PK_CALLBACKS
  5642. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5643. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5644. #endif
  5645. )) {
  5646. /* if using crypto or PK callbacks, try public key decode */
  5647. *idx = 0;
  5648. ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key, der->length);
  5649. }
  5650. #endif
  5651. if (ret == 0) {
  5652. /* check for minimum key size and then free */
  5653. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5654. *keySz = ED25519_KEY_SIZE;
  5655. if (*keySz < minKeySz) {
  5656. WOLFSSL_MSG("ED25519 private key too small");
  5657. ret = ECC_KEY_SIZE_E;
  5658. }
  5659. if (ret == 0) {
  5660. if (ssl) {
  5661. ssl->buffers.keyType = ed25519_sa_algo;
  5662. ssl->buffers.keySz = *keySz;
  5663. }
  5664. else {
  5665. ctx->privateKeyType = ed25519_sa_algo;
  5666. ctx->privateKeySz = *keySz;
  5667. }
  5668. *keyFormat = ED25519k;
  5669. if (ssl != NULL) {
  5670. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && !defined(NO_ED25519_CLIENT_AUTH)
  5671. /* ED25519 requires caching enabled for tracking message
  5672. * hash used in EdDSA_Update for signing */
  5673. ssl->options.cacheMessages = 1;
  5674. #endif
  5675. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5676. *resetSuites = 1;
  5677. }
  5678. }
  5679. }
  5680. }
  5681. else if (*keyFormat == 0) {
  5682. ret = 0; /* continue trying other algorithms */
  5683. }
  5684. wc_ed25519_free(key);
  5685. }
  5686. #ifdef WOLFSSL_SMALL_STACK
  5687. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  5688. #endif
  5689. return ret;
  5690. }
  5691. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  5692. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  5693. static int ProcessBufferTryDecodeEd448(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5694. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5695. void* heap, int devId)
  5696. {
  5697. int ret;
  5698. /* make sure Ed448 key can be used */
  5699. #ifdef WOLFSSL_SMALL_STACK
  5700. ed448_key* key = NULL;
  5701. #else
  5702. ed448_key key[1];
  5703. #endif
  5704. #ifdef WOLFSSL_SMALL_STACK
  5705. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  5706. if (key == NULL)
  5707. return MEMORY_E;
  5708. #endif
  5709. ret = wc_ed448_init_ex(key, heap, devId);
  5710. if (ret == 0) {
  5711. *idx = 0;
  5712. ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length);
  5713. #ifdef WOLF_PRIVATE_KEY_ID
  5714. if (ret != 0 && (devId != INVALID_DEVID
  5715. #ifdef HAVE_PK_CALLBACKS
  5716. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5717. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5718. #endif
  5719. )) {
  5720. /* if using crypto or PK callbacks, try public key decode */
  5721. *idx = 0;
  5722. ret = wc_Ed448PublicKeyDecode(der->buffer, idx, key, der->length);
  5723. }
  5724. #endif
  5725. if (ret == 0) {
  5726. /* check for minimum key size and then free */
  5727. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5728. *keySz = ED448_KEY_SIZE;
  5729. if (*keySz < minKeySz) {
  5730. WOLFSSL_MSG("ED448 private key too small");
  5731. ret = ECC_KEY_SIZE_E;
  5732. }
  5733. }
  5734. if (ret == 0) {
  5735. if (ssl) {
  5736. ssl->buffers.keyType = ed448_sa_algo;
  5737. ssl->buffers.keySz = *keySz;
  5738. }
  5739. else if (ctx) {
  5740. ctx->privateKeyType = ed448_sa_algo;
  5741. ctx->privateKeySz = *keySz;
  5742. }
  5743. *keyFormat = ED448k;
  5744. if (ssl != NULL) {
  5745. /* ED448 requires caching enabled for tracking message
  5746. * hash used in EdDSA_Update for signing */
  5747. ssl->options.cacheMessages = 1;
  5748. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5749. *resetSuites = 1;
  5750. }
  5751. }
  5752. }
  5753. else if (*keyFormat == 0) {
  5754. ret = 0; /* continue trying other algorithms */
  5755. }
  5756. wc_ed448_free(key);
  5757. }
  5758. #ifdef WOLFSSL_SMALL_STACK
  5759. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  5760. #endif
  5761. return ret;
  5762. }
  5763. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  5764. #if defined(HAVE_PQC)
  5765. #if defined(HAVE_FALCON)
  5766. static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5767. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5768. void* heap, int type)
  5769. {
  5770. int ret;
  5771. /* make sure Falcon key can be used */
  5772. falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  5773. DYNAMIC_TYPE_FALCON);
  5774. (void) type;
  5775. if (key == NULL) {
  5776. return MEMORY_E;
  5777. }
  5778. ret = wc_falcon_init(key);
  5779. if (ret == 0) {
  5780. if (*keyFormat == FALCON_LEVEL1k) {
  5781. ret = wc_falcon_set_level(key, 1);
  5782. }
  5783. else if (*keyFormat == FALCON_LEVEL5k) {
  5784. ret = wc_falcon_set_level(key, 5);
  5785. }
  5786. else {
  5787. /* What if *keyformat is 0? We might want to do something more
  5788. * graceful here. */
  5789. wc_falcon_free(key);
  5790. ret = ALGO_ID_E;
  5791. }
  5792. }
  5793. if (ret == 0) {
  5794. *idx = 0;
  5795. ret = wc_falcon_import_private_only(der->buffer, der->length, key);
  5796. if (ret == 0) {
  5797. /* check for minimum key size and then free */
  5798. int minKeySz = ssl ? ssl->options.minFalconKeySz :
  5799. ctx->minFalconKeySz;
  5800. *keySz = FALCON_MAX_KEY_SIZE;
  5801. if (*keySz < minKeySz) {
  5802. WOLFSSL_MSG("Falcon private key too small");
  5803. ret = FALCON_KEY_SIZE_E;
  5804. }
  5805. if (ssl) {
  5806. #ifdef WOLFSSL_DUAL_ALG_CERTS
  5807. if (type == ALT_PRIVATEKEY_TYPE) {
  5808. if (*keyFormat == FALCON_LEVEL1k) {
  5809. ssl->buffers.altKeyType = falcon_level1_sa_algo;
  5810. }
  5811. else {
  5812. ssl->buffers.altKeyType = falcon_level5_sa_algo;
  5813. }
  5814. ssl->buffers.altKeySz = *keySz;
  5815. }
  5816. else
  5817. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  5818. {
  5819. if (*keyFormat == FALCON_LEVEL1k) {
  5820. ssl->buffers.keyType = falcon_level1_sa_algo;
  5821. }
  5822. else {
  5823. ssl->buffers.keyType = falcon_level5_sa_algo;
  5824. }
  5825. ssl->buffers.keySz = *keySz;
  5826. }
  5827. }
  5828. else {
  5829. #ifdef WOLFSSL_DUAL_ALG_CERTS
  5830. if (type == ALT_PRIVATEKEY_TYPE) {
  5831. if (*keyFormat == FALCON_LEVEL1k) {
  5832. ctx->altPrivateKeyType = falcon_level1_sa_algo;
  5833. }
  5834. else {
  5835. ctx->altPrivateKeyType = falcon_level5_sa_algo;
  5836. }
  5837. ctx->altPrivateKeySz = *keySz;
  5838. }
  5839. else
  5840. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  5841. {
  5842. if (*keyFormat == FALCON_LEVEL1k) {
  5843. ctx->privateKeyType = falcon_level1_sa_algo;
  5844. }
  5845. else {
  5846. ctx->privateKeyType = falcon_level5_sa_algo;
  5847. }
  5848. ctx->privateKeySz = *keySz;
  5849. }
  5850. }
  5851. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5852. *resetSuites = 1;
  5853. }
  5854. }
  5855. else if (*keyFormat == 0) {
  5856. ret = 0; /* continue trying other algorithms */
  5857. }
  5858. wc_falcon_free(key);
  5859. }
  5860. XFREE(key, heap, DYNAMIC_TYPE_FALCON);
  5861. return ret;
  5862. }
  5863. #endif
  5864. #if defined(HAVE_DILITHIUM)
  5865. static int ProcessBufferTryDecodeDilithium(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5866. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5867. void* heap, int type)
  5868. {
  5869. int ret;
  5870. /* make sure Dilithium key can be used */
  5871. dilithium_key* key = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap,
  5872. DYNAMIC_TYPE_DILITHIUM);
  5873. (void) type;
  5874. if (key == NULL) {
  5875. return MEMORY_E;
  5876. }
  5877. ret = wc_dilithium_init(key);
  5878. if (ret == 0) {
  5879. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5880. ret = wc_dilithium_set_level(key, 2);
  5881. }
  5882. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5883. ret = wc_dilithium_set_level(key, 3);
  5884. }
  5885. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5886. ret = wc_dilithium_set_level(key, 5);
  5887. }
  5888. else {
  5889. /* What if *keyformat is 0? We might want to do something more
  5890. * graceful here. */
  5891. wc_dilithium_free(key);
  5892. ret = ALGO_ID_E;
  5893. }
  5894. }
  5895. if (ret == 0) {
  5896. *idx = 0;
  5897. ret = wc_dilithium_import_private_only(der->buffer, der->length, key);
  5898. if (ret == 0) {
  5899. /* check for minimum key size and then free */
  5900. int minKeySz = ssl ? ssl->options.minDilithiumKeySz :
  5901. ctx->minDilithiumKeySz;
  5902. *keySz = DILITHIUM_MAX_KEY_SIZE;
  5903. if (*keySz < minKeySz) {
  5904. WOLFSSL_MSG("Dilithium private key too small");
  5905. ret = DILITHIUM_KEY_SIZE_E;
  5906. }
  5907. if (ssl) {
  5908. #ifdef WOLFSSL_DUAL_ALG_CERTS
  5909. if (type == ALT_PRIVATEKEY_TYPE) {
  5910. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5911. ssl->buffers.altKeyType = dilithium_level2_sa_algo;
  5912. }
  5913. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5914. ssl->buffers.altKeyType = dilithium_level3_sa_algo;
  5915. }
  5916. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5917. ssl->buffers.altKeyType = dilithium_level5_sa_algo;
  5918. }
  5919. ssl->buffers.altKeySz = *keySz;
  5920. }
  5921. else
  5922. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  5923. {
  5924. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5925. ssl->buffers.keyType = dilithium_level2_sa_algo;
  5926. }
  5927. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5928. ssl->buffers.keyType = dilithium_level3_sa_algo;
  5929. }
  5930. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5931. ssl->buffers.keyType = dilithium_level5_sa_algo;
  5932. }
  5933. ssl->buffers.keySz = *keySz;
  5934. }
  5935. }
  5936. else {
  5937. #ifdef WOLFSSL_DUAL_ALG_CERTS
  5938. if (type == ALT_PRIVATEKEY_TYPE) {
  5939. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5940. ctx->altPrivateKeyType = dilithium_level2_sa_algo;
  5941. }
  5942. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5943. ctx->altPrivateKeyType = dilithium_level3_sa_algo;
  5944. }
  5945. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5946. ctx->altPrivateKeyType = dilithium_level5_sa_algo;
  5947. }
  5948. ctx->altPrivateKeySz = *keySz;
  5949. }
  5950. else
  5951. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  5952. {
  5953. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5954. ctx->privateKeyType = dilithium_level2_sa_algo;
  5955. }
  5956. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5957. ctx->privateKeyType = dilithium_level3_sa_algo;
  5958. }
  5959. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5960. ctx->privateKeyType = dilithium_level5_sa_algo;
  5961. }
  5962. ctx->privateKeySz = *keySz;
  5963. }
  5964. }
  5965. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5966. *resetSuites = 1;
  5967. }
  5968. }
  5969. else if (*keyFormat == 0) {
  5970. ret = 0; /* continue trying other algorithms */
  5971. }
  5972. wc_dilithium_free(key);
  5973. }
  5974. XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM);
  5975. return ret;
  5976. }
  5977. #endif /* HAVE_DILITHIUM */
  5978. #endif /* HAVE_PQC */
  5979. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5980. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5981. void* heap, int devId, int type)
  5982. {
  5983. int ret = 0;
  5984. (void)heap;
  5985. (void)devId;
  5986. (void)type;
  5987. if (ctx == NULL && ssl == NULL)
  5988. return BAD_FUNC_ARG;
  5989. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  5990. return BAD_FUNC_ARG;
  5991. #ifndef NO_RSA
  5992. if ((*keyFormat == 0 || *keyFormat == RSAk)) {
  5993. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  5994. (HAVE_FIPS_VERSION > 2))
  5995. ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites,
  5996. keyFormat, devId);
  5997. #else
  5998. ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites,
  5999. keyFormat, heap, devId);
  6000. #endif
  6001. if (ret != 0)
  6002. return ret;
  6003. }
  6004. #endif
  6005. #ifdef HAVE_ECC
  6006. if ((*keyFormat == 0) || (*keyFormat == ECDSAk)
  6007. #ifdef WOLFSSL_SM2
  6008. || (*keyFormat == SM2k)
  6009. #endif
  6010. ) {
  6011. ret = ProcessBufferTryDecodeEcc(ctx, ssl, der, keySz, idx, resetSuites,
  6012. keyFormat, heap, devId);
  6013. if (ret != 0)
  6014. return ret;
  6015. }
  6016. #endif /* HAVE_ECC */
  6017. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  6018. if ((*keyFormat == 0 || *keyFormat == ED25519k)) {
  6019. ret = ProcessBufferTryDecodeEd25519(ctx, ssl, der, keySz, idx,
  6020. resetSuites, keyFormat, heap, devId);
  6021. if (ret != 0)
  6022. return ret;
  6023. }
  6024. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  6025. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  6026. if ((*keyFormat == 0 || *keyFormat == ED448k)) {
  6027. ret = ProcessBufferTryDecodeEd448(ctx, ssl, der, keySz, idx,
  6028. resetSuites, keyFormat, heap, devId);
  6029. if (ret != 0)
  6030. return ret;
  6031. }
  6032. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  6033. #if defined(HAVE_PQC)
  6034. #if defined(HAVE_FALCON)
  6035. if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) ||
  6036. (*keyFormat == FALCON_LEVEL5k))) {
  6037. ret = ProcessBufferTryDecodeFalcon(ctx, ssl, der, keySz, idx,
  6038. resetSuites, keyFormat, heap, type);
  6039. if (ret != 0)
  6040. return ret;
  6041. }
  6042. #endif /* HAVE_FALCON */
  6043. #if defined(HAVE_DILITHIUM)
  6044. if ((*keyFormat == 0) ||
  6045. (*keyFormat == DILITHIUM_LEVEL2k) ||
  6046. (*keyFormat == DILITHIUM_LEVEL3k) ||
  6047. (*keyFormat == DILITHIUM_LEVEL5k)) {
  6048. ret = ProcessBufferTryDecodeDilithium(ctx, ssl, der, keySz, idx,
  6049. resetSuites, keyFormat, heap, type);
  6050. if (ret != 0) {
  6051. return ret;
  6052. }
  6053. }
  6054. #endif /* HAVE_DILITHIUM */
  6055. #endif /* HAVE_PQC */
  6056. return ret;
  6057. }
  6058. /* process the buffer buff, length sz, into ctx of format and type
  6059. used tracks bytes consumed, userChain specifies a user cert chain
  6060. to pass during the handshake */
  6061. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6062. long sz, int format, int type, WOLFSSL* ssl,
  6063. long* used, int userChain, int verify)
  6064. {
  6065. DerBuffer* der = NULL;
  6066. int ret = 0;
  6067. int done = 0;
  6068. int keyFormat = 0;
  6069. int resetSuites = 0;
  6070. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  6071. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  6072. word32 idx = 0;
  6073. int keySz = 0;
  6074. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  6075. defined(HAVE_PKCS8)
  6076. word32 algId = 0;
  6077. #endif
  6078. #ifdef WOLFSSL_SMALL_STACK
  6079. EncryptedInfo* info = NULL;
  6080. #else
  6081. EncryptedInfo info[1];
  6082. #endif
  6083. (void)devId;
  6084. (void)idx;
  6085. (void)keySz;
  6086. if (used)
  6087. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  6088. /* check args */
  6089. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  6090. return WOLFSSL_BAD_FILETYPE;
  6091. if (ctx == NULL && ssl == NULL)
  6092. return BAD_FUNC_ARG;
  6093. /* This API does not handle CHAIN_CERT_TYPE */
  6094. if (type == CHAIN_CERT_TYPE)
  6095. return BAD_FUNC_ARG;
  6096. #ifdef WOLFSSL_SMALL_STACK
  6097. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  6098. DYNAMIC_TYPE_ENCRYPTEDINFO);
  6099. if (info == NULL)
  6100. return MEMORY_E;
  6101. #endif
  6102. XMEMSET(info, 0, sizeof(EncryptedInfo));
  6103. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  6104. if (ctx) {
  6105. info->passwd_cb = ctx->passwd_cb;
  6106. info->passwd_userdata = ctx->passwd_userdata;
  6107. }
  6108. #endif
  6109. if (format == WOLFSSL_FILETYPE_PEM) {
  6110. #ifdef WOLFSSL_PEM_TO_DER
  6111. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  6112. #else
  6113. ret = NOT_COMPILED_IN;
  6114. #endif
  6115. }
  6116. else {
  6117. /* ASN1 (DER) */
  6118. int length = (int)sz;
  6119. word32 inOutIdx = 0;
  6120. /* get length of der (read sequence or octet string) */
  6121. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  6122. length += inOutIdx; /* include leading sequence */
  6123. }
  6124. /* get length using octet string (allowed for private key types) */
  6125. else if (type == PRIVATEKEY_TYPE &&
  6126. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  6127. length += inOutIdx; /* include leading oct string */
  6128. }
  6129. else {
  6130. ret = ASN_PARSE_E;
  6131. }
  6132. info->consumed = length;
  6133. if (ret == 0) {
  6134. ret = AllocDer(&der, (word32)length, type, heap);
  6135. if (ret == 0) {
  6136. XMEMCPY(der->buffer, buff, length);
  6137. }
  6138. #ifdef HAVE_PKCS8
  6139. /* if private key try and remove PKCS8 header */
  6140. if (ret == 0 && type == PRIVATEKEY_TYPE) {
  6141. if ((ret = ToTraditional_ex(der->buffer, der->length,
  6142. &algId)) > 0) {
  6143. /* Found PKCS8 header */
  6144. /* ToTraditional_ex moves buff and returns adjusted length */
  6145. der->length = ret;
  6146. keyFormat = algId;
  6147. }
  6148. ret = 0; /* failures should be ignored */
  6149. }
  6150. #endif
  6151. }
  6152. }
  6153. if (used) {
  6154. *used = info->consumed;
  6155. }
  6156. /* process user chain */
  6157. if (ret >= 0) {
  6158. /* Chain should have server cert first, then intermediates, then root.
  6159. * First certificate in chain is processed below after ProcessUserChain
  6160. * and is loaded into ssl->buffers.certificate.
  6161. * Remainder are processed using ProcessUserChain and are loaded into
  6162. * ssl->buffers.certChain. */
  6163. if (userChain) {
  6164. ret = ProcessUserChain(ctx, buff, sz, format, CHAIN_CERT_TYPE, ssl,
  6165. used, info, verify);
  6166. if (ret == ASN_NO_PEM_HEADER) { /* Additional chain is optional */
  6167. unsigned long pemErr = 0;
  6168. CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr);
  6169. ret = 0;
  6170. }
  6171. }
  6172. }
  6173. /* info is only used for private key with DER or PEM, so free now */
  6174. if (ret < 0 || type != PRIVATEKEY_TYPE) {
  6175. #ifdef WOLFSSL_SMALL_STACK
  6176. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6177. #endif
  6178. }
  6179. /* check for error */
  6180. if (ret < 0) {
  6181. FreeDer(&der);
  6182. done = 1;
  6183. }
  6184. if (done == 1) {
  6185. /* No operation, just skip the next section */
  6186. }
  6187. /* Handle DER owner */
  6188. else if (type == CA_TYPE) {
  6189. if (ctx == NULL) {
  6190. WOLFSSL_MSG("Need context for CA load");
  6191. FreeDer(&der);
  6192. return BAD_FUNC_ARG;
  6193. }
  6194. /* verify CA unless user set to no verify */
  6195. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  6196. done = 1;
  6197. }
  6198. #ifdef WOLFSSL_TRUST_PEER_CERT
  6199. else if (type == TRUSTED_PEER_TYPE) {
  6200. /* add trusted peer cert. der is freed within */
  6201. if (ctx != NULL)
  6202. ret = AddTrustedPeer(ctx->cm, &der, verify);
  6203. else {
  6204. SSL_CM_WARNING(ssl);
  6205. ret = AddTrustedPeer(SSL_CM(ssl), &der, verify);
  6206. }
  6207. if (ret != WOLFSSL_SUCCESS) {
  6208. WOLFSSL_MSG("Error adding trusted peer");
  6209. }
  6210. done = 1;
  6211. }
  6212. #endif /* WOLFSSL_TRUST_PEER_CERT */
  6213. else if (type == CERT_TYPE) {
  6214. if (ssl != NULL) {
  6215. /* Make sure previous is free'd */
  6216. if (ssl->buffers.weOwnCert) {
  6217. FreeDer(&ssl->buffers.certificate);
  6218. #ifdef KEEP_OUR_CERT
  6219. wolfSSL_X509_free(ssl->ourCert);
  6220. ssl->ourCert = NULL;
  6221. #endif
  6222. }
  6223. ssl->buffers.certificate = der;
  6224. #ifdef KEEP_OUR_CERT
  6225. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  6226. #endif
  6227. ssl->buffers.weOwnCert = 1;
  6228. }
  6229. else if (ctx != NULL) {
  6230. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  6231. #ifdef KEEP_OUR_CERT
  6232. if (ctx->ourCert) {
  6233. if (ctx->ownOurCert)
  6234. wolfSSL_X509_free(ctx->ourCert);
  6235. ctx->ourCert = NULL;
  6236. }
  6237. #endif
  6238. ctx->certificate = der;
  6239. }
  6240. }
  6241. else if (type == PRIVATEKEY_TYPE) {
  6242. if (ssl != NULL) {
  6243. /* Make sure previous is free'd */
  6244. if (ssl->buffers.weOwnKey) {
  6245. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  6246. FreeDer(&ssl->buffers.key);
  6247. }
  6248. ssl->buffers.key = der;
  6249. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6250. wc_MemZero_Add("SSL Buffers key", der->buffer, der->length);
  6251. #endif
  6252. ssl->buffers.weOwnKey = 1;
  6253. }
  6254. else if (ctx != NULL) {
  6255. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  6256. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  6257. }
  6258. FreeDer(&ctx->privateKey);
  6259. ctx->privateKey = der;
  6260. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6261. wc_MemZero_Add("CTX private key", der->buffer, der->length);
  6262. #endif
  6263. }
  6264. }
  6265. #ifdef WOLFSSL_DUAL_ALG_CERTS
  6266. else if (type == ALT_PRIVATEKEY_TYPE) {
  6267. if (ssl != NULL) {
  6268. /* Make sure previous is free'd */
  6269. if (ssl->buffers.weOwnAltKey) {
  6270. ForceZero(ssl->buffers.altKey->buffer,
  6271. ssl->buffers.altKey->length);
  6272. FreeDer(&ssl->buffers.altKey);
  6273. }
  6274. ssl->buffers.altKey = der;
  6275. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6276. wc_MemZero_Add("SSL Buffers key", der->buffer, der->length);
  6277. #endif
  6278. ssl->buffers.weOwnAltKey = 1;
  6279. }
  6280. else if (ctx != NULL) {
  6281. if (ctx->altPrivateKey != NULL &&
  6282. ctx->altPrivateKey->buffer != NULL) {
  6283. ForceZero(ctx->altPrivateKey->buffer,
  6284. ctx->altPrivateKey->length);
  6285. }
  6286. FreeDer(&ctx->altPrivateKey);
  6287. ctx->altPrivateKey = der;
  6288. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6289. wc_MemZero_Add("CTX private key", der->buffer, der->length);
  6290. #endif
  6291. }
  6292. }
  6293. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  6294. else {
  6295. FreeDer(&der);
  6296. return WOLFSSL_BAD_CERTTYPE;
  6297. }
  6298. if (done == 1) {
  6299. /* No operation, just skip the next section */
  6300. }
  6301. else if (type == PRIVATEKEY_TYPE
  6302. #ifdef WOLFSSL_DUAL_ALG_CERTS
  6303. || type == ALT_PRIVATEKEY_TYPE
  6304. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  6305. ) {
  6306. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  6307. &keyFormat, heap, devId, type);
  6308. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  6309. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  6310. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  6311. if ((ret != 0 || keyFormat == 0)
  6312. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  6313. {
  6314. int passwordSz = NAME_SZ;
  6315. #ifndef WOLFSSL_SMALL_STACK
  6316. char password[NAME_SZ];
  6317. #else
  6318. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  6319. if (password == NULL) {
  6320. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6321. FreeDer(&der);
  6322. return MEMORY_E;
  6323. }
  6324. #endif
  6325. /* get password */
  6326. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  6327. info->passwd_userdata);
  6328. if (ret >= 0) {
  6329. passwordSz = ret;
  6330. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6331. wc_MemZero_Add("ProcessBuffer password", password, passwordSz);
  6332. #endif
  6333. /* PKCS8 decrypt */
  6334. ret = ToTraditionalEnc(der->buffer, der->length,
  6335. password, passwordSz, &algId);
  6336. if (ret >= 0) {
  6337. ForceZero(der->buffer + ret, der->length - ret);
  6338. der->length = ret;
  6339. }
  6340. /* ignore failures and try parsing as unencrypted */
  6341. ForceZero(password, passwordSz);
  6342. }
  6343. #ifdef WOLFSSL_SMALL_STACK
  6344. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  6345. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  6346. wc_MemZero_Check(password, NAME_SZ);
  6347. #endif
  6348. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  6349. &resetSuites, &keyFormat, heap, devId, type);
  6350. }
  6351. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  6352. if (ret != 0) {
  6353. #ifdef WOLFSSL_SMALL_STACK
  6354. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6355. #endif
  6356. return ret;
  6357. }
  6358. if (keyFormat == 0) {
  6359. #ifdef OPENSSL_EXTRA
  6360. /* Reaching this point probably means that the
  6361. * decryption password is wrong */
  6362. if (info->passwd_cb)
  6363. EVPerr(0, EVP_R_BAD_DECRYPT);
  6364. #endif
  6365. #ifdef WOLFSSL_SMALL_STACK
  6366. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6367. #endif
  6368. WOLFSSL_ERROR(WOLFSSL_BAD_FILE);
  6369. return WOLFSSL_BAD_FILE;
  6370. }
  6371. #ifdef WOLFSSL_SMALL_STACK
  6372. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6373. #endif
  6374. (void)devId;
  6375. }
  6376. else if (type == CERT_TYPE) {
  6377. #ifdef WOLFSSL_SMALL_STACK
  6378. DecodedCert* cert;
  6379. #else
  6380. DecodedCert cert[1];
  6381. #endif
  6382. #ifdef WOLF_PRIVATE_KEY_ID
  6383. int keyType = 0;
  6384. #endif
  6385. #ifdef WOLFSSL_SMALL_STACK
  6386. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  6387. DYNAMIC_TYPE_DCERT);
  6388. if (cert == NULL)
  6389. return MEMORY_E;
  6390. #endif
  6391. WOLFSSL_MSG("Checking cert signature type");
  6392. InitDecodedCert_ex(cert, der->buffer, der->length, heap, devId);
  6393. if (DecodeToKey(cert, 0) < 0) {
  6394. WOLFSSL_MSG("Decode to key failed");
  6395. FreeDecodedCert(cert);
  6396. #ifdef WOLFSSL_SMALL_STACK
  6397. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  6398. #endif
  6399. return WOLFSSL_BAD_FILE;
  6400. }
  6401. #if defined(HAVE_RPK)
  6402. if (ssl) {
  6403. ssl->options.rpkState.isRPKLoaded = 0;
  6404. if (cert->isRPK) {
  6405. ssl->options.rpkState.isRPKLoaded = 1;
  6406. }
  6407. }
  6408. else if (ctx) {
  6409. ctx->rpkState.isRPKLoaded = 0;
  6410. if (cert->isRPK) {
  6411. ctx->rpkState.isRPKLoaded = 1;
  6412. }
  6413. }
  6414. #endif /* HAVE_RPK */
  6415. if (ssl) {
  6416. if (ssl->options.side == WOLFSSL_SERVER_END)
  6417. resetSuites = 1;
  6418. }
  6419. else if (ctx && ctx->method->side == WOLFSSL_SERVER_END) {
  6420. resetSuites = 1;
  6421. }
  6422. if (ssl && ssl->ctx->haveECDSAsig) {
  6423. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  6424. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  6425. }
  6426. switch (cert->signatureOID) {
  6427. case CTC_SHAwECDSA:
  6428. case CTC_SHA256wECDSA:
  6429. case CTC_SHA384wECDSA:
  6430. case CTC_SHA512wECDSA:
  6431. case CTC_ED25519:
  6432. case CTC_ED448:
  6433. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6434. case CTC_SM3wSM2:
  6435. #endif
  6436. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  6437. if (ssl)
  6438. ssl->options.haveECDSAsig = 1;
  6439. else if (ctx)
  6440. ctx->haveECDSAsig = 1;
  6441. break;
  6442. case CTC_FALCON_LEVEL1:
  6443. case CTC_FALCON_LEVEL5:
  6444. WOLFSSL_MSG("Falcon cert signature");
  6445. if (ssl)
  6446. ssl->options.haveFalconSig = 1;
  6447. else if (ctx)
  6448. ctx->haveFalconSig = 1;
  6449. break;
  6450. case CTC_DILITHIUM_LEVEL2:
  6451. case CTC_DILITHIUM_LEVEL3:
  6452. case CTC_DILITHIUM_LEVEL5:
  6453. WOLFSSL_MSG("Dilithium cert signature");
  6454. if (ssl)
  6455. ssl->options.haveDilithiumSig = 1;
  6456. else if (ctx)
  6457. ctx->haveDilithiumSig = 1;
  6458. break;
  6459. default:
  6460. WOLFSSL_MSG("Not ECDSA cert signature");
  6461. break;
  6462. }
  6463. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6464. (defined(HAVE_PQC) && defined(HAVE_LIBOQS)) || !defined(NO_RSA)
  6465. if (ssl) {
  6466. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6467. (defined(HAVE_CURVE448) && defined(HAVE_ED448))
  6468. ssl->pkCurveOID = cert->pkCurveOID;
  6469. #endif
  6470. #ifndef WC_STRICT_SIG
  6471. if (cert->keyOID == ECDSAk) {
  6472. ssl->options.haveECC = 1;
  6473. }
  6474. #ifndef NO_RSA
  6475. else if (cert->keyOID == RSAk) {
  6476. ssl->options.haveRSA = 1;
  6477. }
  6478. #ifdef WC_RSA_PSS
  6479. else if (cert->keyOID == RSAPSSk) {
  6480. ssl->options.haveRSA = 1;
  6481. }
  6482. #endif
  6483. #endif
  6484. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6485. else if (cert->keyOID == SM2k) {
  6486. ssl->options.haveECC = 1;
  6487. }
  6488. #endif
  6489. #ifdef HAVE_ED25519
  6490. else if (cert->keyOID == ED25519k) {
  6491. ssl->options.haveECC = 1;
  6492. }
  6493. #endif
  6494. #ifdef HAVE_ED448
  6495. else if (cert->keyOID == ED448k) {
  6496. ssl->options.haveECC = 1;
  6497. }
  6498. #endif
  6499. #ifdef HAVE_PQC
  6500. #ifdef HAVE_FALCON
  6501. else if (cert->keyOID == FALCON_LEVEL1k ||
  6502. cert->keyOID == FALCON_LEVEL5k) {
  6503. ssl->options.haveFalconSig = 1;
  6504. }
  6505. #endif /* HAVE_FALCON */
  6506. #ifdef HAVE_DILITHIUM
  6507. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  6508. cert->keyOID == DILITHIUM_LEVEL3k ||
  6509. cert->keyOID == DILITHIUM_LEVEL5k) {
  6510. ssl->options.haveDilithiumSig = 1;
  6511. }
  6512. #endif /* HAVE_DILITHIUM */
  6513. #endif /* HAVE_PQC */
  6514. #else
  6515. ssl->options.haveECC = ssl->options.haveECDSAsig;
  6516. #endif
  6517. }
  6518. else if (ctx) {
  6519. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  6520. ctx->pkCurveOID = cert->pkCurveOID;
  6521. #endif
  6522. #ifndef WC_STRICT_SIG
  6523. if (cert->keyOID == ECDSAk) {
  6524. ctx->haveECC = 1;
  6525. }
  6526. #ifndef NO_RSA
  6527. else if (cert->keyOID == RSAk) {
  6528. ctx->haveRSA = 1;
  6529. }
  6530. #ifdef WC_RSA_PSS
  6531. else if (cert->keyOID == RSAPSSk) {
  6532. ctx->haveRSA = 1;
  6533. }
  6534. #endif
  6535. #endif
  6536. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6537. else if (cert->keyOID == SM2k) {
  6538. ctx->haveECC = 1;
  6539. }
  6540. #endif
  6541. #ifdef HAVE_ED25519
  6542. else if (cert->keyOID == ED25519k) {
  6543. ctx->haveECC = 1;
  6544. }
  6545. #endif
  6546. #ifdef HAVE_ED448
  6547. else if (cert->keyOID == ED448k) {
  6548. ctx->haveECC = 1;
  6549. }
  6550. #endif
  6551. #ifdef HAVE_PQC
  6552. #ifdef HAVE_FALCON
  6553. else if (cert->keyOID == FALCON_LEVEL1k ||
  6554. cert->keyOID == FALCON_LEVEL5k) {
  6555. ctx->haveFalconSig = 1;
  6556. }
  6557. #endif /* HAVE_FALCON */
  6558. #ifdef HAVE_DILITHIUM
  6559. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  6560. cert->keyOID == DILITHIUM_LEVEL3k ||
  6561. cert->keyOID == DILITHIUM_LEVEL5k) {
  6562. ctx->haveDilithiumSig = 1;
  6563. }
  6564. #endif /* HAVE_DILITHIUM */
  6565. #endif /* HAVE_PQC */
  6566. #else
  6567. ctx->haveECC = ctx->haveECDSAsig;
  6568. #endif
  6569. }
  6570. #endif
  6571. /* check key size of cert unless specified not to */
  6572. switch (cert->keyOID) {
  6573. #ifndef NO_RSA
  6574. #ifdef WC_RSA_PSS
  6575. case RSAPSSk:
  6576. #endif
  6577. case RSAk:
  6578. #ifdef WOLF_PRIVATE_KEY_ID
  6579. keyType = rsa_sa_algo;
  6580. #endif
  6581. /* Determine RSA key size by parsing public key */
  6582. idx = 0;
  6583. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  6584. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  6585. if (ret < 0)
  6586. break;
  6587. if (ssl && !ssl->options.verifyNone) {
  6588. if (ssl->options.minRsaKeySz < 0 ||
  6589. keySz < (int)ssl->options.minRsaKeySz ||
  6590. keySz > (RSA_MAX_SIZE / 8)) {
  6591. ret = RSA_KEY_SIZE_E;
  6592. WOLFSSL_MSG("Certificate RSA key size too small");
  6593. }
  6594. }
  6595. else if (ctx && !ctx->verifyNone) {
  6596. if (ctx->minRsaKeySz < 0 ||
  6597. keySz < (int)ctx->minRsaKeySz ||
  6598. keySz > (RSA_MAX_SIZE / 8)) {
  6599. ret = RSA_KEY_SIZE_E;
  6600. WOLFSSL_MSG("Certificate RSA key size too small");
  6601. }
  6602. }
  6603. break;
  6604. #endif /* !NO_RSA */
  6605. #ifdef HAVE_ECC
  6606. case ECDSAk:
  6607. #ifdef WOLF_PRIVATE_KEY_ID
  6608. keyType = ecc_dsa_sa_algo;
  6609. #endif
  6610. /* Determine ECC key size based on curve */
  6611. #ifdef WOLFSSL_CUSTOM_CURVES
  6612. if (cert->pkCurveOID == 0 && cert->pkCurveSize != 0) {
  6613. keySz = cert->pkCurveSize * 8;
  6614. }
  6615. else
  6616. #endif
  6617. {
  6618. keySz = wc_ecc_get_curve_size_from_id(
  6619. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  6620. }
  6621. if (ssl && !ssl->options.verifyNone) {
  6622. if (ssl->options.minEccKeySz < 0 ||
  6623. keySz < (int)ssl->options.minEccKeySz) {
  6624. ret = ECC_KEY_SIZE_E;
  6625. WOLFSSL_MSG("Certificate ECC key size error");
  6626. }
  6627. }
  6628. else if (ctx && !ctx->verifyNone) {
  6629. if (ctx->minEccKeySz < 0 ||
  6630. keySz < (int)ctx->minEccKeySz) {
  6631. ret = ECC_KEY_SIZE_E;
  6632. WOLFSSL_MSG("Certificate ECC key size error");
  6633. }
  6634. }
  6635. break;
  6636. #endif /* HAVE_ECC */
  6637. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6638. case SM2k:
  6639. #ifdef WOLF_PRIVATE_KEY_ID
  6640. keyType = sm2_sa_algo;
  6641. #endif
  6642. /* Determine ECC key size based on curve */
  6643. keySz = wc_ecc_get_curve_size_from_id(
  6644. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  6645. if (ssl && !ssl->options.verifyNone) {
  6646. if (ssl->options.minEccKeySz < 0 ||
  6647. keySz < (int)ssl->options.minEccKeySz) {
  6648. ret = ECC_KEY_SIZE_E;
  6649. WOLFSSL_MSG("Certificate Ed key size error");
  6650. }
  6651. }
  6652. else if (ctx && !ctx->verifyNone) {
  6653. if (ctx->minEccKeySz < 0 ||
  6654. keySz < (int)ctx->minEccKeySz) {
  6655. ret = ECC_KEY_SIZE_E;
  6656. WOLFSSL_MSG("Certificate ECC key size error");
  6657. }
  6658. }
  6659. break;
  6660. #endif /* HAVE_ED25519 */
  6661. #ifdef HAVE_ED25519
  6662. case ED25519k:
  6663. #ifdef WOLF_PRIVATE_KEY_ID
  6664. keyType = ed25519_sa_algo;
  6665. #endif
  6666. /* ED25519 is fixed key size */
  6667. keySz = ED25519_KEY_SIZE;
  6668. if (ssl && !ssl->options.verifyNone) {
  6669. if (ssl->options.minEccKeySz < 0 ||
  6670. keySz < (int)ssl->options.minEccKeySz) {
  6671. ret = ECC_KEY_SIZE_E;
  6672. WOLFSSL_MSG("Certificate Ed key size error");
  6673. }
  6674. }
  6675. else if (ctx && !ctx->verifyNone) {
  6676. if (ctx->minEccKeySz < 0 ||
  6677. keySz < (int)ctx->minEccKeySz) {
  6678. ret = ECC_KEY_SIZE_E;
  6679. WOLFSSL_MSG("Certificate ECC key size error");
  6680. }
  6681. }
  6682. break;
  6683. #endif /* HAVE_ED25519 */
  6684. #ifdef HAVE_ED448
  6685. case ED448k:
  6686. #ifdef WOLF_PRIVATE_KEY_ID
  6687. keyType = ed448_sa_algo;
  6688. #endif
  6689. /* ED448 is fixed key size */
  6690. keySz = ED448_KEY_SIZE;
  6691. if (ssl && !ssl->options.verifyNone) {
  6692. if (ssl->options.minEccKeySz < 0 ||
  6693. keySz < (int)ssl->options.minEccKeySz) {
  6694. ret = ECC_KEY_SIZE_E;
  6695. WOLFSSL_MSG("Certificate Ed key size error");
  6696. }
  6697. }
  6698. else if (ctx && !ctx->verifyNone) {
  6699. if (ctx->minEccKeySz < 0 ||
  6700. keySz < (int)ctx->minEccKeySz) {
  6701. ret = ECC_KEY_SIZE_E;
  6702. WOLFSSL_MSG("Certificate ECC key size error");
  6703. }
  6704. }
  6705. break;
  6706. #endif /* HAVE_ED448 */
  6707. #if defined(HAVE_PQC)
  6708. #if defined(HAVE_FALCON)
  6709. case FALCON_LEVEL1k:
  6710. case FALCON_LEVEL5k:
  6711. #ifdef WOLF_PRIVATE_KEY_ID
  6712. keyType = falcon_level5_sa_algo;
  6713. #endif
  6714. /* Falcon is fixed key size */
  6715. keySz = FALCON_MAX_KEY_SIZE;
  6716. if (ssl && !ssl->options.verifyNone) {
  6717. if (ssl->options.minFalconKeySz < 0 ||
  6718. keySz < (int)ssl->options.minFalconKeySz) {
  6719. ret = FALCON_KEY_SIZE_E;
  6720. WOLFSSL_MSG("Certificate Falcon key size error");
  6721. }
  6722. }
  6723. else if (ctx && !ctx->verifyNone) {
  6724. if (ctx->minFalconKeySz < 0 ||
  6725. keySz < (int)ctx->minFalconKeySz) {
  6726. ret = FALCON_KEY_SIZE_E;
  6727. WOLFSSL_MSG("Certificate Falcon key size error");
  6728. }
  6729. }
  6730. break;
  6731. #endif /* HAVE_FALCON */
  6732. #if defined(HAVE_DILITHIUM)
  6733. case DILITHIUM_LEVEL2k:
  6734. case DILITHIUM_LEVEL3k:
  6735. case DILITHIUM_LEVEL5k:
  6736. #ifdef WOLF_PRIVATE_KEY_ID
  6737. keyType = dilithium_level5_sa_algo;
  6738. #endif
  6739. /* Dilithium is fixed key size */
  6740. keySz = DILITHIUM_MAX_KEY_SIZE;
  6741. if (ssl && !ssl->options.verifyNone) {
  6742. if (ssl->options.minDilithiumKeySz < 0 ||
  6743. keySz < (int)ssl->options.minDilithiumKeySz) {
  6744. ret = DILITHIUM_KEY_SIZE_E;
  6745. WOLFSSL_MSG("Certificate Dilithium key size error");
  6746. }
  6747. }
  6748. else if (ctx && !ctx->verifyNone) {
  6749. if (ctx->minDilithiumKeySz < 0 ||
  6750. keySz < (int)ctx->minDilithiumKeySz) {
  6751. ret = DILITHIUM_KEY_SIZE_E;
  6752. WOLFSSL_MSG("Certificate Dilithium key size error");
  6753. }
  6754. }
  6755. break;
  6756. #endif /* HAVE_DILITHIUM */
  6757. #endif /* HAVE_PQC */
  6758. default:
  6759. WOLFSSL_MSG("No key size check done on certificate");
  6760. break; /* do no check if not a case for the key */
  6761. }
  6762. #ifdef WOLF_PRIVATE_KEY_ID
  6763. if (ssl != NULL) {
  6764. ssl->buffers.keyType = (byte)keyType;
  6765. ssl->buffers.keySz = keySz;
  6766. }
  6767. else if (ctx != NULL) {
  6768. ctx->privateKeyType = (byte)keyType;
  6769. ctx->privateKeySz = keySz;
  6770. }
  6771. #endif
  6772. FreeDecodedCert(cert);
  6773. #ifdef WOLFSSL_SMALL_STACK
  6774. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  6775. #endif
  6776. if (ret != 0) {
  6777. done = 1;
  6778. }
  6779. }
  6780. if (done == 1) {
  6781. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  6782. !defined(WOLFSSL_NO_CLIENT_AUTH))
  6783. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  6784. /* Call to over-ride status */
  6785. if ((ctx != NULL) && (ctx->cm != NULL) &&
  6786. (ctx->cm->verifyCallback != NULL)) {
  6787. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  6788. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  6789. }
  6790. }
  6791. #endif /* NO_WOLFSSL_CM_VERIFY */
  6792. return ret;
  6793. }
  6794. if (ssl && resetSuites) {
  6795. word16 havePSK = 0;
  6796. word16 haveRSA = 0;
  6797. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6798. if (ssl->options.havePSK) {
  6799. havePSK = 1;
  6800. }
  6801. #endif
  6802. #ifndef NO_RSA
  6803. haveRSA = 1;
  6804. #endif
  6805. keySz = ssl->buffers.keySz;
  6806. if (AllocateSuites(ssl) != 0)
  6807. return WOLFSSL_FAILURE;
  6808. /* let's reset suites */
  6809. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  6810. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  6811. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  6812. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  6813. ssl->options.useAnon, TRUE, ssl->options.side);
  6814. }
  6815. else if (ctx && resetSuites) {
  6816. word16 havePSK = 0;
  6817. word16 haveRSA = 0;
  6818. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6819. if (ctx->havePSK) {
  6820. havePSK = 1;
  6821. }
  6822. #endif
  6823. #ifndef NO_RSA
  6824. haveRSA = 1;
  6825. #endif
  6826. keySz = ctx->privateKeySz;
  6827. if (AllocateCtxSuites(ctx) != 0)
  6828. return WOLFSSL_FAILURE;
  6829. /* let's reset suites */
  6830. InitSuites(ctx->suites, ctx->method->version, keySz, haveRSA,
  6831. havePSK, ctx->haveDH, ctx->haveECDSAsig,
  6832. ctx->haveECC, TRUE, ctx->haveStaticECC,
  6833. ctx->haveFalconSig, ctx->haveDilithiumSig,
  6834. #ifdef HAVE_ANON
  6835. ctx->useAnon,
  6836. #else
  6837. FALSE,
  6838. #endif
  6839. TRUE, ctx->method->side);
  6840. }
  6841. return WOLFSSL_SUCCESS;
  6842. }
  6843. /* CA PEM file for verification, may have multiple/chain certs to process */
  6844. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6845. long sz, int format, int type, WOLFSSL* ssl, int verify)
  6846. {
  6847. long used = 0;
  6848. int ret = 0;
  6849. int gotOne = 0;
  6850. WOLFSSL_MSG("Processing CA PEM file");
  6851. while (used < sz) {
  6852. long consumed = 0;
  6853. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  6854. &consumed, 0, verify);
  6855. if (ret == MEMORY_E) {
  6856. return ret;
  6857. }
  6858. else if (ret < 0) {
  6859. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  6860. DerBuffer* der = NULL;
  6861. EncryptedInfo info;
  6862. WOLFSSL_MSG("Trying a CRL");
  6863. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  6864. NULL) == 0) {
  6865. WOLFSSL_MSG(" Processed a CRL");
  6866. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  6867. der->length, WOLFSSL_FILETYPE_ASN1);
  6868. FreeDer(&der);
  6869. used += info.consumed;
  6870. continue;
  6871. }
  6872. #endif
  6873. if (consumed > 0) { /* Made progress in file */
  6874. WOLFSSL_ERROR(ret);
  6875. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  6876. WOLFSSL_MSG("Search for other certs in file");
  6877. }
  6878. else {
  6879. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  6880. WOLFSSL_MSG("Do not continue search for other certs in file");
  6881. break;
  6882. }
  6883. }
  6884. else {
  6885. WOLFSSL_MSG(" Processed a CA");
  6886. gotOne = 1;
  6887. }
  6888. used += consumed;
  6889. }
  6890. if (gotOne) {
  6891. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  6892. return WOLFSSL_SUCCESS;
  6893. }
  6894. return ret;
  6895. }
  6896. #ifdef HAVE_CRL
  6897. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6898. long sz, int type)
  6899. {
  6900. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  6901. if (ctx == NULL)
  6902. return BAD_FUNC_ARG;
  6903. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  6904. }
  6905. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  6906. long sz, int type)
  6907. {
  6908. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  6909. if (ssl == NULL || ssl->ctx == NULL)
  6910. return BAD_FUNC_ARG;
  6911. SSL_CM_WARNING(ssl);
  6912. return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type);
  6913. }
  6914. #endif /* HAVE_CRL */
  6915. #ifdef HAVE_OCSP
  6916. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  6917. {
  6918. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  6919. if (ssl) {
  6920. SSL_CM_WARNING(ssl);
  6921. return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options);
  6922. }
  6923. else
  6924. return BAD_FUNC_ARG;
  6925. }
  6926. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  6927. {
  6928. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  6929. if (ssl) {
  6930. SSL_CM_WARNING(ssl);
  6931. return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl));
  6932. }
  6933. else
  6934. return BAD_FUNC_ARG;
  6935. }
  6936. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  6937. {
  6938. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  6939. if (ssl) {
  6940. SSL_CM_WARNING(ssl);
  6941. return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl));
  6942. }
  6943. else
  6944. return BAD_FUNC_ARG;
  6945. }
  6946. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  6947. {
  6948. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  6949. if (ssl) {
  6950. SSL_CM_WARNING(ssl);
  6951. return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl));
  6952. }
  6953. else
  6954. return BAD_FUNC_ARG;
  6955. }
  6956. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  6957. {
  6958. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6959. if (ssl) {
  6960. SSL_CM_WARNING(ssl);
  6961. return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url);
  6962. }
  6963. else
  6964. return BAD_FUNC_ARG;
  6965. }
  6966. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  6967. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6968. {
  6969. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  6970. if (ssl) {
  6971. SSL_CM_WARNING(ssl);
  6972. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  6973. return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl),
  6974. ioCb, respFreeCb, NULL);
  6975. }
  6976. else
  6977. return BAD_FUNC_ARG;
  6978. }
  6979. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  6980. {
  6981. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  6982. if (ctx)
  6983. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  6984. else
  6985. return BAD_FUNC_ARG;
  6986. }
  6987. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  6988. {
  6989. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  6990. if (ctx)
  6991. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  6992. else
  6993. return BAD_FUNC_ARG;
  6994. }
  6995. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  6996. {
  6997. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6998. if (ctx)
  6999. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  7000. else
  7001. return BAD_FUNC_ARG;
  7002. }
  7003. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  7004. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  7005. {
  7006. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  7007. if (ctx)
  7008. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  7009. respFreeCb, ioCbCtx);
  7010. else
  7011. return BAD_FUNC_ARG;
  7012. }
  7013. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  7014. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  7015. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  7016. {
  7017. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  7018. if (ctx)
  7019. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  7020. else
  7021. return BAD_FUNC_ARG;
  7022. }
  7023. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  7024. {
  7025. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  7026. if (ctx)
  7027. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  7028. else
  7029. return BAD_FUNC_ARG;
  7030. }
  7031. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  7032. {
  7033. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  7034. if (ctx)
  7035. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  7036. else
  7037. return BAD_FUNC_ARG;
  7038. }
  7039. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  7040. {
  7041. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  7042. if (ctx)
  7043. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  7044. else
  7045. return BAD_FUNC_ARG;
  7046. }
  7047. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  7048. #endif /* HAVE_OCSP */
  7049. /* macro to get verify settings for AddCA */
  7050. #define GET_VERIFY_SETTING_CTX(ctx) \
  7051. ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY)
  7052. #define GET_VERIFY_SETTING_SSL(ssl) \
  7053. ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY)
  7054. #ifndef NO_FILESYSTEM
  7055. /* process a file with name fname into ctx of format and type
  7056. userChain specifies a user certificate chain to pass during handshake */
  7057. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  7058. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  7059. {
  7060. #ifdef WOLFSSL_SMALL_STACK
  7061. byte staticBuffer[1]; /* force heap usage */
  7062. #else
  7063. byte staticBuffer[FILE_BUFFER_SIZE];
  7064. #endif
  7065. byte* myBuffer = staticBuffer;
  7066. int dynamic = 0;
  7067. int ret;
  7068. long sz = 0;
  7069. XFILE file;
  7070. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  7071. #ifndef NO_CODING
  7072. const char* header = NULL;
  7073. const char* footer = NULL;
  7074. #endif
  7075. (void)crl;
  7076. (void)heapHint;
  7077. if (fname == NULL) return WOLFSSL_BAD_FILE;
  7078. file = XFOPEN(fname, "rb");
  7079. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7080. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  7081. XFCLOSE(file);
  7082. return WOLFSSL_BAD_FILE;
  7083. }
  7084. sz = XFTELL(file);
  7085. if (XFSEEK(file, 0, XSEEK_SET) != 0) {
  7086. XFCLOSE(file);
  7087. return WOLFSSL_BAD_FILE;
  7088. }
  7089. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7090. WOLFSSL_MSG("ProcessFile file size error");
  7091. XFCLOSE(file);
  7092. return WOLFSSL_BAD_FILE;
  7093. }
  7094. if (sz > (long)sizeof(staticBuffer)) {
  7095. WOLFSSL_MSG("Getting dynamic buffer");
  7096. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  7097. if (myBuffer == NULL) {
  7098. XFCLOSE(file);
  7099. return WOLFSSL_BAD_FILE;
  7100. }
  7101. dynamic = 1;
  7102. }
  7103. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7104. ret = WOLFSSL_BAD_FILE;
  7105. else {
  7106. /* Try to detect type by parsing cert header and footer */
  7107. if (type == DETECT_CERT_TYPE) {
  7108. #ifndef NO_CODING
  7109. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  7110. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  7111. type = CA_TYPE;
  7112. }
  7113. #ifdef HAVE_CRL
  7114. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  7115. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  7116. type = CRL_TYPE;
  7117. }
  7118. #endif
  7119. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  7120. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  7121. type = CERT_TYPE;
  7122. }
  7123. else
  7124. #endif
  7125. {
  7126. WOLFSSL_MSG("Failed to detect certificate type");
  7127. if (dynamic)
  7128. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  7129. XFCLOSE(file);
  7130. return WOLFSSL_BAD_CERTTYPE;
  7131. }
  7132. }
  7133. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  7134. && format == WOLFSSL_FILETYPE_PEM) {
  7135. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  7136. verify);
  7137. }
  7138. #ifdef HAVE_CRL
  7139. else if (type == CRL_TYPE)
  7140. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  7141. #endif
  7142. else
  7143. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  7144. userChain, verify);
  7145. }
  7146. XFCLOSE(file);
  7147. if (dynamic)
  7148. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  7149. return ret;
  7150. }
  7151. /* loads file then loads each file in path, no c_rehash */
  7152. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  7153. const char* path, word32 flags)
  7154. {
  7155. int ret = WOLFSSL_SUCCESS;
  7156. #ifndef NO_WOLFSSL_DIR
  7157. int successCount = 0;
  7158. #endif
  7159. int verify;
  7160. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  7161. if (ctx == NULL || (file == NULL && path == NULL)) {
  7162. return WOLFSSL_FAILURE;
  7163. }
  7164. verify = GET_VERIFY_SETTING_CTX(ctx);
  7165. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  7166. verify = VERIFY_SKIP_DATE;
  7167. if (file) {
  7168. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  7169. NULL, verify);
  7170. #ifndef NO_WOLFSSL_DIR
  7171. if (ret == WOLFSSL_SUCCESS)
  7172. successCount++;
  7173. #endif
  7174. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  7175. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  7176. if (ret != WOLFSSL_SUCCESS) {
  7177. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error");
  7178. }
  7179. #endif
  7180. }
  7181. if (ret == WOLFSSL_SUCCESS && path) {
  7182. #ifndef NO_WOLFSSL_DIR
  7183. char* name = NULL;
  7184. int fileRet;
  7185. int failCount = 0;
  7186. #ifdef WOLFSSL_SMALL_STACK
  7187. ReadDirCtx* readCtx;
  7188. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  7189. DYNAMIC_TYPE_DIRCTX);
  7190. if (readCtx == NULL)
  7191. return MEMORY_E;
  7192. #else
  7193. ReadDirCtx readCtx[1];
  7194. #endif
  7195. /* try to load each regular file in path */
  7196. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  7197. while (fileRet == 0 && name) {
  7198. WOLFSSL_MSG(name); /* log file name */
  7199. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  7200. NULL, 0, NULL, verify);
  7201. if (ret != WOLFSSL_SUCCESS) {
  7202. /* handle flags for ignoring errors, skipping expired certs or
  7203. by PEM certificate header error */
  7204. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  7205. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  7206. (ret == ASN_NO_PEM_HEADER))) {
  7207. /* Do not fail here if a certificate fails to load,
  7208. continue to next file */
  7209. unsigned long err = 0;
  7210. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  7211. #if defined(WOLFSSL_QT)
  7212. ret = WOLFSSL_SUCCESS;
  7213. #endif
  7214. }
  7215. else {
  7216. WOLFSSL_ERROR(ret);
  7217. WOLFSSL_MSG("Load CA file failed, continuing");
  7218. failCount++;
  7219. }
  7220. }
  7221. else {
  7222. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  7223. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  7224. if (ret != WOLFSSL_SUCCESS) {
  7225. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. Ignoring"
  7226. "this error.");
  7227. }
  7228. #endif
  7229. successCount++;
  7230. }
  7231. fileRet = wc_ReadDirNext(readCtx, path, &name);
  7232. }
  7233. wc_ReadDirClose(readCtx);
  7234. /* pass directory read failure to response code */
  7235. if (fileRet != WC_READDIR_NOFILE) {
  7236. ret = fileRet;
  7237. #if defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH)
  7238. if (ret == BAD_PATH_ERROR &&
  7239. flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) {
  7240. /* QSslSocket always loads certs in system folder
  7241. * when it is initialized.
  7242. * Compliant with OpenSSL when flag sets.
  7243. */
  7244. ret = WOLFSSL_SUCCESS;
  7245. }
  7246. else {
  7247. /* qssl socket wants to know errors. */
  7248. WOLFSSL_ERROR(ret);
  7249. }
  7250. #endif
  7251. }
  7252. /* report failure if no files were loaded or there were failures */
  7253. else if (successCount == 0 || failCount > 0) {
  7254. /* use existing error code if exists */
  7255. #if defined(WOLFSSL_QT)
  7256. /* compliant with OpenSSL when flag sets*/
  7257. if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE))
  7258. #endif
  7259. {
  7260. ret = WOLFSSL_FAILURE;
  7261. }
  7262. }
  7263. else {
  7264. ret = WOLFSSL_SUCCESS;
  7265. }
  7266. #ifdef WOLFSSL_SMALL_STACK
  7267. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  7268. #endif
  7269. #else
  7270. ret = NOT_COMPILED_IN;
  7271. (void)flags;
  7272. #endif
  7273. }
  7274. return ret;
  7275. }
  7276. WOLFSSL_ABI
  7277. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7278. const char* path)
  7279. {
  7280. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  7281. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  7282. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  7283. }
  7284. #ifdef WOLFSSL_SYS_CA_CERTS
  7285. #ifdef USE_WINDOWS_API
  7286. static int LoadSystemCaCertsWindows(WOLFSSL_CTX* ctx, byte* loaded)
  7287. {
  7288. int ret = WOLFSSL_SUCCESS;
  7289. word32 i;
  7290. HANDLE handle = NULL;
  7291. PCCERT_CONTEXT certCtx = NULL;
  7292. LPCSTR storeNames[2] = {"ROOT", "CA"};
  7293. HCRYPTPROV_LEGACY hProv = (HCRYPTPROV_LEGACY)NULL;
  7294. if (ctx == NULL || loaded == NULL) {
  7295. ret = WOLFSSL_FAILURE;
  7296. }
  7297. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7298. i < sizeof(storeNames)/sizeof(*storeNames); ++i) {
  7299. handle = CertOpenSystemStoreA(hProv, storeNames[i]);
  7300. if (handle != NULL) {
  7301. while ((certCtx = CertEnumCertificatesInStore(handle, certCtx))
  7302. != NULL) {
  7303. if (certCtx->dwCertEncodingType == X509_ASN_ENCODING) {
  7304. if (ProcessBuffer(ctx, certCtx->pbCertEncoded,
  7305. certCtx->cbCertEncoded, WOLFSSL_FILETYPE_ASN1,
  7306. CA_TYPE, NULL, NULL, 0,
  7307. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7308. /*
  7309. * Set "loaded" as long as we've loaded one CA
  7310. * cert.
  7311. */
  7312. *loaded = 1;
  7313. }
  7314. }
  7315. }
  7316. }
  7317. else {
  7318. WOLFSSL_MSG_EX("Failed to open cert store %s.", storeNames[i]);
  7319. }
  7320. if (handle != NULL && !CertCloseStore(handle, 0)) {
  7321. WOLFSSL_MSG_EX("Failed to close cert store %s.", storeNames[i]);
  7322. ret = WOLFSSL_FAILURE;
  7323. }
  7324. }
  7325. return ret;
  7326. }
  7327. #elif defined(__APPLE__)
  7328. #if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \
  7329. && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7330. /*
  7331. * Manually obtains certificates from the system trust store and loads them
  7332. * directly into wolfSSL "the old way".
  7333. *
  7334. * As of MacOS 14.0 we are still able to use this method to access system
  7335. * certificates. Accessibility of this API is indicated by the presence of the
  7336. * Security/SecTrustSettings.h header. In the likely event that Apple removes
  7337. * access to this API on Macs, this function should be removed and the
  7338. * DoAppleNativeCertValidation() routine should be used for all devices.
  7339. */
  7340. static int LoadSystemCaCertsMac(WOLFSSL_CTX* ctx, byte* loaded)
  7341. {
  7342. int ret = WOLFSSL_SUCCESS;
  7343. word32 i;
  7344. const unsigned int trustDomains[] = {
  7345. kSecTrustSettingsDomainUser,
  7346. kSecTrustSettingsDomainAdmin,
  7347. kSecTrustSettingsDomainSystem
  7348. };
  7349. CFArrayRef certs;
  7350. OSStatus stat;
  7351. CFIndex numCerts;
  7352. CFDataRef der;
  7353. CFIndex j;
  7354. if (ctx == NULL || loaded == NULL) {
  7355. ret = WOLFSSL_FAILURE;
  7356. }
  7357. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7358. i < sizeof(trustDomains)/sizeof(*trustDomains); ++i) {
  7359. stat = SecTrustSettingsCopyCertificates(
  7360. (SecTrustSettingsDomain)trustDomains[i], &certs);
  7361. if (stat == errSecSuccess) {
  7362. numCerts = CFArrayGetCount(certs);
  7363. for (j = 0; j < numCerts; ++j) {
  7364. der = SecCertificateCopyData((SecCertificateRef)
  7365. CFArrayGetValueAtIndex(certs, j));
  7366. if (der != NULL) {
  7367. if (ProcessBuffer(ctx, CFDataGetBytePtr(der),
  7368. CFDataGetLength(der), WOLFSSL_FILETYPE_ASN1,
  7369. CA_TYPE, NULL, NULL, 0,
  7370. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7371. /*
  7372. * Set "loaded" as long as we've loaded one CA
  7373. * cert.
  7374. */
  7375. *loaded = 1;
  7376. }
  7377. CFRelease(der);
  7378. }
  7379. }
  7380. CFRelease(certs);
  7381. }
  7382. else if (stat == errSecNoTrustSettings) {
  7383. WOLFSSL_MSG_EX("No trust settings for domain %d, moving to next "
  7384. "domain.", trustDomains[i]);
  7385. }
  7386. else {
  7387. WOLFSSL_MSG_EX("SecTrustSettingsCopyCertificates failed with"
  7388. " status %d.", stat);
  7389. ret = WOLFSSL_FAILURE;
  7390. break;
  7391. }
  7392. }
  7393. return ret;
  7394. }
  7395. #endif /* defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) */
  7396. #else
  7397. /* Potential system CA certs directories on Linux/Unix distros. */
  7398. static const char* systemCaDirs[] = {
  7399. #if defined(__ANDROID__) || defined(ANDROID)
  7400. "/system/etc/security/cacerts" /* Android */
  7401. #else
  7402. "/etc/ssl/certs", /* Debian, Ubuntu, Gentoo, others */
  7403. "/etc/pki/ca-trust/source/anchors", /* Fedora, RHEL */
  7404. "/etc/pki/tls/certs" /* Older RHEL */
  7405. #endif
  7406. };
  7407. const char** wolfSSL_get_system_CA_dirs(word32* num)
  7408. {
  7409. const char** ret;
  7410. if (num == NULL) {
  7411. ret = NULL;
  7412. }
  7413. else {
  7414. ret = systemCaDirs;
  7415. *num = sizeof(systemCaDirs)/sizeof(*systemCaDirs);
  7416. }
  7417. return ret;
  7418. }
  7419. static int LoadSystemCaCertsNix(WOLFSSL_CTX* ctx, byte* loaded) {
  7420. int ret = WOLFSSL_SUCCESS;
  7421. word32 i;
  7422. if (ctx == NULL || loaded == NULL) {
  7423. ret = WOLFSSL_FAILURE;
  7424. }
  7425. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7426. i < sizeof(systemCaDirs)/sizeof(*systemCaDirs); ++i) {
  7427. WOLFSSL_MSG_EX("Attempting to load system CA certs from %s.",
  7428. systemCaDirs[i]);
  7429. /*
  7430. * We want to keep trying to load more CAs even if one cert in
  7431. * the directory is bad and can't be used (e.g. if one is expired),
  7432. * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR.
  7433. */
  7434. if (wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, systemCaDirs[i],
  7435. WOLFSSL_LOAD_FLAG_IGNORE_ERR) != WOLFSSL_SUCCESS) {
  7436. WOLFSSL_MSG_EX("Failed to load CA certs from %s, trying "
  7437. "next possible location.", systemCaDirs[i]);
  7438. }
  7439. else {
  7440. WOLFSSL_MSG_EX("Loaded CA certs from %s.",
  7441. systemCaDirs[i]);
  7442. *loaded = 1;
  7443. /* Stop searching after we've loaded one directory. */
  7444. break;
  7445. }
  7446. }
  7447. return ret;
  7448. }
  7449. #endif
  7450. int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx)
  7451. {
  7452. int ret;
  7453. byte loaded = 0;
  7454. WOLFSSL_ENTER("wolfSSL_CTX_load_system_CA_certs");
  7455. #ifdef USE_WINDOWS_API
  7456. ret = LoadSystemCaCertsWindows(ctx, &loaded);
  7457. #elif defined(__APPLE__)
  7458. #if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \
  7459. && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7460. /* As of MacOS 14.0 we are still able to access system certificates and
  7461. * load them manually into wolfSSL "the old way". Accessibility of this API
  7462. * is indicated by the presence of the Security/SecTrustSettings.h header */
  7463. ret = LoadSystemCaCertsMac(ctx, &loaded);
  7464. #elif defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7465. /* For other Apple devices, Apple has removed the ability to obtain
  7466. * certificates from the trust store, so we can't use wolfSSL's built-in
  7467. * certificate validation mechanisms anymore. We instead must call into the
  7468. * Security Framework APIs to authenticate peer certificates when received.
  7469. * (see src/internal.c:DoAppleNativeCertValidation()).
  7470. * Thus, there is no CA "loading" required, but to keep behavior consistent
  7471. * with the current API (not using system CA certs unless this function has
  7472. * been called), we simply set a flag indicating that the new apple trust
  7473. * verification routine should be used later */
  7474. ctx->doAppleNativeCertValidationFlag = 1;
  7475. ret = WOLFSSL_SUCCESS;
  7476. loaded = 1;
  7477. #if FIPS_VERSION_GE(2,0) /* Gate back to cert 3389 FIPS modules */
  7478. #warning "Cryptographic operations may occur outside the FIPS module boundary" \
  7479. "Please review FIPS claims for cryptography on this Apple device"
  7480. #endif /* FIPS_VERSION_GE(2,0) */
  7481. #else
  7482. /* HAVE_SECURITY_SECXXX_H macros are set by autotools or CMake when searching
  7483. * system for the required SDK headers. If building with user_settings.h, you
  7484. * will need to manually define WOLFSSL_APPLE_NATIVE_CERT_VALIDATION
  7485. * and ensure the appropriate Security.framework headers and libraries are
  7486. * visible to your compiler */
  7487. #error "WOLFSSL_SYS_CA_CERTS on Apple devices requires Security.framework" \
  7488. " header files to be detected, or a manual override with" \
  7489. " WOLFSSL_APPLE_NATIVE_CERT_VALIDATION"
  7490. #endif
  7491. #else
  7492. ret = LoadSystemCaCertsNix(ctx, &loaded);
  7493. #endif
  7494. if (ret == WOLFSSL_SUCCESS && !loaded) {
  7495. ret = WOLFSSL_BAD_PATH;
  7496. }
  7497. WOLFSSL_LEAVE("wolfSSL_CTX_load_system_CA_certs", ret);
  7498. return ret;
  7499. }
  7500. #endif /* WOLFSSL_SYS_CA_CERTS */
  7501. #ifdef WOLFSSL_TRUST_PEER_CERT
  7502. /* Used to specify a peer cert to match when connecting
  7503. ctx : the ctx structure to load in peer cert
  7504. file: the string name of cert file
  7505. type: type of format such as PEM/DER
  7506. */
  7507. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  7508. {
  7509. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  7510. if (ctx == NULL || file == NULL) {
  7511. return WOLFSSL_FAILURE;
  7512. }
  7513. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  7514. GET_VERIFY_SETTING_CTX(ctx));
  7515. }
  7516. int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int type)
  7517. {
  7518. WOLFSSL_ENTER("wolfSSL_trust_peer_cert");
  7519. if (ssl == NULL || file == NULL) {
  7520. return WOLFSSL_FAILURE;
  7521. }
  7522. return ProcessFile(NULL, file, type, TRUSTED_PEER_TYPE, ssl, 0, NULL,
  7523. GET_VERIFY_SETTING_SSL(ssl));
  7524. }
  7525. #endif /* WOLFSSL_TRUST_PEER_CERT */
  7526. #endif /* NO_FILESYSTEM */
  7527. #ifdef HAVE_CRL
  7528. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  7529. {
  7530. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  7531. if (ssl) {
  7532. SSL_CM_WARNING(ssl);
  7533. return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options);
  7534. }
  7535. else
  7536. return BAD_FUNC_ARG;
  7537. }
  7538. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  7539. {
  7540. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  7541. if (ssl) {
  7542. SSL_CM_WARNING(ssl);
  7543. return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl));
  7544. }
  7545. else
  7546. return BAD_FUNC_ARG;
  7547. }
  7548. #ifndef NO_FILESYSTEM
  7549. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  7550. {
  7551. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  7552. if (ssl) {
  7553. SSL_CM_WARNING(ssl);
  7554. return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor);
  7555. }
  7556. else
  7557. return BAD_FUNC_ARG;
  7558. }
  7559. int wolfSSL_LoadCRLFile(WOLFSSL* ssl, const char* file, int type)
  7560. {
  7561. WOLFSSL_ENTER("wolfSSL_LoadCRLFile");
  7562. if (ssl) {
  7563. SSL_CM_WARNING(ssl);
  7564. return wolfSSL_CertManagerLoadCRLFile(SSL_CM(ssl), file, type);
  7565. }
  7566. else
  7567. return BAD_FUNC_ARG;
  7568. }
  7569. #endif
  7570. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  7571. {
  7572. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7573. if (ssl) {
  7574. SSL_CM_WARNING(ssl);
  7575. return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb);
  7576. }
  7577. else
  7578. return BAD_FUNC_ARG;
  7579. }
  7580. #ifdef HAVE_CRL_IO
  7581. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  7582. {
  7583. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7584. if (ssl) {
  7585. SSL_CM_WARNING(ssl);
  7586. return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb);
  7587. }
  7588. else
  7589. return BAD_FUNC_ARG;
  7590. }
  7591. #endif
  7592. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  7593. {
  7594. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  7595. if (ctx)
  7596. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  7597. else
  7598. return BAD_FUNC_ARG;
  7599. }
  7600. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  7601. {
  7602. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  7603. if (ctx)
  7604. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  7605. else
  7606. return BAD_FUNC_ARG;
  7607. }
  7608. #ifndef NO_FILESYSTEM
  7609. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  7610. int type, int monitor)
  7611. {
  7612. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7613. if (ctx)
  7614. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  7615. else
  7616. return BAD_FUNC_ARG;
  7617. }
  7618. int wolfSSL_CTX_LoadCRLFile(WOLFSSL_CTX* ctx, const char* file,
  7619. int type)
  7620. {
  7621. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7622. if (ctx)
  7623. return wolfSSL_CertManagerLoadCRLFile(ctx->cm, file, type);
  7624. else
  7625. return BAD_FUNC_ARG;
  7626. }
  7627. #endif
  7628. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  7629. {
  7630. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  7631. if (ctx)
  7632. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  7633. else
  7634. return BAD_FUNC_ARG;
  7635. }
  7636. #ifdef HAVE_CRL_IO
  7637. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  7638. {
  7639. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  7640. if (ctx)
  7641. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  7642. else
  7643. return BAD_FUNC_ARG;
  7644. }
  7645. #endif
  7646. #endif /* HAVE_CRL */
  7647. #ifndef NO_FILESYSTEM
  7648. #ifdef WOLFSSL_DER_LOAD
  7649. /* Add format parameter to allow DER load of CA files */
  7650. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7651. int format)
  7652. {
  7653. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  7654. if (ctx == NULL || file == NULL)
  7655. return WOLFSSL_FAILURE;
  7656. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  7657. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7658. return WOLFSSL_SUCCESS;
  7659. }
  7660. return WOLFSSL_FAILURE;
  7661. }
  7662. #endif /* WOLFSSL_DER_LOAD */
  7663. WOLFSSL_ABI
  7664. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  7665. int format)
  7666. {
  7667. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  7668. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  7669. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7670. return WOLFSSL_SUCCESS;
  7671. }
  7672. return WOLFSSL_FAILURE;
  7673. }
  7674. WOLFSSL_ABI
  7675. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  7676. int format)
  7677. {
  7678. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  7679. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  7680. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7681. return WOLFSSL_SUCCESS;
  7682. }
  7683. return WOLFSSL_FAILURE;
  7684. }
  7685. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7686. int wolfSSL_CTX_use_AltPrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  7687. int format)
  7688. {
  7689. WOLFSSL_ENTER("wolfSSL_CTX_use_AltPrivateKey_file");
  7690. if (ProcessFile(ctx, file, format, ALT_PRIVATEKEY_TYPE, NULL, 0, NULL,
  7691. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7692. return WOLFSSL_SUCCESS;
  7693. }
  7694. return WOLFSSL_FAILURE;
  7695. }
  7696. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  7697. #endif /* NO_FILESYSTEM */
  7698. /* Sets the max chain depth when verifying a certificate chain. Default depth
  7699. * is set to MAX_CHAIN_DEPTH.
  7700. *
  7701. * ctx WOLFSSL_CTX structure to set depth in
  7702. * depth max depth
  7703. */
  7704. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  7705. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  7706. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  7707. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  7708. return;
  7709. }
  7710. ctx->verifyDepth = (byte)depth;
  7711. }
  7712. /* get cert chaining depth using ssl struct */
  7713. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  7714. {
  7715. if(ssl == NULL) {
  7716. return BAD_FUNC_ARG;
  7717. }
  7718. #ifndef OPENSSL_EXTRA
  7719. return MAX_CHAIN_DEPTH;
  7720. #else
  7721. return ssl->options.verifyDepth;
  7722. #endif
  7723. }
  7724. /* get cert chaining depth using ctx struct */
  7725. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  7726. {
  7727. if (ctx == NULL) {
  7728. return BAD_FUNC_ARG;
  7729. }
  7730. #ifndef OPENSSL_EXTRA
  7731. return MAX_CHAIN_DEPTH;
  7732. #else
  7733. return ctx->verifyDepth;
  7734. #endif
  7735. }
  7736. #ifndef NO_FILESYSTEM
  7737. WOLFSSL_ABI
  7738. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  7739. {
  7740. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7741. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  7742. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  7743. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7744. return WOLFSSL_SUCCESS;
  7745. }
  7746. return WOLFSSL_FAILURE;
  7747. }
  7748. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  7749. const char* file, int format)
  7750. {
  7751. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7752. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  7753. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  7754. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7755. return WOLFSSL_SUCCESS;
  7756. }
  7757. return WOLFSSL_FAILURE;
  7758. }
  7759. #ifndef NO_DH
  7760. /* server Diffie-Hellman parameters */
  7761. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  7762. const char* fname, int format)
  7763. {
  7764. #ifdef WOLFSSL_SMALL_STACK
  7765. byte staticBuffer[1]; /* force heap usage */
  7766. #else
  7767. byte staticBuffer[FILE_BUFFER_SIZE];
  7768. #endif
  7769. byte* myBuffer = staticBuffer;
  7770. int dynamic = 0;
  7771. int ret;
  7772. long sz = 0;
  7773. XFILE file;
  7774. if (ctx == NULL || fname == NULL)
  7775. return BAD_FUNC_ARG;
  7776. file = XFOPEN(fname, "rb");
  7777. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7778. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  7779. XFCLOSE(file);
  7780. return WOLFSSL_BAD_FILE;
  7781. }
  7782. sz = XFTELL(file);
  7783. if(XFSEEK(file, 0, XSEEK_SET) != 0) {
  7784. XFCLOSE(file);
  7785. return WOLFSSL_BAD_FILE;
  7786. }
  7787. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7788. WOLFSSL_MSG("SetTmpDH file size error");
  7789. XFCLOSE(file);
  7790. return WOLFSSL_BAD_FILE;
  7791. }
  7792. if (sz > (long)sizeof(staticBuffer)) {
  7793. WOLFSSL_MSG("Getting dynamic buffer");
  7794. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  7795. if (myBuffer == NULL) {
  7796. XFCLOSE(file);
  7797. return WOLFSSL_BAD_FILE;
  7798. }
  7799. dynamic = 1;
  7800. }
  7801. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7802. ret = WOLFSSL_BAD_FILE;
  7803. else {
  7804. if (ssl)
  7805. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  7806. else
  7807. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  7808. }
  7809. XFCLOSE(file);
  7810. if (dynamic)
  7811. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  7812. return ret;
  7813. }
  7814. /* server Diffie-Hellman parameters */
  7815. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  7816. {
  7817. if (ssl == NULL)
  7818. return BAD_FUNC_ARG;
  7819. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  7820. }
  7821. /* server Diffie-Hellman parameters */
  7822. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  7823. {
  7824. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  7825. }
  7826. #endif /* NO_DH */
  7827. #endif /* NO_FILESYSTEM */
  7828. #ifndef NO_CHECK_PRIVATE_KEY
  7829. /* Check private against public in certificate for match
  7830. *
  7831. * Returns WOLFSSL_SUCCESS on good private key
  7832. * WOLFSSL_FAILURE if mismatched */
  7833. static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
  7834. int devId, int isKeyLabel, int isKeyId)
  7835. {
  7836. #ifdef WOLFSSL_SMALL_STACK
  7837. DecodedCert* der = NULL;
  7838. #else
  7839. DecodedCert der[1];
  7840. #endif
  7841. word32 size;
  7842. byte* buff;
  7843. int ret = WOLFSSL_FAILURE;
  7844. WOLFSSL_ENTER("check_cert_key");
  7845. if (cert == NULL || key == NULL) {
  7846. return WOLFSSL_FAILURE;
  7847. }
  7848. #ifdef WOLFSSL_SMALL_STACK
  7849. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  7850. if (der == NULL)
  7851. return MEMORY_E;
  7852. #endif
  7853. size = cert->length;
  7854. buff = cert->buffer;
  7855. InitDecodedCert_ex(der, buff, size, heap, devId);
  7856. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  7857. FreeDecodedCert(der);
  7858. #ifdef WOLFSSL_SMALL_STACK
  7859. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7860. #endif
  7861. return WOLFSSL_FAILURE;
  7862. }
  7863. size = key->length;
  7864. buff = key->buffer;
  7865. #ifdef WOLF_PRIVATE_KEY_ID
  7866. if (devId != INVALID_DEVID) {
  7867. int type = 0;
  7868. void *pkey = NULL;
  7869. #ifndef NO_RSA
  7870. if (der->keyOID == RSAk) {
  7871. type = DYNAMIC_TYPE_RSA;
  7872. }
  7873. #ifdef WC_RSA_PSS
  7874. if (der->keyOID == RSAPSSk) {
  7875. type = DYNAMIC_TYPE_RSA;
  7876. }
  7877. #endif
  7878. #endif
  7879. #ifdef HAVE_ECC
  7880. if (der->keyOID == ECDSAk) {
  7881. type = DYNAMIC_TYPE_ECC;
  7882. }
  7883. #endif
  7884. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  7885. if ((der->keyOID == DILITHIUM_LEVEL2k) ||
  7886. (der->keyOID == DILITHIUM_LEVEL3k) ||
  7887. (der->keyOID == DILITHIUM_LEVEL5k)) {
  7888. type = DYNAMIC_TYPE_DILITHIUM;
  7889. }
  7890. #endif
  7891. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7892. if ((der->keyOID == FALCON_LEVEL1k) ||
  7893. (der->keyOID == FALCON_LEVEL5k)) {
  7894. type = DYNAMIC_TYPE_FALCON;
  7895. }
  7896. #endif
  7897. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  7898. isKeyLabel, isKeyId, heap, devId);
  7899. #ifdef WOLF_CRYPTO_CB
  7900. if (ret == 0) {
  7901. #ifndef NO_RSA
  7902. if (der->keyOID == RSAk
  7903. #ifdef WC_RSA_PSS
  7904. || der->keyOID == RSAPSSk
  7905. #endif
  7906. ) {
  7907. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey,
  7908. der->publicKey, der->pubKeySize);
  7909. }
  7910. #endif
  7911. #ifdef HAVE_ECC
  7912. if (der->keyOID == ECDSAk) {
  7913. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey,
  7914. der->publicKey, der->pubKeySize);
  7915. }
  7916. #endif
  7917. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  7918. if ((der->keyOID == DILITHIUM_LEVEL2k) ||
  7919. (der->keyOID == DILITHIUM_LEVEL3k) ||
  7920. (der->keyOID == DILITHIUM_LEVEL5k)) {
  7921. ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey,
  7922. WC_PQC_SIG_TYPE_DILITHIUM,
  7923. der->publicKey, der->pubKeySize);
  7924. }
  7925. #endif
  7926. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7927. if ((der->keyOID == FALCON_LEVEL1k) ||
  7928. (der->keyOID == FALCON_LEVEL5k)) {
  7929. ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey,
  7930. WC_PQC_SIG_TYPE_FALCON,
  7931. der->publicKey, der->pubKeySize);
  7932. }
  7933. #endif
  7934. }
  7935. #else
  7936. /* devId was set, don't check, for now */
  7937. /* TODO: Add callback for private key check? */
  7938. #endif
  7939. if (pkey != NULL) {
  7940. #ifndef NO_RSA
  7941. if (der->keyOID == RSAk
  7942. #ifdef WC_RSA_PSS
  7943. || der->keyOID == RSAPSSk
  7944. #endif
  7945. ) {
  7946. wc_FreeRsaKey((RsaKey*)pkey);
  7947. }
  7948. #endif
  7949. #ifdef HAVE_ECC
  7950. if (der->keyOID == ECDSAk) {
  7951. wc_ecc_free((ecc_key*)pkey);
  7952. }
  7953. #endif
  7954. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  7955. if ((der->keyOID == DILITHIUM_LEVEL2k) ||
  7956. (der->keyOID == DILITHIUM_LEVEL3k) ||
  7957. (der->keyOID == DILITHIUM_LEVEL5k)) {
  7958. wc_dilithium_free((dilithium_key*)pkey);
  7959. }
  7960. #endif
  7961. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7962. if ((der->keyOID == FALCON_LEVEL1k) ||
  7963. (der->keyOID == FALCON_LEVEL5k)) {
  7964. wc_falcon_free((falcon_key*)pkey);
  7965. }
  7966. #endif
  7967. XFREE(pkey, heap, type);
  7968. }
  7969. if (ret != CRYPTOCB_UNAVAILABLE) {
  7970. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7971. }
  7972. }
  7973. else {
  7974. /* fall through if unavailable */
  7975. ret = CRYPTOCB_UNAVAILABLE;
  7976. }
  7977. if (ret == CRYPTOCB_UNAVAILABLE)
  7978. #endif /* WOLF_PRIVATE_KEY_ID */
  7979. {
  7980. ret = wc_CheckPrivateKeyCert(buff, size, der);
  7981. ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7982. }
  7983. FreeDecodedCert(der);
  7984. #ifdef WOLFSSL_SMALL_STACK
  7985. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7986. #endif
  7987. (void)devId;
  7988. (void)isKeyLabel;
  7989. (void)isKeyId;
  7990. return ret;
  7991. }
  7992. /* Check private against public in certificate for match
  7993. *
  7994. * ctx WOLFSSL_CTX structure to check private key in
  7995. *
  7996. * Returns WOLFSSL_SUCCESS on good private key
  7997. * WOLFSSL_FAILURE if mismatched. */
  7998. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  7999. {
  8000. if (ctx == NULL) {
  8001. return WOLFSSL_FAILURE;
  8002. }
  8003. return check_cert_key(ctx->certificate, ctx->privateKey, ctx->heap,
  8004. ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId);
  8005. }
  8006. #endif /* !NO_CHECK_PRIVATE_KEY */
  8007. #ifdef OPENSSL_ALL
  8008. /**
  8009. * Return the private key of the WOLFSSL_CTX struct
  8010. * @return WOLFSSL_EVP_PKEY* The caller doesn *NOT*` free the returned object.
  8011. */
  8012. WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx)
  8013. {
  8014. const unsigned char *key;
  8015. int type;
  8016. WOLFSSL_ENTER("wolfSSL_CTX_get0_privatekey");
  8017. if (ctx == NULL || ctx->privateKey == NULL ||
  8018. ctx->privateKey->buffer == NULL) {
  8019. WOLFSSL_MSG("Bad parameter or key not set");
  8020. return NULL;
  8021. }
  8022. switch (ctx->privateKeyType) {
  8023. #ifndef NO_RSA
  8024. case rsa_sa_algo:
  8025. type = EVP_PKEY_RSA;
  8026. break;
  8027. #endif
  8028. #ifdef HAVE_ECC
  8029. case ecc_dsa_sa_algo:
  8030. type = EVP_PKEY_EC;
  8031. break;
  8032. #endif
  8033. #ifdef WOLFSSL_SM2
  8034. case sm2_sa_algo:
  8035. type = EVP_PKEY_EC;
  8036. break;
  8037. #endif
  8038. default:
  8039. /* Other key types not supported either as ssl private keys
  8040. * or in the EVP layer */
  8041. WOLFSSL_MSG("Unsupported key type");
  8042. return NULL;
  8043. }
  8044. key = ctx->privateKey->buffer;
  8045. if (ctx->privateKeyPKey != NULL)
  8046. return ctx->privateKeyPKey;
  8047. else
  8048. return wolfSSL_d2i_PrivateKey(type,
  8049. (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key,
  8050. (long)ctx->privateKey->length);
  8051. }
  8052. #endif
  8053. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8054. static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out,
  8055. const unsigned char** in, long inSz, int priv)
  8056. {
  8057. WOLFSSL_EVP_PKEY* pkey = NULL;
  8058. const unsigned char* mem;
  8059. long memSz = inSz;
  8060. WOLFSSL_ENTER("d2iGenericKey");
  8061. if (in == NULL || *in == NULL || inSz < 0) {
  8062. WOLFSSL_MSG("Bad argument");
  8063. return NULL;
  8064. }
  8065. mem = *in;
  8066. #if !defined(NO_RSA)
  8067. {
  8068. word32 keyIdx = 0;
  8069. int isRsaKey;
  8070. #ifdef WOLFSSL_SMALL_STACK
  8071. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  8072. if (rsa == NULL)
  8073. return NULL;
  8074. #else
  8075. RsaKey rsa[1];
  8076. #endif
  8077. XMEMSET(rsa, 0, sizeof(RsaKey));
  8078. /* test if RSA key */
  8079. if (priv)
  8080. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  8081. wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  8082. else
  8083. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  8084. wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  8085. wc_FreeRsaKey(rsa);
  8086. #ifdef WOLFSSL_SMALL_STACK
  8087. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  8088. #endif
  8089. if (isRsaKey) {
  8090. pkey = wolfSSL_EVP_PKEY_new();
  8091. if (pkey != NULL) {
  8092. pkey->pkey_sz = keyIdx;
  8093. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8094. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8095. DYNAMIC_TYPE_PUBLIC_KEY);
  8096. if (pkey->pkey.ptr == NULL) {
  8097. wolfSSL_EVP_PKEY_free(pkey);
  8098. return NULL;
  8099. }
  8100. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  8101. pkey->type = EVP_PKEY_RSA;
  8102. if (out != NULL) {
  8103. *out = pkey;
  8104. }
  8105. pkey->ownRsa = 1;
  8106. pkey->rsa = wolfssl_rsa_d2i(NULL, mem, inSz,
  8107. priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC);
  8108. if (pkey->rsa == NULL) {
  8109. wolfSSL_EVP_PKEY_free(pkey);
  8110. return NULL;
  8111. }
  8112. return pkey;
  8113. }
  8114. else {
  8115. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  8116. }
  8117. }
  8118. }
  8119. #endif /* NO_RSA */
  8120. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  8121. {
  8122. word32 keyIdx = 0;
  8123. int isEccKey;
  8124. #ifdef WOLFSSL_SMALL_STACK
  8125. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  8126. if (ecc == NULL)
  8127. return NULL;
  8128. #else
  8129. ecc_key ecc[1];
  8130. #endif
  8131. XMEMSET(ecc, 0, sizeof(ecc_key));
  8132. if (priv)
  8133. isEccKey = wc_ecc_init(ecc) == 0 &&
  8134. wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  8135. else
  8136. isEccKey = wc_ecc_init(ecc) == 0 &&
  8137. wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  8138. wc_ecc_free(ecc);
  8139. #ifdef WOLFSSL_SMALL_STACK
  8140. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  8141. #endif
  8142. if (isEccKey) {
  8143. pkey = wolfSSL_EVP_PKEY_new();
  8144. if (pkey != NULL) {
  8145. pkey->pkey_sz = keyIdx;
  8146. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  8147. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8148. DYNAMIC_TYPE_PUBLIC_KEY);
  8149. if (pkey->pkey.ptr == NULL) {
  8150. wolfSSL_EVP_PKEY_free(pkey);
  8151. return NULL;
  8152. }
  8153. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  8154. pkey->type = EVP_PKEY_EC;
  8155. if (out != NULL) {
  8156. *out = pkey;
  8157. }
  8158. pkey->ownEcc = 1;
  8159. pkey->ecc = wolfSSL_EC_KEY_new();
  8160. if (pkey->ecc == NULL) {
  8161. wolfSSL_EVP_PKEY_free(pkey);
  8162. return NULL;
  8163. }
  8164. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  8165. (const unsigned char*)pkey->pkey.ptr,
  8166. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  8167. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  8168. wolfSSL_EVP_PKEY_free(pkey);
  8169. return NULL;
  8170. }
  8171. return pkey;
  8172. }
  8173. else {
  8174. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  8175. }
  8176. }
  8177. }
  8178. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  8179. #if !defined(NO_DSA)
  8180. {
  8181. word32 keyIdx = 0;
  8182. int isDsaKey;
  8183. #ifdef WOLFSSL_SMALL_STACK
  8184. DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  8185. if (dsa == NULL)
  8186. return NULL;
  8187. #else
  8188. DsaKey dsa[1];
  8189. #endif
  8190. XMEMSET(dsa, 0, sizeof(DsaKey));
  8191. if (priv)
  8192. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  8193. wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  8194. else
  8195. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  8196. wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  8197. wc_FreeDsaKey(dsa);
  8198. #ifdef WOLFSSL_SMALL_STACK
  8199. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  8200. #endif
  8201. /* test if DSA key */
  8202. if (isDsaKey) {
  8203. pkey = wolfSSL_EVP_PKEY_new();
  8204. if (pkey != NULL) {
  8205. pkey->pkey_sz = keyIdx;
  8206. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8207. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8208. DYNAMIC_TYPE_PUBLIC_KEY);
  8209. if (pkey->pkey.ptr == NULL) {
  8210. wolfSSL_EVP_PKEY_free(pkey);
  8211. return NULL;
  8212. }
  8213. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  8214. pkey->type = EVP_PKEY_DSA;
  8215. if (out != NULL) {
  8216. *out = pkey;
  8217. }
  8218. pkey->ownDsa = 1;
  8219. pkey->dsa = wolfSSL_DSA_new();
  8220. if (pkey->dsa == NULL) {
  8221. wolfSSL_EVP_PKEY_free(pkey);
  8222. return NULL;
  8223. }
  8224. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  8225. (const unsigned char*)pkey->pkey.ptr,
  8226. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  8227. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  8228. wolfSSL_EVP_PKEY_free(pkey);
  8229. return NULL;
  8230. }
  8231. return pkey;
  8232. }
  8233. else {
  8234. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  8235. }
  8236. }
  8237. }
  8238. #endif /* NO_DSA */
  8239. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  8240. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  8241. (HAVE_FIPS_VERSION > 2))
  8242. {
  8243. int isDhKey;
  8244. word32 keyIdx = 0;
  8245. #ifdef WOLFSSL_SMALL_STACK
  8246. DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  8247. if (dh == NULL)
  8248. return NULL;
  8249. #else
  8250. DhKey dh[1];
  8251. #endif
  8252. XMEMSET(dh, 0, sizeof(DhKey));
  8253. isDhKey = wc_InitDhKey(dh) == 0 &&
  8254. wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0;
  8255. wc_FreeDhKey(dh);
  8256. #ifdef WOLFSSL_SMALL_STACK
  8257. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  8258. #endif
  8259. /* test if DH key */
  8260. if (isDhKey) {
  8261. pkey = wolfSSL_EVP_PKEY_new();
  8262. if (pkey != NULL) {
  8263. pkey->pkey_sz = (int)memSz;
  8264. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8265. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8266. DYNAMIC_TYPE_PUBLIC_KEY);
  8267. if (pkey->pkey.ptr == NULL) {
  8268. wolfSSL_EVP_PKEY_free(pkey);
  8269. return NULL;
  8270. }
  8271. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  8272. pkey->type = EVP_PKEY_DH;
  8273. if (out != NULL) {
  8274. *out = pkey;
  8275. }
  8276. pkey->ownDh = 1;
  8277. pkey->dh = wolfSSL_DH_new();
  8278. if (pkey->dh == NULL) {
  8279. wolfSSL_EVP_PKEY_free(pkey);
  8280. return NULL;
  8281. }
  8282. if (wolfSSL_DH_LoadDer(pkey->dh,
  8283. (const unsigned char*)pkey->pkey.ptr,
  8284. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  8285. wolfSSL_EVP_PKEY_free(pkey);
  8286. return NULL;
  8287. }
  8288. return pkey;
  8289. }
  8290. else {
  8291. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  8292. }
  8293. }
  8294. }
  8295. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8296. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  8297. #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
  8298. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  8299. (HAVE_FIPS_VERSION > 2))
  8300. {
  8301. word32 keyIdx = 0;
  8302. DhKey* key = NULL;
  8303. int ret;
  8304. #ifdef WOLFSSL_SMALL_STACK
  8305. DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  8306. if (dh == NULL)
  8307. return NULL;
  8308. #else
  8309. DhKey dh[1];
  8310. #endif
  8311. XMEMSET(dh, 0, sizeof(DhKey));
  8312. /* test if DH-public key */
  8313. if (wc_InitDhKey(dh) != 0)
  8314. return NULL;
  8315. ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz);
  8316. wc_FreeDhKey(dh);
  8317. #ifdef WOLFSSL_SMALL_STACK
  8318. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  8319. #endif
  8320. if (ret == 0) {
  8321. pkey = wolfSSL_EVP_PKEY_new();
  8322. if (pkey != NULL) {
  8323. pkey->type = EVP_PKEY_DH;
  8324. pkey->pkey_sz = (int)memSz;
  8325. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8326. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8327. DYNAMIC_TYPE_PUBLIC_KEY);
  8328. if (pkey->pkey.ptr == NULL) {
  8329. wolfSSL_EVP_PKEY_free(pkey);
  8330. return NULL;
  8331. }
  8332. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  8333. if (out != NULL) {
  8334. *out = pkey;
  8335. }
  8336. pkey->ownDh = 1;
  8337. pkey->dh = wolfSSL_DH_new();
  8338. if (pkey->dh == NULL) {
  8339. wolfSSL_EVP_PKEY_free(pkey);
  8340. return NULL;
  8341. }
  8342. key = (DhKey*)pkey->dh->internal;
  8343. keyIdx = 0;
  8344. if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0)
  8345. {
  8346. int elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q |
  8347. ELEMENT_PUB;
  8348. if (priv)
  8349. elements |= ELEMENT_PRV;
  8350. if(SetDhExternal_ex(pkey->dh, elements)
  8351. == WOLFSSL_SUCCESS ) {
  8352. return pkey;
  8353. }
  8354. }
  8355. else {
  8356. wolfSSL_EVP_PKEY_free(pkey);
  8357. return NULL;
  8358. }
  8359. }
  8360. }
  8361. }
  8362. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8363. #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */
  8364. #ifdef HAVE_PQC
  8365. #ifdef HAVE_FALCON
  8366. {
  8367. int isFalcon = 0;
  8368. #ifdef WOLFSSL_SMALL_STACK
  8369. falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL,
  8370. DYNAMIC_TYPE_FALCON);
  8371. if (falcon == NULL) {
  8372. return NULL;
  8373. }
  8374. #else
  8375. falcon_key falcon[1];
  8376. #endif
  8377. if (wc_falcon_init(falcon) == 0) {
  8378. /* test if Falcon key */
  8379. if (priv) {
  8380. /* Try level 1 */
  8381. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  8382. wc_falcon_import_private_only(mem, (word32)memSz,
  8383. falcon) == 0;
  8384. if (!isFalcon) {
  8385. /* Try level 5 */
  8386. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  8387. wc_falcon_import_private_only(mem, (word32)memSz,
  8388. falcon) == 0;
  8389. }
  8390. } else {
  8391. /* Try level 1 */
  8392. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  8393. wc_falcon_import_public(mem, (word32)memSz, falcon)
  8394. == 0;
  8395. if (!isFalcon) {
  8396. /* Try level 5 */
  8397. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  8398. wc_falcon_import_public(mem, (word32)memSz,
  8399. falcon) == 0;
  8400. }
  8401. }
  8402. wc_falcon_free(falcon);
  8403. }
  8404. #ifdef WOLFSSL_SMALL_STACK
  8405. XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON);
  8406. #endif
  8407. if (isFalcon) {
  8408. /* Create a fake Falcon EVP_PKEY. In the future, we might integrate
  8409. * Falcon into the compatibility layer. */
  8410. pkey = wolfSSL_EVP_PKEY_new();
  8411. if (pkey == NULL) {
  8412. WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error");
  8413. return NULL;
  8414. }
  8415. pkey->type = EVP_PKEY_FALCON;
  8416. pkey->pkey.ptr = NULL;
  8417. pkey->pkey_sz = 0;
  8418. return pkey;
  8419. }
  8420. }
  8421. #endif /* HAVE_FALCON */
  8422. #ifdef HAVE_DILITHIUM
  8423. {
  8424. int isDilithium = 0;
  8425. #ifdef WOLFSSL_SMALL_STACK
  8426. dilithium_key *dilithium = (dilithium_key *)
  8427. XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM);
  8428. if (dilithium == NULL) {
  8429. return NULL;
  8430. }
  8431. #else
  8432. dilithium_key dilithium[1];
  8433. #endif
  8434. if (wc_dilithium_init(dilithium) == 0) {
  8435. /* Test if Dilithium key. Try all levels. */
  8436. if (priv) {
  8437. isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 &&
  8438. wc_dilithium_import_private_only(mem,
  8439. (word32)memSz, dilithium) == 0;
  8440. if (!isDilithium) {
  8441. isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 &&
  8442. wc_dilithium_import_private_only(mem,
  8443. (word32)memSz, dilithium) == 0;
  8444. }
  8445. if (!isDilithium) {
  8446. isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 &&
  8447. wc_dilithium_import_private_only(mem,
  8448. (word32)memSz, dilithium) == 0;
  8449. }
  8450. } else {
  8451. isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 &&
  8452. wc_dilithium_import_public(mem, (word32)memSz,
  8453. dilithium) == 0;
  8454. if (!isDilithium) {
  8455. isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 &&
  8456. wc_dilithium_import_public(mem, (word32)memSz,
  8457. dilithium) == 0;
  8458. }
  8459. if (!isDilithium) {
  8460. isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 &&
  8461. wc_dilithium_import_public(mem, (word32)memSz,
  8462. dilithium) == 0;
  8463. }
  8464. }
  8465. wc_dilithium_free(dilithium);
  8466. }
  8467. #ifdef WOLFSSL_SMALL_STACK
  8468. XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM);
  8469. #endif
  8470. if (isDilithium) {
  8471. /* Create a fake Dilithium EVP_PKEY. In the future, we might
  8472. * integrate Dilithium into the compatibility layer. */
  8473. pkey = wolfSSL_EVP_PKEY_new();
  8474. if (pkey == NULL) {
  8475. WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error");
  8476. return NULL;
  8477. }
  8478. pkey->type = EVP_PKEY_DILITHIUM;
  8479. pkey->pkey.ptr = NULL;
  8480. pkey->pkey_sz = 0;
  8481. return pkey;
  8482. }
  8483. }
  8484. #endif /* HAVE_DILITHIUM */
  8485. #endif /* HAVE_PQC */
  8486. if (pkey == NULL) {
  8487. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  8488. }
  8489. return pkey;
  8490. }
  8491. #endif /* OPENSSL_EXTRA || WPA_SMALL */
  8492. #ifdef OPENSSL_EXTRA
  8493. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY(
  8494. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen)
  8495. {
  8496. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8497. #ifdef WOLFSSL_PEM_TO_DER
  8498. int ret;
  8499. DerBuffer* der = NULL;
  8500. if (keyBuf == NULL || *keyBuf == NULL || keyLen <= 0) {
  8501. WOLFSSL_MSG("Bad key PEM/DER args");
  8502. return NULL;
  8503. }
  8504. ret = PemToDer(*keyBuf, keyLen, PRIVATEKEY_TYPE, &der, NULL, NULL, NULL);
  8505. if (ret < 0) {
  8506. WOLFSSL_MSG("Not PEM format");
  8507. ret = AllocDer(&der, (word32)keyLen, PRIVATEKEY_TYPE, NULL);
  8508. if (ret == 0) {
  8509. XMEMCPY(der->buffer, *keyBuf, keyLen);
  8510. }
  8511. }
  8512. if (ret == 0) {
  8513. /* Verify this is PKCS8 Key */
  8514. word32 inOutIdx = 0;
  8515. word32 algId;
  8516. ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId);
  8517. if (ret >= 0) {
  8518. ret = 0; /* good DER */
  8519. }
  8520. }
  8521. if (ret == 0) {
  8522. pkcs8 = wolfSSL_EVP_PKEY_new();
  8523. if (pkcs8 == NULL)
  8524. ret = MEMORY_E;
  8525. }
  8526. if (ret == 0) {
  8527. pkcs8->pkey.ptr = (char*)XMALLOC(der->length, NULL,
  8528. DYNAMIC_TYPE_PUBLIC_KEY);
  8529. if (pkcs8->pkey.ptr == NULL)
  8530. ret = MEMORY_E;
  8531. }
  8532. if (ret == 0) {
  8533. XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length);
  8534. pkcs8->pkey_sz = der->length;
  8535. }
  8536. FreeDer(&der);
  8537. if (ret != 0) {
  8538. wolfSSL_EVP_PKEY_free(pkcs8);
  8539. pkcs8 = NULL;
  8540. }
  8541. if (pkey != NULL) {
  8542. *pkey = pkcs8;
  8543. }
  8544. #else
  8545. (void)bio;
  8546. (void)pkey;
  8547. #endif /* WOLFSSL_PEM_TO_DER */
  8548. return pkcs8;
  8549. }
  8550. #ifndef NO_BIO
  8551. /* put SSL type in extra for now, not very common */
  8552. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  8553. *
  8554. * bio input bio to read DER from
  8555. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  8556. * structure.
  8557. *
  8558. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  8559. * case.
  8560. */
  8561. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  8562. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  8563. {
  8564. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8565. #ifdef WOLFSSL_PEM_TO_DER
  8566. unsigned char* mem = NULL;
  8567. int memSz;
  8568. WOLFSSL_ENTER("wolfSSL_d2i_PKCS8_PKEY_bio");
  8569. if (bio == NULL) {
  8570. return NULL;
  8571. }
  8572. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  8573. return NULL;
  8574. }
  8575. pkcs8 = wolfSSL_d2i_PKCS8_PKEY(pkey, (const unsigned char**)&mem, memSz);
  8576. #else
  8577. (void)bio;
  8578. (void)pkey;
  8579. #endif /* WOLFSSL_PEM_TO_DER */
  8580. return pkcs8;
  8581. }
  8582. /* expecting DER format public key
  8583. *
  8584. * bio input bio to read DER from
  8585. * out If not NULL then this pointer will be overwritten with a new
  8586. * WOLFSSL_EVP_PKEY pointer
  8587. *
  8588. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  8589. */
  8590. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  8591. WOLFSSL_EVP_PKEY** out)
  8592. {
  8593. unsigned char* mem;
  8594. long memSz;
  8595. WOLFSSL_EVP_PKEY* pkey = NULL;
  8596. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio");
  8597. if (bio == NULL) {
  8598. return NULL;
  8599. }
  8600. (void)out;
  8601. memSz = wolfSSL_BIO_get_len(bio);
  8602. if (memSz <= 0) {
  8603. return NULL;
  8604. }
  8605. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8606. if (mem == NULL) {
  8607. return NULL;
  8608. }
  8609. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  8610. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  8611. if (out != NULL && pkey != NULL) {
  8612. *out = pkey;
  8613. }
  8614. }
  8615. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8616. return pkey;
  8617. }
  8618. #endif /* !NO_BIO */
  8619. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  8620. *
  8621. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  8622. * in DER buffer to convert
  8623. * inSz size of in buffer
  8624. *
  8625. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  8626. * on fail
  8627. */
  8628. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  8629. const unsigned char** in, long inSz)
  8630. {
  8631. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  8632. return d2iGenericKey(out, in, inSz, 0);
  8633. }
  8634. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_ASN) && \
  8635. !defined(NO_PWDBASED)
  8636. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  8637. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  8638. {
  8639. int sz;
  8640. word16 pkcs8HeaderSz;
  8641. if (!key || !key->pkey_sz)
  8642. return WOLFSSL_FATAL_ERROR;
  8643. /* return the key without PKCS8 for compatibility */
  8644. /* if pkcs8HeaderSz is invalid, use 0 and return all of pkey */
  8645. pkcs8HeaderSz = 0;
  8646. if (key->pkey_sz > key->pkcs8HeaderSz)
  8647. pkcs8HeaderSz = key->pkcs8HeaderSz;
  8648. sz = key->pkey_sz - pkcs8HeaderSz;
  8649. if (der) {
  8650. unsigned char* pt = (unsigned char*)key->pkey.ptr;
  8651. if (*der) {
  8652. /* since this function signature has no size value passed in it is
  8653. * assumed that the user has allocated a large enough buffer */
  8654. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8655. *der += sz;
  8656. }
  8657. else {
  8658. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  8659. if (*der == NULL) {
  8660. return WOLFSSL_FATAL_ERROR;
  8661. }
  8662. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8663. }
  8664. }
  8665. return sz;
  8666. }
  8667. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  8668. {
  8669. return wolfSSL_i2d_PublicKey(key, der);
  8670. }
  8671. #endif /* OPENSSL_EXTRA && !NO_CERTS && !NO_ASN && !NO_PWDBASED */
  8672. static WOLFSSL_EVP_PKEY* _d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8673. const unsigned char **in, long inSz, int priv)
  8674. {
  8675. int ret = 0;
  8676. word32 idx = 0, algId;
  8677. word16 pkcs8HeaderSz = 0;
  8678. WOLFSSL_EVP_PKEY* local;
  8679. int opt = 0;
  8680. (void)opt;
  8681. if (in == NULL || inSz < 0) {
  8682. WOLFSSL_MSG("Bad argument");
  8683. return NULL;
  8684. }
  8685. if (priv == 1) {
  8686. /* Check if input buffer has PKCS8 header. In the case that it does not
  8687. * have a PKCS8 header then do not error out. */
  8688. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx,
  8689. (word32)inSz, &algId)) > 0) {
  8690. WOLFSSL_MSG("Found PKCS8 header");
  8691. pkcs8HeaderSz = (word16)idx;
  8692. if ((type == EVP_PKEY_RSA && algId != RSAk
  8693. #ifdef WC_RSA_PSS
  8694. && algId != RSAPSSk
  8695. #endif
  8696. ) ||
  8697. (type == EVP_PKEY_EC && algId != ECDSAk) ||
  8698. (type == EVP_PKEY_DSA && algId != DSAk) ||
  8699. (type == EVP_PKEY_DH && algId != DHk)) {
  8700. WOLFSSL_MSG("PKCS8 does not match EVP key type");
  8701. return NULL;
  8702. }
  8703. (void)idx; /* not used */
  8704. }
  8705. else {
  8706. if (ret != ASN_PARSE_E) {
  8707. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 "
  8708. "header");
  8709. return NULL;
  8710. }
  8711. }
  8712. }
  8713. if (out != NULL && *out != NULL) {
  8714. wolfSSL_EVP_PKEY_free(*out);
  8715. *out = NULL;
  8716. }
  8717. local = wolfSSL_EVP_PKEY_new();
  8718. if (local == NULL) {
  8719. return NULL;
  8720. }
  8721. local->type = type;
  8722. local->pkey_sz = (int)inSz;
  8723. local->pkcs8HeaderSz = pkcs8HeaderSz;
  8724. local->pkey.ptr = (char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  8725. if (local->pkey.ptr == NULL) {
  8726. wolfSSL_EVP_PKEY_free(local);
  8727. local = NULL;
  8728. return NULL;
  8729. }
  8730. else {
  8731. XMEMCPY(local->pkey.ptr, *in, inSz);
  8732. }
  8733. switch (type) {
  8734. #ifndef NO_RSA
  8735. case EVP_PKEY_RSA:
  8736. opt = priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC;
  8737. local->ownRsa = 1;
  8738. local->rsa = wolfssl_rsa_d2i(NULL,
  8739. (const unsigned char*)local->pkey.ptr, local->pkey_sz, opt);
  8740. if (local->rsa == NULL) {
  8741. wolfSSL_EVP_PKEY_free(local);
  8742. return NULL;
  8743. }
  8744. break;
  8745. #endif /* NO_RSA */
  8746. #ifdef HAVE_ECC
  8747. case EVP_PKEY_EC:
  8748. local->ownEcc = 1;
  8749. local->ecc = wolfSSL_EC_KEY_new();
  8750. if (local->ecc == NULL) {
  8751. wolfSSL_EVP_PKEY_free(local);
  8752. return NULL;
  8753. }
  8754. opt = priv ? WOLFSSL_EC_KEY_LOAD_PRIVATE :
  8755. WOLFSSL_EC_KEY_LOAD_PUBLIC;
  8756. if (wolfSSL_EC_KEY_LoadDer_ex(local->ecc,
  8757. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8758. opt)
  8759. != WOLFSSL_SUCCESS) {
  8760. wolfSSL_EVP_PKEY_free(local);
  8761. return NULL;
  8762. }
  8763. break;
  8764. #endif /* HAVE_ECC */
  8765. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  8766. #ifndef NO_DSA
  8767. case EVP_PKEY_DSA:
  8768. local->ownDsa = 1;
  8769. local->dsa = wolfSSL_DSA_new();
  8770. if (local->dsa == NULL) {
  8771. wolfSSL_EVP_PKEY_free(local);
  8772. return NULL;
  8773. }
  8774. opt = priv ? WOLFSSL_DSA_LOAD_PRIVATE : WOLFSSL_DSA_LOAD_PUBLIC;
  8775. if (wolfSSL_DSA_LoadDer_ex(local->dsa,
  8776. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8777. opt)
  8778. != WOLFSSL_SUCCESS) {
  8779. wolfSSL_EVP_PKEY_free(local);
  8780. return NULL;
  8781. }
  8782. break;
  8783. #endif /* NO_DSA */
  8784. #ifndef NO_DH
  8785. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  8786. case EVP_PKEY_DH:
  8787. local->ownDh = 1;
  8788. local->dh = wolfSSL_DH_new();
  8789. if (local->dh == NULL) {
  8790. wolfSSL_EVP_PKEY_free(local);
  8791. return NULL;
  8792. }
  8793. if (wolfSSL_DH_LoadDer(local->dh,
  8794. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  8795. != WOLFSSL_SUCCESS) {
  8796. wolfSSL_EVP_PKEY_free(local);
  8797. return NULL;
  8798. }
  8799. break;
  8800. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8801. #endif /* HAVE_DH */
  8802. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  8803. default:
  8804. WOLFSSL_MSG("Unsupported key type");
  8805. wolfSSL_EVP_PKEY_free(local);
  8806. return NULL;
  8807. }
  8808. /* advance pointer with success */
  8809. if (local != NULL) {
  8810. if (local->pkey_sz <= (int)inSz) {
  8811. *in += local->pkey_sz;
  8812. }
  8813. if (out != NULL) {
  8814. *out = local;
  8815. }
  8816. }
  8817. return local;
  8818. }
  8819. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8820. const unsigned char **in, long inSz)
  8821. {
  8822. WOLFSSL_ENTER("wolfSSL_d2i_PublicKey");
  8823. return _d2i_PublicKey(type, out, in, inSz, 0);
  8824. }
  8825. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  8826. *
  8827. * type type of key
  8828. * out newly created WOLFSSL_EVP_PKEY structure
  8829. * in pointer to input key DER
  8830. * inSz size of in buffer
  8831. *
  8832. * On success a non null pointer is returned and the pointer in is advanced the
  8833. * same number of bytes read.
  8834. */
  8835. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  8836. const unsigned char **in, long inSz)
  8837. {
  8838. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  8839. return _d2i_PublicKey(type, out, in, inSz, 1);
  8840. }
  8841. #ifdef WOLF_PRIVATE_KEY_ID
  8842. /* Create an EVP structure for use with crypto callbacks */
  8843. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_id(int type, WOLFSSL_EVP_PKEY** out,
  8844. void* heap, int devId)
  8845. {
  8846. WOLFSSL_EVP_PKEY* local;
  8847. if (out != NULL && *out != NULL) {
  8848. wolfSSL_EVP_PKEY_free(*out);
  8849. *out = NULL;
  8850. }
  8851. local = wolfSSL_EVP_PKEY_new_ex(heap);
  8852. if (local == NULL) {
  8853. return NULL;
  8854. }
  8855. local->type = type;
  8856. local->pkey_sz = 0;
  8857. local->pkcs8HeaderSz = 0;
  8858. switch (type) {
  8859. #ifndef NO_RSA
  8860. case EVP_PKEY_RSA:
  8861. {
  8862. RsaKey* key;
  8863. local->ownRsa = 1;
  8864. local->rsa = wolfSSL_RSA_new_ex(heap, devId);
  8865. if (local->rsa == NULL) {
  8866. wolfSSL_EVP_PKEY_free(local);
  8867. return NULL;
  8868. }
  8869. key = (RsaKey*)local->rsa->internal;
  8870. #ifdef WOLF_CRYPTO_CB
  8871. key->devId = devId;
  8872. #endif
  8873. (void)key;
  8874. local->rsa->inSet = 1;
  8875. break;
  8876. }
  8877. #endif /* !NO_RSA */
  8878. #ifdef HAVE_ECC
  8879. case EVP_PKEY_EC:
  8880. {
  8881. ecc_key* key;
  8882. local->ownEcc = 1;
  8883. local->ecc = wolfSSL_EC_KEY_new_ex(heap, devId);
  8884. if (local->ecc == NULL) {
  8885. wolfSSL_EVP_PKEY_free(local);
  8886. return NULL;
  8887. }
  8888. key = (ecc_key*)local->ecc->internal;
  8889. #ifdef WOLF_CRYPTO_CB
  8890. key->devId = devId;
  8891. #endif
  8892. key->type = ECC_PRIVATEKEY;
  8893. /* key is required to have a key size / curve set, although
  8894. * actual one used is determined by devId callback function */
  8895. wc_ecc_set_curve(key, ECDHE_SIZE, ECC_CURVE_DEF);
  8896. local->ecc->inSet = 1;
  8897. break;
  8898. }
  8899. #endif /* HAVE_ECC */
  8900. default:
  8901. WOLFSSL_MSG("Unsupported private key id type");
  8902. wolfSSL_EVP_PKEY_free(local);
  8903. return NULL;
  8904. }
  8905. if (local != NULL && out != NULL) {
  8906. *out = local;
  8907. }
  8908. return local;
  8909. }
  8910. #endif /* WOLF_PRIVATE_KEY_ID */
  8911. #ifndef NO_CERTS /* // NOLINT(readability-redundant-preprocessor) */
  8912. #ifndef NO_CHECK_PRIVATE_KEY
  8913. /* Check private against public in certificate for match
  8914. *
  8915. * ssl WOLFSSL structure to check private key in
  8916. *
  8917. * Returns WOLFSSL_SUCCESS on good private key
  8918. * WOLFSSL_FAILURE if mismatched. */
  8919. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  8920. {
  8921. if (ssl == NULL) {
  8922. return WOLFSSL_FAILURE;
  8923. }
  8924. return check_cert_key(ssl->buffers.certificate, ssl->buffers.key, ssl->heap,
  8925. ssl->buffers.keyDevId, ssl->buffers.keyLabel, ssl->buffers.keyId);
  8926. }
  8927. #endif /* !NO_CHECK_PRIVATE_KEY */
  8928. #endif /* !NO_CERTS */
  8929. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8930. {
  8931. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8932. if (ssl == NULL || pkey == NULL ) {
  8933. return WOLFSSL_FAILURE;
  8934. }
  8935. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8936. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8937. }
  8938. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8939. long derSz)
  8940. {
  8941. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8942. if (ssl == NULL || der == NULL ) {
  8943. return WOLFSSL_FAILURE;
  8944. }
  8945. (void)pri; /* type of private key */
  8946. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8947. }
  8948. /******************************************************************************
  8949. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8950. *
  8951. * RETURNS:
  8952. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8953. */
  8954. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8955. unsigned char* der, long derSz)
  8956. {
  8957. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8958. if (ctx == NULL || der == NULL ) {
  8959. return WOLFSSL_FAILURE;
  8960. }
  8961. (void)pri; /* type of private key */
  8962. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8963. }
  8964. #ifndef NO_RSA
  8965. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8966. {
  8967. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8968. if (ssl == NULL || der == NULL ) {
  8969. return WOLFSSL_FAILURE;
  8970. }
  8971. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8972. }
  8973. #endif
  8974. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8975. {
  8976. long idx = 0;
  8977. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8978. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8979. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8980. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8981. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8982. return WOLFSSL_SUCCESS;
  8983. }
  8984. }
  8985. (void)idx;
  8986. return WOLFSSL_FAILURE;
  8987. }
  8988. #endif /* OPENSSL_EXTRA */
  8989. #if defined(HAVE_RPK)
  8990. /* Confirm that all the byte data in the buffer is unique.
  8991. * return 1 if all the byte data in the buffer is unique, otherwise 0.
  8992. */
  8993. static int isArrayUnique(const char* buf, size_t len)
  8994. {
  8995. size_t i, j;
  8996. /* check the array is unique */
  8997. for (i = 0; i < len -1; ++i) {
  8998. for (j = i+ 1; j < len; ++j) {
  8999. if (buf[i] == buf[j]) {
  9000. return 0;
  9001. }
  9002. }
  9003. }
  9004. return 1;
  9005. }
  9006. /* Set user preference for the client_cert_type exetnsion.
  9007. * Takes byte array containing cert types the caller can provide to its peer.
  9008. * Cert types are in preferred order in the array.
  9009. */
  9010. WOLFSSL_API int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx,
  9011. const char* buf, int bufLen)
  9012. {
  9013. int i;
  9014. if (ctx == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) {
  9015. return BAD_FUNC_ARG;
  9016. }
  9017. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  9018. if (buf == NULL || bufLen == 0) {
  9019. ctx->rpkConfig.preferred_ClientCertTypeCnt = 1;
  9020. ctx->rpkConfig.preferred_ClientCertTypes[0]= WOLFSSL_CERT_TYPE_X509;
  9021. ctx->rpkConfig.preferred_ClientCertTypes[1]= WOLFSSL_CERT_TYPE_X509;
  9022. return WOLFSSL_SUCCESS;
  9023. }
  9024. if (!isArrayUnique(buf, bufLen))
  9025. return BAD_FUNC_ARG;
  9026. for (i = 0; i < bufLen; i++){
  9027. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  9028. return BAD_FUNC_ARG;
  9029. ctx->rpkConfig.preferred_ClientCertTypes[i] = buf[i];
  9030. }
  9031. ctx->rpkConfig.preferred_ClientCertTypeCnt = bufLen;
  9032. return WOLFSSL_SUCCESS;
  9033. }
  9034. /* Set user preference for the server_cert_type exetnsion.
  9035. * Takes byte array containing cert types the caller can provide to its peer.
  9036. * Cert types are in preferred order in the array.
  9037. */
  9038. WOLFSSL_API int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx,
  9039. const char* buf, int bufLen)
  9040. {
  9041. int i;
  9042. if (ctx == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) {
  9043. return BAD_FUNC_ARG;
  9044. }
  9045. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  9046. if (buf == NULL || bufLen == 0) {
  9047. ctx->rpkConfig.preferred_ServerCertTypeCnt = 1;
  9048. ctx->rpkConfig.preferred_ServerCertTypes[0]= WOLFSSL_CERT_TYPE_X509;
  9049. ctx->rpkConfig.preferred_ServerCertTypes[1]= WOLFSSL_CERT_TYPE_X509;
  9050. return WOLFSSL_SUCCESS;
  9051. }
  9052. if (!isArrayUnique(buf, bufLen))
  9053. return BAD_FUNC_ARG;
  9054. for (i = 0; i < bufLen; i++){
  9055. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  9056. return BAD_FUNC_ARG;
  9057. ctx->rpkConfig.preferred_ServerCertTypes[i] = buf[i];
  9058. }
  9059. ctx->rpkConfig.preferred_ServerCertTypeCnt = bufLen;
  9060. return WOLFSSL_SUCCESS;
  9061. }
  9062. /* Set user preference for the client_cert_type exetnsion.
  9063. * Takes byte array containing cert types the caller can provide to its peer.
  9064. * Cert types are in preferred order in the array.
  9065. */
  9066. WOLFSSL_API int wolfSSL_set_client_cert_type(WOLFSSL* ssl,
  9067. const char* buf, int bufLen)
  9068. {
  9069. int i;
  9070. if (ssl == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) {
  9071. return BAD_FUNC_ARG;
  9072. }
  9073. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  9074. if (buf == NULL || bufLen == 0) {
  9075. ssl->options.rpkConfig.preferred_ClientCertTypeCnt = 1;
  9076. ssl->options.rpkConfig.preferred_ClientCertTypes[0]
  9077. = WOLFSSL_CERT_TYPE_X509;
  9078. ssl->options.rpkConfig.preferred_ClientCertTypes[1]
  9079. = WOLFSSL_CERT_TYPE_X509;
  9080. return WOLFSSL_SUCCESS;
  9081. }
  9082. if (!isArrayUnique(buf, bufLen))
  9083. return BAD_FUNC_ARG;
  9084. for (i = 0; i < bufLen; i++){
  9085. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  9086. return BAD_FUNC_ARG;
  9087. ssl->options.rpkConfig.preferred_ClientCertTypes[i] = buf[i];
  9088. }
  9089. ssl->options.rpkConfig.preferred_ClientCertTypeCnt = bufLen;
  9090. return WOLFSSL_SUCCESS;
  9091. }
  9092. /* Set user preference for the server_cert_type exetnsion.
  9093. * Takes byte array containing cert types the caller can provide to its peer.
  9094. * Cert types are in preferred order in the array.
  9095. */
  9096. WOLFSSL_API int wolfSSL_set_server_cert_type(WOLFSSL* ssl,
  9097. const char* buf, int bufLen)
  9098. {
  9099. int i;
  9100. if (ssl == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) {
  9101. return BAD_FUNC_ARG;
  9102. }
  9103. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  9104. if (buf == NULL || bufLen == 0) {
  9105. ssl->options.rpkConfig.preferred_ServerCertTypeCnt = 1;
  9106. ssl->options.rpkConfig.preferred_ServerCertTypes[0]
  9107. = WOLFSSL_CERT_TYPE_X509;
  9108. ssl->options.rpkConfig.preferred_ServerCertTypes[1]
  9109. = WOLFSSL_CERT_TYPE_X509;
  9110. return WOLFSSL_SUCCESS;
  9111. }
  9112. if (!isArrayUnique(buf, bufLen))
  9113. return BAD_FUNC_ARG;
  9114. for (i = 0; i < bufLen; i++){
  9115. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  9116. return BAD_FUNC_ARG;
  9117. ssl->options.rpkConfig.preferred_ServerCertTypes[i] = buf[i];
  9118. }
  9119. ssl->options.rpkConfig.preferred_ServerCertTypeCnt = bufLen;
  9120. return WOLFSSL_SUCCESS;
  9121. }
  9122. /* get negotiated certificate type value and return it to the second parameter.
  9123. * cert type value:
  9124. * -1: WOLFSSL_CERT_TYPE_UNKNOWN
  9125. * 0: WOLFSSL_CERT_TYPE_X509
  9126. * 2: WOLFSSL_CERT_TYPE_RPK
  9127. * return WOLFSSL_SUCCESS on success, otherwise negative value.
  9128. * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for
  9129. * cert type.
  9130. */
  9131. WOLFSSL_API int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp)
  9132. {
  9133. int ret = WOLFSSL_SUCCESS;
  9134. if (ssl == NULL || tp == NULL)
  9135. return BAD_FUNC_ARG;
  9136. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9137. if (ssl->options.rpkState.received_ClientCertTypeCnt == 1)
  9138. *tp = ssl->options.rpkState.received_ClientCertTypes[0];
  9139. else
  9140. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  9141. }
  9142. else {
  9143. if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1)
  9144. *tp = ssl->options.rpkState.sending_ClientCertTypes[0];
  9145. else
  9146. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  9147. }
  9148. return ret;
  9149. }
  9150. /* get negotiated certificate type value and return it to the second parameter.
  9151. * cert type value:
  9152. * -1: WOLFSSL_CERT_TYPE_UNKNOWN
  9153. * 0: WOLFSSL_CERT_TYPE_X509
  9154. * 2: WOLFSSL_CERT_TYPE_RPK
  9155. * return WOLFSSL_SUCCESS on success, otherwise negative value.
  9156. * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for
  9157. * cert type.
  9158. */
  9159. WOLFSSL_API int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp)
  9160. {
  9161. int ret = WOLFSSL_SUCCESS;
  9162. if (ssl == NULL || tp == NULL)
  9163. return BAD_FUNC_ARG;
  9164. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9165. if (ssl->options.rpkState.received_ServerCertTypeCnt == 1)
  9166. *tp = ssl->options.rpkState.received_ServerCertTypes[0];
  9167. else
  9168. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  9169. }
  9170. else {
  9171. if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1)
  9172. *tp = ssl->options.rpkState.sending_ServerCertTypes[0];
  9173. else
  9174. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  9175. }
  9176. return ret;
  9177. }
  9178. #endif /* HAVE_RPK */
  9179. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  9180. int derSz)
  9181. {
  9182. long idx = 0;
  9183. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  9184. if (der != NULL && ssl != NULL) {
  9185. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  9186. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9187. return WOLFSSL_SUCCESS;
  9188. }
  9189. }
  9190. (void)idx;
  9191. return WOLFSSL_FAILURE;
  9192. }
  9193. #ifndef NO_FILESYSTEM
  9194. WOLFSSL_ABI
  9195. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  9196. {
  9197. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  9198. if (ssl == NULL) {
  9199. return BAD_FUNC_ARG;
  9200. }
  9201. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  9202. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9203. return WOLFSSL_SUCCESS;
  9204. }
  9205. return WOLFSSL_FAILURE;
  9206. }
  9207. WOLFSSL_ABI
  9208. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  9209. {
  9210. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  9211. if (ssl == NULL) {
  9212. return BAD_FUNC_ARG;
  9213. }
  9214. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  9215. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9216. return WOLFSSL_SUCCESS;
  9217. }
  9218. return WOLFSSL_FAILURE;
  9219. }
  9220. WOLFSSL_ABI
  9221. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  9222. {
  9223. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  9224. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  9225. if (ssl == NULL) {
  9226. return BAD_FUNC_ARG;
  9227. }
  9228. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  9229. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9230. return WOLFSSL_SUCCESS;
  9231. }
  9232. return WOLFSSL_FAILURE;
  9233. }
  9234. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  9235. int format)
  9236. {
  9237. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  9238. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  9239. if (ssl == NULL) {
  9240. return BAD_FUNC_ARG;
  9241. }
  9242. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  9243. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9244. return WOLFSSL_SUCCESS;
  9245. }
  9246. return WOLFSSL_FAILURE;
  9247. }
  9248. #endif /* !NO_FILESYSTEM */
  9249. #ifdef HAVE_ECC
  9250. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  9251. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  9252. {
  9253. if (ctx == NULL)
  9254. return BAD_FUNC_ARG;
  9255. /* if 0 then get from loaded private key */
  9256. if (sz == 0) {
  9257. /* applies only to ECDSA */
  9258. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  9259. return WOLFSSL_SUCCESS;
  9260. if (ctx->privateKeySz == 0) {
  9261. WOLFSSL_MSG("Must set private key/cert first");
  9262. return BAD_FUNC_ARG;
  9263. }
  9264. sz = (word16)ctx->privateKeySz;
  9265. }
  9266. /* check size */
  9267. #if ECC_MIN_KEY_SZ > 0
  9268. if (sz < ECC_MINSIZE)
  9269. return BAD_FUNC_ARG;
  9270. #endif
  9271. if (sz > ECC_MAXSIZE)
  9272. return BAD_FUNC_ARG;
  9273. ctx->eccTempKeySz = sz;
  9274. return WOLFSSL_SUCCESS;
  9275. }
  9276. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  9277. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  9278. {
  9279. if (ssl == NULL)
  9280. return BAD_FUNC_ARG;
  9281. /* check size */
  9282. #if ECC_MIN_KEY_SZ > 0
  9283. if (sz < ECC_MINSIZE)
  9284. return BAD_FUNC_ARG;
  9285. #endif
  9286. if (sz > ECC_MAXSIZE)
  9287. return BAD_FUNC_ARG;
  9288. ssl->eccTempKeySz = sz;
  9289. return WOLFSSL_SUCCESS;
  9290. }
  9291. #endif /* HAVE_ECC */
  9292. #ifdef OPENSSL_EXTRA
  9293. #ifndef NO_FILESYSTEM
  9294. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  9295. int format)
  9296. {
  9297. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey_file");
  9298. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  9299. }
  9300. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  9301. {
  9302. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  9303. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  9304. }
  9305. #endif /* NO_FILESYSTEM */
  9306. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  9307. * of master secret.
  9308. *
  9309. * ses : a session from completed TLS/SSL handshake
  9310. * out : buffer to hold copy of master secret
  9311. * outSz : size of out buffer
  9312. * returns : number of bytes copied into out buffer on success
  9313. * less then or equal to 0 is considered a failure case
  9314. */
  9315. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  9316. unsigned char* out, int outSz)
  9317. {
  9318. int size;
  9319. ses = ClientSessionToSession(ses);
  9320. if (outSz == 0) {
  9321. return SECRET_LEN;
  9322. }
  9323. if (ses == NULL || out == NULL || outSz < 0) {
  9324. return 0;
  9325. }
  9326. if (outSz > SECRET_LEN) {
  9327. size = SECRET_LEN;
  9328. }
  9329. else {
  9330. size = outSz;
  9331. }
  9332. XMEMCPY(out, ses->masterSecret, size);
  9333. return size;
  9334. }
  9335. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  9336. {
  9337. (void)ses;
  9338. return SECRET_LEN;
  9339. }
  9340. #ifdef WOLFSSL_EARLY_DATA
  9341. unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session)
  9342. {
  9343. return session->maxEarlyDataSz;
  9344. }
  9345. #endif /* WOLFSSL_EARLY_DATA */
  9346. #endif /* OPENSSL_EXTRA */
  9347. typedef struct {
  9348. byte verifyPeer:1;
  9349. byte verifyNone:1;
  9350. byte failNoCert:1;
  9351. byte failNoCertxPSK:1;
  9352. byte verifyPostHandshake:1;
  9353. } SetVerifyOptions;
  9354. static SetVerifyOptions ModeToVerifyOptions(int mode)
  9355. {
  9356. SetVerifyOptions opts;
  9357. XMEMSET(&opts, 0, sizeof(SetVerifyOptions));
  9358. if (mode != WOLFSSL_VERIFY_DEFAULT) {
  9359. opts.verifyNone = (mode == WOLFSSL_VERIFY_NONE);
  9360. if (!opts.verifyNone) {
  9361. opts.verifyPeer =
  9362. (mode & WOLFSSL_VERIFY_PEER) != 0;
  9363. opts.failNoCertxPSK =
  9364. (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) != 0;
  9365. opts.failNoCert =
  9366. (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) != 0;
  9367. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9368. opts.verifyPostHandshake =
  9369. (mode & WOLFSSL_VERIFY_POST_HANDSHAKE) != 0;
  9370. #endif
  9371. }
  9372. }
  9373. return opts;
  9374. }
  9375. WOLFSSL_ABI
  9376. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  9377. {
  9378. SetVerifyOptions opts;
  9379. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  9380. if (ctx == NULL)
  9381. return;
  9382. opts = ModeToVerifyOptions(mode);
  9383. ctx->verifyNone = opts.verifyNone;
  9384. ctx->verifyPeer = opts.verifyPeer;
  9385. ctx->failNoCert = opts.failNoCert;
  9386. ctx->failNoCertxPSK = opts.failNoCertxPSK;
  9387. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9388. ctx->verifyPostHandshake = opts.verifyPostHandshake;
  9389. #endif
  9390. ctx->verifyCallback = vc;
  9391. }
  9392. #ifdef OPENSSL_ALL
  9393. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  9394. CertVerifyCallback cb, void* arg)
  9395. {
  9396. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_verify_callback");
  9397. if (ctx == NULL)
  9398. return;
  9399. ctx->verifyCertCb = cb;
  9400. ctx->verifyCertCbArg = arg;
  9401. }
  9402. #endif
  9403. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  9404. {
  9405. SetVerifyOptions opts;
  9406. WOLFSSL_ENTER("wolfSSL_set_verify");
  9407. if (ssl == NULL)
  9408. return;
  9409. opts = ModeToVerifyOptions(mode);
  9410. ssl->options.verifyNone = opts.verifyNone;
  9411. ssl->options.verifyPeer = opts.verifyPeer;
  9412. ssl->options.failNoCert = opts.failNoCert;
  9413. ssl->options.failNoCertxPSK = opts.failNoCertxPSK;
  9414. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9415. ssl->options.verifyPostHandshake = opts.verifyPostHandshake;
  9416. #endif
  9417. ssl->verifyCallback = vc;
  9418. }
  9419. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  9420. {
  9421. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  9422. if (ssl == NULL)
  9423. return;
  9424. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  9425. defined(OPENSSL_ALL)
  9426. ssl->peerVerifyRet = v;
  9427. #else
  9428. (void)v;
  9429. WOLFSSL_STUB("wolfSSL_set_verify_result");
  9430. #endif
  9431. }
  9432. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  9433. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9434. /* For TLS v1.3 send handshake messages after handshake completes. */
  9435. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  9436. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  9437. {
  9438. int ret = wolfSSL_request_certificate(ssl);
  9439. if (ret != WOLFSSL_SUCCESS) {
  9440. if (!IsAtLeastTLSv1_3(ssl->version)) {
  9441. /* specific error of wrong version expected */
  9442. WOLFSSL_ERROR(UNSUPPORTED_PROTO_VERSION);
  9443. }
  9444. else {
  9445. WOLFSSL_ERROR(ret); /* log the error in the error queue */
  9446. }
  9447. }
  9448. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9449. }
  9450. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  9451. {
  9452. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  9453. if (ret == 0) {
  9454. ctx->postHandshakeAuth = (val != 0);
  9455. }
  9456. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9457. }
  9458. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  9459. {
  9460. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  9461. if (ret == 0) {
  9462. ssl->options.postHandshakeAuth = (val != 0);
  9463. }
  9464. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9465. }
  9466. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  9467. /* store user ctx for verify callback */
  9468. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  9469. {
  9470. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  9471. if (ssl)
  9472. ssl->verifyCbCtx = ctx;
  9473. }
  9474. /* store user ctx for verify callback */
  9475. void wolfSSL_CTX_SetCertCbCtx(WOLFSSL_CTX* ctx, void* userCtx)
  9476. {
  9477. WOLFSSL_ENTER("wolfSSL_CTX_SetCertCbCtx");
  9478. if (ctx)
  9479. ctx->verifyCbCtx = userCtx;
  9480. }
  9481. /* store context CA Cache addition callback */
  9482. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  9483. {
  9484. if (ctx && ctx->cm)
  9485. ctx->cm->caCacheCallback = cb;
  9486. }
  9487. #if defined(PERSIST_CERT_CACHE)
  9488. #if !defined(NO_FILESYSTEM)
  9489. /* Persist cert cache to file */
  9490. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9491. {
  9492. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  9493. if (ctx == NULL || fname == NULL)
  9494. return BAD_FUNC_ARG;
  9495. return CM_SaveCertCache(ctx->cm, fname);
  9496. }
  9497. /* Persist cert cache from file */
  9498. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9499. {
  9500. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  9501. if (ctx == NULL || fname == NULL)
  9502. return BAD_FUNC_ARG;
  9503. return CM_RestoreCertCache(ctx->cm, fname);
  9504. }
  9505. #endif /* NO_FILESYSTEM */
  9506. /* Persist cert cache to memory */
  9507. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  9508. int sz, int* used)
  9509. {
  9510. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  9511. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  9512. return BAD_FUNC_ARG;
  9513. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  9514. }
  9515. /* Restore cert cache from memory */
  9516. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  9517. {
  9518. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  9519. if (ctx == NULL || mem == NULL || sz <= 0)
  9520. return BAD_FUNC_ARG;
  9521. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  9522. }
  9523. /* get how big the the cert cache save buffer needs to be */
  9524. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  9525. {
  9526. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  9527. if (ctx == NULL)
  9528. return BAD_FUNC_ARG;
  9529. return CM_GetCertCacheMemSize(ctx->cm);
  9530. }
  9531. #endif /* PERSIST_CERT_CACHE */
  9532. #endif /* !NO_CERTS */
  9533. #ifndef NO_SESSION_CACHE
  9534. WOLFSSL_ABI
  9535. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  9536. {
  9537. WOLFSSL_ENTER("wolfSSL_get_session");
  9538. if (ssl) {
  9539. #ifdef NO_SESSION_CACHE_REF
  9540. return ssl->session;
  9541. #else
  9542. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9543. /* On the client side we want to return a persistent reference for
  9544. * backwards compatibility. */
  9545. #ifndef NO_CLIENT_CACHE
  9546. if (ssl->clientSession) {
  9547. return (WOLFSSL_SESSION*)ssl->clientSession;
  9548. }
  9549. else {
  9550. /* Try to add a ClientCache entry to associate with the current
  9551. * session. Ignore any session cache options. */
  9552. int err;
  9553. const byte* id = ssl->session->sessionID;
  9554. byte idSz = ssl->session->sessionIDSz;
  9555. if (ssl->session->haveAltSessionID) {
  9556. id = ssl->session->altSessionID;
  9557. idSz = ID_LEN;
  9558. }
  9559. err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz,
  9560. NULL, ssl->session->side,
  9561. #ifdef HAVE_SESSION_TICKET
  9562. ssl->session->ticketLen > 0,
  9563. #else
  9564. 0,
  9565. #endif
  9566. &ssl->clientSession);
  9567. if (err == 0) {
  9568. return (WOLFSSL_SESSION*)ssl->clientSession;
  9569. }
  9570. }
  9571. #endif
  9572. }
  9573. else {
  9574. return ssl->session;
  9575. }
  9576. #endif
  9577. }
  9578. return NULL;
  9579. }
  9580. /* The get1 version requires caller to call SSL_SESSION_free */
  9581. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  9582. {
  9583. WOLFSSL_SESSION* sess = NULL;
  9584. WOLFSSL_ENTER("wolfSSL_get1_session");
  9585. if (ssl != NULL) {
  9586. sess = ssl->session;
  9587. if (sess != NULL) {
  9588. /* increase reference count if allocated session */
  9589. if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) {
  9590. if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS)
  9591. sess = NULL;
  9592. }
  9593. }
  9594. }
  9595. return sess;
  9596. }
  9597. /*
  9598. * Sets the session object to use when establishing a TLS/SSL session using
  9599. * the ssl object. Therefore, this function must be called before
  9600. * wolfSSL_connect. The session object to use can be obtained in a previous
  9601. * TLS/SSL connection using wolfSSL_get_session.
  9602. *
  9603. * This function rejects the session if it has been expired when this function
  9604. * is called. Note that this expiration check is wolfSSL specific and differs
  9605. * from OpenSSL return code behavior.
  9606. *
  9607. * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully
  9608. * setting the session, WOLFSSL_FAILURE on failure due to the session cache
  9609. * being disabled, or the session has expired.
  9610. *
  9611. * To match OpenSSL return code behavior when session is expired, define
  9612. * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return
  9613. * WOLFSSL_SUCCESS even when the session is expired and rejected.
  9614. */
  9615. WOLFSSL_ABI
  9616. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  9617. {
  9618. WOLFSSL_ENTER("wolfSSL_set_session");
  9619. if (session)
  9620. return wolfSSL_SetSession(ssl, session);
  9621. return WOLFSSL_FAILURE;
  9622. }
  9623. #ifndef NO_CLIENT_CACHE
  9624. /* Associate client session with serverID, find existing or store for saving
  9625. if newSession flag on, don't reuse existing session
  9626. WOLFSSL_SUCCESS on ok */
  9627. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  9628. {
  9629. WOLFSSL_SESSION* session = NULL;
  9630. byte idHash[SERVER_ID_LEN];
  9631. WOLFSSL_ENTER("wolfSSL_SetServerID");
  9632. if (ssl == NULL || id == NULL || len <= 0)
  9633. return BAD_FUNC_ARG;
  9634. if (len > SERVER_ID_LEN) {
  9635. #if defined(NO_SHA) && !defined(NO_SHA256)
  9636. if (wc_Sha256Hash(id, len, idHash) != 0)
  9637. return WOLFSSL_FAILURE;
  9638. #else
  9639. if (wc_ShaHash(id, len, idHash) != 0)
  9640. return WOLFSSL_FAILURE;
  9641. #endif
  9642. id = idHash;
  9643. len = SERVER_ID_LEN;
  9644. }
  9645. if (newSession == 0) {
  9646. session = wolfSSL_GetSessionClient(ssl, id, len);
  9647. if (session) {
  9648. if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  9649. #ifdef HAVE_EXT_CACHE
  9650. wolfSSL_FreeSession(ssl->ctx, session);
  9651. #endif
  9652. WOLFSSL_MSG("wolfSSL_SetSession failed");
  9653. session = NULL;
  9654. }
  9655. }
  9656. }
  9657. if (session == NULL) {
  9658. WOLFSSL_MSG("Valid ServerID not cached already");
  9659. ssl->session->idLen = (word16)len;
  9660. XMEMCPY(ssl->session->serverID, id, len);
  9661. }
  9662. #ifdef HAVE_EXT_CACHE
  9663. else {
  9664. wolfSSL_FreeSession(ssl->ctx, session);
  9665. }
  9666. #endif
  9667. return WOLFSSL_SUCCESS;
  9668. }
  9669. #endif /* !NO_CLIENT_CACHE */
  9670. /* TODO: Add SESSION_CACHE_DYNAMIC_MEM support for PERSIST_SESSION_CACHE.
  9671. * Need a count of current sessions to get an accurate memsize (totalCount is
  9672. * not decremented when sessions are removed).
  9673. * Need to determine ideal layout for mem/filesave.
  9674. * Also need mem/filesave checking to ensure not restoring non DYNAMIC_MEM cache.
  9675. */
  9676. #if defined(PERSIST_SESSION_CACHE) && !defined(SESSION_CACHE_DYNAMIC_MEM)
  9677. /* for persistence, if changes to layout need to increment and modify
  9678. save_session_cache() and restore_session_cache and memory versions too */
  9679. #define WOLFSSL_CACHE_VERSION 2
  9680. /* Session Cache Header information */
  9681. typedef struct {
  9682. int version; /* cache layout version id */
  9683. int rows; /* session rows */
  9684. int columns; /* session columns */
  9685. int sessionSz; /* sizeof WOLFSSL_SESSION */
  9686. } cache_header_t;
  9687. /* current persistence layout is:
  9688. 1) cache_header_t
  9689. 2) SessionCache
  9690. 3) ClientCache
  9691. update WOLFSSL_CACHE_VERSION if change layout for the following
  9692. PERSISTENT_SESSION_CACHE functions
  9693. */
  9694. /* get how big the the session cache save buffer needs to be */
  9695. int wolfSSL_get_session_cache_memsize(void)
  9696. {
  9697. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  9698. #ifndef NO_CLIENT_CACHE
  9699. sz += (int)(sizeof(ClientCache));
  9700. #endif
  9701. return sz;
  9702. }
  9703. /* Persist session cache to memory */
  9704. int wolfSSL_memsave_session_cache(void* mem, int sz)
  9705. {
  9706. int i;
  9707. cache_header_t cache_header;
  9708. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9709. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  9710. if (sz < wolfSSL_get_session_cache_memsize()) {
  9711. WOLFSSL_MSG("Memory buffer too small");
  9712. return BUFFER_E;
  9713. }
  9714. cache_header.version = WOLFSSL_CACHE_VERSION;
  9715. cache_header.rows = SESSION_ROWS;
  9716. cache_header.columns = SESSIONS_PER_ROW;
  9717. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9718. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  9719. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9720. if (SESSION_ROW_RD_LOCK(row) != 0) {
  9721. WOLFSSL_MSG("Session cache mutex lock failed");
  9722. return BAD_MUTEX_E;
  9723. }
  9724. #endif
  9725. for (i = 0; i < cache_header.rows; ++i) {
  9726. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9727. if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) {
  9728. WOLFSSL_MSG("Session row cache mutex lock failed");
  9729. return BAD_MUTEX_E;
  9730. }
  9731. #endif
  9732. XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW);
  9733. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9734. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9735. #endif
  9736. }
  9737. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9738. SESSION_ROW_UNLOCK(row);
  9739. #endif
  9740. #ifndef NO_CLIENT_CACHE
  9741. if (wc_LockMutex(&clisession_mutex) != 0) {
  9742. WOLFSSL_MSG("Client cache mutex lock failed");
  9743. return BAD_MUTEX_E;
  9744. }
  9745. XMEMCPY(row, ClientCache, sizeof(ClientCache));
  9746. wc_UnLockMutex(&clisession_mutex);
  9747. #endif
  9748. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  9749. return WOLFSSL_SUCCESS;
  9750. }
  9751. /* Restore the persistent session cache from memory */
  9752. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  9753. {
  9754. int i;
  9755. cache_header_t cache_header;
  9756. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9757. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  9758. if (sz < wolfSSL_get_session_cache_memsize()) {
  9759. WOLFSSL_MSG("Memory buffer too small");
  9760. return BUFFER_E;
  9761. }
  9762. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  9763. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9764. cache_header.rows != SESSION_ROWS ||
  9765. cache_header.columns != SESSIONS_PER_ROW ||
  9766. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9767. WOLFSSL_MSG("Session cache header match failed");
  9768. return CACHE_MATCH_ERROR;
  9769. }
  9770. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9771. if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) {
  9772. WOLFSSL_MSG("Session cache mutex lock failed");
  9773. return BAD_MUTEX_E;
  9774. }
  9775. #endif
  9776. for (i = 0; i < cache_header.rows; ++i) {
  9777. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9778. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  9779. WOLFSSL_MSG("Session row cache mutex lock failed");
  9780. return BAD_MUTEX_E;
  9781. }
  9782. #endif
  9783. XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW);
  9784. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9785. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9786. #endif
  9787. }
  9788. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9789. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9790. #endif
  9791. #ifndef NO_CLIENT_CACHE
  9792. if (wc_LockMutex(&clisession_mutex) != 0) {
  9793. WOLFSSL_MSG("Client cache mutex lock failed");
  9794. return BAD_MUTEX_E;
  9795. }
  9796. XMEMCPY(ClientCache, row, sizeof(ClientCache));
  9797. wc_UnLockMutex(&clisession_mutex);
  9798. #endif
  9799. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9800. return WOLFSSL_SUCCESS;
  9801. }
  9802. #if !defined(NO_FILESYSTEM)
  9803. /* Persist session cache to file */
  9804. /* doesn't use memsave because of additional memory use */
  9805. int wolfSSL_save_session_cache(const char *fname)
  9806. {
  9807. XFILE file;
  9808. int ret;
  9809. int rc = WOLFSSL_SUCCESS;
  9810. int i;
  9811. cache_header_t cache_header;
  9812. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9813. file = XFOPEN(fname, "w+b");
  9814. if (file == XBADFILE) {
  9815. WOLFSSL_MSG("Couldn't open session cache save file");
  9816. return WOLFSSL_BAD_FILE;
  9817. }
  9818. cache_header.version = WOLFSSL_CACHE_VERSION;
  9819. cache_header.rows = SESSION_ROWS;
  9820. cache_header.columns = SESSIONS_PER_ROW;
  9821. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9822. /* cache header */
  9823. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9824. if (ret != 1) {
  9825. WOLFSSL_MSG("Session cache header file write failed");
  9826. XFCLOSE(file);
  9827. return FWRITE_ERROR;
  9828. }
  9829. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9830. if (SESSION_ROW_RD_LOCK(&SessionCache[0]) != 0) {
  9831. WOLFSSL_MSG("Session cache mutex lock failed");
  9832. XFCLOSE(file);
  9833. return BAD_MUTEX_E;
  9834. }
  9835. #endif
  9836. /* session cache */
  9837. for (i = 0; i < cache_header.rows; ++i) {
  9838. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9839. if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) {
  9840. WOLFSSL_MSG("Session row cache mutex lock failed");
  9841. XFCLOSE(file);
  9842. return BAD_MUTEX_E;
  9843. }
  9844. #endif
  9845. ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9846. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9847. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9848. #endif
  9849. if (ret != 1) {
  9850. WOLFSSL_MSG("Session cache member file write failed");
  9851. rc = FWRITE_ERROR;
  9852. break;
  9853. }
  9854. }
  9855. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9856. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9857. #endif
  9858. #ifndef NO_CLIENT_CACHE
  9859. /* client cache */
  9860. if (wc_LockMutex(&clisession_mutex) != 0) {
  9861. WOLFSSL_MSG("Client cache mutex lock failed");
  9862. XFCLOSE(file);
  9863. return BAD_MUTEX_E;
  9864. }
  9865. ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file);
  9866. if (ret != 1) {
  9867. WOLFSSL_MSG("Client cache member file write failed");
  9868. rc = FWRITE_ERROR;
  9869. }
  9870. wc_UnLockMutex(&clisession_mutex);
  9871. #endif /* !NO_CLIENT_CACHE */
  9872. XFCLOSE(file);
  9873. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9874. return rc;
  9875. }
  9876. /* Restore the persistent session cache from file */
  9877. /* doesn't use memstore because of additional memory use */
  9878. int wolfSSL_restore_session_cache(const char *fname)
  9879. {
  9880. XFILE file;
  9881. int rc = WOLFSSL_SUCCESS;
  9882. int ret;
  9883. int i;
  9884. cache_header_t cache_header;
  9885. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9886. file = XFOPEN(fname, "rb");
  9887. if (file == XBADFILE) {
  9888. WOLFSSL_MSG("Couldn't open session cache save file");
  9889. return WOLFSSL_BAD_FILE;
  9890. }
  9891. /* cache header */
  9892. ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file);
  9893. if (ret != 1) {
  9894. WOLFSSL_MSG("Session cache header file read failed");
  9895. XFCLOSE(file);
  9896. return FREAD_ERROR;
  9897. }
  9898. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9899. cache_header.rows != SESSION_ROWS ||
  9900. cache_header.columns != SESSIONS_PER_ROW ||
  9901. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9902. WOLFSSL_MSG("Session cache header match failed");
  9903. XFCLOSE(file);
  9904. return CACHE_MATCH_ERROR;
  9905. }
  9906. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9907. if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) {
  9908. WOLFSSL_MSG("Session cache mutex lock failed");
  9909. XFCLOSE(file);
  9910. return BAD_MUTEX_E;
  9911. }
  9912. #endif
  9913. /* session cache */
  9914. for (i = 0; i < cache_header.rows; ++i) {
  9915. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9916. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  9917. WOLFSSL_MSG("Session row cache mutex lock failed");
  9918. XFCLOSE(file);
  9919. return BAD_MUTEX_E;
  9920. }
  9921. #endif
  9922. ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9923. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9924. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9925. #endif
  9926. if (ret != 1) {
  9927. WOLFSSL_MSG("Session cache member file read failed");
  9928. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9929. rc = FREAD_ERROR;
  9930. break;
  9931. }
  9932. }
  9933. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9934. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9935. #endif
  9936. #ifndef NO_CLIENT_CACHE
  9937. /* client cache */
  9938. if (wc_LockMutex(&clisession_mutex) != 0) {
  9939. WOLFSSL_MSG("Client cache mutex lock failed");
  9940. XFCLOSE(file);
  9941. return BAD_MUTEX_E;
  9942. }
  9943. ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file);
  9944. if (ret != 1) {
  9945. WOLFSSL_MSG("Client cache member file read failed");
  9946. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9947. rc = FREAD_ERROR;
  9948. }
  9949. wc_UnLockMutex(&clisession_mutex);
  9950. #endif /* !NO_CLIENT_CACHE */
  9951. XFCLOSE(file);
  9952. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9953. return rc;
  9954. }
  9955. #endif /* !NO_FILESYSTEM */
  9956. #endif /* PERSIST_SESSION_CACHE && !SESSION_CACHE_DYNAMIC_MEM */
  9957. #endif /* NO_SESSION_CACHE */
  9958. void wolfSSL_load_error_strings(void)
  9959. {
  9960. /* compatibility only */
  9961. }
  9962. int wolfSSL_library_init(void)
  9963. {
  9964. WOLFSSL_ENTER("wolfSSL_library_init");
  9965. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9966. return WOLFSSL_SUCCESS;
  9967. else
  9968. return WOLFSSL_FATAL_ERROR;
  9969. }
  9970. #ifdef HAVE_SECRET_CALLBACK
  9971. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9972. {
  9973. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9974. if (ssl == NULL)
  9975. return WOLFSSL_FATAL_ERROR;
  9976. ssl->sessionSecretCb = cb;
  9977. ssl->sessionSecretCtx = ctx;
  9978. if (cb != NULL) {
  9979. /* If using a pre-set key, assume session resumption. */
  9980. ssl->session->sessionIDSz = 0;
  9981. ssl->options.resuming = 1;
  9982. }
  9983. return WOLFSSL_SUCCESS;
  9984. }
  9985. #endif
  9986. #ifndef NO_SESSION_CACHE
  9987. /* on by default if built in but allow user to turn off */
  9988. WOLFSSL_ABI
  9989. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9990. {
  9991. WOLFSSL_ENTER("wolfSSL_CTX_set_session_cache_mode");
  9992. if (ctx == NULL)
  9993. return WOLFSSL_FAILURE;
  9994. if (mode == WOLFSSL_SESS_CACHE_OFF) {
  9995. ctx->sessionCacheOff = 1;
  9996. #ifdef HAVE_EXT_CACHE
  9997. ctx->internalCacheOff = 1;
  9998. ctx->internalCacheLookupOff = 1;
  9999. #endif
  10000. }
  10001. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  10002. ctx->sessionCacheFlushOff = 1;
  10003. #ifdef HAVE_EXT_CACHE
  10004. /* WOLFSSL_SESS_CACHE_NO_INTERNAL activates both if's */
  10005. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  10006. ctx->internalCacheOff = 1;
  10007. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0)
  10008. ctx->internalCacheLookupOff = 1;
  10009. #endif
  10010. return WOLFSSL_SUCCESS;
  10011. }
  10012. #ifdef OPENSSL_EXTRA
  10013. /* Get the session cache mode for CTX
  10014. *
  10015. * ctx WOLFSSL_CTX struct to get cache mode from
  10016. *
  10017. * Returns a bit mask that has the session cache mode */
  10018. long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  10019. {
  10020. long m = 0;
  10021. WOLFSSL_ENTER("wolfSSL_CTX_get_session_cache_mode");
  10022. if (ctx == NULL) {
  10023. return m;
  10024. }
  10025. if (ctx->sessionCacheOff != 1) {
  10026. m |= WOLFSSL_SESS_CACHE_SERVER;
  10027. }
  10028. if (ctx->sessionCacheFlushOff == 1) {
  10029. m |= WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR;
  10030. }
  10031. #ifdef HAVE_EXT_CACHE
  10032. if (ctx->internalCacheOff == 1) {
  10033. m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE;
  10034. }
  10035. if (ctx->internalCacheLookupOff == 1) {
  10036. m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP;
  10037. }
  10038. #endif
  10039. return m;
  10040. }
  10041. #endif /* OPENSSL_EXTRA */
  10042. #endif /* NO_SESSION_CACHE */
  10043. #ifdef OPENSSL_EXTRA
  10044. /*
  10045. * check if the list has TLS13 and pre-TLS13 suites
  10046. * @param list cipher suite list that user want to set
  10047. * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2
  10048. */
  10049. static int CheckcipherList(const char* list)
  10050. {
  10051. int ret;
  10052. int findTLSv13Suites = 0;
  10053. int findbeforeSuites = 0;
  10054. byte cipherSuite0;
  10055. byte cipherSuite1;
  10056. int flags;
  10057. char* next = (char*)list;
  10058. do {
  10059. char* current = next;
  10060. char name[MAX_SUITE_NAME + 1];
  10061. word32 length = MAX_SUITE_NAME;
  10062. word32 current_length;
  10063. next = XSTRSTR(next, ":");
  10064. current_length = (!next) ? (word32)XSTRLEN(current)
  10065. : (word32)(next - current);
  10066. if (current_length < length) {
  10067. length = current_length;
  10068. }
  10069. XMEMCPY(name, current, length);
  10070. name[length] = 0;
  10071. if (XSTRCMP(name, "ALL") == 0 || XSTRCMP(name, "DEFAULT") == 0 ||
  10072. XSTRCMP(name, "HIGH") == 0) {
  10073. findTLSv13Suites = 1;
  10074. findbeforeSuites = 1;
  10075. break;
  10076. }
  10077. ret = wolfSSL_get_cipher_suite_from_name(name, &cipherSuite0,
  10078. &cipherSuite1, &flags);
  10079. if (ret == 0) {
  10080. if (cipherSuite0 == TLS13_BYTE) {
  10081. /* TLSv13 suite */
  10082. findTLSv13Suites = 1;
  10083. }
  10084. else {
  10085. findbeforeSuites = 1;
  10086. }
  10087. }
  10088. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  10089. /* check if mixed due to names like RSA:ECDHE+AESGCM etc. */
  10090. if (ret != 0) {
  10091. char* subStr = name;
  10092. char* subStrNext;
  10093. do {
  10094. subStrNext = XSTRSTR(subStr, "+");
  10095. if ((XSTRCMP(subStr, "ECDHE") == 0) ||
  10096. (XSTRCMP(subStr, "RSA") == 0)) {
  10097. return 0;
  10098. }
  10099. if (subStrNext && (XSTRLEN(subStrNext) > 0)) {
  10100. subStr = subStrNext + 1; /* +1 to skip past '+' */
  10101. }
  10102. } while (subStrNext != NULL);
  10103. }
  10104. #endif
  10105. if (findTLSv13Suites == 1 && findbeforeSuites == 1) {
  10106. /* list has mixed suites */
  10107. return 0;
  10108. }
  10109. }
  10110. while (next++); /* ++ needed to skip ':' */
  10111. if (findTLSv13Suites == 0 && findbeforeSuites == 1) {
  10112. ret = 1;/* only before TLSv13 suites */
  10113. }
  10114. else if (findTLSv13Suites == 1 && findbeforeSuites == 0) {
  10115. ret = 2;/* only TLSv13 suties */
  10116. }
  10117. else {
  10118. ret = 0;/* handle as mixed */
  10119. }
  10120. return ret;
  10121. }
  10122. /* parse some bulk lists like !eNULL / !aNULL
  10123. *
  10124. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  10125. */
  10126. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  10127. Suites* suites, const char* list)
  10128. {
  10129. int ret = 0;
  10130. int listattribute = 0;
  10131. int tls13Only = 0;
  10132. #ifndef WOLFSSL_SMALL_STACK
  10133. byte suitesCpy[WOLFSSL_MAX_SUITE_SZ];
  10134. #else
  10135. byte* suitesCpy = NULL;
  10136. #endif
  10137. word16 suitesCpySz = 0;
  10138. word16 i = 0;
  10139. word16 j = 0;
  10140. if (suites == NULL || list == NULL) {
  10141. WOLFSSL_MSG("NULL argument");
  10142. return WOLFSSL_FAILURE;
  10143. }
  10144. listattribute = CheckcipherList(list);
  10145. if (listattribute == 0) {
  10146. /* list has mixed(pre-TLSv13 and TLSv13) suites
  10147. * update cipher suites the same as before
  10148. */
  10149. return (SetCipherList_ex(ctx, ssl, suites, list)) ? WOLFSSL_SUCCESS :
  10150. WOLFSSL_FAILURE;
  10151. }
  10152. else if (listattribute == 1) {
  10153. /* list has only pre-TLSv13 suites.
  10154. * Only update before TLSv13 suites.
  10155. */
  10156. tls13Only = 0;
  10157. }
  10158. else if (listattribute == 2) {
  10159. /* list has only TLSv13 suites. Only update TLv13 suites
  10160. * simulate set_ciphersuites() compatibility layer API
  10161. */
  10162. tls13Only = 1;
  10163. if ((ctx != NULL && !IsAtLeastTLSv1_3(ctx->method->version)) ||
  10164. (ssl != NULL && !IsAtLeastTLSv1_3(ssl->version))) {
  10165. /* Silently ignore TLS 1.3 ciphers if we don't support it. */
  10166. return WOLFSSL_SUCCESS;
  10167. }
  10168. }
  10169. /* list contains ciphers either only for TLS 1.3 or <= TLS 1.2 */
  10170. if (suites->suiteSz == 0) {
  10171. WOLFSSL_MSG("Warning suites->suiteSz = 0 set to WOLFSSL_MAX_SUITE_SZ");
  10172. suites->suiteSz = WOLFSSL_MAX_SUITE_SZ;
  10173. }
  10174. #ifdef WOLFSSL_SMALL_STACK
  10175. if (suites->suiteSz > 0) {
  10176. suitesCpy = (byte*)XMALLOC(suites->suiteSz, NULL,
  10177. DYNAMIC_TYPE_TMP_BUFFER);
  10178. if (suitesCpy == NULL) {
  10179. return WOLFSSL_FAILURE;
  10180. }
  10181. XMEMSET(suitesCpy, 0, suites->suiteSz);
  10182. }
  10183. #else
  10184. XMEMSET(suitesCpy, 0, sizeof(suitesCpy));
  10185. #endif
  10186. if (suites->suiteSz > 0)
  10187. XMEMCPY(suitesCpy, suites->suites, suites->suiteSz);
  10188. suitesCpySz = suites->suiteSz;
  10189. ret = SetCipherList_ex(ctx, ssl, suites, list);
  10190. if (ret != 1) {
  10191. #ifdef WOLFSSL_SMALL_STACK
  10192. XFREE(suitesCpy, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10193. #endif
  10194. return WOLFSSL_FAILURE;
  10195. }
  10196. for (i = 0; i < suitesCpySz &&
  10197. suites->suiteSz <= (WOLFSSL_MAX_SUITE_SZ - SUITE_LEN); i += 2) {
  10198. /* Check for duplicates */
  10199. int duplicate = 0;
  10200. for (j = 0; j < suites->suiteSz; j += 2) {
  10201. if (suitesCpy[i] == suites->suites[j] &&
  10202. suitesCpy[i+1] == suites->suites[j+1]) {
  10203. duplicate = 1;
  10204. break;
  10205. }
  10206. }
  10207. if (!duplicate) {
  10208. if (tls13Only) {
  10209. /* Updating TLS 1.3 ciphers */
  10210. if (suitesCpy[i] != TLS13_BYTE) {
  10211. /* Only copy over <= TLS 1.2 ciphers */
  10212. /* TLS 1.3 ciphers take precedence */
  10213. suites->suites[suites->suiteSz++] = suitesCpy[i];
  10214. suites->suites[suites->suiteSz++] = suitesCpy[i+1];
  10215. }
  10216. }
  10217. else {
  10218. /* Updating <= TLS 1.2 ciphers */
  10219. if (suitesCpy[i] == TLS13_BYTE) {
  10220. /* Only copy over TLS 1.3 ciphers */
  10221. /* TLS 1.3 ciphers take precedence */
  10222. XMEMMOVE(suites->suites + SUITE_LEN, suites->suites,
  10223. suites->suiteSz);
  10224. suites->suites[0] = suitesCpy[i];
  10225. suites->suites[1] = suitesCpy[i+1];
  10226. suites->suiteSz += 2;
  10227. }
  10228. }
  10229. }
  10230. }
  10231. #ifdef WOLFSSL_SMALL_STACK
  10232. XFREE(suitesCpy, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10233. #endif
  10234. return ret;
  10235. }
  10236. #endif
  10237. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  10238. {
  10239. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  10240. if (ctx == NULL)
  10241. return WOLFSSL_FAILURE;
  10242. if (AllocateCtxSuites(ctx) != 0)
  10243. return WOLFSSL_FAILURE;
  10244. #ifdef OPENSSL_EXTRA
  10245. return wolfSSL_parse_cipher_list(ctx, NULL, ctx->suites, list);
  10246. #else
  10247. return (SetCipherList(ctx, ctx->suites, list)) ?
  10248. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10249. #endif
  10250. }
  10251. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10252. int wolfSSL_CTX_set_cipher_list_bytes(WOLFSSL_CTX* ctx, const byte* list,
  10253. const int listSz)
  10254. {
  10255. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list_bytes");
  10256. if (ctx == NULL)
  10257. return WOLFSSL_FAILURE;
  10258. if (AllocateCtxSuites(ctx) != 0)
  10259. return WOLFSSL_FAILURE;
  10260. return (SetCipherListFromBytes(ctx, ctx->suites, list, listSz)) ?
  10261. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10262. }
  10263. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10264. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  10265. {
  10266. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  10267. if (ssl == NULL || ssl->ctx == NULL) {
  10268. return WOLFSSL_FAILURE;
  10269. }
  10270. if (AllocateSuites(ssl) != 0)
  10271. return WOLFSSL_FAILURE;
  10272. #ifdef OPENSSL_EXTRA
  10273. return wolfSSL_parse_cipher_list(NULL, ssl, ssl->suites, list);
  10274. #else
  10275. return (SetCipherList_ex(NULL, ssl, ssl->suites, list)) ?
  10276. WOLFSSL_SUCCESS :
  10277. WOLFSSL_FAILURE;
  10278. #endif
  10279. }
  10280. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10281. int wolfSSL_set_cipher_list_bytes(WOLFSSL* ssl, const byte* list,
  10282. const int listSz)
  10283. {
  10284. WOLFSSL_ENTER("wolfSSL_set_cipher_list_bytes");
  10285. if (ssl == NULL || ssl->ctx == NULL) {
  10286. return WOLFSSL_FAILURE;
  10287. }
  10288. if (AllocateSuites(ssl) != 0)
  10289. return WOLFSSL_FAILURE;
  10290. return (SetCipherListFromBytes(ssl->ctx, ssl->suites, list, listSz))
  10291. ? WOLFSSL_SUCCESS
  10292. : WOLFSSL_FAILURE;
  10293. }
  10294. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10295. #ifdef HAVE_KEYING_MATERIAL
  10296. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  10297. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  10298. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  10299. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  10300. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  10301. static const struct ForbiddenLabels {
  10302. const char* label;
  10303. size_t labelLen;
  10304. } forbiddenLabels[] = {
  10305. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  10306. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  10307. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  10308. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  10309. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  10310. {NULL, 0},
  10311. };
  10312. /**
  10313. * Implement RFC 5705
  10314. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  10315. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  10316. */
  10317. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  10318. unsigned char *out, size_t outLen,
  10319. const char *label, size_t labelLen,
  10320. const unsigned char *context, size_t contextLen,
  10321. int use_context)
  10322. {
  10323. byte* seed = NULL;
  10324. word32 seedLen;
  10325. const struct ForbiddenLabels* fl;
  10326. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  10327. if (ssl == NULL || out == NULL || label == NULL ||
  10328. (use_context && contextLen && context == NULL)) {
  10329. WOLFSSL_MSG("Bad argument");
  10330. return WOLFSSL_FAILURE;
  10331. }
  10332. /* clientRandom + serverRandom
  10333. * OR
  10334. * clientRandom + serverRandom + ctx len encoding + ctx */
  10335. seedLen = !use_context ? (word32)SEED_LEN :
  10336. (word32)SEED_LEN + 2 + (word32)contextLen;
  10337. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  10338. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  10339. "data. Call wolfSSL_KeepArrays before attempting to "
  10340. "export keyid material.");
  10341. return WOLFSSL_FAILURE;
  10342. }
  10343. /* check forbidden labels */
  10344. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  10345. if (labelLen >= fl->labelLen &&
  10346. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  10347. WOLFSSL_MSG("Forbidden label");
  10348. return WOLFSSL_FAILURE;
  10349. }
  10350. }
  10351. #ifdef WOLFSSL_TLS13
  10352. if (IsAtLeastTLSv1_3(ssl->version)) {
  10353. /* Path for TLS 1.3 */
  10354. if (!use_context) {
  10355. contextLen = 0;
  10356. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  10357. }
  10358. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  10359. context, contextLen) != 0) {
  10360. WOLFSSL_MSG("Tls13_Exporter error");
  10361. return WOLFSSL_FAILURE;
  10362. }
  10363. return WOLFSSL_SUCCESS;
  10364. }
  10365. #endif
  10366. /* Path for <=TLS 1.2 */
  10367. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10368. if (seed == NULL) {
  10369. WOLFSSL_MSG("malloc error");
  10370. return WOLFSSL_FAILURE;
  10371. }
  10372. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  10373. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  10374. if (use_context) {
  10375. /* Encode len in big endian */
  10376. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  10377. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  10378. if (contextLen) {
  10379. /* 0 length context is allowed */
  10380. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  10381. }
  10382. }
  10383. PRIVATE_KEY_UNLOCK();
  10384. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  10385. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  10386. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  10387. WOLFSSL_MSG("wc_PRF_TLS error");
  10388. PRIVATE_KEY_LOCK();
  10389. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10390. return WOLFSSL_FAILURE;
  10391. }
  10392. PRIVATE_KEY_LOCK();
  10393. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10394. return WOLFSSL_SUCCESS;
  10395. }
  10396. #endif /* HAVE_KEYING_MATERIAL */
  10397. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  10398. {
  10399. int useNb = 0;
  10400. if (ssl == NULL)
  10401. return WOLFSSL_FAILURE;
  10402. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  10403. if (ssl->options.dtls) {
  10404. #ifdef WOLFSSL_DTLS
  10405. useNb = ssl->options.dtlsUseNonblock;
  10406. #endif
  10407. }
  10408. else {
  10409. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  10410. "DEPRECATED for non-DTLS use.");
  10411. }
  10412. return useNb;
  10413. }
  10414. #ifndef WOLFSSL_LEANPSK
  10415. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  10416. {
  10417. (void)nonblock;
  10418. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  10419. if (ssl == NULL)
  10420. return;
  10421. if (ssl->options.dtls) {
  10422. #ifdef WOLFSSL_DTLS
  10423. ssl->options.dtlsUseNonblock = (nonblock != 0);
  10424. #endif
  10425. }
  10426. else {
  10427. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  10428. "DEPRECATED for non-DTLS use.");
  10429. }
  10430. }
  10431. #ifdef WOLFSSL_DTLS
  10432. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  10433. {
  10434. int timeout = 0;
  10435. if (ssl)
  10436. timeout = ssl->dtls_timeout;
  10437. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout", timeout);
  10438. return timeout;
  10439. }
  10440. #ifdef WOLFSSL_DTLS13
  10441. /*
  10442. * This API returns 1 when the user should set a short timeout for receiving
  10443. * data. It is recommended that it is at most 1/4 the value returned by
  10444. * wolfSSL_dtls_get_current_timeout().
  10445. */
  10446. int wolfSSL_dtls13_use_quick_timeout(WOLFSSL* ssl)
  10447. {
  10448. return ssl->dtls13FastTimeout;
  10449. }
  10450. /*
  10451. * When this is set, a DTLS 1.3 connection will send acks immediately when a
  10452. * disruption is detected to shortcut timeouts. This results in potentially
  10453. * more traffic but may make the handshake quicker.
  10454. */
  10455. void wolfSSL_dtls13_set_send_more_acks(WOLFSSL* ssl, int value)
  10456. {
  10457. if (ssl != NULL)
  10458. ssl->options.dtls13SendMoreAcks = !!value;
  10459. }
  10460. #endif /* WOLFSSL_DTLS13 */
  10461. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  10462. {
  10463. if (ssl && timeleft) {
  10464. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  10465. timeleft->tv_sec = ssl->dtls_timeout;
  10466. }
  10467. return 0;
  10468. }
  10469. #ifndef NO_WOLFSSL_STUB
  10470. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10471. {
  10472. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10473. (void)ssl;
  10474. return 0;
  10475. }
  10476. #endif
  10477. #ifndef NO_WOLFSSL_STUB
  10478. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10479. {
  10480. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10481. (void)ssl;
  10482. (void)duration_ms;
  10483. }
  10484. #endif
  10485. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10486. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10487. {
  10488. if (ssl == NULL || timeout < 0)
  10489. return BAD_FUNC_ARG;
  10490. if (timeout > ssl->dtls_timeout_max) {
  10491. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10492. return BAD_FUNC_ARG;
  10493. }
  10494. ssl->dtls_timeout_init = timeout;
  10495. ssl->dtls_timeout = timeout;
  10496. return WOLFSSL_SUCCESS;
  10497. }
  10498. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10499. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10500. {
  10501. if (ssl == NULL || timeout < 0)
  10502. return BAD_FUNC_ARG;
  10503. if (timeout < ssl->dtls_timeout_init) {
  10504. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10505. return BAD_FUNC_ARG;
  10506. }
  10507. ssl->dtls_timeout_max = timeout;
  10508. return WOLFSSL_SUCCESS;
  10509. }
  10510. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10511. {
  10512. int result = WOLFSSL_SUCCESS;
  10513. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout");
  10514. if (ssl == NULL)
  10515. return WOLFSSL_FATAL_ERROR;
  10516. #ifdef WOLFSSL_DTLS13
  10517. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  10518. result = Dtls13RtxTimeout(ssl);
  10519. if (result < 0) {
  10520. if (result == WANT_WRITE)
  10521. ssl->dtls13SendingAckOrRtx = 1;
  10522. ssl->error = result;
  10523. WOLFSSL_ERROR(result);
  10524. return WOLFSSL_FATAL_ERROR;
  10525. }
  10526. return WOLFSSL_SUCCESS;
  10527. }
  10528. #endif /* WOLFSSL_DTLS13 */
  10529. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  10530. if (DtlsMsgPoolTimeout(ssl) < 0){
  10531. ssl->error = SOCKET_ERROR_E;
  10532. WOLFSSL_ERROR(ssl->error);
  10533. result = WOLFSSL_FATAL_ERROR;
  10534. }
  10535. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  10536. ssl->error = result;
  10537. WOLFSSL_ERROR(result);
  10538. result = WOLFSSL_FATAL_ERROR;
  10539. }
  10540. else {
  10541. /* Reset return value to success */
  10542. result = WOLFSSL_SUCCESS;
  10543. }
  10544. }
  10545. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout", result);
  10546. return result;
  10547. }
  10548. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10549. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10550. {
  10551. WOLFSSL_ENTER("wolfSSL_dtls_retransmit");
  10552. if (ssl == NULL)
  10553. return WOLFSSL_FATAL_ERROR;
  10554. if (!ssl->options.handShakeDone) {
  10555. int result = DtlsMsgPoolSend(ssl, 0);
  10556. if (result < 0) {
  10557. ssl->error = result;
  10558. WOLFSSL_ERROR(result);
  10559. return WOLFSSL_FATAL_ERROR;
  10560. }
  10561. }
  10562. return 0;
  10563. }
  10564. #endif /* DTLS */
  10565. #endif /* LEANPSK */
  10566. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10567. /* Not an SSL function, return 0 for success, error code otherwise */
  10568. /* Prereq: ssl's RNG needs to be initialized. */
  10569. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10570. const byte* secret, word32 secretSz)
  10571. {
  10572. int ret = 0;
  10573. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10574. if (ssl == NULL) {
  10575. WOLFSSL_MSG("need a SSL object");
  10576. return BAD_FUNC_ARG;
  10577. }
  10578. if (secret != NULL && secretSz == 0) {
  10579. WOLFSSL_MSG("can't have a new secret without a size");
  10580. return BAD_FUNC_ARG;
  10581. }
  10582. /* If secretSz is 0, use the default size. */
  10583. if (secretSz == 0)
  10584. secretSz = COOKIE_SECRET_SZ;
  10585. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10586. byte* newSecret;
  10587. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10588. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10589. ssl->buffers.dtlsCookieSecret.length);
  10590. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10591. ssl->heap, DYNAMIC_TYPE_COOKIE_PWD);
  10592. }
  10593. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10594. if (newSecret == NULL) {
  10595. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10596. ssl->buffers.dtlsCookieSecret.length = 0;
  10597. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10598. return MEMORY_ERROR;
  10599. }
  10600. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10601. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10602. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10603. wc_MemZero_Add("wolfSSL_DTLS_SetCookieSecret secret",
  10604. ssl->buffers.dtlsCookieSecret.buffer,
  10605. ssl->buffers.dtlsCookieSecret.length);
  10606. #endif
  10607. }
  10608. /* If the supplied secret is NULL, randomly generate a new secret. */
  10609. if (secret == NULL) {
  10610. ret = wc_RNG_GenerateBlock(ssl->rng,
  10611. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10612. }
  10613. else
  10614. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10615. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10616. return ret;
  10617. }
  10618. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10619. /* EITHER SIDE METHODS */
  10620. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10621. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10622. {
  10623. return wolfSSLv23_method_ex(NULL);
  10624. }
  10625. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10626. {
  10627. WOLFSSL_METHOD* m = NULL;
  10628. WOLFSSL_ENTER("wolfSSLv23_method");
  10629. #if !defined(NO_WOLFSSL_CLIENT)
  10630. m = wolfSSLv23_client_method_ex(heap);
  10631. #elif !defined(NO_WOLFSSL_SERVER)
  10632. m = wolfSSLv23_server_method_ex(heap);
  10633. #else
  10634. (void)heap;
  10635. #endif
  10636. if (m != NULL) {
  10637. m->side = WOLFSSL_NEITHER_END;
  10638. }
  10639. return m;
  10640. }
  10641. #ifdef WOLFSSL_ALLOW_SSLV3
  10642. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10643. {
  10644. return wolfSSLv3_method_ex(NULL);
  10645. }
  10646. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10647. {
  10648. WOLFSSL_METHOD* m = NULL;
  10649. WOLFSSL_ENTER("wolfSSLv3_method_ex");
  10650. #if !defined(NO_WOLFSSL_CLIENT)
  10651. m = wolfSSLv3_client_method_ex(heap);
  10652. #elif !defined(NO_WOLFSSL_SERVER)
  10653. m = wolfSSLv3_server_method_ex(heap);
  10654. #endif
  10655. if (m != NULL) {
  10656. m->side = WOLFSSL_NEITHER_END;
  10657. }
  10658. return m;
  10659. }
  10660. #endif
  10661. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10662. /* client only parts */
  10663. #ifndef NO_WOLFSSL_CLIENT
  10664. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  10665. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10666. {
  10667. WOLFSSL_STUB("wolfSSLv2_client_method");
  10668. return NULL;
  10669. }
  10670. #endif
  10671. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10672. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10673. {
  10674. return wolfSSLv3_client_method_ex(NULL);
  10675. }
  10676. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10677. {
  10678. WOLFSSL_METHOD* method =
  10679. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10680. heap, DYNAMIC_TYPE_METHOD);
  10681. (void)heap;
  10682. WOLFSSL_ENTER("wolfSSLv3_client_method_ex");
  10683. if (method)
  10684. InitSSL_Method(method, MakeSSLv3());
  10685. return method;
  10686. }
  10687. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10688. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10689. {
  10690. return wolfSSLv23_client_method_ex(NULL);
  10691. }
  10692. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10693. {
  10694. WOLFSSL_METHOD* method =
  10695. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10696. heap, DYNAMIC_TYPE_METHOD);
  10697. (void)heap;
  10698. WOLFSSL_ENTER("wolfSSLv23_client_method_ex");
  10699. if (method) {
  10700. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10701. #if defined(WOLFSSL_TLS13)
  10702. InitSSL_Method(method, MakeTLSv1_3());
  10703. #elif !defined(WOLFSSL_NO_TLS12)
  10704. InitSSL_Method(method, MakeTLSv1_2());
  10705. #elif !defined(NO_OLD_TLS)
  10706. InitSSL_Method(method, MakeTLSv1_1());
  10707. #endif
  10708. #else
  10709. #ifndef NO_OLD_TLS
  10710. InitSSL_Method(method, MakeTLSv1_1());
  10711. #endif
  10712. #endif
  10713. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10714. method->downgrade = 1;
  10715. #endif
  10716. }
  10717. return method;
  10718. }
  10719. /* please see note at top of README if you get an error from connect */
  10720. WOLFSSL_ABI
  10721. int wolfSSL_connect(WOLFSSL* ssl)
  10722. {
  10723. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10724. int neededState;
  10725. byte advanceState;
  10726. #endif
  10727. int ret = 0;
  10728. (void)ret;
  10729. #ifdef HAVE_ERRNO_H
  10730. errno = 0;
  10731. #endif
  10732. if (ssl == NULL)
  10733. return BAD_FUNC_ARG;
  10734. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10735. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10736. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10737. if (ssl->error != WOLFSSL_SUCCESS) {
  10738. WOLFSSL_ERROR(ssl->error);
  10739. return WOLFSSL_FATAL_ERROR;
  10740. }
  10741. ssl->error = 0; /* expected to be zero here */
  10742. }
  10743. #ifdef OPENSSL_EXTRA
  10744. if (ssl->CBIS != NULL) {
  10745. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10746. ssl->cbmode = SSL_CB_WRITE;
  10747. }
  10748. #endif
  10749. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10750. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10751. return wolfSSL_connect_TLSv13(ssl);
  10752. #else
  10753. #ifdef WOLFSSL_TLS13
  10754. if (ssl->options.tls1_3) {
  10755. WOLFSSL_MSG("TLS 1.3");
  10756. return wolfSSL_connect_TLSv13(ssl);
  10757. }
  10758. #endif
  10759. WOLFSSL_MSG("TLS 1.2 or lower");
  10760. WOLFSSL_ENTER("wolfSSL_connect");
  10761. /* make sure this wolfSSL object has arrays and rng setup. Protects
  10762. * case where the WOLFSSL object is reused via wolfSSL_clear() */
  10763. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  10764. return ret;
  10765. }
  10766. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10767. if ((ssl->ConnectFilter != NULL) &&
  10768. (ssl->options.connectState == CONNECT_BEGIN)) {
  10769. wolfSSL_netfilter_decision_t res;
  10770. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  10771. WOLFSSL_SUCCESS) &&
  10772. (res == WOLFSSL_NETFILTER_REJECT)) {
  10773. ssl->error = SOCKET_FILTERED_E;
  10774. WOLFSSL_ERROR(ssl->error);
  10775. return WOLFSSL_FATAL_ERROR;
  10776. }
  10777. }
  10778. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10779. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10780. ssl->error = SIDE_ERROR;
  10781. WOLFSSL_ERROR(ssl->error);
  10782. return WOLFSSL_FATAL_ERROR;
  10783. }
  10784. #ifdef WOLFSSL_DTLS
  10785. if (ssl->version.major == DTLS_MAJOR) {
  10786. ssl->options.dtls = 1;
  10787. ssl->options.tls = 1;
  10788. ssl->options.tls1_1 = 1;
  10789. ssl->options.dtlsStateful = 1;
  10790. }
  10791. #endif
  10792. /* fragOffset is non-zero when sending fragments. On the last
  10793. * fragment, fragOffset is zero again, and the state can be
  10794. * advanced. */
  10795. advanceState = ssl->fragOffset == 0 &&
  10796. (ssl->options.connectState == CONNECT_BEGIN ||
  10797. ssl->options.connectState == HELLO_AGAIN ||
  10798. (ssl->options.connectState >= FIRST_REPLY_DONE &&
  10799. ssl->options.connectState <= FIRST_REPLY_FOURTH));
  10800. #ifdef WOLFSSL_DTLS13
  10801. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
  10802. advanceState = advanceState && !ssl->dtls13SendingAckOrRtx;
  10803. #endif /* WOLFSSL_DTLS13 */
  10804. if (ssl->buffers.outputBuffer.length > 0
  10805. #ifdef WOLFSSL_ASYNC_CRYPT
  10806. /* do not send buffered or advance state if last error was an
  10807. async pending operation */
  10808. && ssl->error != WC_PENDING_E
  10809. #endif
  10810. ) {
  10811. ret = SendBuffered(ssl);
  10812. if (ret == 0) {
  10813. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  10814. if (advanceState) {
  10815. ssl->options.connectState++;
  10816. WOLFSSL_MSG("connect state: "
  10817. "Advanced from last buffered fragment send");
  10818. #ifdef WOLFSSL_ASYNC_IO
  10819. /* Cleanup async */
  10820. FreeAsyncCtx(ssl, 0);
  10821. #endif
  10822. }
  10823. }
  10824. else {
  10825. WOLFSSL_MSG("connect state: "
  10826. "Not advanced, more fragments to send");
  10827. }
  10828. }
  10829. else {
  10830. ssl->error = ret;
  10831. WOLFSSL_ERROR(ssl->error);
  10832. return WOLFSSL_FATAL_ERROR;
  10833. }
  10834. #ifdef WOLFSSL_DTLS13
  10835. if (ssl->options.dtls)
  10836. ssl->dtls13SendingAckOrRtx = 0;
  10837. #endif /* WOLFSSL_DTLS13 */
  10838. }
  10839. ret = RetrySendAlert(ssl);
  10840. if (ret != 0) {
  10841. ssl->error = ret;
  10842. WOLFSSL_ERROR(ssl->error);
  10843. return WOLFSSL_FATAL_ERROR;
  10844. }
  10845. switch (ssl->options.connectState) {
  10846. case CONNECT_BEGIN :
  10847. /* always send client hello first */
  10848. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10849. WOLFSSL_ERROR(ssl->error);
  10850. return WOLFSSL_FATAL_ERROR;
  10851. }
  10852. ssl->options.connectState = CLIENT_HELLO_SENT;
  10853. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10854. FALL_THROUGH;
  10855. case CLIENT_HELLO_SENT :
  10856. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10857. SERVER_HELLODONE_COMPLETE;
  10858. #ifdef WOLFSSL_DTLS
  10859. /* In DTLS, when resuming, we can go straight to FINISHED,
  10860. * or do a cookie exchange and then skip to FINISHED, assume
  10861. * we need the cookie exchange first. */
  10862. if (IsDtlsNotSctpMode(ssl))
  10863. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10864. #endif
  10865. /* get response */
  10866. WOLFSSL_MSG("Server state up to needed state.");
  10867. while (ssl->options.serverState < neededState) {
  10868. WOLFSSL_MSG("Progressing server state...");
  10869. #ifdef WOLFSSL_TLS13
  10870. if (ssl->options.tls1_3)
  10871. return wolfSSL_connect_TLSv13(ssl);
  10872. #endif
  10873. WOLFSSL_MSG("ProcessReply...");
  10874. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10875. WOLFSSL_ERROR(ssl->error);
  10876. return WOLFSSL_FATAL_ERROR;
  10877. }
  10878. /* if resumption failed, reset needed state */
  10879. else if (neededState == SERVER_FINISHED_COMPLETE) {
  10880. if (!ssl->options.resuming) {
  10881. #ifdef WOLFSSL_DTLS
  10882. if (IsDtlsNotSctpMode(ssl))
  10883. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10884. else
  10885. #endif
  10886. neededState = SERVER_HELLODONE_COMPLETE;
  10887. }
  10888. }
  10889. WOLFSSL_MSG("ProcessReply done.");
  10890. #ifdef WOLFSSL_DTLS13
  10891. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)
  10892. && ssl->dtls13Rtx.sendAcks == 1
  10893. && ssl->options.seenUnifiedHdr) {
  10894. /* we aren't negotiated the version yet, so we aren't sure
  10895. * the other end can speak v1.3. On the other side we have
  10896. * received a unified records, assuming that the
  10897. * ServerHello got lost, we will send an empty ACK. In case
  10898. * the server is a DTLS with version less than 1.3, it
  10899. * should just ignore the message */
  10900. ssl->dtls13Rtx.sendAcks = 0;
  10901. if ((ssl->error = SendDtls13Ack(ssl)) < 0) {
  10902. if (ssl->error == WANT_WRITE)
  10903. ssl->dtls13SendingAckOrRtx = 1;
  10904. WOLFSSL_ERROR(ssl->error);
  10905. return WOLFSSL_FATAL_ERROR;
  10906. }
  10907. }
  10908. #endif /* WOLFSSL_DTLS13 */
  10909. }
  10910. ssl->options.connectState = HELLO_AGAIN;
  10911. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10912. FALL_THROUGH;
  10913. case HELLO_AGAIN :
  10914. #ifdef WOLFSSL_TLS13
  10915. if (ssl->options.tls1_3)
  10916. return wolfSSL_connect_TLSv13(ssl);
  10917. #endif
  10918. #ifdef WOLFSSL_DTLS
  10919. if (ssl->options.serverState ==
  10920. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10921. if (IsDtlsNotSctpMode(ssl)) {
  10922. /* re-init hashes, exclude first hello and verify request */
  10923. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10924. WOLFSSL_ERROR(ssl->error);
  10925. return WOLFSSL_FATAL_ERROR;
  10926. }
  10927. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10928. WOLFSSL_ERROR(ssl->error);
  10929. return WOLFSSL_FATAL_ERROR;
  10930. }
  10931. }
  10932. }
  10933. #endif
  10934. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10935. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10936. FALL_THROUGH;
  10937. case HELLO_AGAIN_REPLY :
  10938. #ifdef WOLFSSL_DTLS
  10939. if (IsDtlsNotSctpMode(ssl)) {
  10940. neededState = ssl->options.resuming ?
  10941. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10942. /* get response */
  10943. while (ssl->options.serverState < neededState) {
  10944. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10945. WOLFSSL_ERROR(ssl->error);
  10946. return WOLFSSL_FATAL_ERROR;
  10947. }
  10948. /* if resumption failed, reset needed state */
  10949. if (neededState == SERVER_FINISHED_COMPLETE) {
  10950. if (!ssl->options.resuming)
  10951. neededState = SERVER_HELLODONE_COMPLETE;
  10952. }
  10953. }
  10954. }
  10955. #endif
  10956. ssl->options.connectState = FIRST_REPLY_DONE;
  10957. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10958. FALL_THROUGH;
  10959. case FIRST_REPLY_DONE :
  10960. if (ssl->options.certOnly)
  10961. return WOLFSSL_SUCCESS;
  10962. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10963. #ifdef WOLFSSL_TLS13
  10964. if (ssl->options.tls1_3)
  10965. return wolfSSL_connect_TLSv13(ssl);
  10966. #endif
  10967. if (ssl->options.sendVerify) {
  10968. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10969. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10970. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10971. #endif
  10972. WOLFSSL_ERROR(ssl->error);
  10973. return WOLFSSL_FATAL_ERROR;
  10974. }
  10975. WOLFSSL_MSG("sent: certificate");
  10976. }
  10977. #endif
  10978. ssl->options.connectState = FIRST_REPLY_FIRST;
  10979. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10980. FALL_THROUGH;
  10981. case FIRST_REPLY_FIRST :
  10982. #ifdef WOLFSSL_TLS13
  10983. if (ssl->options.tls1_3)
  10984. return wolfSSL_connect_TLSv13(ssl);
  10985. #endif
  10986. if (!ssl->options.resuming) {
  10987. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10988. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10989. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10990. #endif
  10991. #ifdef WOLFSSL_EXTRA_ALERTS
  10992. if (ssl->error == NO_PEER_KEY ||
  10993. ssl->error == PSK_KEY_ERROR) {
  10994. SendAlert(ssl, alert_fatal, handshake_failure);
  10995. }
  10996. #endif
  10997. WOLFSSL_ERROR(ssl->error);
  10998. return WOLFSSL_FATAL_ERROR;
  10999. }
  11000. WOLFSSL_MSG("sent: client key exchange");
  11001. }
  11002. ssl->options.connectState = FIRST_REPLY_SECOND;
  11003. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  11004. FALL_THROUGH;
  11005. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  11006. case FIRST_REPLY_SECOND :
  11007. /* CLIENT: Fail-safe for Server Authentication. */
  11008. if (!ssl->options.peerAuthGood) {
  11009. WOLFSSL_MSG("Server authentication did not happen");
  11010. ssl->error = NO_PEER_VERIFY;
  11011. return WOLFSSL_FATAL_ERROR;
  11012. }
  11013. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  11014. if (ssl->options.sendVerify) {
  11015. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  11016. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11017. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11018. #endif
  11019. WOLFSSL_ERROR(ssl->error);
  11020. return WOLFSSL_FATAL_ERROR;
  11021. }
  11022. WOLFSSL_MSG("sent: certificate verify");
  11023. }
  11024. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  11025. ssl->options.connectState = FIRST_REPLY_THIRD;
  11026. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  11027. FALL_THROUGH;
  11028. case FIRST_REPLY_THIRD :
  11029. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  11030. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11031. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11032. #endif
  11033. WOLFSSL_ERROR(ssl->error);
  11034. return WOLFSSL_FATAL_ERROR;
  11035. }
  11036. WOLFSSL_MSG("sent: change cipher spec");
  11037. ssl->options.connectState = FIRST_REPLY_FOURTH;
  11038. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  11039. FALL_THROUGH;
  11040. case FIRST_REPLY_FOURTH :
  11041. if ( (ssl->error = SendFinished(ssl)) != 0) {
  11042. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11043. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11044. #endif
  11045. WOLFSSL_ERROR(ssl->error);
  11046. return WOLFSSL_FATAL_ERROR;
  11047. }
  11048. WOLFSSL_MSG("sent: finished");
  11049. ssl->options.connectState = FINISHED_DONE;
  11050. WOLFSSL_MSG("connect state: FINISHED_DONE");
  11051. FALL_THROUGH;
  11052. #ifdef WOLFSSL_DTLS13
  11053. case WAIT_FINISHED_ACK:
  11054. ssl->options.connectState = FINISHED_DONE;
  11055. FALL_THROUGH;
  11056. #endif /* WOLFSSL_DTLS13 */
  11057. case FINISHED_DONE :
  11058. /* get response */
  11059. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  11060. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11061. WOLFSSL_ERROR(ssl->error);
  11062. return WOLFSSL_FATAL_ERROR;
  11063. }
  11064. ssl->options.connectState = SECOND_REPLY_DONE;
  11065. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  11066. FALL_THROUGH;
  11067. case SECOND_REPLY_DONE:
  11068. #ifndef NO_HANDSHAKE_DONE_CB
  11069. if (ssl->hsDoneCb) {
  11070. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11071. if (cbret < 0) {
  11072. ssl->error = cbret;
  11073. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11074. return WOLFSSL_FATAL_ERROR;
  11075. }
  11076. }
  11077. #endif /* NO_HANDSHAKE_DONE_CB */
  11078. if (!ssl->options.dtls) {
  11079. if (!ssl->options.keepResources) {
  11080. FreeHandshakeResources(ssl);
  11081. }
  11082. }
  11083. #ifdef WOLFSSL_DTLS
  11084. else {
  11085. ssl->options.dtlsHsRetain = 1;
  11086. }
  11087. #endif /* WOLFSSL_DTLS */
  11088. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11089. /* This may be necessary in async so that we don't try to
  11090. * renegotiate again */
  11091. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11092. ssl->secure_renegotiation->startScr = 0;
  11093. }
  11094. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11095. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11096. /* Free the remaining async context if not using it for crypto */
  11097. FreeAsyncCtx(ssl, 1);
  11098. #endif
  11099. ssl->error = 0; /* clear the error */
  11100. WOLFSSL_LEAVE("wolfSSL_connect", WOLFSSL_SUCCESS);
  11101. return WOLFSSL_SUCCESS;
  11102. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  11103. default:
  11104. WOLFSSL_MSG("Unknown connect state ERROR");
  11105. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  11106. }
  11107. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  11108. }
  11109. #endif /* NO_WOLFSSL_CLIENT */
  11110. /* server only parts */
  11111. #ifndef NO_WOLFSSL_SERVER
  11112. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  11113. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  11114. {
  11115. WOLFSSL_STUB("wolfSSLv2_server_method");
  11116. return 0;
  11117. }
  11118. #endif
  11119. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  11120. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  11121. {
  11122. return wolfSSLv3_server_method_ex(NULL);
  11123. }
  11124. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  11125. {
  11126. WOLFSSL_METHOD* method =
  11127. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  11128. heap, DYNAMIC_TYPE_METHOD);
  11129. (void)heap;
  11130. WOLFSSL_ENTER("wolfSSLv3_server_method_ex");
  11131. if (method) {
  11132. InitSSL_Method(method, MakeSSLv3());
  11133. method->side = WOLFSSL_SERVER_END;
  11134. }
  11135. return method;
  11136. }
  11137. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  11138. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  11139. {
  11140. return wolfSSLv23_server_method_ex(NULL);
  11141. }
  11142. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  11143. {
  11144. WOLFSSL_METHOD* method =
  11145. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  11146. heap, DYNAMIC_TYPE_METHOD);
  11147. (void)heap;
  11148. WOLFSSL_ENTER("wolfSSLv23_server_method_ex");
  11149. if (method) {
  11150. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  11151. #ifdef WOLFSSL_TLS13
  11152. InitSSL_Method(method, MakeTLSv1_3());
  11153. #elif !defined(WOLFSSL_NO_TLS12)
  11154. InitSSL_Method(method, MakeTLSv1_2());
  11155. #elif !defined(NO_OLD_TLS)
  11156. InitSSL_Method(method, MakeTLSv1_1());
  11157. #endif
  11158. #else
  11159. #ifndef NO_OLD_TLS
  11160. InitSSL_Method(method, MakeTLSv1_1());
  11161. #else
  11162. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  11163. #endif
  11164. #endif
  11165. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  11166. method->downgrade = 1;
  11167. #endif
  11168. method->side = WOLFSSL_SERVER_END;
  11169. }
  11170. return method;
  11171. }
  11172. WOLFSSL_ABI
  11173. int wolfSSL_accept(WOLFSSL* ssl)
  11174. {
  11175. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  11176. word16 havePSK = 0;
  11177. word16 haveAnon = 0;
  11178. word16 haveMcast = 0;
  11179. #endif
  11180. int ret = 0;
  11181. (void)ret;
  11182. if (ssl == NULL)
  11183. return WOLFSSL_FATAL_ERROR;
  11184. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  11185. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  11186. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  11187. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  11188. if (ssl->error != WOLFSSL_SUCCESS) {
  11189. WOLFSSL_ERROR(ssl->error);
  11190. return WOLFSSL_FATAL_ERROR;
  11191. }
  11192. ssl->error = 0; /* expected to be zero here */
  11193. }
  11194. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  11195. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  11196. return wolfSSL_accept_TLSv13(ssl);
  11197. #else
  11198. #ifdef WOLFSSL_TLS13
  11199. if (ssl->options.tls1_3)
  11200. return wolfSSL_accept_TLSv13(ssl);
  11201. #endif
  11202. WOLFSSL_ENTER("wolfSSL_accept");
  11203. /* make sure this wolfSSL object has arrays and rng setup. Protects
  11204. * case where the WOLFSSL object is reused via wolfSSL_clear() */
  11205. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  11206. return ret;
  11207. }
  11208. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  11209. if ((ssl->AcceptFilter != NULL) &&
  11210. ((ssl->options.acceptState == ACCEPT_BEGIN)
  11211. #ifdef HAVE_SECURE_RENEGOTIATION
  11212. || (ssl->options.acceptState == ACCEPT_BEGIN_RENEG)
  11213. #endif
  11214. ))
  11215. {
  11216. wolfSSL_netfilter_decision_t res;
  11217. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  11218. WOLFSSL_SUCCESS) &&
  11219. (res == WOLFSSL_NETFILTER_REJECT)) {
  11220. ssl->error = SOCKET_FILTERED_E;
  11221. WOLFSSL_ERROR(ssl->error);
  11222. return WOLFSSL_FATAL_ERROR;
  11223. }
  11224. }
  11225. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  11226. #ifdef HAVE_ERRNO_H
  11227. errno = 0;
  11228. #endif
  11229. #ifndef NO_PSK
  11230. havePSK = ssl->options.havePSK;
  11231. #endif
  11232. (void)havePSK;
  11233. #ifdef HAVE_ANON
  11234. haveAnon = ssl->options.useAnon;
  11235. #endif
  11236. (void)haveAnon;
  11237. #ifdef WOLFSSL_MULTICAST
  11238. haveMcast = ssl->options.haveMcast;
  11239. #endif
  11240. (void)haveMcast;
  11241. if (ssl->options.side != WOLFSSL_SERVER_END) {
  11242. ssl->error = SIDE_ERROR;
  11243. WOLFSSL_ERROR(ssl->error);
  11244. return WOLFSSL_FATAL_ERROR;
  11245. }
  11246. #ifndef NO_CERTS
  11247. /* in case used set_accept_state after init */
  11248. if (!havePSK && !haveAnon && !haveMcast) {
  11249. #ifdef OPENSSL_EXTRA
  11250. if (ssl->ctx->certSetupCb != NULL) {
  11251. WOLFSSL_MSG("CertSetupCb set. server cert and "
  11252. "key not checked");
  11253. }
  11254. else
  11255. #endif
  11256. {
  11257. if (!ssl->buffers.certificate ||
  11258. !ssl->buffers.certificate->buffer) {
  11259. WOLFSSL_MSG("accept error: server cert required");
  11260. ssl->error = NO_PRIVATE_KEY;
  11261. WOLFSSL_ERROR(ssl->error);
  11262. return WOLFSSL_FATAL_ERROR;
  11263. }
  11264. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  11265. /* allow no private key if using existing key */
  11266. #ifdef WOLF_PRIVATE_KEY_ID
  11267. if (ssl->devId != INVALID_DEVID
  11268. #ifdef HAVE_PK_CALLBACKS
  11269. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  11270. #endif
  11271. ) {
  11272. WOLFSSL_MSG("Allowing no server private key "
  11273. "(external)");
  11274. }
  11275. else
  11276. #endif
  11277. {
  11278. WOLFSSL_MSG("accept error: server key required");
  11279. ssl->error = NO_PRIVATE_KEY;
  11280. WOLFSSL_ERROR(ssl->error);
  11281. return WOLFSSL_FATAL_ERROR;
  11282. }
  11283. }
  11284. }
  11285. }
  11286. #endif
  11287. #ifdef WOLFSSL_DTLS
  11288. if (ssl->version.major == DTLS_MAJOR) {
  11289. ssl->options.dtls = 1;
  11290. ssl->options.tls = 1;
  11291. ssl->options.tls1_1 = 1;
  11292. if (!IsDtlsNotSctpMode(ssl) || !IsDtlsNotSrtpMode(ssl) ||
  11293. IsSCR(ssl))
  11294. ssl->options.dtlsStateful = 1;
  11295. }
  11296. #endif
  11297. if (ssl->buffers.outputBuffer.length > 0
  11298. #ifdef WOLFSSL_ASYNC_CRYPT
  11299. /* do not send buffered or advance state if last error was an
  11300. async pending operation */
  11301. && ssl->error != WC_PENDING_E
  11302. #endif
  11303. ) {
  11304. ret = SendBuffered(ssl);
  11305. if (ret == 0) {
  11306. /* fragOffset is non-zero when sending fragments. On the last
  11307. * fragment, fragOffset is zero again, and the state can be
  11308. * advanced. */
  11309. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  11310. if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE ||
  11311. ssl->options.acceptState == SERVER_HELLO_SENT ||
  11312. ssl->options.acceptState == CERT_SENT ||
  11313. ssl->options.acceptState == CERT_STATUS_SENT ||
  11314. ssl->options.acceptState == KEY_EXCHANGE_SENT ||
  11315. ssl->options.acceptState == CERT_REQ_SENT ||
  11316. ssl->options.acceptState == ACCEPT_SECOND_REPLY_DONE ||
  11317. ssl->options.acceptState == TICKET_SENT ||
  11318. ssl->options.acceptState == CHANGE_CIPHER_SENT) {
  11319. ssl->options.acceptState++;
  11320. WOLFSSL_MSG("accept state: "
  11321. "Advanced from last buffered fragment send");
  11322. #ifdef WOLFSSL_ASYNC_IO
  11323. /* Cleanup async */
  11324. FreeAsyncCtx(ssl, 0);
  11325. #endif
  11326. }
  11327. }
  11328. else {
  11329. WOLFSSL_MSG("accept state: "
  11330. "Not advanced, more fragments to send");
  11331. }
  11332. }
  11333. else {
  11334. ssl->error = ret;
  11335. WOLFSSL_ERROR(ssl->error);
  11336. return WOLFSSL_FATAL_ERROR;
  11337. }
  11338. #ifdef WOLFSSL_DTLS13
  11339. if (ssl->options.dtls)
  11340. ssl->dtls13SendingAckOrRtx = 0;
  11341. #endif /* WOLFSSL_DTLS13 */
  11342. }
  11343. ret = RetrySendAlert(ssl);
  11344. if (ret != 0) {
  11345. ssl->error = ret;
  11346. WOLFSSL_ERROR(ssl->error);
  11347. return WOLFSSL_FATAL_ERROR;
  11348. }
  11349. switch (ssl->options.acceptState) {
  11350. case ACCEPT_BEGIN :
  11351. #ifdef HAVE_SECURE_RENEGOTIATION
  11352. case ACCEPT_BEGIN_RENEG:
  11353. #endif
  11354. /* get response */
  11355. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  11356. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11357. WOLFSSL_ERROR(ssl->error);
  11358. return WOLFSSL_FATAL_ERROR;
  11359. }
  11360. #ifdef WOLFSSL_TLS13
  11361. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  11362. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  11363. FALL_THROUGH;
  11364. case ACCEPT_CLIENT_HELLO_DONE :
  11365. if (ssl->options.tls1_3) {
  11366. return wolfSSL_accept_TLSv13(ssl);
  11367. }
  11368. #endif
  11369. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  11370. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  11371. FALL_THROUGH;
  11372. case ACCEPT_FIRST_REPLY_DONE :
  11373. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  11374. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11375. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11376. #endif
  11377. WOLFSSL_ERROR(ssl->error);
  11378. return WOLFSSL_FATAL_ERROR;
  11379. }
  11380. ssl->options.acceptState = SERVER_HELLO_SENT;
  11381. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  11382. FALL_THROUGH;
  11383. case SERVER_HELLO_SENT :
  11384. #ifdef WOLFSSL_TLS13
  11385. if (ssl->options.tls1_3) {
  11386. return wolfSSL_accept_TLSv13(ssl);
  11387. }
  11388. #endif
  11389. #ifndef NO_CERTS
  11390. if (!ssl->options.resuming)
  11391. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  11392. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11393. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11394. #endif
  11395. WOLFSSL_ERROR(ssl->error);
  11396. return WOLFSSL_FATAL_ERROR;
  11397. }
  11398. #endif
  11399. ssl->options.acceptState = CERT_SENT;
  11400. WOLFSSL_MSG("accept state CERT_SENT");
  11401. FALL_THROUGH;
  11402. case CERT_SENT :
  11403. #ifndef NO_CERTS
  11404. if (!ssl->options.resuming)
  11405. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  11406. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11407. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11408. #endif
  11409. WOLFSSL_ERROR(ssl->error);
  11410. return WOLFSSL_FATAL_ERROR;
  11411. }
  11412. #endif
  11413. ssl->options.acceptState = CERT_STATUS_SENT;
  11414. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  11415. FALL_THROUGH;
  11416. case CERT_STATUS_SENT :
  11417. #ifdef WOLFSSL_TLS13
  11418. if (ssl->options.tls1_3) {
  11419. return wolfSSL_accept_TLSv13(ssl);
  11420. }
  11421. #endif
  11422. if (!ssl->options.resuming)
  11423. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  11424. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11425. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11426. #endif
  11427. WOLFSSL_ERROR(ssl->error);
  11428. return WOLFSSL_FATAL_ERROR;
  11429. }
  11430. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  11431. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  11432. FALL_THROUGH;
  11433. case KEY_EXCHANGE_SENT :
  11434. #ifndef NO_CERTS
  11435. if (!ssl->options.resuming) {
  11436. if (ssl->options.verifyPeer) {
  11437. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  11438. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11439. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11440. #endif
  11441. WOLFSSL_ERROR(ssl->error);
  11442. return WOLFSSL_FATAL_ERROR;
  11443. }
  11444. }
  11445. else {
  11446. /* SERVER: Peer auth good if not verifying client. */
  11447. ssl->options.peerAuthGood = 1;
  11448. }
  11449. }
  11450. #endif
  11451. ssl->options.acceptState = CERT_REQ_SENT;
  11452. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  11453. FALL_THROUGH;
  11454. case CERT_REQ_SENT :
  11455. if (!ssl->options.resuming)
  11456. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  11457. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11458. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11459. #endif
  11460. WOLFSSL_ERROR(ssl->error);
  11461. return WOLFSSL_FATAL_ERROR;
  11462. }
  11463. ssl->options.acceptState = SERVER_HELLO_DONE;
  11464. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  11465. FALL_THROUGH;
  11466. case SERVER_HELLO_DONE :
  11467. if (!ssl->options.resuming) {
  11468. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  11469. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11470. WOLFSSL_ERROR(ssl->error);
  11471. return WOLFSSL_FATAL_ERROR;
  11472. }
  11473. }
  11474. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  11475. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  11476. FALL_THROUGH;
  11477. case ACCEPT_SECOND_REPLY_DONE :
  11478. #ifndef NO_CERTS
  11479. /* SERVER: When not resuming and verifying peer but no certificate
  11480. * received and not failing when not received then peer auth good.
  11481. */
  11482. if (!ssl->options.resuming && ssl->options.verifyPeer &&
  11483. !ssl->options.havePeerCert && !ssl->options.failNoCert) {
  11484. ssl->options.peerAuthGood = 1;
  11485. }
  11486. #endif /* !NO_CERTS */
  11487. #ifdef WOLFSSL_NO_CLIENT_AUTH
  11488. if (!ssl->options.resuming) {
  11489. ssl->options.peerAuthGood = 1;
  11490. }
  11491. #endif
  11492. #ifdef HAVE_SESSION_TICKET
  11493. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  11494. if ( (ssl->error = SendTicket(ssl)) != 0) {
  11495. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11496. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11497. #endif
  11498. WOLFSSL_MSG("Thought we need ticket but failed");
  11499. WOLFSSL_ERROR(ssl->error);
  11500. return WOLFSSL_FATAL_ERROR;
  11501. }
  11502. }
  11503. #endif /* HAVE_SESSION_TICKET */
  11504. ssl->options.acceptState = TICKET_SENT;
  11505. WOLFSSL_MSG("accept state TICKET_SENT");
  11506. FALL_THROUGH;
  11507. case TICKET_SENT:
  11508. /* SERVER: Fail-safe for CLient Authentication. */
  11509. if (!ssl->options.peerAuthGood) {
  11510. WOLFSSL_MSG("Client authentication did not happen");
  11511. return WOLFSSL_FATAL_ERROR;
  11512. }
  11513. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  11514. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11515. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11516. #endif
  11517. WOLFSSL_ERROR(ssl->error);
  11518. return WOLFSSL_FATAL_ERROR;
  11519. }
  11520. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  11521. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  11522. FALL_THROUGH;
  11523. case CHANGE_CIPHER_SENT :
  11524. if ( (ssl->error = SendFinished(ssl)) != 0) {
  11525. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11526. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11527. #endif
  11528. WOLFSSL_ERROR(ssl->error);
  11529. return WOLFSSL_FATAL_ERROR;
  11530. }
  11531. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  11532. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  11533. FALL_THROUGH;
  11534. case ACCEPT_FINISHED_DONE :
  11535. if (ssl->options.resuming) {
  11536. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  11537. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11538. WOLFSSL_ERROR(ssl->error);
  11539. return WOLFSSL_FATAL_ERROR;
  11540. }
  11541. }
  11542. }
  11543. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  11544. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  11545. FALL_THROUGH;
  11546. case ACCEPT_THIRD_REPLY_DONE :
  11547. #ifndef NO_HANDSHAKE_DONE_CB
  11548. if (ssl->hsDoneCb) {
  11549. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11550. if (cbret < 0) {
  11551. ssl->error = cbret;
  11552. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11553. return WOLFSSL_FATAL_ERROR;
  11554. }
  11555. }
  11556. #endif /* NO_HANDSHAKE_DONE_CB */
  11557. if (!ssl->options.dtls) {
  11558. if (!ssl->options.keepResources) {
  11559. FreeHandshakeResources(ssl);
  11560. }
  11561. }
  11562. #ifdef WOLFSSL_DTLS
  11563. else {
  11564. ssl->options.dtlsHsRetain = 1;
  11565. }
  11566. #endif /* WOLFSSL_DTLS */
  11567. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11568. /* This may be necessary in async so that we don't try to
  11569. * renegotiate again */
  11570. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11571. ssl->secure_renegotiation->startScr = 0;
  11572. }
  11573. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11574. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11575. /* Free the remaining async context if not using it for crypto */
  11576. FreeAsyncCtx(ssl, 1);
  11577. #endif
  11578. #if defined(WOLFSSL_SESSION_EXPORT) && defined(WOLFSSL_DTLS)
  11579. if (ssl->dtls_export) {
  11580. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  11581. WOLFSSL_MSG("Export DTLS session error");
  11582. WOLFSSL_ERROR(ssl->error);
  11583. return WOLFSSL_FATAL_ERROR;
  11584. }
  11585. }
  11586. #endif
  11587. ssl->error = 0; /* clear the error */
  11588. WOLFSSL_LEAVE("wolfSSL_accept", WOLFSSL_SUCCESS);
  11589. return WOLFSSL_SUCCESS;
  11590. default :
  11591. WOLFSSL_MSG("Unknown accept state ERROR");
  11592. return WOLFSSL_FATAL_ERROR;
  11593. }
  11594. #endif /* !WOLFSSL_NO_TLS12 */
  11595. }
  11596. #endif /* NO_WOLFSSL_SERVER */
  11597. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  11598. int wolfDTLS_SetChGoodCb(WOLFSSL* ssl, ClientHelloGoodCb cb, void* user_ctx)
  11599. {
  11600. WOLFSSL_ENTER("wolfDTLS_SetChGoodCb");
  11601. if (ssl == NULL)
  11602. return BAD_FUNC_ARG;
  11603. ssl->chGoodCb = cb;
  11604. ssl->chGoodCtx = user_ctx;
  11605. return WOLFSSL_SUCCESS;
  11606. }
  11607. #endif
  11608. #ifndef NO_HANDSHAKE_DONE_CB
  11609. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  11610. {
  11611. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  11612. if (ssl == NULL)
  11613. return BAD_FUNC_ARG;
  11614. ssl->hsDoneCb = cb;
  11615. ssl->hsDoneCtx = user_ctx;
  11616. return WOLFSSL_SUCCESS;
  11617. }
  11618. #endif /* NO_HANDSHAKE_DONE_CB */
  11619. WOLFSSL_ABI
  11620. int wolfSSL_Cleanup(void)
  11621. {
  11622. int ret = WOLFSSL_SUCCESS; /* Only the first error will be returned */
  11623. int release = 0;
  11624. #if !defined(NO_SESSION_CACHE)
  11625. int i;
  11626. int j;
  11627. #endif
  11628. WOLFSSL_ENTER("wolfSSL_Cleanup");
  11629. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11630. if (inits_count_mutex_valid == 1) {
  11631. #endif
  11632. if (wc_LockMutex(&inits_count_mutex) != 0) {
  11633. WOLFSSL_MSG("Bad Lock Mutex count");
  11634. return BAD_MUTEX_E;
  11635. }
  11636. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11637. }
  11638. #endif
  11639. if (initRefCount > 0) {
  11640. --initRefCount;
  11641. if (initRefCount == 0)
  11642. release = 1;
  11643. }
  11644. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11645. if (inits_count_mutex_valid == 1) {
  11646. #endif
  11647. wc_UnLockMutex(&inits_count_mutex);
  11648. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11649. }
  11650. #endif
  11651. if (!release)
  11652. return ret;
  11653. #ifdef OPENSSL_EXTRA
  11654. wolfSSL_BN_free_one();
  11655. #endif
  11656. #ifndef NO_SESSION_CACHE
  11657. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  11658. for (i = 0; i < SESSION_ROWS; ++i) {
  11659. if ((SessionCache[i].lock_valid == 1) &&
  11660. (wc_FreeRwLock(&SessionCache[i].row_lock) != 0)) {
  11661. if (ret == WOLFSSL_SUCCESS)
  11662. ret = BAD_MUTEX_E;
  11663. }
  11664. SessionCache[i].lock_valid = 0;
  11665. }
  11666. #else
  11667. if ((session_lock_valid == 1) && (wc_FreeRwLock(&session_lock) != 0)) {
  11668. if (ret == WOLFSSL_SUCCESS)
  11669. ret = BAD_MUTEX_E;
  11670. }
  11671. session_lock_valid = 0;
  11672. #endif
  11673. for (i = 0; i < SESSION_ROWS; i++) {
  11674. for (j = 0; j < SESSIONS_PER_ROW; j++) {
  11675. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11676. if (SessionCache[i].Sessions[j]) {
  11677. EvictSessionFromCache(SessionCache[i].Sessions[j]);
  11678. XFREE(SessionCache[i].Sessions[j], SessionCache[i].heap,
  11679. DYNAMIC_TYPE_SESSION);
  11680. SessionCache[i].Sessions[j] = NULL;
  11681. }
  11682. #else
  11683. EvictSessionFromCache(&SessionCache[i].Sessions[j]);
  11684. #endif
  11685. }
  11686. }
  11687. #ifndef NO_CLIENT_CACHE
  11688. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11689. if ((clisession_mutex_valid == 1) &&
  11690. (wc_FreeMutex(&clisession_mutex) != 0)) {
  11691. if (ret == WOLFSSL_SUCCESS)
  11692. ret = BAD_MUTEX_E;
  11693. }
  11694. clisession_mutex_valid = 0;
  11695. #endif
  11696. #endif
  11697. #endif /* !NO_SESSION_CACHE */
  11698. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11699. if ((inits_count_mutex_valid == 1) && (wc_FreeMutex(&inits_count_mutex) != 0)) {
  11700. if (ret == WOLFSSL_SUCCESS)
  11701. ret = BAD_MUTEX_E;
  11702. }
  11703. inits_count_mutex_valid = 0;
  11704. #endif
  11705. #ifdef OPENSSL_EXTRA
  11706. wolfSSL_RAND_Cleanup();
  11707. #endif
  11708. if (wolfCrypt_Cleanup() != 0) {
  11709. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11710. if (ret == WOLFSSL_SUCCESS)
  11711. ret = WC_CLEANUP_E;
  11712. }
  11713. #if FIPS_VERSION_GE(5,1)
  11714. if (wolfCrypt_SetPrivateKeyReadEnable_fips(0, WC_KEYTYPE_ALL) < 0) {
  11715. if (ret == WOLFSSL_SUCCESS)
  11716. ret = WC_CLEANUP_E;
  11717. }
  11718. #endif
  11719. #ifdef HAVE_GLOBAL_RNG
  11720. #ifndef WOLFSSL_MUTEX_INITIALIZER
  11721. if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) {
  11722. if (ret == WOLFSSL_SUCCESS)
  11723. ret = BAD_MUTEX_E;
  11724. }
  11725. globalRNGMutex_valid = 0;
  11726. #endif /* !WOLFSSL_MUTEX_INITIALIZER */
  11727. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  11728. wolfSSL_FIPS_drbg_free(gDrbgDefCtx);
  11729. gDrbgDefCtx = NULL;
  11730. #endif
  11731. #endif
  11732. #if defined(HAVE_EX_DATA) && \
  11733. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  11734. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  11735. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  11736. defined(WOLFSSL_WPAS_SMALL)
  11737. crypto_ex_cb_free(crypto_ex_cb_ctx_session);
  11738. crypto_ex_cb_ctx_session = NULL;
  11739. #endif
  11740. #ifdef WOLFSSL_MEM_FAIL_COUNT
  11741. wc_MemFailCount_Free();
  11742. #endif
  11743. return ret;
  11744. }
  11745. void SetupSession(WOLFSSL* ssl)
  11746. {
  11747. WOLFSSL_SESSION* session = ssl->session;
  11748. WOLFSSL_ENTER("SetupSession");
  11749. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  11750. /* Make sure the session ID is available when the user calls any
  11751. * get_session API */
  11752. if (!session->haveAltSessionID) {
  11753. XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN);
  11754. session->sessionIDSz = ssl->arrays->sessionIDSz;
  11755. }
  11756. else {
  11757. XMEMCPY(session->sessionID, session->altSessionID, ID_LEN);
  11758. session->sessionIDSz = ID_LEN;
  11759. }
  11760. }
  11761. session->side = (byte)ssl->options.side;
  11762. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  11763. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  11764. session->haveEMS = ssl->options.haveEMS;
  11765. #ifdef WOLFSSL_SESSION_ID_CTX
  11766. /* If using compatibility layer then check for and copy over session context
  11767. * id. */
  11768. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  11769. XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  11770. session->sessionCtxSz = ssl->sessionCtxSz;
  11771. }
  11772. #endif
  11773. session->timeout = ssl->timeout;
  11774. #ifndef NO_ASN_TIME
  11775. session->bornOn = LowResTimer();
  11776. #endif
  11777. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11778. defined(HAVE_SESSION_TICKET))
  11779. session->version = ssl->version;
  11780. #endif
  11781. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11782. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11783. session->cipherSuite0 = ssl->options.cipherSuite0;
  11784. session->cipherSuite = ssl->options.cipherSuite;
  11785. #endif
  11786. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11787. session->peerVerifyRet = (byte)ssl->peerVerifyRet;
  11788. #endif
  11789. session->isSetup = 1;
  11790. }
  11791. #ifndef NO_SESSION_CACHE
  11792. WOLFSSL_ABI
  11793. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11794. {
  11795. /* static table now, no flushing needed */
  11796. (void)ctx;
  11797. (void)tm;
  11798. }
  11799. void wolfSSL_CTX_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11800. {
  11801. int i, j;
  11802. byte id[ID_LEN];
  11803. (void)ctx;
  11804. XMEMSET(id, 0, ID_LEN);
  11805. WOLFSSL_ENTER("wolfSSL_flush_sessions");
  11806. for (i = 0; i < SESSION_ROWS; ++i) {
  11807. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  11808. WOLFSSL_MSG("Session cache mutex lock failed");
  11809. return;
  11810. }
  11811. for (j = 0; j < SESSIONS_PER_ROW; j++) {
  11812. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11813. WOLFSSL_SESSION* s = SessionCache[i].Sessions[j];
  11814. #else
  11815. WOLFSSL_SESSION* s = &SessionCache[i].Sessions[j];
  11816. #endif
  11817. if (
  11818. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11819. s != NULL &&
  11820. #endif
  11821. XMEMCMP(s->sessionID, id, ID_LEN) != 0 &&
  11822. s->bornOn + s->timeout < (word32)tm
  11823. )
  11824. {
  11825. EvictSessionFromCache(s);
  11826. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11827. XFREE(s, s->heap, DYNAMIC_TYPE_SESSION);
  11828. SessionCache[i].Sessions[j] = NULL;
  11829. #endif
  11830. }
  11831. }
  11832. SESSION_ROW_UNLOCK(&SessionCache[i]);
  11833. }
  11834. }
  11835. /* set ssl session timeout in seconds */
  11836. WOLFSSL_ABI
  11837. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11838. {
  11839. if (ssl == NULL)
  11840. return BAD_FUNC_ARG;
  11841. if (to == 0)
  11842. to = WOLFSSL_SESSION_TIMEOUT;
  11843. ssl->timeout = to;
  11844. return WOLFSSL_SUCCESS;
  11845. }
  11846. /**
  11847. * Sets ctx session timeout in seconds.
  11848. * The timeout value set here should be reflected in the
  11849. * "session ticket lifetime hint" if this API works in the openssl compat-layer.
  11850. * Therefore wolfSSL_CTX_set_TicketHint is called internally.
  11851. * Arguments:
  11852. * - ctx WOLFSSL_CTX object which the timeout is set to
  11853. * - to timeout value in second
  11854. * Returns:
  11855. * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure.
  11856. * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value
  11857. * on success, BAD_FUNC_ARG on failure.
  11858. */
  11859. WOLFSSL_ABI
  11860. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11861. {
  11862. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11863. word32 prev_timeout = 0;
  11864. #endif
  11865. int ret = WOLFSSL_SUCCESS;
  11866. (void)ret;
  11867. if (ctx == NULL)
  11868. ret = BAD_FUNC_ARG;
  11869. if (ret == WOLFSSL_SUCCESS) {
  11870. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11871. prev_timeout = ctx->timeout;
  11872. #endif
  11873. if (to == 0) {
  11874. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  11875. }
  11876. else {
  11877. ctx->timeout = to;
  11878. }
  11879. }
  11880. #if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \
  11881. !defined(NO_WOLFSSL_SERVER)
  11882. if (ret == WOLFSSL_SUCCESS) {
  11883. if (to == 0) {
  11884. ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT);
  11885. }
  11886. else {
  11887. ret = wolfSSL_CTX_set_TicketHint(ctx, to);
  11888. }
  11889. }
  11890. #endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */
  11891. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11892. if (ret == WOLFSSL_SUCCESS) {
  11893. return prev_timeout;
  11894. }
  11895. else {
  11896. return ret;
  11897. }
  11898. #else
  11899. return ret;
  11900. #endif /* WOLFSSL_ERROR_CODE_OPENSSL */
  11901. }
  11902. #ifndef NO_CLIENT_CACHE
  11903. /* Get Session from Client cache based on id/len, return NULL on failure */
  11904. WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11905. {
  11906. WOLFSSL_SESSION* ret = NULL;
  11907. word32 row;
  11908. int idx;
  11909. int count;
  11910. int error = 0;
  11911. ClientSession* clSess;
  11912. WOLFSSL_ENTER("wolfSSL_GetSessionClient");
  11913. if (ssl->ctx->sessionCacheOff) {
  11914. WOLFSSL_MSG("Session Cache off");
  11915. return NULL;
  11916. }
  11917. if (ssl->options.side == WOLFSSL_SERVER_END)
  11918. return NULL;
  11919. len = min(SERVER_ID_LEN, (word32)len);
  11920. /* Do not access ssl->ctx->get_sess_cb from here. It is using a different
  11921. * set of ID's */
  11922. row = HashObject(id, len, &error) % CLIENT_SESSION_ROWS;
  11923. if (error != 0) {
  11924. WOLFSSL_MSG("Hash session failed");
  11925. return NULL;
  11926. }
  11927. if (wc_LockMutex(&clisession_mutex) != 0) {
  11928. WOLFSSL_MSG("Client cache mutex lock failed");
  11929. return NULL;
  11930. }
  11931. /* start from most recently used */
  11932. count = min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW);
  11933. idx = ClientCache[row].nextIdx - 1;
  11934. if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) {
  11935. idx = CLIENT_SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11936. }
  11937. clSess = ClientCache[row].Clients;
  11938. for (; count > 0; --count) {
  11939. WOLFSSL_SESSION* current;
  11940. SessionRow* sessRow;
  11941. if (clSess[idx].serverRow >= SESSION_ROWS) {
  11942. WOLFSSL_MSG("Client cache serverRow invalid");
  11943. break;
  11944. }
  11945. /* lock row */
  11946. sessRow = &SessionCache[clSess[idx].serverRow];
  11947. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  11948. WOLFSSL_MSG("Session cache row lock failure");
  11949. break;
  11950. }
  11951. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11952. current = sessRow->Sessions[clSess[idx].serverIdx];
  11953. #else
  11954. current = &sessRow->Sessions[clSess[idx].serverIdx];
  11955. #endif
  11956. if (current && XMEMCMP(current->serverID, id, len) == 0) {
  11957. WOLFSSL_MSG("Found a serverid match for client");
  11958. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11959. WOLFSSL_MSG("Session valid");
  11960. ret = current;
  11961. SESSION_ROW_UNLOCK(sessRow);
  11962. break;
  11963. } else {
  11964. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11965. }
  11966. } else {
  11967. WOLFSSL_MSG("ServerID not a match from client table");
  11968. }
  11969. SESSION_ROW_UNLOCK(sessRow);
  11970. idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1;
  11971. }
  11972. wc_UnLockMutex(&clisession_mutex);
  11973. return ret;
  11974. }
  11975. #endif /* !NO_CLIENT_CACHE */
  11976. static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session)
  11977. {
  11978. (void)session;
  11979. return ssl->options.sessionCacheOff
  11980. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET)
  11981. && session->ticketLen == 0
  11982. #endif
  11983. ;
  11984. }
  11985. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  11986. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11987. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11988. /**
  11989. * SessionTicketNoncePrealloc() - prealloc a buffer for ticket nonces
  11990. * @output: [in] pointer to WOLFSSL_SESSION object that will soon be a
  11991. * destination of a session duplication
  11992. * @buf: [out] address of the preallocated buf
  11993. * @len: [out] len of the preallocated buf
  11994. *
  11995. * prealloc a buffer that will likely suffice to contain a ticket nonce. It's
  11996. * used when copying session under lock, when syscalls need to be avoided. If
  11997. * output already has a dynamic buffer, it's reused.
  11998. */
  11999. static int SessionTicketNoncePrealloc(byte** buf, byte* len, void *heap)
  12000. {
  12001. (void)heap;
  12002. *buf = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_NONCE_LEN, heap,
  12003. DYNAMIC_TYPE_SESSION_TICK);
  12004. if (*buf == NULL) {
  12005. WOLFSSL_MSG("Failed to preallocate ticket nonce buffer");
  12006. *len = 0;
  12007. return 1;
  12008. }
  12009. *len = PREALLOC_SESSION_TICKET_NONCE_LEN;
  12010. return 0;
  12011. }
  12012. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
  12013. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  12014. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  12015. byte* ticketNonceLen, byte* preallocUsed);
  12016. void TlsSessionCacheUnlockRow(word32 row)
  12017. {
  12018. SessionRow* sessRow;
  12019. sessRow = &SessionCache[row];
  12020. (void)sessRow;
  12021. SESSION_ROW_UNLOCK(sessRow);
  12022. }
  12023. /* Don't use this function directly. Use TlsSessionCacheGetAndRdLock and
  12024. * TlsSessionCacheGetAndWrLock to fully utilize compiler const support. */
  12025. static int TlsSessionCacheGetAndLock(const byte *id,
  12026. const WOLFSSL_SESSION **sess, word32 *lockedRow, byte readOnly, byte side)
  12027. {
  12028. SessionRow *sessRow;
  12029. const WOLFSSL_SESSION *s;
  12030. word32 row;
  12031. int count;
  12032. int error;
  12033. int idx;
  12034. *sess = NULL;
  12035. row = HashObject(id, ID_LEN, &error) % SESSION_ROWS;
  12036. if (error != 0)
  12037. return error;
  12038. sessRow = &SessionCache[row];
  12039. if (readOnly)
  12040. error = SESSION_ROW_RD_LOCK(sessRow);
  12041. else
  12042. error = SESSION_ROW_WR_LOCK(sessRow);
  12043. if (error != 0)
  12044. return FATAL_ERROR;
  12045. /* start from most recently used */
  12046. count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW);
  12047. idx = sessRow->nextIdx - 1;
  12048. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  12049. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  12050. }
  12051. for (; count > 0; --count) {
  12052. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12053. s = sessRow->Sessions[idx];
  12054. #else
  12055. s = &sessRow->Sessions[idx];
  12056. #endif
  12057. if (s && XMEMCMP(s->sessionID, id, ID_LEN) == 0 && s->side == side) {
  12058. *sess = s;
  12059. break;
  12060. }
  12061. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  12062. }
  12063. if (*sess == NULL) {
  12064. SESSION_ROW_UNLOCK(sessRow);
  12065. }
  12066. else {
  12067. *lockedRow = row;
  12068. }
  12069. return 0;
  12070. }
  12071. static int CheckSessionMatch(const WOLFSSL* ssl, const WOLFSSL_SESSION* sess)
  12072. {
  12073. if (ssl == NULL || sess == NULL)
  12074. return 0;
  12075. #ifdef OPENSSL_EXTRA
  12076. if (ssl->sessionCtxSz > 0 && (ssl->sessionCtxSz != sess->sessionCtxSz ||
  12077. XMEMCMP(ssl->sessionCtx, sess->sessionCtx, sess->sessionCtxSz) != 0))
  12078. return 0;
  12079. #endif
  12080. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  12081. if (IsAtLeastTLSv1_3(ssl->version) != IsAtLeastTLSv1_3(sess->version))
  12082. return 0;
  12083. #endif
  12084. return 1;
  12085. }
  12086. int TlsSessionCacheGetAndRdLock(const byte *id, const WOLFSSL_SESSION **sess,
  12087. word32 *lockedRow, byte side)
  12088. {
  12089. return TlsSessionCacheGetAndLock(id, sess, lockedRow, 1, side);
  12090. }
  12091. int TlsSessionCacheGetAndWrLock(const byte *id, WOLFSSL_SESSION **sess,
  12092. word32 *lockedRow, byte side)
  12093. {
  12094. return TlsSessionCacheGetAndLock(id, (const WOLFSSL_SESSION**)sess,
  12095. lockedRow, 0, side);
  12096. }
  12097. int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
  12098. {
  12099. const WOLFSSL_SESSION* sess = NULL;
  12100. const byte* id = NULL;
  12101. word32 row;
  12102. int error = 0;
  12103. #ifdef HAVE_SESSION_TICKET
  12104. #ifndef WOLFSSL_SMALL_STACK
  12105. byte tmpTicket[PREALLOC_SESSION_TICKET_LEN];
  12106. #else
  12107. byte* tmpTicket = NULL;
  12108. #endif
  12109. #ifdef WOLFSSL_TLS13
  12110. byte *preallocNonce = NULL;
  12111. byte preallocNonceLen = 0;
  12112. byte preallocNonceUsed = 0;
  12113. #endif /* WOLFSSL_TLS13 */
  12114. byte tmpBufSet = 0;
  12115. #endif
  12116. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12117. WOLFSSL_X509* peer = NULL;
  12118. #endif
  12119. byte bogusID[ID_LEN];
  12120. byte bogusIDSz = 0;
  12121. WOLFSSL_ENTER("wolfSSL_GetSessionFromCache");
  12122. if (output == NULL) {
  12123. WOLFSSL_MSG("NULL output");
  12124. return WOLFSSL_FAILURE;
  12125. }
  12126. if (SslSessionCacheOff(ssl, ssl->session))
  12127. return WOLFSSL_FAILURE;
  12128. if (ssl->options.haveSessionId == 0 && !ssl->session->haveAltSessionID)
  12129. return WOLFSSL_FAILURE;
  12130. #ifdef HAVE_SESSION_TICKET
  12131. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  12132. return WOLFSSL_FAILURE;
  12133. #endif
  12134. XMEMSET(bogusID, 0, sizeof(bogusID));
  12135. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL
  12136. && !ssl->session->haveAltSessionID)
  12137. id = ssl->arrays->sessionID;
  12138. else if (ssl->session->haveAltSessionID) {
  12139. id = ssl->session->altSessionID;
  12140. /* We want to restore the bogus ID for TLS compatibility */
  12141. if (output == ssl->session) {
  12142. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  12143. bogusIDSz = ssl->session->sessionIDSz;
  12144. }
  12145. }
  12146. else
  12147. id = ssl->session->sessionID;
  12148. #ifdef HAVE_EXT_CACHE
  12149. if (ssl->ctx->get_sess_cb != NULL) {
  12150. int copy = 0;
  12151. int found = 0;
  12152. WOLFSSL_SESSION* extSess;
  12153. /* Attempt to retrieve the session from the external cache. */
  12154. WOLFSSL_MSG("Calling external session cache");
  12155. extSess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  12156. if ((extSess != NULL)
  12157. && CheckSessionMatch(ssl, extSess)
  12158. ) {
  12159. WOLFSSL_MSG("Session found in external cache");
  12160. found = 1;
  12161. error = wolfSSL_DupSession(extSess, output, 0);
  12162. #ifdef HAVE_EX_DATA
  12163. extSess->ownExData = 1;
  12164. output->ownExData = 0;
  12165. #endif
  12166. /* We want to restore the bogus ID for TLS compatibility */
  12167. if (ssl->session->haveAltSessionID &&
  12168. output == ssl->session) {
  12169. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  12170. ssl->session->sessionIDSz = bogusIDSz;
  12171. }
  12172. }
  12173. /* If copy not set then free immediately */
  12174. if (extSess != NULL && !copy)
  12175. wolfSSL_FreeSession(ssl->ctx, extSess);
  12176. if (found)
  12177. return error;
  12178. WOLFSSL_MSG("Session not found in external cache");
  12179. }
  12180. if (ssl->options.internalCacheLookupOff) {
  12181. WOLFSSL_MSG("Internal cache lookup turned off");
  12182. return WOLFSSL_FAILURE;
  12183. }
  12184. #endif
  12185. #ifdef HAVE_SESSION_TICKET
  12186. if (output->ticket == NULL ||
  12187. output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) {
  12188. #ifdef WOLFSSL_SMALL_STACK
  12189. tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap,
  12190. DYNAMIC_TYPE_TMP_BUFFER);
  12191. if (tmpTicket == NULL) {
  12192. WOLFSSL_MSG("tmpTicket malloc failed");
  12193. return WOLFSSL_FAILURE;
  12194. }
  12195. #endif
  12196. if (output->ticketLenAlloc)
  12197. XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12198. output->ticket = tmpTicket; /* cppcheck-suppress autoVariables
  12199. */
  12200. output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN;
  12201. output->ticketLen = 0;
  12202. tmpBufSet = 1;
  12203. }
  12204. #endif
  12205. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12206. if (output->peer != NULL) {
  12207. wolfSSL_X509_free(output->peer);
  12208. output->peer = NULL;
  12209. }
  12210. #endif
  12211. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \
  12212. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12213. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12214. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  12215. XFREE(output->ticketNonce.data, output->heap,
  12216. DYNAMIC_TYPE_SESSION_TICK);
  12217. output->ticketNonce.data = output->ticketNonce.dataStatic;
  12218. output->ticketNonce.len = 0;
  12219. }
  12220. error = SessionTicketNoncePrealloc(&preallocNonce, &preallocNonceLen,
  12221. output->heap);
  12222. if (error != 0) {
  12223. if (tmpBufSet) {
  12224. output->ticket = output->staticTicket;
  12225. output->ticketLenAlloc = 0;
  12226. }
  12227. #ifdef WOLFSSL_SMALL_STACK
  12228. if (tmpTicket != NULL)
  12229. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12230. #endif
  12231. return WOLFSSL_FAILURE;
  12232. }
  12233. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET*/
  12234. /* init to avoid clang static analyzer false positive */
  12235. row = 0;
  12236. error = TlsSessionCacheGetAndRdLock(id, &sess, &row, (byte)ssl->options.side);
  12237. error = (error == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  12238. if (error != WOLFSSL_SUCCESS || sess == NULL) {
  12239. WOLFSSL_MSG("Get Session from cache failed");
  12240. error = WOLFSSL_FAILURE;
  12241. #ifdef HAVE_SESSION_TICKET
  12242. if (tmpBufSet) {
  12243. output->ticket = output->staticTicket;
  12244. output->ticketLenAlloc = 0;
  12245. }
  12246. #ifdef WOLFSSL_TLS13
  12247. if (preallocNonce != NULL) {
  12248. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12249. preallocNonce = NULL;
  12250. }
  12251. #endif /* WOLFSSL_TLS13 */
  12252. #ifdef WOLFSSL_SMALL_STACK
  12253. if (tmpTicket != NULL) {
  12254. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12255. tmpTicket = NULL;
  12256. }
  12257. #endif
  12258. #endif
  12259. }
  12260. else {
  12261. if (!CheckSessionMatch(ssl, sess)) {
  12262. WOLFSSL_MSG("Invalid session: can't be used in this context");
  12263. TlsSessionCacheUnlockRow(row);
  12264. error = WOLFSSL_FAILURE;
  12265. }
  12266. else if (LowResTimer() >= (sess->bornOn + sess->timeout)) {
  12267. WOLFSSL_SESSION* wrSess = NULL;
  12268. WOLFSSL_MSG("Invalid session: timed out");
  12269. sess = NULL;
  12270. TlsSessionCacheUnlockRow(row);
  12271. /* Attempt to get a write lock */
  12272. error = TlsSessionCacheGetAndWrLock(id, &wrSess, &row,
  12273. (byte)ssl->options.side);
  12274. if (error == 0 && wrSess != NULL) {
  12275. EvictSessionFromCache(wrSess);
  12276. TlsSessionCacheUnlockRow(row);
  12277. }
  12278. error = WOLFSSL_FAILURE;
  12279. }
  12280. }
  12281. /* mollify confused cppcheck nullPointer warning. */
  12282. if (sess == NULL)
  12283. error = WOLFSSL_FAILURE;
  12284. if (error == WOLFSSL_SUCCESS) {
  12285. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13)
  12286. error = wolfSSL_DupSessionEx(sess, output, 1,
  12287. preallocNonce, &preallocNonceLen, &preallocNonceUsed);
  12288. #else
  12289. error = wolfSSL_DupSession(sess, output, 1);
  12290. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
  12291. #ifdef HAVE_EX_DATA
  12292. output->ownExData = !sess->ownExData; /* Session may own ex_data */
  12293. #endif
  12294. TlsSessionCacheUnlockRow(row);
  12295. }
  12296. /* We want to restore the bogus ID for TLS compatibility */
  12297. if (ssl->session->haveAltSessionID &&
  12298. output == ssl->session) {
  12299. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  12300. ssl->session->sessionIDSz = bogusIDSz;
  12301. }
  12302. #ifdef HAVE_SESSION_TICKET
  12303. if (tmpBufSet) {
  12304. if (error == WOLFSSL_SUCCESS) {
  12305. if (output->ticketLen > SESSION_TICKET_LEN) {
  12306. output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap,
  12307. DYNAMIC_TYPE_SESSION_TICK);
  12308. if (output->ticket == NULL) {
  12309. error = WOLFSSL_FAILURE;
  12310. output->ticket = output->staticTicket;
  12311. output->ticketLenAlloc = 0;
  12312. output->ticketLen = 0;
  12313. }
  12314. }
  12315. else {
  12316. output->ticket = output->staticTicket;
  12317. output->ticketLenAlloc = 0;
  12318. }
  12319. }
  12320. else {
  12321. output->ticket = output->staticTicket;
  12322. output->ticketLenAlloc = 0;
  12323. output->ticketLen = 0;
  12324. }
  12325. if (error == WOLFSSL_SUCCESS) {
  12326. XMEMCPY(output->ticket, tmpTicket, output->ticketLen);
  12327. }
  12328. }
  12329. #ifdef WOLFSSL_SMALL_STACK
  12330. if (tmpTicket != NULL)
  12331. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12332. #endif
  12333. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12334. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12335. if (error == WOLFSSL_SUCCESS && preallocNonceUsed) {
  12336. if (preallocNonceLen < PREALLOC_SESSION_TICKET_NONCE_LEN) {
  12337. /* buffer bigger than needed */
  12338. #ifndef XREALLOC
  12339. output->ticketNonce.data = (byte*)XMALLOC(preallocNonceLen,
  12340. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12341. if (output->ticketNonce.data != NULL)
  12342. XMEMCPY(output->ticketNonce.data, preallocNonce,
  12343. preallocNonceLen);
  12344. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12345. preallocNonce = NULL;
  12346. #else
  12347. output->ticketNonce.data = (byte*)XREALLOC(preallocNonce,
  12348. preallocNonceLen, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12349. if (output->ticketNonce.data != NULL) {
  12350. /* don't free the reallocated pointer */
  12351. preallocNonce = NULL;
  12352. }
  12353. #endif /* !XREALLOC */
  12354. if (output->ticketNonce.data == NULL) {
  12355. output->ticketNonce.data = output->ticketNonce.dataStatic;
  12356. output->ticketNonce.len = 0;
  12357. error = WOLFSSL_FAILURE;
  12358. /* preallocNonce will be free'd after the if */
  12359. }
  12360. }
  12361. else {
  12362. output->ticketNonce.data = preallocNonce;
  12363. output->ticketNonce.len = preallocNonceLen;
  12364. preallocNonce = NULL;
  12365. }
  12366. }
  12367. if (preallocNonce != NULL)
  12368. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12369. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12370. #endif
  12371. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12372. if (peer != NULL) {
  12373. wolfSSL_X509_free(peer);
  12374. }
  12375. #endif
  12376. return error;
  12377. }
  12378. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12379. byte restoreSessionCerts)
  12380. {
  12381. WOLFSSL_SESSION* ret = NULL;
  12382. (void)restoreSessionCerts; /* Kept for compatibility */
  12383. if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) {
  12384. ret = ssl->session;
  12385. }
  12386. else {
  12387. WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session");
  12388. }
  12389. if (ret != NULL && masterSecret != NULL)
  12390. XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN);
  12391. return ret;
  12392. }
  12393. int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  12394. {
  12395. SessionRow* sessRow = NULL;
  12396. int ret = WOLFSSL_SUCCESS;
  12397. session = ClientSessionToSession(session);
  12398. if (ssl == NULL || session == NULL || !session->isSetup) {
  12399. WOLFSSL_MSG("ssl or session NULL or not set up");
  12400. return WOLFSSL_FAILURE;
  12401. }
  12402. /* We need to lock the session as the first step if its in the cache */
  12403. if (session->type == WOLFSSL_SESSION_TYPE_CACHE) {
  12404. if (session->cacheRow < SESSION_ROWS) {
  12405. sessRow = &SessionCache[session->cacheRow];
  12406. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  12407. WOLFSSL_MSG("Session row lock failed");
  12408. return WOLFSSL_FAILURE;
  12409. }
  12410. }
  12411. }
  12412. if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END &&
  12413. (byte)ssl->options.side != session->side) {
  12414. WOLFSSL_MSG("Setting session for wrong role");
  12415. ret = WOLFSSL_FAILURE;
  12416. }
  12417. if (ret == WOLFSSL_SUCCESS) {
  12418. if (ssl->session == session) {
  12419. WOLFSSL_MSG("ssl->session and session same");
  12420. }
  12421. else if (session->type != WOLFSSL_SESSION_TYPE_CACHE) {
  12422. if (wolfSSL_SESSION_up_ref(session) == WOLFSSL_SUCCESS) {
  12423. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  12424. ssl->session = session;
  12425. }
  12426. else
  12427. ret = WOLFSSL_FAILURE;
  12428. }
  12429. else {
  12430. ret = wolfSSL_DupSession(session, ssl->session, 0);
  12431. if (ret != WOLFSSL_SUCCESS)
  12432. WOLFSSL_MSG("Session duplicate failed");
  12433. }
  12434. }
  12435. /* Let's copy over the altSessionID for local cache purposes */
  12436. if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID &&
  12437. ssl->session != session) {
  12438. ssl->session->haveAltSessionID = 1;
  12439. XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN);
  12440. }
  12441. if (sessRow != NULL) {
  12442. SESSION_ROW_UNLOCK(sessRow);
  12443. sessRow = NULL;
  12444. }
  12445. /* Note: the `session` variable cannot be used below, since the row is
  12446. * un-locked */
  12447. if (ret != WOLFSSL_SUCCESS)
  12448. return ret;
  12449. #ifdef WOLFSSL_SESSION_ID_CTX
  12450. /* check for application context id */
  12451. if (ssl->sessionCtxSz > 0) {
  12452. if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, ssl->sessionCtxSz)) {
  12453. /* context id did not match! */
  12454. WOLFSSL_MSG("Session context did not match");
  12455. return WOLFSSL_FAILURE;
  12456. }
  12457. }
  12458. #endif /* WOLFSSL_SESSION_ID_CTX */
  12459. if (LowResTimer() >= (ssl->session->bornOn + ssl->session->timeout)) {
  12460. #if !defined(OPENSSL_EXTRA) || !defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12461. return WOLFSSL_FAILURE; /* session timed out */
  12462. #else /* defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) */
  12463. WOLFSSL_MSG("Session is expired but return success for "
  12464. "OpenSSL compatibility");
  12465. #endif
  12466. }
  12467. ssl->options.resuming = 1;
  12468. ssl->options.haveEMS = ssl->session->haveEMS;
  12469. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  12470. defined(HAVE_SESSION_TICKET))
  12471. ssl->version = ssl->session->version;
  12472. if (IsAtLeastTLSv1_3(ssl->version))
  12473. ssl->options.tls1_3 = 1;
  12474. #endif
  12475. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  12476. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12477. ssl->options.cipherSuite0 = ssl->session->cipherSuite0;
  12478. ssl->options.cipherSuite = ssl->session->cipherSuite;
  12479. #endif
  12480. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12481. ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet;
  12482. #endif
  12483. return WOLFSSL_SUCCESS;
  12484. }
  12485. #ifdef WOLFSSL_SESSION_STATS
  12486. static int get_locked_session_stats(word32* active, word32* total,
  12487. word32* peak);
  12488. #endif
  12489. #ifndef NO_CLIENT_CACHE
  12490. ClientSession* AddSessionToClientCache(int side, int row, int idx, byte* serverID,
  12491. word16 idLen, const byte* sessionID,
  12492. word16 useTicket)
  12493. {
  12494. int error = -1;
  12495. word32 clientRow = 0, clientIdx = 0;
  12496. ClientSession* ret = NULL;
  12497. (void)useTicket;
  12498. if (side == WOLFSSL_CLIENT_END
  12499. && row != INVALID_SESSION_ROW
  12500. && (idLen
  12501. #ifdef HAVE_SESSION_TICKET
  12502. || useTicket == 1
  12503. #endif
  12504. || serverID != NULL
  12505. )) {
  12506. WOLFSSL_MSG("Trying to add client cache entry");
  12507. if (idLen) {
  12508. clientRow = HashObject(serverID,
  12509. idLen, &error) % CLIENT_SESSION_ROWS;
  12510. }
  12511. else if (serverID != NULL) {
  12512. clientRow = HashObject(sessionID,
  12513. ID_LEN, &error) % CLIENT_SESSION_ROWS;
  12514. }
  12515. else {
  12516. error = -1;
  12517. }
  12518. if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) {
  12519. clientIdx = ClientCache[clientRow].nextIdx;
  12520. if (clientIdx < CLIENT_SESSIONS_PER_ROW) {
  12521. ClientCache[clientRow].Clients[clientIdx].serverRow =
  12522. (word16)row;
  12523. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  12524. (word16)idx;
  12525. if (sessionID != NULL) {
  12526. word32 sessionIDHash = HashObject(sessionID, ID_LEN,
  12527. &error);
  12528. if (error == 0) {
  12529. ClientCache[clientRow].Clients[clientIdx].sessionIDHash
  12530. = sessionIDHash;
  12531. }
  12532. }
  12533. }
  12534. else {
  12535. error = -1;
  12536. ClientCache[clientRow].nextIdx = 0; /* reset index as safety */
  12537. WOLFSSL_MSG("Invalid client cache index! "
  12538. "Possible corrupted memory");
  12539. }
  12540. if (error == 0) {
  12541. WOLFSSL_MSG("Adding client cache entry");
  12542. ret = &ClientCache[clientRow].Clients[clientIdx];
  12543. if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW)
  12544. ClientCache[clientRow].totalCount++;
  12545. ClientCache[clientRow].nextIdx++;
  12546. ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW;
  12547. }
  12548. wc_UnLockMutex(&clisession_mutex);
  12549. }
  12550. else {
  12551. WOLFSSL_MSG("Hash session or lock failed");
  12552. }
  12553. }
  12554. else {
  12555. WOLFSSL_MSG("Skipping client cache");
  12556. }
  12557. return ret;
  12558. }
  12559. #endif /* !NO_CLIENT_CACHE */
  12560. /**
  12561. * For backwards compatibility, this API needs to be used in *ALL* functions
  12562. * that access the WOLFSSL_SESSION members directly.
  12563. *
  12564. * This API checks if the passed in session is actually a ClientSession object
  12565. * and returns the matching session cache object. Otherwise just return the
  12566. * input. ClientSession objects only occur in the ClientCache. They are not
  12567. * allocated anywhere else.
  12568. */
  12569. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12570. {
  12571. WOLFSSL_ENTER("ClientSessionToSession");
  12572. #ifdef NO_SESSION_CACHE_REF
  12573. return (WOLFSSL_SESSION*)session;
  12574. #else
  12575. #ifndef NO_CLIENT_CACHE
  12576. if (session == NULL)
  12577. return NULL;
  12578. /* Check if session points into ClientCache */
  12579. if ((byte*)session >= (byte*)ClientCache &&
  12580. /* Cast to byte* to make pointer arithmetic work per byte */
  12581. (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) {
  12582. ClientSession* clientSession = (ClientSession*)session;
  12583. SessionRow* sessRow = NULL;
  12584. WOLFSSL_SESSION* cacheSession = NULL;
  12585. word32 sessionIDHash = 0;
  12586. int error = 0;
  12587. session = NULL; /* Default to NULL for failure case */
  12588. if (wc_LockMutex(&clisession_mutex) != 0) {
  12589. WOLFSSL_MSG("Client cache mutex lock failed");
  12590. return NULL;
  12591. }
  12592. if (clientSession->serverRow >= SESSION_ROWS ||
  12593. clientSession->serverIdx >= SESSIONS_PER_ROW) {
  12594. WOLFSSL_MSG("Client cache serverRow or serverIdx invalid");
  12595. error = -1;
  12596. }
  12597. /* Prevent memory access before clientSession->serverRow and
  12598. * clientSession->serverIdx are sanitized. */
  12599. XFENCE();
  12600. if (error == 0) {
  12601. /* Lock row */
  12602. sessRow = &SessionCache[clientSession->serverRow];
  12603. error = SESSION_ROW_RD_LOCK(sessRow);
  12604. if (error != 0) {
  12605. WOLFSSL_MSG("Session cache row lock failure");
  12606. sessRow = NULL;
  12607. }
  12608. }
  12609. if (error == 0) {
  12610. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12611. cacheSession = sessRow->Sessions[clientSession->serverIdx];
  12612. #else
  12613. cacheSession = &sessRow->Sessions[clientSession->serverIdx];
  12614. #endif
  12615. if (cacheSession && cacheSession->sessionIDSz == 0) {
  12616. cacheSession = NULL;
  12617. WOLFSSL_MSG("Session cache entry not set");
  12618. error = -1;
  12619. }
  12620. }
  12621. if (error == 0) {
  12622. /* Calculate the hash of the session ID */
  12623. sessionIDHash = HashObject(cacheSession->sessionID, ID_LEN,
  12624. &error);
  12625. }
  12626. if (error == 0) {
  12627. /* Check the session ID hash matches */
  12628. error = clientSession->sessionIDHash != sessionIDHash;
  12629. if (error != 0)
  12630. WOLFSSL_MSG("session ID hash don't match");
  12631. }
  12632. if (error == 0) {
  12633. /* Hashes match */
  12634. session = cacheSession;
  12635. WOLFSSL_MSG("Found session cache matching client session object");
  12636. }
  12637. if (sessRow != NULL) {
  12638. SESSION_ROW_UNLOCK(sessRow);
  12639. }
  12640. wc_UnLockMutex(&clisession_mutex);
  12641. return (WOLFSSL_SESSION*)session;
  12642. }
  12643. else {
  12644. /* Plain WOLFSSL_SESSION object */
  12645. return (WOLFSSL_SESSION*)session;
  12646. }
  12647. #else
  12648. return (WOLFSSL_SESSION*)session;
  12649. #endif
  12650. #endif
  12651. }
  12652. int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession,
  12653. const byte* id, byte idSz, int* sessionIndex, int side,
  12654. word16 useTicket, ClientSession** clientCacheEntry)
  12655. {
  12656. WOLFSSL_SESSION* cacheSession = NULL;
  12657. SessionRow* sessRow = NULL;
  12658. word32 idx = 0;
  12659. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12660. WOLFSSL_X509* cachePeer = NULL;
  12661. WOLFSSL_X509* addPeer = NULL;
  12662. #endif
  12663. #ifdef HAVE_SESSION_TICKET
  12664. byte* cacheTicBuff = NULL;
  12665. byte ticBuffUsed = 0;
  12666. byte* ticBuff = NULL;
  12667. int ticLen = 0;
  12668. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12669. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12670. byte *preallocNonce = NULL;
  12671. byte preallocNonceLen = 0;
  12672. byte preallocNonceUsed = 0;
  12673. byte *toFree = NULL;
  12674. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC */
  12675. #endif /* HAVE_SESSION_TICKET */
  12676. int ret = 0;
  12677. int row;
  12678. int i;
  12679. int overwrite = 0;
  12680. (void)ctx;
  12681. (void)sessionIndex;
  12682. (void)useTicket;
  12683. (void)clientCacheEntry;
  12684. WOLFSSL_ENTER("AddSessionToCache");
  12685. if (idSz == 0) {
  12686. WOLFSSL_MSG("AddSessionToCache idSz == 0");
  12687. return BAD_FUNC_ARG;
  12688. }
  12689. addSession = ClientSessionToSession(addSession);
  12690. if (addSession == NULL) {
  12691. WOLFSSL_MSG("AddSessionToCache is NULL");
  12692. return MEMORY_E;
  12693. }
  12694. #ifdef HAVE_SESSION_TICKET
  12695. ticLen = addSession->ticketLen;
  12696. /* Alloc Memory here to avoid syscalls during lock */
  12697. if (ticLen > SESSION_TICKET_LEN) {
  12698. ticBuff = (byte*)XMALLOC(ticLen, NULL,
  12699. DYNAMIC_TYPE_SESSION_TICK);
  12700. if (ticBuff == NULL) {
  12701. return MEMORY_E;
  12702. }
  12703. }
  12704. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12705. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12706. if (addSession->ticketNonce.data != addSession->ticketNonce.dataStatic) {
  12707. /* use the AddSession->heap even if the buffer maybe saved in
  12708. * CachedSession objects. CachedSession heap and AddSession heap should
  12709. * be the same */
  12710. preallocNonce = (byte*)XMALLOC(addSession->ticketNonce.len,
  12711. addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12712. if (preallocNonce == NULL) {
  12713. if (ticBuff != NULL)
  12714. XFREE(ticBuff, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12715. return MEMORY_E;
  12716. }
  12717. preallocNonceLen = addSession->ticketNonce.len;
  12718. }
  12719. #endif /* WOLFSSL_TLS13 && WOLFSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
  12720. #endif /* HAVE_SESSION_TICKET */
  12721. /* Find a position for the new session in cache and use that */
  12722. /* Use the session object in the cache for external cache if required */
  12723. row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS);
  12724. if (ret != 0) {
  12725. WOLFSSL_MSG("Hash session failed");
  12726. #ifdef HAVE_SESSION_TICKET
  12727. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12728. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12729. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12730. #endif
  12731. #endif
  12732. return ret;
  12733. }
  12734. sessRow = &SessionCache[row];
  12735. if (SESSION_ROW_WR_LOCK(sessRow) != 0) {
  12736. #ifdef HAVE_SESSION_TICKET
  12737. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12738. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12739. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12740. #endif
  12741. #endif
  12742. WOLFSSL_MSG("Session row lock failed");
  12743. return BAD_MUTEX_E;
  12744. }
  12745. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  12746. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12747. cacheSession = sessRow->Sessions[i];
  12748. #else
  12749. cacheSession = &sessRow->Sessions[i];
  12750. #endif
  12751. if (cacheSession && XMEMCMP(id,
  12752. cacheSession->sessionID, ID_LEN) == 0 &&
  12753. cacheSession->side == side) {
  12754. WOLFSSL_MSG("Session already exists. Overwriting.");
  12755. overwrite = 1;
  12756. idx = i;
  12757. break;
  12758. }
  12759. }
  12760. if (!overwrite)
  12761. idx = sessRow->nextIdx;
  12762. #ifdef SESSION_INDEX
  12763. if (sessionIndex != NULL)
  12764. *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  12765. #endif
  12766. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12767. cacheSession = sessRow->Sessions[idx];
  12768. if (cacheSession == NULL) {
  12769. cacheSession = (WOLFSSL_SESSION*) XMALLOC(sizeof(WOLFSSL_SESSION),
  12770. sessRow->heap, DYNAMIC_TYPE_SESSION);
  12771. if (cacheSession == NULL) {
  12772. #ifdef HAVE_SESSION_TICKET
  12773. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12774. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12775. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12776. #endif
  12777. #endif
  12778. SESSION_ROW_UNLOCK(sessRow);
  12779. return MEMORY_E;
  12780. }
  12781. XMEMSET(cacheSession, 0, sizeof(WOLFSSL_SESSION));
  12782. sessRow->Sessions[idx] = cacheSession;
  12783. }
  12784. #else
  12785. cacheSession = &sessRow->Sessions[idx];
  12786. #endif
  12787. #ifdef HAVE_EX_DATA
  12788. if (overwrite) {
  12789. /* Figure out who owns the ex_data */
  12790. if (cacheSession->ownExData) {
  12791. /* Prioritize cacheSession copy */
  12792. XMEMCPY(&addSession->ex_data, &cacheSession->ex_data,
  12793. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  12794. }
  12795. /* else will be copied in wolfSSL_DupSession call */
  12796. }
  12797. else if (cacheSession->ownExData) {
  12798. crypto_ex_cb_free_data(cacheSession, crypto_ex_cb_ctx_session,
  12799. &cacheSession->ex_data);
  12800. cacheSession->ownExData = 0;
  12801. }
  12802. #endif
  12803. if (!overwrite)
  12804. EvictSessionFromCache(cacheSession);
  12805. cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE;
  12806. cacheSession->cacheRow = row;
  12807. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12808. /* Save the peer field to free after unlocking the row */
  12809. if (cacheSession->peer != NULL)
  12810. cachePeer = cacheSession->peer;
  12811. cacheSession->peer = NULL;
  12812. #endif
  12813. #ifdef HAVE_SESSION_TICKET
  12814. /* If we can reuse the existing buffer in cacheSession then we won't touch
  12815. * ticBuff at all making it a very cheap malloc/free. The page on a modern
  12816. * OS will most likely not even be allocated to the process. */
  12817. if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) {
  12818. /* Save pointer only if separately allocated */
  12819. if (cacheSession->ticket != cacheSession->staticTicket)
  12820. cacheTicBuff = cacheSession->ticket;
  12821. ticBuffUsed = 1;
  12822. cacheSession->ticket = ticBuff;
  12823. cacheSession->ticketLenAlloc = (word16) ticLen;
  12824. }
  12825. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12826. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12827. /* cache entry never used */
  12828. if (cacheSession->ticketNonce.data == NULL)
  12829. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12830. if (cacheSession->ticketNonce.data !=
  12831. cacheSession->ticketNonce.dataStatic) {
  12832. toFree = cacheSession->ticketNonce.data;
  12833. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12834. cacheSession->ticketNonce.len = 0;
  12835. }
  12836. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12837. #endif
  12838. #ifdef SESSION_CERTS
  12839. if (overwrite &&
  12840. addSession->chain.count == 0 &&
  12841. cacheSession->chain.count > 0) {
  12842. /* Copy in the certs from the session */
  12843. addSession->chain.count = cacheSession->chain.count;
  12844. XMEMCPY(addSession->chain.certs, cacheSession->chain.certs,
  12845. sizeof(x509_buffer) * cacheSession->chain.count);
  12846. }
  12847. #endif /* SESSION_CERTS */
  12848. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12849. /* Don't copy the peer cert into cache */
  12850. addPeer = addSession->peer;
  12851. addSession->peer = NULL;
  12852. #endif
  12853. cacheSession->heap = NULL;
  12854. /* Copy data into the cache object */
  12855. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12856. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12857. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12858. ret = wolfSSL_DupSessionEx(addSession, cacheSession, 1, preallocNonce,
  12859. &preallocNonceLen, &preallocNonceUsed) == WOLFSSL_FAILURE;
  12860. #else
  12861. ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE;
  12862. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12863. && FIPS_VERSION_GE(5,3)*/
  12864. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12865. addSession->peer = addPeer;
  12866. #endif
  12867. if (ret == 0) {
  12868. if (!overwrite) {
  12869. /* Increment the totalCount and the nextIdx */
  12870. if (sessRow->totalCount < SESSIONS_PER_ROW)
  12871. sessRow->totalCount++;
  12872. sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW;
  12873. }
  12874. if (id != addSession->sessionID) {
  12875. /* ssl->session->sessionID may contain the bogus ID or we want the
  12876. * ID from the arrays object */
  12877. XMEMCPY(cacheSession->sessionID, id, ID_LEN);
  12878. cacheSession->sessionIDSz = ID_LEN;
  12879. }
  12880. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  12881. if (ctx->rem_sess_cb != NULL)
  12882. cacheSession->rem_sess_cb = ctx->rem_sess_cb;
  12883. #endif
  12884. #ifdef HAVE_EX_DATA
  12885. /* The session in cache now owns the ex_data */
  12886. addSession->ownExData = 0;
  12887. cacheSession->ownExData = 1;
  12888. #endif
  12889. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12890. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12891. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12892. if (preallocNonce != NULL && preallocNonceUsed) {
  12893. cacheSession->ticketNonce.data = preallocNonce;
  12894. cacheSession->ticketNonce.len = preallocNonceLen;
  12895. preallocNonce = NULL;
  12896. preallocNonceLen = 0;
  12897. }
  12898. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12899. * && FIPS_VERSION_GE(5,3)*/
  12900. }
  12901. #ifdef HAVE_SESSION_TICKET
  12902. else if (ticBuffUsed) {
  12903. /* Error occurred. Need to clean up the ticket buffer. */
  12904. cacheSession->ticket = cacheSession->staticTicket;
  12905. cacheSession->ticketLenAlloc = 0;
  12906. cacheSession->ticketLen = 0;
  12907. }
  12908. #endif
  12909. SESSION_ROW_UNLOCK(sessRow);
  12910. cacheSession = NULL; /* Can't access after unlocked */
  12911. #ifndef NO_CLIENT_CACHE
  12912. if (ret == 0 && clientCacheEntry != NULL) {
  12913. ClientSession* clientCache = AddSessionToClientCache(side, row, idx,
  12914. addSession->serverID, addSession->idLen, id, useTicket);
  12915. if (clientCache != NULL)
  12916. *clientCacheEntry = clientCache;
  12917. }
  12918. #endif
  12919. #ifdef HAVE_SESSION_TICKET
  12920. if (ticBuff != NULL && !ticBuffUsed)
  12921. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12922. XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12923. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12924. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12925. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12926. XFREE(toFree, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12927. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12928. #endif
  12929. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12930. if (cachePeer != NULL) {
  12931. wolfSSL_X509_free(cachePeer);
  12932. cachePeer = NULL; /* Make sure not use after this point */
  12933. }
  12934. #endif
  12935. return ret;
  12936. }
  12937. void AddSession(WOLFSSL* ssl)
  12938. {
  12939. int error = 0;
  12940. const byte* id = NULL;
  12941. byte idSz = 0;
  12942. WOLFSSL_SESSION* session = ssl->session;
  12943. (void)error;
  12944. WOLFSSL_ENTER("AddSession");
  12945. if (SslSessionCacheOff(ssl, session)) {
  12946. WOLFSSL_MSG("Cache off");
  12947. return;
  12948. }
  12949. if (session->haveAltSessionID) {
  12950. id = session->altSessionID;
  12951. idSz = ID_LEN;
  12952. }
  12953. else {
  12954. id = session->sessionID;
  12955. idSz = session->sessionIDSz;
  12956. }
  12957. /* Do this only for the client because if the server doesn't have an ID at
  12958. * this point, it won't on resumption. */
  12959. if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12960. WC_RNG* rng = NULL;
  12961. if (ssl->rng != NULL)
  12962. rng = ssl->rng;
  12963. #if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA)
  12964. else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) {
  12965. rng = &globalRNG;
  12966. }
  12967. #endif
  12968. if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID,
  12969. ID_LEN) != 0)
  12970. return;
  12971. ssl->session->haveAltSessionID = 1;
  12972. id = ssl->session->altSessionID;
  12973. idSz = ID_LEN;
  12974. }
  12975. #ifdef HAVE_EXT_CACHE
  12976. if (!ssl->options.internalCacheOff)
  12977. #endif
  12978. {
  12979. /* Try to add the session to internal cache or external cache
  12980. if a new_sess_cb is set. Its ok if we don't succeed. */
  12981. (void)AddSessionToCache(ssl->ctx, session, id, idSz,
  12982. #ifdef SESSION_INDEX
  12983. &ssl->sessionIndex,
  12984. #else
  12985. NULL,
  12986. #endif
  12987. ssl->options.side,
  12988. #ifdef HAVE_SESSION_TICKET
  12989. ssl->options.useTicket,
  12990. #else
  12991. 0,
  12992. #endif
  12993. #ifdef NO_SESSION_CACHE_REF
  12994. NULL
  12995. #else
  12996. (ssl->options.side == WOLFSSL_CLIENT_END) ?
  12997. &ssl->clientSession : NULL
  12998. #endif
  12999. );
  13000. }
  13001. #ifdef HAVE_EXT_CACHE
  13002. if (error == 0 && ssl->ctx->new_sess_cb != NULL) {
  13003. int cbRet = 0;
  13004. wolfSSL_SESSION_up_ref(session);
  13005. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  13006. if (cbRet == 0)
  13007. wolfSSL_FreeSession(ssl->ctx, session);
  13008. }
  13009. #endif
  13010. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  13011. if (error == 0) {
  13012. word32 active = 0;
  13013. error = get_locked_session_stats(&active, NULL, NULL);
  13014. if (error == WOLFSSL_SUCCESS) {
  13015. error = 0; /* back to this function ok */
  13016. if (PeakSessions < active) {
  13017. PeakSessions = active;
  13018. }
  13019. }
  13020. }
  13021. #endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */
  13022. (void)error;
  13023. }
  13024. #ifdef SESSION_INDEX
  13025. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  13026. {
  13027. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  13028. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  13029. return ssl->sessionIndex;
  13030. }
  13031. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  13032. {
  13033. int row, col, result = WOLFSSL_FAILURE;
  13034. SessionRow* sessRow;
  13035. WOLFSSL_SESSION* cacheSession;
  13036. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  13037. session = ClientSessionToSession(session);
  13038. row = idx >> SESSIDX_ROW_SHIFT;
  13039. col = idx & SESSIDX_IDX_MASK;
  13040. if (session == NULL ||
  13041. row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) {
  13042. return WOLFSSL_FAILURE;
  13043. }
  13044. sessRow = &SessionCache[row];
  13045. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  13046. return BAD_MUTEX_E;
  13047. }
  13048. #ifdef SESSION_CACHE_DYNAMIC_MEM
  13049. cacheSession = sessRow->Sessions[col];
  13050. #else
  13051. cacheSession = &sessRow->Sessions[col];
  13052. #endif
  13053. if (cacheSession) {
  13054. XMEMCPY(session, cacheSession, sizeof(WOLFSSL_SESSION));
  13055. result = WOLFSSL_SUCCESS;
  13056. }
  13057. else {
  13058. result = WOLFSSL_FAILURE;
  13059. }
  13060. SESSION_ROW_UNLOCK(sessRow);
  13061. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  13062. return result;
  13063. }
  13064. #endif /* SESSION_INDEX */
  13065. #if defined(SESSION_CERTS)
  13066. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  13067. {
  13068. WOLFSSL_X509_CHAIN* chain = NULL;
  13069. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  13070. session = ClientSessionToSession(session);
  13071. if (session)
  13072. chain = &session->chain;
  13073. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  13074. return chain;
  13075. }
  13076. #ifdef OPENSSL_EXTRA
  13077. /* gets the peer certificate associated with the session passed in
  13078. * returns null on failure, the caller should not free the returned pointer */
  13079. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  13080. {
  13081. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  13082. session = ClientSessionToSession(session);
  13083. if (session) {
  13084. int count;
  13085. count = wolfSSL_get_chain_count(&session->chain);
  13086. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  13087. WOLFSSL_MSG("bad count found");
  13088. return NULL;
  13089. }
  13090. if (session->peer == NULL) {
  13091. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  13092. }
  13093. return session->peer;
  13094. }
  13095. WOLFSSL_MSG("No session passed in");
  13096. return NULL;
  13097. }
  13098. #endif /* OPENSSL_EXTRA */
  13099. #endif /* SESSION_INDEX && SESSION_CERTS */
  13100. #ifdef WOLFSSL_SESSION_STATS
  13101. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  13102. {
  13103. int result = WOLFSSL_SUCCESS;
  13104. int i;
  13105. int count;
  13106. int idx;
  13107. word32 now = 0;
  13108. word32 seen = 0;
  13109. word32 ticks = LowResTimer();
  13110. WOLFSSL_ENTER("get_locked_session_stats");
  13111. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  13112. SESSION_ROW_RD_LOCK(&SessionCache[0]);
  13113. #endif
  13114. for (i = 0; i < SESSION_ROWS; i++) {
  13115. SessionRow* row = &SessionCache[i];
  13116. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  13117. if (SESSION_ROW_RD_LOCK(row) != 0) {
  13118. WOLFSSL_MSG("Session row cache mutex lock failed");
  13119. return BAD_MUTEX_E;
  13120. }
  13121. #endif
  13122. seen += row->totalCount;
  13123. if (active == NULL) {
  13124. SESSION_ROW_UNLOCK(row);
  13125. continue;
  13126. }
  13127. count = min((word32)row->totalCount, SESSIONS_PER_ROW);
  13128. idx = row->nextIdx - 1;
  13129. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  13130. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  13131. }
  13132. for (; count > 0; --count) {
  13133. /* if not expired then good */
  13134. #ifdef SESSION_CACHE_DYNAMIC_MEM
  13135. if (row->Sessions[idx] &&
  13136. ticks < (row->Sessions[idx]->bornOn +
  13137. row->Sessions[idx]->timeout) )
  13138. #else
  13139. if (ticks < (row->Sessions[idx].bornOn +
  13140. row->Sessions[idx].timeout) )
  13141. #endif
  13142. {
  13143. now++;
  13144. }
  13145. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  13146. }
  13147. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  13148. SESSION_ROW_UNLOCK(row);
  13149. #endif
  13150. }
  13151. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  13152. SESSION_ROW_UNLOCK(&SessionCache[0]);
  13153. #endif
  13154. if (active) {
  13155. *active = now;
  13156. }
  13157. if (total) {
  13158. *total = seen;
  13159. }
  13160. #ifdef WOLFSSL_PEAK_SESSIONS
  13161. if (peak) {
  13162. *peak = PeakSessions;
  13163. }
  13164. #else
  13165. (void)peak;
  13166. #endif
  13167. WOLFSSL_LEAVE("get_locked_session_stats", result);
  13168. return result;
  13169. }
  13170. /* return WOLFSSL_SUCCESS on ok */
  13171. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  13172. word32* maxSessions)
  13173. {
  13174. int result = WOLFSSL_SUCCESS;
  13175. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  13176. if (maxSessions) {
  13177. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  13178. if (active == NULL && total == NULL && peak == NULL)
  13179. return result; /* we're done */
  13180. }
  13181. /* user must provide at least one query value */
  13182. if (active == NULL && total == NULL && peak == NULL) {
  13183. return BAD_FUNC_ARG;
  13184. }
  13185. result = get_locked_session_stats(active, total, peak);
  13186. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  13187. return result;
  13188. }
  13189. #endif /* WOLFSSL_SESSION_STATS */
  13190. #ifdef PRINT_SESSION_STATS
  13191. /* WOLFSSL_SUCCESS on ok */
  13192. int wolfSSL_PrintSessionStats(void)
  13193. {
  13194. word32 totalSessionsSeen = 0;
  13195. word32 totalSessionsNow = 0;
  13196. word32 peak = 0;
  13197. word32 maxSessions = 0;
  13198. int i;
  13199. int ret;
  13200. double E; /* expected freq */
  13201. double chiSquare = 0;
  13202. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  13203. &peak, &maxSessions);
  13204. if (ret != WOLFSSL_SUCCESS)
  13205. return ret;
  13206. printf("Total Sessions Seen = %u\n", totalSessionsSeen);
  13207. printf("Total Sessions Now = %u\n", totalSessionsNow);
  13208. #ifdef WOLFSSL_PEAK_SESSIONS
  13209. printf("Peak Sessions = %u\n", peak);
  13210. #endif
  13211. printf("Max Sessions = %u\n", maxSessions);
  13212. E = (double)totalSessionsSeen / SESSION_ROWS;
  13213. for (i = 0; i < SESSION_ROWS; i++) {
  13214. double diff = SessionCache[i].totalCount - E;
  13215. diff *= diff; /* square */
  13216. diff /= E; /* normalize */
  13217. chiSquare += diff;
  13218. }
  13219. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  13220. SESSION_ROWS - 1);
  13221. #if (SESSION_ROWS == 11)
  13222. printf(" .05 p value = 18.3, chi-square should be less\n");
  13223. #elif (SESSION_ROWS == 211)
  13224. printf(".05 p value = 244.8, chi-square should be less\n");
  13225. #elif (SESSION_ROWS == 5981)
  13226. printf(".05 p value = 6161.0, chi-square should be less\n");
  13227. #elif (SESSION_ROWS == 3)
  13228. printf(".05 p value = 6.0, chi-square should be less\n");
  13229. #elif (SESSION_ROWS == 2861)
  13230. printf(".05 p value = 2985.5, chi-square should be less\n");
  13231. #endif
  13232. printf("\n");
  13233. return ret;
  13234. }
  13235. #endif /* SESSION_STATS */
  13236. #else /* NO_SESSION_CACHE */
  13237. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  13238. {
  13239. return (WOLFSSL_SESSION*)session;
  13240. }
  13241. /* No session cache version */
  13242. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  13243. byte restoreSessionCerts)
  13244. {
  13245. (void)ssl;
  13246. (void)masterSecret;
  13247. (void)restoreSessionCerts;
  13248. return NULL;
  13249. }
  13250. #endif /* NO_SESSION_CACHE */
  13251. /* call before SSL_connect, if verifying will add name check to
  13252. date check and signature check */
  13253. WOLFSSL_ABI
  13254. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  13255. {
  13256. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  13257. if (ssl == NULL || dn == NULL) {
  13258. WOLFSSL_MSG("Bad function argument: NULL");
  13259. return WOLFSSL_FAILURE;
  13260. }
  13261. if (ssl->buffers.domainName.buffer)
  13262. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13263. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  13264. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  13265. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13266. if (ssl->buffers.domainName.buffer) {
  13267. unsigned char* domainName = ssl->buffers.domainName.buffer;
  13268. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  13269. domainName[ssl->buffers.domainName.length] = '\0';
  13270. return WOLFSSL_SUCCESS;
  13271. }
  13272. else {
  13273. ssl->error = MEMORY_ERROR;
  13274. return WOLFSSL_FAILURE;
  13275. }
  13276. }
  13277. /* turn on wolfSSL zlib compression
  13278. returns WOLFSSL_SUCCESS for success, else error (not built in)
  13279. */
  13280. int wolfSSL_set_compression(WOLFSSL* ssl)
  13281. {
  13282. WOLFSSL_ENTER("wolfSSL_set_compression");
  13283. (void)ssl;
  13284. #ifdef HAVE_LIBZ
  13285. ssl->options.usingCompression = 1;
  13286. return WOLFSSL_SUCCESS;
  13287. #else
  13288. return NOT_COMPILED_IN;
  13289. #endif
  13290. }
  13291. #ifndef USE_WINDOWS_API
  13292. #ifndef NO_WRITEV
  13293. /* simulate writev semantics, doesn't actually do block at a time though
  13294. because of SSL_write behavior and because front adds may be small */
  13295. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  13296. {
  13297. #ifdef WOLFSSL_SMALL_STACK
  13298. byte staticBuffer[1]; /* force heap usage */
  13299. #else
  13300. byte staticBuffer[FILE_BUFFER_SIZE];
  13301. #endif
  13302. byte* myBuffer = staticBuffer;
  13303. int dynamic = 0;
  13304. int sending = 0;
  13305. int idx = 0;
  13306. int i;
  13307. int ret;
  13308. WOLFSSL_ENTER("wolfSSL_writev");
  13309. for (i = 0; i < iovcnt; i++)
  13310. sending += (int)iov[i].iov_len;
  13311. if (sending > (int)sizeof(staticBuffer)) {
  13312. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  13313. DYNAMIC_TYPE_WRITEV);
  13314. if (!myBuffer)
  13315. return MEMORY_ERROR;
  13316. dynamic = 1;
  13317. }
  13318. for (i = 0; i < iovcnt; i++) {
  13319. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  13320. idx += (int)iov[i].iov_len;
  13321. }
  13322. /* myBuffer may not be initialized fully, but the span up to the
  13323. * sending length will be.
  13324. */
  13325. PRAGMA_GCC_DIAG_PUSH
  13326. PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
  13327. ret = wolfSSL_write(ssl, myBuffer, sending);
  13328. PRAGMA_GCC_DIAG_POP
  13329. if (dynamic)
  13330. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  13331. return ret;
  13332. }
  13333. #endif
  13334. #endif
  13335. #ifdef WOLFSSL_CALLBACKS
  13336. typedef struct itimerval Itimerval;
  13337. /* don't keep calling simple functions while setting up timer and signals
  13338. if no inlining these are the next best */
  13339. #define AddTimes(a, b, c) \
  13340. do { \
  13341. (c).tv_sec = (a).tv_sec + (b).tv_sec; \
  13342. (c).tv_usec = (a).tv_usec + (b).tv_usec;\
  13343. if ((c).tv_usec >= 1000000) { \
  13344. (c).tv_sec++; \
  13345. (c).tv_usec -= 1000000; \
  13346. } \
  13347. } while (0)
  13348. #define SubtractTimes(a, b, c) \
  13349. do { \
  13350. (c).tv_sec = (a).tv_sec - (b).tv_sec; \
  13351. (c).tv_usec = (a).tv_usec - (b).tv_usec;\
  13352. if ((c).tv_usec < 0) { \
  13353. (c).tv_sec--; \
  13354. (c).tv_usec += 1000000; \
  13355. } \
  13356. } while (0)
  13357. #define CmpTimes(a, b, cmp) \
  13358. (((a).tv_sec == (b).tv_sec) ? \
  13359. ((a).tv_usec cmp (b).tv_usec) : \
  13360. ((a).tv_sec cmp (b).tv_sec)) \
  13361. /* do nothing handler */
  13362. static void myHandler(int signo)
  13363. {
  13364. (void)signo;
  13365. return;
  13366. }
  13367. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13368. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13369. {
  13370. int ret = WOLFSSL_FATAL_ERROR;
  13371. int oldTimerOn = 0; /* was timer already on */
  13372. WOLFSSL_TIMEVAL startTime;
  13373. WOLFSSL_TIMEVAL endTime;
  13374. WOLFSSL_TIMEVAL totalTime;
  13375. Itimerval myTimeout;
  13376. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  13377. struct sigaction act, oact;
  13378. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  13379. if (hsCb) {
  13380. ssl->hsInfoOn = 1;
  13381. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  13382. }
  13383. if (toCb) {
  13384. ssl->toInfoOn = 1;
  13385. InitTimeoutInfo(&ssl->timeoutInfo);
  13386. if (gettimeofday(&startTime, 0) < 0)
  13387. ERR_OUT(GETTIME_ERROR);
  13388. /* use setitimer to simulate getitimer, init 0 myTimeout */
  13389. myTimeout.it_interval.tv_sec = 0;
  13390. myTimeout.it_interval.tv_usec = 0;
  13391. myTimeout.it_value.tv_sec = 0;
  13392. myTimeout.it_value.tv_usec = 0;
  13393. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  13394. ERR_OUT(SETITIMER_ERROR);
  13395. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  13396. oldTimerOn = 1;
  13397. /* is old timer going to expire before ours */
  13398. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  13399. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  13400. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  13401. }
  13402. }
  13403. myTimeout.it_value.tv_sec = timeout.tv_sec;
  13404. myTimeout.it_value.tv_usec = timeout.tv_usec;
  13405. /* set up signal handler, don't restart socket send/recv */
  13406. act.sa_handler = myHandler;
  13407. sigemptyset(&act.sa_mask);
  13408. act.sa_flags = 0;
  13409. #ifdef SA_INTERRUPT
  13410. act.sa_flags |= SA_INTERRUPT;
  13411. #endif
  13412. if (sigaction(SIGALRM, &act, &oact) < 0)
  13413. ERR_OUT(SIGACT_ERROR);
  13414. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  13415. ERR_OUT(SETITIMER_ERROR);
  13416. }
  13417. /* do main work */
  13418. #ifndef NO_WOLFSSL_CLIENT
  13419. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13420. ret = wolfSSL_connect(ssl);
  13421. #endif
  13422. #ifndef NO_WOLFSSL_SERVER
  13423. if (ssl->options.side == WOLFSSL_SERVER_END)
  13424. ret = wolfSSL_accept(ssl);
  13425. #endif
  13426. /* do callbacks */
  13427. if (toCb) {
  13428. if (oldTimerOn) {
  13429. if (gettimeofday(&endTime, 0) < 0)
  13430. ERR_OUT(SYSLIB_FAILED_E);
  13431. SubtractTimes(endTime, startTime, totalTime);
  13432. /* adjust old timer for elapsed time */
  13433. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  13434. SubtractTimes(oldTimeout.it_value, totalTime,
  13435. oldTimeout.it_value);
  13436. else {
  13437. /* reset value to interval, may be off */
  13438. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  13439. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  13440. }
  13441. /* keep iter the same whether there or not */
  13442. }
  13443. /* restore old handler */
  13444. if (sigaction(SIGALRM, &oact, 0) < 0)
  13445. ret = SIGACT_ERROR; /* more pressing error, stomp */
  13446. else
  13447. /* use old settings which may turn off (expired or not there) */
  13448. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  13449. ret = SETITIMER_ERROR;
  13450. /* if we had a timeout call callback */
  13451. if (ssl->timeoutInfo.timeoutName[0]) {
  13452. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  13453. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  13454. (toCb)(&ssl->timeoutInfo);
  13455. }
  13456. ssl->toInfoOn = 0;
  13457. }
  13458. /* clean up buffers allocated by AddPacketInfo */
  13459. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  13460. if (hsCb) {
  13461. FinishHandShakeInfo(&ssl->handShakeInfo);
  13462. (hsCb)(&ssl->handShakeInfo);
  13463. ssl->hsInfoOn = 0;
  13464. }
  13465. return ret;
  13466. }
  13467. #ifndef NO_WOLFSSL_CLIENT
  13468. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13469. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13470. {
  13471. WOLFSSL_ENTER("wolfSSL_connect_ex");
  13472. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13473. }
  13474. #endif
  13475. #ifndef NO_WOLFSSL_SERVER
  13476. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13477. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13478. {
  13479. WOLFSSL_ENTER("wolfSSL_accept_ex");
  13480. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13481. }
  13482. #endif
  13483. #endif /* WOLFSSL_CALLBACKS */
  13484. #ifndef NO_PSK
  13485. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  13486. wc_psk_client_callback cb)
  13487. {
  13488. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_callback");
  13489. if (ctx == NULL)
  13490. return;
  13491. ctx->havePSK = 1;
  13492. ctx->client_psk_cb = cb;
  13493. }
  13494. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  13495. {
  13496. byte haveRSA = 1;
  13497. int keySz = 0;
  13498. WOLFSSL_ENTER("wolfSSL_set_psk_client_callback");
  13499. if (ssl == NULL)
  13500. return;
  13501. ssl->options.havePSK = 1;
  13502. ssl->options.client_psk_cb = cb;
  13503. #ifdef NO_RSA
  13504. haveRSA = 0;
  13505. #endif
  13506. #ifndef NO_CERTS
  13507. keySz = ssl->buffers.keySz;
  13508. #endif
  13509. if (AllocateSuites(ssl) != 0)
  13510. return;
  13511. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13512. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13513. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13514. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13515. ssl->options.useAnon, TRUE, ssl->options.side);
  13516. }
  13517. #ifdef OPENSSL_EXTRA
  13518. /**
  13519. * set call back function for psk session use
  13520. * @param ssl a pointer to WOLFSSL structure
  13521. * @param cb a function pointer to wc_psk_use_session_cb
  13522. * @return none
  13523. */
  13524. void wolfSSL_set_psk_use_session_callback(WOLFSSL* ssl,
  13525. wc_psk_use_session_cb_func cb)
  13526. {
  13527. WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback");
  13528. if (ssl != NULL) {
  13529. ssl->options.havePSK = 1;
  13530. ssl->options.session_psk_cb = cb;
  13531. }
  13532. WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS);
  13533. }
  13534. #endif
  13535. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  13536. wc_psk_server_callback cb)
  13537. {
  13538. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_server_callback");
  13539. if (ctx == NULL)
  13540. return;
  13541. ctx->havePSK = 1;
  13542. ctx->server_psk_cb = cb;
  13543. }
  13544. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  13545. {
  13546. byte haveRSA = 1;
  13547. int keySz = 0;
  13548. WOLFSSL_ENTER("wolfSSL_set_psk_server_callback");
  13549. if (ssl == NULL)
  13550. return;
  13551. ssl->options.havePSK = 1;
  13552. ssl->options.server_psk_cb = cb;
  13553. #ifdef NO_RSA
  13554. haveRSA = 0;
  13555. #endif
  13556. #ifndef NO_CERTS
  13557. keySz = ssl->buffers.keySz;
  13558. #endif
  13559. if (AllocateSuites(ssl) != 0)
  13560. return;
  13561. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13562. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13563. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13564. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13565. ssl->options.useAnon, TRUE, ssl->options.side);
  13566. }
  13567. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  13568. {
  13569. WOLFSSL_ENTER("wolfSSL_get_psk_identity_hint");
  13570. if (ssl == NULL || ssl->arrays == NULL)
  13571. return NULL;
  13572. return ssl->arrays->server_hint;
  13573. }
  13574. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  13575. {
  13576. WOLFSSL_ENTER("wolfSSL_get_psk_identity");
  13577. if (ssl == NULL || ssl->arrays == NULL)
  13578. return NULL;
  13579. return ssl->arrays->client_identity;
  13580. }
  13581. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  13582. {
  13583. WOLFSSL_ENTER("wolfSSL_CTX_use_psk_identity_hint");
  13584. if (hint == 0)
  13585. ctx->server_hint[0] = '\0';
  13586. else {
  13587. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  13588. #ifdef WOLFSSL_QT
  13589. ctx->havePSK=1;
  13590. #endif
  13591. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  13592. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  13593. }
  13594. return WOLFSSL_SUCCESS;
  13595. }
  13596. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  13597. {
  13598. WOLFSSL_ENTER("wolfSSL_use_psk_identity_hint");
  13599. if (ssl == NULL || ssl->arrays == NULL)
  13600. return WOLFSSL_FAILURE;
  13601. if (hint == 0)
  13602. ssl->arrays->server_hint[0] = 0;
  13603. else {
  13604. XSTRNCPY(ssl->arrays->server_hint, hint,
  13605. sizeof(ssl->arrays->server_hint)-1);
  13606. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  13607. }
  13608. return WOLFSSL_SUCCESS;
  13609. }
  13610. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  13611. {
  13612. return ssl ? ssl->options.psk_ctx : NULL;
  13613. }
  13614. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  13615. {
  13616. return ctx ? ctx->psk_ctx : NULL;
  13617. }
  13618. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  13619. {
  13620. if (ssl == NULL)
  13621. return WOLFSSL_FAILURE;
  13622. ssl->options.psk_ctx = psk_ctx;
  13623. return WOLFSSL_SUCCESS;
  13624. }
  13625. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  13626. {
  13627. if (ctx == NULL)
  13628. return WOLFSSL_FAILURE;
  13629. ctx->psk_ctx = psk_ctx;
  13630. return WOLFSSL_SUCCESS;
  13631. }
  13632. #endif /* NO_PSK */
  13633. #ifdef HAVE_ANON
  13634. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  13635. {
  13636. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  13637. if (ctx == NULL)
  13638. return WOLFSSL_FAILURE;
  13639. ctx->useAnon = 1;
  13640. return WOLFSSL_SUCCESS;
  13641. }
  13642. #endif /* HAVE_ANON */
  13643. #ifndef NO_CERTS
  13644. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  13645. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  13646. const unsigned char* in,
  13647. long sz, int format, int userChain,
  13648. word32 flags)
  13649. {
  13650. int verify;
  13651. int ret = WOLFSSL_FAILURE;
  13652. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  13653. verify = GET_VERIFY_SETTING_CTX(ctx);
  13654. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  13655. verify = VERIFY_SKIP_DATE;
  13656. if (format == WOLFSSL_FILETYPE_PEM)
  13657. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  13658. verify);
  13659. else
  13660. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  13661. userChain, verify);
  13662. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  13663. if (ret == WOLFSSL_SUCCESS)
  13664. ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format);
  13665. #endif
  13666. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  13667. return ret;
  13668. }
  13669. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  13670. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  13671. const unsigned char* in,
  13672. long sz, int format)
  13673. {
  13674. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  13675. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13676. }
  13677. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  13678. const unsigned char* in,
  13679. long sz, int format)
  13680. {
  13681. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  13682. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13683. }
  13684. #ifdef WOLFSSL_TRUST_PEER_CERT
  13685. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  13686. const unsigned char* in,
  13687. long sz, int format)
  13688. {
  13689. int verify;
  13690. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  13691. /* sanity check on arguments */
  13692. if (sz < 0 || in == NULL || ctx == NULL) {
  13693. return BAD_FUNC_ARG;
  13694. }
  13695. #if (WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  13696. verify = VERIFY_SKIP_DATE;
  13697. #else
  13698. verify = GET_VERIFY_SETTING_CTX(ctx);
  13699. #endif
  13700. if (format == WOLFSSL_FILETYPE_PEM)
  13701. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  13702. NULL, verify);
  13703. else
  13704. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  13705. NULL, 0, verify);
  13706. }
  13707. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13708. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  13709. const unsigned char* in, long sz, int format)
  13710. {
  13711. int ret = WOLFSSL_FAILURE;
  13712. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  13713. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  13714. GET_VERIFY_SETTING_CTX(ctx));
  13715. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  13716. return ret;
  13717. }
  13718. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  13719. const unsigned char* in, long sz, int format)
  13720. {
  13721. int ret = WOLFSSL_FAILURE;
  13722. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  13723. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  13724. 0, GET_VERIFY_SETTING_CTX(ctx));
  13725. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  13726. return ret;
  13727. }
  13728. #ifdef WOLF_PRIVATE_KEY_ID
  13729. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13730. long sz, int devId, long keySz)
  13731. {
  13732. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  13733. if (ret == WOLFSSL_SUCCESS)
  13734. ctx->privateKeySz = (word32)keySz;
  13735. return ret;
  13736. }
  13737. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13738. long sz, int devId)
  13739. {
  13740. int ret = WOLFSSL_FAILURE;
  13741. FreeDer(&ctx->privateKey);
  13742. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13743. ctx->heap) == 0) {
  13744. XMEMCPY(ctx->privateKey->buffer, id, sz);
  13745. ctx->privateKeyId = 1;
  13746. if (devId != INVALID_DEVID)
  13747. ctx->privateKeyDevId = devId;
  13748. else
  13749. ctx->privateKeyDevId = ctx->devId;
  13750. ret = WOLFSSL_SUCCESS;
  13751. }
  13752. return ret;
  13753. }
  13754. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  13755. int devId)
  13756. {
  13757. int ret = WOLFSSL_FAILURE;
  13758. word32 sz = (word32)XSTRLEN(label) + 1;
  13759. FreeDer(&ctx->privateKey);
  13760. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13761. ctx->heap) == 0) {
  13762. XMEMCPY(ctx->privateKey->buffer, label, sz);
  13763. ctx->privateKeyLabel = 1;
  13764. if (devId != INVALID_DEVID)
  13765. ctx->privateKeyDevId = devId;
  13766. else
  13767. ctx->privateKeyDevId = ctx->devId;
  13768. ret = WOLFSSL_SUCCESS;
  13769. }
  13770. return ret;
  13771. }
  13772. #endif /* WOLF_PRIVATE_KEY_ID */
  13773. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  13774. const unsigned char* in, long sz, int format)
  13775. {
  13776. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  13777. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  13778. GET_VERIFY_SETTING_CTX(ctx));
  13779. }
  13780. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  13781. const unsigned char* in, long sz)
  13782. {
  13783. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  13784. WOLFSSL_FILETYPE_PEM);
  13785. }
  13786. #ifndef NO_DH
  13787. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  13788. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  13789. const unsigned char* buf,
  13790. long sz, int format)
  13791. {
  13792. DerBuffer* der = NULL;
  13793. int ret = 0;
  13794. word32 pSz = MAX_DH_SIZE;
  13795. word32 gSz = MAX_DH_SIZE;
  13796. #ifdef WOLFSSL_SMALL_STACK
  13797. byte* p = NULL;
  13798. byte* g = NULL;
  13799. #else
  13800. byte p[MAX_DH_SIZE];
  13801. byte g[MAX_DH_SIZE];
  13802. #endif
  13803. if (ctx == NULL || buf == NULL)
  13804. return BAD_FUNC_ARG;
  13805. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  13806. if (ret != 0) {
  13807. return ret;
  13808. }
  13809. der->buffer = (byte*)buf;
  13810. der->length = (word32)sz;
  13811. #ifdef WOLFSSL_SMALL_STACK
  13812. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13813. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13814. if (p == NULL || g == NULL) {
  13815. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13816. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13817. return MEMORY_E;
  13818. }
  13819. #endif
  13820. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  13821. ret = WOLFSSL_BAD_FILETYPE;
  13822. else {
  13823. if (format == WOLFSSL_FILETYPE_PEM) {
  13824. #ifdef WOLFSSL_PEM_TO_DER
  13825. FreeDer(&der);
  13826. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  13827. NULL, NULL);
  13828. if (ret < 0) {
  13829. /* Also try X9.42 format */
  13830. ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap,
  13831. NULL, NULL);
  13832. }
  13833. #ifdef WOLFSSL_WPAS
  13834. #ifndef NO_DSA
  13835. if (ret < 0) {
  13836. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  13837. NULL, NULL);
  13838. }
  13839. #endif
  13840. #endif /* WOLFSSL_WPAS */
  13841. #else
  13842. ret = NOT_COMPILED_IN;
  13843. #endif /* WOLFSSL_PEM_TO_DER */
  13844. }
  13845. if (ret == 0) {
  13846. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  13847. ret = WOLFSSL_BAD_FILETYPE;
  13848. else if (ssl)
  13849. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  13850. else
  13851. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  13852. }
  13853. }
  13854. FreeDer(&der);
  13855. #ifdef WOLFSSL_SMALL_STACK
  13856. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13857. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13858. #endif
  13859. return ret;
  13860. }
  13861. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13862. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  13863. int format)
  13864. {
  13865. if (ssl == NULL)
  13866. return BAD_FUNC_ARG;
  13867. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  13868. }
  13869. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13870. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  13871. long sz, int format)
  13872. {
  13873. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  13874. }
  13875. #endif /* NO_DH */
  13876. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  13877. const unsigned char* in, long sz, int format)
  13878. {
  13879. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  13880. if (ssl == NULL)
  13881. return BAD_FUNC_ARG;
  13882. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  13883. GET_VERIFY_SETTING_SSL(ssl));
  13884. }
  13885. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  13886. const unsigned char* in, long sz, int format)
  13887. {
  13888. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  13889. if (ssl == NULL)
  13890. return BAD_FUNC_ARG;
  13891. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  13892. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  13893. }
  13894. #ifdef WOLF_PRIVATE_KEY_ID
  13895. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  13896. long sz, int devId, long keySz)
  13897. {
  13898. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  13899. if (ret == WOLFSSL_SUCCESS)
  13900. ssl->buffers.keySz = (word32)keySz;
  13901. return ret;
  13902. }
  13903. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  13904. long sz, int devId)
  13905. {
  13906. int ret = WOLFSSL_FAILURE;
  13907. if (ssl->buffers.weOwnKey)
  13908. FreeDer(&ssl->buffers.key);
  13909. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13910. ssl->heap) == 0) {
  13911. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  13912. ssl->buffers.weOwnKey = 1;
  13913. ssl->buffers.keyId = 1;
  13914. if (devId != INVALID_DEVID)
  13915. ssl->buffers.keyDevId = devId;
  13916. else
  13917. ssl->buffers.keyDevId = ssl->devId;
  13918. ret = WOLFSSL_SUCCESS;
  13919. }
  13920. return ret;
  13921. }
  13922. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  13923. {
  13924. int ret = WOLFSSL_FAILURE;
  13925. word32 sz = (word32)XSTRLEN(label) + 1;
  13926. if (ssl->buffers.weOwnKey)
  13927. FreeDer(&ssl->buffers.key);
  13928. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13929. ssl->heap) == 0) {
  13930. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  13931. ssl->buffers.weOwnKey = 1;
  13932. ssl->buffers.keyLabel = 1;
  13933. if (devId != INVALID_DEVID)
  13934. ssl->buffers.keyDevId = devId;
  13935. else
  13936. ssl->buffers.keyDevId = ssl->devId;
  13937. ret = WOLFSSL_SUCCESS;
  13938. }
  13939. return ret;
  13940. }
  13941. #endif /* WOLF_PRIVATE_KEY_ID */
  13942. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  13943. const unsigned char* in, long sz, int format)
  13944. {
  13945. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  13946. if (ssl == NULL)
  13947. return BAD_FUNC_ARG;
  13948. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  13949. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  13950. }
  13951. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  13952. const unsigned char* in, long sz)
  13953. {
  13954. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  13955. WOLFSSL_FILETYPE_PEM);
  13956. }
  13957. /* unload any certs or keys that SSL owns, leave CTX as is
  13958. WOLFSSL_SUCCESS on ok */
  13959. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  13960. {
  13961. if (ssl == NULL) {
  13962. WOLFSSL_MSG("Null function arg");
  13963. return BAD_FUNC_ARG;
  13964. }
  13965. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  13966. WOLFSSL_MSG("Unloading cert");
  13967. FreeDer(&ssl->buffers.certificate);
  13968. #ifdef KEEP_OUR_CERT
  13969. wolfSSL_X509_free(ssl->ourCert);
  13970. ssl->ourCert = NULL;
  13971. #endif
  13972. ssl->buffers.weOwnCert = 0;
  13973. }
  13974. if (ssl->buffers.weOwnCertChain) {
  13975. WOLFSSL_MSG("Unloading cert chain");
  13976. FreeDer(&ssl->buffers.certChain);
  13977. ssl->buffers.weOwnCertChain = 0;
  13978. }
  13979. if (ssl->buffers.weOwnKey) {
  13980. WOLFSSL_MSG("Unloading key");
  13981. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  13982. FreeDer(&ssl->buffers.key);
  13983. ssl->buffers.weOwnKey = 0;
  13984. }
  13985. #ifdef WOLFSSL_DUAL_ALG_CERTS
  13986. if (ssl->buffers.weOwnAltKey) {
  13987. WOLFSSL_MSG("Unloading alt key");
  13988. ForceZero(ssl->buffers.altKey->buffer, ssl->buffers.altKey->length);
  13989. FreeDer(&ssl->buffers.altKey);
  13990. ssl->buffers.weOwnAltKey = 0;
  13991. }
  13992. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  13993. return WOLFSSL_SUCCESS;
  13994. }
  13995. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  13996. {
  13997. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  13998. if (ctx == NULL)
  13999. return BAD_FUNC_ARG;
  14000. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  14001. }
  14002. int wolfSSL_CTX_UnloadIntermediateCerts(WOLFSSL_CTX* ctx)
  14003. {
  14004. WOLFSSL_ENTER("wolfSSL_CTX_UnloadIntermediateCerts");
  14005. if (ctx == NULL)
  14006. return BAD_FUNC_ARG;
  14007. if (ctx->ref.count > 1) {
  14008. WOLFSSL_MSG("ctx object must have a ref count of 1 before "
  14009. "unloading intermediate certs");
  14010. return BAD_STATE_E;
  14011. }
  14012. return wolfSSL_CertManagerUnloadIntermediateCerts(ctx->cm);
  14013. }
  14014. #ifdef WOLFSSL_TRUST_PEER_CERT
  14015. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  14016. {
  14017. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  14018. if (ctx == NULL)
  14019. return BAD_FUNC_ARG;
  14020. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  14021. }
  14022. #ifdef WOLFSSL_LOCAL_X509_STORE
  14023. int wolfSSL_Unload_trust_peers(WOLFSSL* ssl)
  14024. {
  14025. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  14026. if (ssl == NULL)
  14027. return BAD_FUNC_ARG;
  14028. SSL_CM_WARNING(ssl);
  14029. return wolfSSL_CertManagerUnload_trust_peers(SSL_CM(ssl));
  14030. }
  14031. #endif /* WOLFSSL_LOCAL_X509_STORE */
  14032. #endif /* WOLFSSL_TRUST_PEER_CERT */
  14033. /* old NO_FILESYSTEM end */
  14034. #endif /* !NO_CERTS */
  14035. #ifdef OPENSSL_EXTRA
  14036. int wolfSSL_add_all_algorithms(void)
  14037. {
  14038. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  14039. if (initRefCount != 0 || wolfSSL_Init() == WOLFSSL_SUCCESS)
  14040. return WOLFSSL_SUCCESS;
  14041. else
  14042. return WOLFSSL_FATAL_ERROR;
  14043. }
  14044. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  14045. {
  14046. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  14047. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  14048. return WOLFSSL_FATAL_ERROR;
  14049. return WOLFSSL_SUCCESS;
  14050. }
  14051. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  14052. {
  14053. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  14054. /* This function is currently the same as
  14055. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  14056. the use of a wolfssl.cnf type configuration file and is only used for
  14057. OpenSSL compatibility. */
  14058. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  14059. return WOLFSSL_FATAL_ERROR;
  14060. }
  14061. return WOLFSSL_SUCCESS;
  14062. }
  14063. /* returns previous set cache size which stays constant */
  14064. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  14065. {
  14066. /* cache size fixed at compile time in wolfSSL */
  14067. (void)ctx;
  14068. (void)sz;
  14069. WOLFSSL_MSG("session cache is set at compile time");
  14070. #ifndef NO_SESSION_CACHE
  14071. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  14072. #else
  14073. return 0;
  14074. #endif
  14075. }
  14076. #endif
  14077. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  14078. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14079. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  14080. {
  14081. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  14082. if (mode)
  14083. ctx->quietShutdown = 1;
  14084. }
  14085. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  14086. {
  14087. WOLFSSL_ENTER("wolfSSL_set_quiet_shutdown");
  14088. if (mode)
  14089. ssl->options.quietShutdown = 1;
  14090. }
  14091. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL ||
  14092. WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14093. #ifdef OPENSSL_EXTRA
  14094. #ifndef NO_BIO
  14095. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  14096. {
  14097. WOLFSSL_ENTER("wolfSSL_set_bio");
  14098. if (ssl == NULL) {
  14099. WOLFSSL_MSG("Bad argument, ssl was NULL");
  14100. return;
  14101. }
  14102. /* free any existing WOLFSSL_BIOs in use but don't free those in
  14103. * a chain */
  14104. if (ssl->biord != NULL) {
  14105. if (ssl->biord != ssl->biowr) {
  14106. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  14107. wolfSSL_BIO_free(ssl->biowr);
  14108. ssl->biowr = NULL;
  14109. }
  14110. if (ssl->biord->prev != NULL)
  14111. wolfSSL_BIO_free(ssl->biord);
  14112. ssl->biord = NULL;
  14113. }
  14114. /* set flag obviously */
  14115. if (rd && !(rd->flags & WOLFSSL_BIO_FLAG_READ))
  14116. rd->flags |= WOLFSSL_BIO_FLAG_READ;
  14117. if (wr && !(wr->flags & WOLFSSL_BIO_FLAG_WRITE))
  14118. wr->flags |= WOLFSSL_BIO_FLAG_WRITE;
  14119. ssl->biord = rd;
  14120. ssl->biowr = wr;
  14121. /* set SSL to use BIO callbacks instead */
  14122. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  14123. ssl->CBIORecv = BioReceive;
  14124. }
  14125. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  14126. ssl->CBIOSend = BioSend;
  14127. }
  14128. /* User programs should always retry reading from these BIOs */
  14129. if (rd) {
  14130. /* User writes to rd */
  14131. BIO_set_retry_write(rd);
  14132. }
  14133. if (wr) {
  14134. /* User reads from wr */
  14135. BIO_set_retry_read(wr);
  14136. }
  14137. }
  14138. #endif /* !NO_BIO */
  14139. #endif /* OPENSSL_EXTRA */
  14140. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  14141. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  14142. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  14143. {
  14144. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  14145. if (ctx != NULL) {
  14146. wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL);
  14147. ctx->client_ca_names = names;
  14148. }
  14149. }
  14150. void wolfSSL_set_client_CA_list(WOLFSSL* ssl,
  14151. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  14152. {
  14153. WOLFSSL_ENTER("wolfSSL_set_client_CA_list");
  14154. if (ssl != NULL) {
  14155. if (ssl->client_ca_names != ssl->ctx->client_ca_names)
  14156. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  14157. ssl->client_ca_names = names;
  14158. }
  14159. }
  14160. #ifdef OPENSSL_EXTRA
  14161. /* registers client cert callback, called during handshake if server
  14162. requests client auth but user has not loaded client cert/key */
  14163. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  14164. {
  14165. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  14166. if (ctx != NULL) {
  14167. ctx->CBClientCert = cb;
  14168. }
  14169. }
  14170. void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx,
  14171. CertSetupCallback cb, void *arg)
  14172. {
  14173. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_cb");
  14174. if (ctx == NULL)
  14175. return;
  14176. ctx->certSetupCb = cb;
  14177. ctx->certSetupCbArg = arg;
  14178. }
  14179. int wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl,
  14180. const byte** suites, word16* suiteSz,
  14181. const byte** hashSigAlgo, word16* hashSigAlgoSz)
  14182. {
  14183. WOLFSSL_ENTER("wolfSSL_get_client_suites_sigalgs");
  14184. if (suites != NULL)
  14185. *suites = NULL;
  14186. if (suiteSz != NULL)
  14187. *suiteSz = 0;
  14188. if (hashSigAlgo != NULL)
  14189. *hashSigAlgo = NULL;
  14190. if (hashSigAlgoSz != NULL)
  14191. *hashSigAlgoSz = 0;
  14192. if (ssl != NULL && ssl->clSuites != NULL) {
  14193. if (suites != NULL && suiteSz != NULL) {
  14194. *suites = ssl->clSuites->suites;
  14195. *suiteSz = ssl->clSuites->suiteSz;
  14196. }
  14197. if (hashSigAlgo != NULL && hashSigAlgoSz != NULL) {
  14198. *hashSigAlgo = ssl->clSuites->hashSigAlgo;
  14199. *hashSigAlgoSz = ssl->clSuites->hashSigAlgoSz;
  14200. }
  14201. return WOLFSSL_SUCCESS;
  14202. }
  14203. return WOLFSSL_FAILURE;
  14204. }
  14205. WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first,
  14206. byte second)
  14207. {
  14208. WOLFSSL_CIPHERSUITE_INFO info;
  14209. info.rsaAuth = (byte)(CipherRequires(first, second, REQUIRES_RSA) ||
  14210. CipherRequires(first, second, REQUIRES_RSA_SIG));
  14211. info.eccAuth = (byte)(CipherRequires(first, second, REQUIRES_ECC) ||
  14212. /* Static ECC ciphers may require RSA for authentication */
  14213. (CipherRequires(first, second, REQUIRES_ECC_STATIC) &&
  14214. !CipherRequires(first, second, REQUIRES_RSA_SIG)));
  14215. info.eccStatic =
  14216. (byte)CipherRequires(first, second, REQUIRES_ECC_STATIC);
  14217. info.psk = (byte)CipherRequires(first, second, REQUIRES_PSK);
  14218. return info;
  14219. }
  14220. /**
  14221. * @param first First byte of the hash and signature algorithm
  14222. * @param second Second byte of the hash and signature algorithm
  14223. * @param hashAlgo The enum wc_HashType of the MAC algorithm
  14224. * @param sigAlgo The enum Key_Sum of the authentication algorithm
  14225. */
  14226. int wolfSSL_get_sigalg_info(byte first, byte second,
  14227. int* hashAlgo, int* sigAlgo)
  14228. {
  14229. byte input[2];
  14230. byte hashType;
  14231. byte sigType;
  14232. if (hashAlgo == NULL || sigAlgo == NULL)
  14233. return BAD_FUNC_ARG;
  14234. input[0] = first;
  14235. input[1] = second;
  14236. DecodeSigAlg(input, &hashType, &sigType);
  14237. /* cast so that compiler reminds us of unimplemented values */
  14238. switch ((enum SignatureAlgorithm)sigType) {
  14239. case anonymous_sa_algo:
  14240. *sigAlgo = ANONk;
  14241. break;
  14242. case rsa_sa_algo:
  14243. *sigAlgo = RSAk;
  14244. break;
  14245. case dsa_sa_algo:
  14246. *sigAlgo = DSAk;
  14247. break;
  14248. case ecc_dsa_sa_algo:
  14249. *sigAlgo = ECDSAk;
  14250. break;
  14251. case rsa_pss_sa_algo:
  14252. *sigAlgo = RSAPSSk;
  14253. break;
  14254. case ed25519_sa_algo:
  14255. *sigAlgo = ED25519k;
  14256. break;
  14257. case rsa_pss_pss_algo:
  14258. *sigAlgo = RSAPSSk;
  14259. break;
  14260. case ed448_sa_algo:
  14261. *sigAlgo = ED448k;
  14262. break;
  14263. case falcon_level1_sa_algo:
  14264. *sigAlgo = FALCON_LEVEL1k;
  14265. break;
  14266. case falcon_level5_sa_algo:
  14267. *sigAlgo = FALCON_LEVEL5k;
  14268. break;
  14269. case dilithium_level2_sa_algo:
  14270. *sigAlgo = DILITHIUM_LEVEL2k;
  14271. break;
  14272. case dilithium_level3_sa_algo:
  14273. *sigAlgo = DILITHIUM_LEVEL3k;
  14274. break;
  14275. case dilithium_level5_sa_algo:
  14276. *sigAlgo = DILITHIUM_LEVEL5k;
  14277. break;
  14278. case sm2_sa_algo:
  14279. *sigAlgo = SM2k;
  14280. break;
  14281. case invalid_sa_algo:
  14282. default:
  14283. *hashAlgo = WC_HASH_TYPE_NONE;
  14284. *sigAlgo = 0;
  14285. return BAD_FUNC_ARG;
  14286. }
  14287. /* cast so that compiler reminds us of unimplemented values */
  14288. switch((enum wc_MACAlgorithm)hashType) {
  14289. case no_mac:
  14290. case rmd_mac: /* Don't have a RIPEMD type in wc_HashType */
  14291. *hashAlgo = WC_HASH_TYPE_NONE;
  14292. break;
  14293. case md5_mac:
  14294. *hashAlgo = WC_HASH_TYPE_MD5;
  14295. break;
  14296. case sha_mac:
  14297. *hashAlgo = WC_HASH_TYPE_SHA;
  14298. break;
  14299. case sha224_mac:
  14300. *hashAlgo = WC_HASH_TYPE_SHA224;
  14301. break;
  14302. case sha256_mac:
  14303. *hashAlgo = WC_HASH_TYPE_SHA256;
  14304. break;
  14305. case sha384_mac:
  14306. *hashAlgo = WC_HASH_TYPE_SHA384;
  14307. break;
  14308. case sha512_mac:
  14309. *hashAlgo = WC_HASH_TYPE_SHA512;
  14310. break;
  14311. case blake2b_mac:
  14312. *hashAlgo = WC_HASH_TYPE_BLAKE2B;
  14313. break;
  14314. case sm3_mac:
  14315. #ifdef WOLFSSL_SM3
  14316. *hashAlgo = WC_HASH_TYPE_SM3;
  14317. #else
  14318. *hashAlgo = WC_HASH_TYPE_NONE;
  14319. #endif
  14320. break;
  14321. default:
  14322. *hashAlgo = WC_HASH_TYPE_NONE;
  14323. *sigAlgo = 0;
  14324. return BAD_FUNC_ARG;
  14325. }
  14326. return 0;
  14327. }
  14328. /**
  14329. * Internal wrapper for calling certSetupCb
  14330. * @param ssl The SSL/TLS Object
  14331. * @return 0 on success
  14332. */
  14333. int CertSetupCbWrapper(WOLFSSL* ssl)
  14334. {
  14335. int ret = 0;
  14336. if (ssl->ctx->certSetupCb != NULL) {
  14337. WOLFSSL_MSG("Calling user cert setup callback");
  14338. ret = ssl->ctx->certSetupCb(ssl, ssl->ctx->certSetupCbArg);
  14339. if (ret == 1) {
  14340. WOLFSSL_MSG("User cert callback returned success");
  14341. ret = 0;
  14342. }
  14343. else if (ret == 0) {
  14344. SendAlert(ssl, alert_fatal, internal_error);
  14345. ret = CLIENT_CERT_CB_ERROR;
  14346. }
  14347. else if (ret < 0) {
  14348. ret = WOLFSSL_ERROR_WANT_X509_LOOKUP;
  14349. }
  14350. else {
  14351. WOLFSSL_MSG("Unexpected user callback return");
  14352. ret = CLIENT_CERT_CB_ERROR;
  14353. }
  14354. }
  14355. return ret;
  14356. }
  14357. #endif /* OPENSSL_EXTRA */
  14358. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  14359. #ifndef WOLFSSL_NO_CA_NAMES
  14360. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  14361. const WOLFSSL_CTX *ctx)
  14362. {
  14363. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  14364. if (ctx == NULL) {
  14365. WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list");
  14366. return NULL;
  14367. }
  14368. return ctx->client_ca_names;
  14369. }
  14370. /* returns the CA's set on server side or the CA's sent from server when
  14371. * on client side */
  14372. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  14373. const WOLFSSL* ssl)
  14374. {
  14375. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  14376. if (ssl == NULL) {
  14377. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  14378. return NULL;
  14379. }
  14380. return SSL_CA_NAMES(ssl);
  14381. }
  14382. #if !defined(NO_CERTS)
  14383. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  14384. {
  14385. WOLFSSL_X509_NAME *nameCopy = NULL;
  14386. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  14387. if (ctx == NULL || x509 == NULL){
  14388. WOLFSSL_MSG("Bad argument");
  14389. return WOLFSSL_FAILURE;
  14390. }
  14391. if (ctx->client_ca_names == NULL) {
  14392. ctx->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  14393. if (ctx->client_ca_names == NULL) {
  14394. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  14395. return WOLFSSL_FAILURE;
  14396. }
  14397. }
  14398. nameCopy = wolfSSL_X509_NAME_dup(wolfSSL_X509_get_subject_name(x509));
  14399. if (nameCopy == NULL) {
  14400. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  14401. return WOLFSSL_FAILURE;
  14402. }
  14403. if (wolfSSL_sk_X509_NAME_push(ctx->client_ca_names, nameCopy) != WOLFSSL_SUCCESS) {
  14404. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  14405. wolfSSL_X509_NAME_free(nameCopy);
  14406. return WOLFSSL_FAILURE;
  14407. }
  14408. return WOLFSSL_SUCCESS;
  14409. }
  14410. #endif
  14411. #ifndef NO_BIO
  14412. #if !defined(NO_RSA) && !defined(NO_CERTS)
  14413. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  14414. {
  14415. /* The webserver build is using this to load a CA into the server
  14416. * for client authentication as an option. Have this return NULL in
  14417. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  14418. * the function. */
  14419. #ifdef OPENSSL_EXTRA
  14420. WOLFSSL_STACK *list = NULL;
  14421. WOLFSSL_BIO* bio = NULL;
  14422. WOLFSSL_X509 *cert = NULL;
  14423. WOLFSSL_X509_NAME *nameCopy = NULL;
  14424. unsigned long err = WOLFSSL_FAILURE;
  14425. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  14426. bio = wolfSSL_BIO_new_file(fname, "rb");
  14427. if (bio == NULL) {
  14428. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  14429. goto cleanup;
  14430. }
  14431. list = wolfSSL_sk_X509_NAME_new(NULL);
  14432. if (list == NULL) {
  14433. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  14434. goto cleanup;
  14435. }
  14436. /* Read each certificate in the chain out of the file. */
  14437. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  14438. /* Need a persistent copy of the subject name. */
  14439. nameCopy = wolfSSL_X509_NAME_dup(
  14440. wolfSSL_X509_get_subject_name(cert));
  14441. if (nameCopy == NULL) {
  14442. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  14443. goto cleanup;
  14444. }
  14445. /*
  14446. * Original cert will be freed so make sure not to try to access
  14447. * it in the future.
  14448. */
  14449. nameCopy->x509 = NULL;
  14450. if (wolfSSL_sk_X509_NAME_push(list, nameCopy) !=
  14451. WOLFSSL_SUCCESS) {
  14452. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  14453. /* Do free in loop because nameCopy is now responsibility
  14454. * of list to free and adding jumps to cleanup after this
  14455. * might result in a double free. */
  14456. wolfSSL_X509_NAME_free(nameCopy);
  14457. goto cleanup;
  14458. }
  14459. wolfSSL_X509_free(cert);
  14460. cert = NULL;
  14461. }
  14462. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  14463. err = WOLFSSL_SUCCESS;
  14464. cleanup:
  14465. wolfSSL_X509_free(cert);
  14466. wolfSSL_BIO_free(bio);
  14467. if (err != WOLFSSL_SUCCESS) {
  14468. /* We failed so return NULL */
  14469. wolfSSL_sk_X509_NAME_pop_free(list, NULL);
  14470. list = NULL;
  14471. }
  14472. return list;
  14473. #else
  14474. (void)fname;
  14475. return NULL;
  14476. #endif
  14477. }
  14478. #endif
  14479. #endif /* !NO_BIO */
  14480. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
  14481. #ifdef OPENSSL_EXTRA
  14482. #ifdef WOLFSSL_SYS_CA_CERTS
  14483. /*
  14484. * This is an OpenSSL compatibility layer function, but it doesn't mirror
  14485. * the exact functionality of its OpenSSL counterpart. We don't support the
  14486. * notion of an "OpenSSL directory". This function will attempt to load the
  14487. * environment variables SSL_CERT_DIR and SSL_CERT_FILE, if either are found,
  14488. * they will be loaded. Otherwise, it will act as a wrapper around our
  14489. * native wolfSSL_CTX_load_system_CA_certs function. This function does
  14490. * conform to OpenSSL's return value conventions.
  14491. */
  14492. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  14493. {
  14494. int ret;
  14495. #ifdef XGETENV
  14496. char* certDir;
  14497. char* certFile;
  14498. word32 flags;
  14499. #endif
  14500. WOLFSSL_ENTER("wolfSSL_CTX_set_default_verify_paths");
  14501. #ifdef XGETENV
  14502. certDir = XGETENV("SSL_CERT_DIR");
  14503. certFile = XGETENV("SSL_CERT_FILE");
  14504. flags = WOLFSSL_LOAD_FLAG_PEM_CA_ONLY;
  14505. if (certDir || certFile) {
  14506. if (certDir) {
  14507. /*
  14508. * We want to keep trying to load more CAs even if one cert in
  14509. * the directory is bad and can't be used (e.g. if one is expired),
  14510. * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR.
  14511. */
  14512. flags |= WOLFSSL_LOAD_FLAG_IGNORE_ERR;
  14513. }
  14514. ret = wolfSSL_CTX_load_verify_locations_ex(ctx, certFile, certDir,
  14515. flags);
  14516. if (ret != WOLFSSL_SUCCESS) {
  14517. WOLFSSL_MSG_EX("Failed to load CA certs from SSL_CERT_FILE: %s"
  14518. " SSL_CERT_DIR: %s. Error: %d", certFile,
  14519. certDir, ret);
  14520. return WOLFSSL_FAILURE;
  14521. }
  14522. return ret;
  14523. }
  14524. #endif
  14525. #ifdef NO_FILESYSTEM
  14526. WOLFSSL_MSG("wolfSSL_CTX_set_default_verify_paths not supported"
  14527. " with NO_FILESYSTEM enabled");
  14528. ret = WOLFSSL_FATAL_ERROR;
  14529. #else
  14530. ret = wolfSSL_CTX_load_system_CA_certs(ctx);
  14531. if (ret == WOLFSSL_BAD_PATH) {
  14532. /*
  14533. * OpenSSL doesn't treat the lack of a system CA cert directory as a
  14534. * failure. We do the same here.
  14535. */
  14536. ret = WOLFSSL_SUCCESS;
  14537. }
  14538. #endif
  14539. WOLFSSL_LEAVE("wolfSSL_CTX_set_default_verify_paths", ret);
  14540. return ret;
  14541. }
  14542. #endif /* WOLFSSL_SYS_CA_CERTS */
  14543. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  14544. && !defined(WC_NO_RNG)
  14545. static const byte srp_N[] = {
  14546. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  14547. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  14548. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  14549. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  14550. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  14551. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  14552. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  14553. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  14554. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  14555. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  14556. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  14557. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  14558. };
  14559. static const byte srp_g[] = {
  14560. 0x02
  14561. };
  14562. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  14563. {
  14564. int r = 0;
  14565. SrpSide srp_side = SRP_CLIENT_SIDE;
  14566. byte salt[SRP_SALT_SIZE];
  14567. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  14568. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  14569. return WOLFSSL_FAILURE;
  14570. if (ctx->method->side == WOLFSSL_SERVER_END){
  14571. srp_side = SRP_SERVER_SIDE;
  14572. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  14573. srp_side = SRP_CLIENT_SIDE;
  14574. } else {
  14575. WOLFSSL_MSG("Init CTX failed");
  14576. return WOLFSSL_FAILURE;
  14577. }
  14578. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  14579. WOLFSSL_MSG("Init SRP CTX failed");
  14580. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  14581. ctx->srp = NULL;
  14582. return WOLFSSL_FAILURE;
  14583. }
  14584. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  14585. (word32)XSTRLEN(username));
  14586. if (r < 0) {
  14587. WOLFSSL_MSG("fail to set srp username.");
  14588. return WOLFSSL_FAILURE;
  14589. }
  14590. /* if wolfSSL_CTX_set_srp_password has already been called, */
  14591. /* execute wc_SrpSetPassword here */
  14592. if (ctx->srp_password != NULL) {
  14593. WC_RNG rng;
  14594. if (wc_InitRng(&rng) < 0){
  14595. WOLFSSL_MSG("wc_InitRng failed");
  14596. return WOLFSSL_FAILURE;
  14597. }
  14598. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14599. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14600. wc_FreeRng(&rng);
  14601. if (r < 0) {
  14602. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14603. return WOLFSSL_FAILURE;
  14604. }
  14605. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14606. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14607. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  14608. WOLFSSL_MSG("wc_SrpSetParam failed");
  14609. return WOLFSSL_FAILURE;
  14610. }
  14611. r = wc_SrpSetPassword(ctx->srp,
  14612. (const byte*)ctx->srp_password,
  14613. (word32)XSTRLEN((char *)ctx->srp_password));
  14614. if (r < 0) {
  14615. WOLFSSL_MSG("fail to set srp password.");
  14616. return WOLFSSL_FAILURE;
  14617. }
  14618. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  14619. ctx->srp_password = NULL;
  14620. }
  14621. return WOLFSSL_SUCCESS;
  14622. }
  14623. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  14624. {
  14625. int r;
  14626. byte salt[SRP_SALT_SIZE];
  14627. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  14628. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  14629. return WOLFSSL_FAILURE;
  14630. if (ctx->srp->user != NULL) {
  14631. WC_RNG rng;
  14632. if (wc_InitRng(&rng) < 0) {
  14633. WOLFSSL_MSG("wc_InitRng failed");
  14634. return WOLFSSL_FAILURE;
  14635. }
  14636. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14637. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14638. wc_FreeRng(&rng);
  14639. if (r < 0) {
  14640. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14641. return WOLFSSL_FAILURE;
  14642. }
  14643. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14644. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14645. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  14646. WOLFSSL_MSG("wc_SrpSetParam failed");
  14647. wc_FreeRng(&rng);
  14648. return WOLFSSL_FAILURE;
  14649. }
  14650. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  14651. (word32)XSTRLEN(password));
  14652. if (r < 0) {
  14653. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  14654. wc_FreeRng(&rng);
  14655. return WOLFSSL_FAILURE;
  14656. }
  14657. if (ctx->srp_password != NULL){
  14658. XFREE(ctx->srp_password,NULL,
  14659. DYNAMIC_TYPE_SRP);
  14660. ctx->srp_password = NULL;
  14661. }
  14662. wc_FreeRng(&rng);
  14663. } else {
  14664. /* save password for wolfSSL_set_srp_username */
  14665. if (ctx->srp_password != NULL)
  14666. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  14667. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  14668. DYNAMIC_TYPE_SRP);
  14669. if (ctx->srp_password == NULL){
  14670. WOLFSSL_MSG("memory allocation error");
  14671. return WOLFSSL_FAILURE;
  14672. }
  14673. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  14674. }
  14675. return WOLFSSL_SUCCESS;
  14676. }
  14677. /**
  14678. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  14679. * that the requested strength is less than or equal to the size of the
  14680. * static modulus size.
  14681. * @param ctx Not used
  14682. * @param strength Minimum number of bits for the modulus
  14683. * @return 1 if strength is less than or equal to static modulus
  14684. * 0 if strength is greater than static modulus
  14685. */
  14686. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  14687. {
  14688. (void)ctx;
  14689. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  14690. if (strength > (int)(sizeof(srp_N)*8)) {
  14691. WOLFSSL_MSG("Bad Parameter");
  14692. return WOLFSSL_FAILURE;
  14693. }
  14694. return WOLFSSL_SUCCESS;
  14695. }
  14696. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  14697. {
  14698. if (ssl && ssl->ctx && ssl->ctx->srp) {
  14699. return (char*) ssl->ctx->srp->user;
  14700. }
  14701. return NULL;
  14702. }
  14703. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  14704. /* keyblock size in bytes or -1 */
  14705. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  14706. {
  14707. if (ssl == NULL)
  14708. return WOLFSSL_FATAL_ERROR;
  14709. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  14710. ssl->specs.hash_size);
  14711. }
  14712. #endif /* OPENSSL_EXTRA */
  14713. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14714. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  14715. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  14716. unsigned char** sr, unsigned int* srLen,
  14717. unsigned char** cr, unsigned int* crLen)
  14718. {
  14719. if (ssl == NULL || ssl->arrays == NULL)
  14720. return WOLFSSL_FATAL_ERROR;
  14721. *ms = ssl->arrays->masterSecret;
  14722. *sr = ssl->arrays->serverRandom;
  14723. *cr = ssl->arrays->clientRandom;
  14724. *msLen = SECRET_LEN;
  14725. *srLen = RAN_LEN;
  14726. *crLen = RAN_LEN;
  14727. return WOLFSSL_SUCCESS;
  14728. }
  14729. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  14730. {
  14731. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  14732. if (ssl == NULL)
  14733. return;
  14734. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14735. #ifdef HAVE_ECC
  14736. #ifdef WOLFSSL_SMALL_STACK
  14737. ecc_key* key = NULL;
  14738. #else
  14739. ecc_key key[1];
  14740. #endif
  14741. word32 idx = 0;
  14742. #ifdef WOLFSSL_SMALL_STACK
  14743. key = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  14744. DYNAMIC_TYPE_ECC);
  14745. if (key == NULL) {
  14746. WOLFSSL_MSG("Error allocating memory for ecc_key");
  14747. }
  14748. #endif
  14749. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  14750. if (wc_ecc_init(key) >= 0) {
  14751. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  14752. key, ssl->buffers.key->length) != 0) {
  14753. ssl->options.haveECDSAsig = 0;
  14754. ssl->options.haveECC = 0;
  14755. ssl->options.haveStaticECC = 0;
  14756. }
  14757. wc_ecc_free(key);
  14758. }
  14759. }
  14760. #ifdef WOLFSSL_SMALL_STACK
  14761. XFREE(key, ssl->heap, DYNAMIC_TYPE_ECC);
  14762. #endif
  14763. #endif
  14764. #ifndef NO_DH
  14765. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  14766. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  14767. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  14768. ssl->options.haveDH = 1;
  14769. }
  14770. #endif
  14771. }
  14772. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  14773. WOLFSSL_MSG("Error initializing server side");
  14774. }
  14775. }
  14776. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14777. /* return true if connection established */
  14778. int wolfSSL_is_init_finished(const WOLFSSL* ssl)
  14779. {
  14780. if (ssl == NULL)
  14781. return 0;
  14782. /* Can't use ssl->options.connectState and ssl->options.acceptState because
  14783. * they differ in meaning for TLS <=1.2 and 1.3 */
  14784. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  14785. return 1;
  14786. return 0;
  14787. }
  14788. #ifdef OPENSSL_EXTRA
  14789. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  14790. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  14791. {
  14792. /* wolfSSL verifies all these internally */
  14793. (void)ctx;
  14794. (void)f;
  14795. }
  14796. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  14797. {
  14798. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  14799. if(ssl==NULL) {
  14800. WOLFSSL_MSG("Shutdown not set. ssl is null");
  14801. return;
  14802. }
  14803. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  14804. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  14805. }
  14806. #endif
  14807. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  14808. {
  14809. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  14810. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  14811. if(ctx == NULL)
  14812. return BAD_FUNC_ARG;
  14813. return ctx->mask;
  14814. }
  14815. /* forward declaration */
  14816. static long wolf_set_options(long old_op, long op);
  14817. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  14818. {
  14819. WOLFSSL_ENTER("wolfSSL_CTX_set_options");
  14820. if (ctx == NULL)
  14821. return BAD_FUNC_ARG;
  14822. ctx->mask = wolf_set_options(ctx->mask, opt);
  14823. #if defined(HAVE_SESSION_TICKET) && (defined(OPENSSL_EXTRA) \
  14824. || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL))
  14825. if ((ctx->mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  14826. ctx->noTicketTls12 = 1;
  14827. }
  14828. /* This code is here for documentation purpose. You must not turn off
  14829. * session tickets with the WOLFSSL_OP_NO_TICKET option for TLSv1.3.
  14830. * Because we need to support both stateful and stateless tickets.
  14831. #ifdef WOLFSSL_TLS13
  14832. if ((ctx->mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  14833. ctx->noTicketTls13 = 1;
  14834. }
  14835. #endif
  14836. */
  14837. #endif
  14838. return ctx->mask;
  14839. }
  14840. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  14841. {
  14842. WOLFSSL_ENTER("wolfSSL_CTX_clear_options");
  14843. if(ctx == NULL)
  14844. return BAD_FUNC_ARG;
  14845. ctx->mask &= ~opt;
  14846. return ctx->mask;
  14847. }
  14848. #ifdef OPENSSL_EXTRA
  14849. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  14850. {
  14851. WOLFSSL_ENTER("wolfSSL_set_rfd");
  14852. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  14853. ssl->IOCB_ReadCtx = &ssl->rfd;
  14854. #ifdef WOLFSSL_DTLS
  14855. if (ssl->options.dtls) {
  14856. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  14857. ssl->buffers.dtlsCtx.rfd = rfd;
  14858. }
  14859. #endif
  14860. return WOLFSSL_SUCCESS;
  14861. }
  14862. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  14863. {
  14864. WOLFSSL_ENTER("wolfSSL_set_wfd");
  14865. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  14866. ssl->IOCB_WriteCtx = &ssl->wfd;
  14867. return WOLFSSL_SUCCESS;
  14868. }
  14869. #endif /* OPENSSL_EXTRA */
  14870. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  14871. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  14872. /**
  14873. * Implemented in a similar way that ngx_ssl_ocsp_validate does it when
  14874. * SSL_get0_verified_chain is not available.
  14875. * @param ssl WOLFSSL object to extract certs from
  14876. * @return Stack of verified certs
  14877. */
  14878. WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
  14879. {
  14880. WOLF_STACK_OF(WOLFSSL_X509)* chain = NULL;
  14881. WOLFSSL_X509_STORE_CTX* storeCtx = NULL;
  14882. WOLFSSL_X509* peerCert = NULL;
  14883. WOLFSSL_ENTER("wolfSSL_get0_verified_chain");
  14884. if (ssl == NULL || ssl->ctx == NULL) {
  14885. WOLFSSL_MSG("Bad parameter");
  14886. return NULL;
  14887. }
  14888. peerCert = wolfSSL_get_peer_certificate((WOLFSSL*)ssl);
  14889. if (peerCert == NULL) {
  14890. WOLFSSL_MSG("wolfSSL_get_peer_certificate error");
  14891. return NULL;
  14892. }
  14893. /* wolfSSL_get_peer_certificate returns a copy. We want the internal
  14894. * member so that we don't have to worry about free'ing it. We call
  14895. * wolfSSL_get_peer_certificate so that we don't have to worry about
  14896. * setting up the internal pointer. */
  14897. wolfSSL_X509_free(peerCert);
  14898. peerCert = (WOLFSSL_X509*)&ssl->peerCert;
  14899. chain = wolfSSL_get_peer_cert_chain(ssl);
  14900. if (chain == NULL) {
  14901. WOLFSSL_MSG("wolfSSL_get_peer_cert_chain error");
  14902. return NULL;
  14903. }
  14904. storeCtx = wolfSSL_X509_STORE_CTX_new();
  14905. if (storeCtx == NULL) {
  14906. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_new error");
  14907. return NULL;
  14908. }
  14909. if (wolfSSL_X509_STORE_CTX_init(storeCtx, SSL_STORE(ssl),
  14910. peerCert, chain) != WOLFSSL_SUCCESS) {
  14911. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init error");
  14912. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14913. return NULL;
  14914. }
  14915. if (wolfSSL_X509_verify_cert(storeCtx) <= 0) {
  14916. WOLFSSL_MSG("wolfSSL_X509_verify_cert error");
  14917. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14918. return NULL;
  14919. }
  14920. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14921. return chain;
  14922. }
  14923. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  14924. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  14925. {
  14926. if (ctx == NULL) {
  14927. return NULL;
  14928. }
  14929. if (ctx->x509_store_pt != NULL)
  14930. return ctx->x509_store_pt;
  14931. return &ctx->x509_store;
  14932. }
  14933. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  14934. {
  14935. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_store");
  14936. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  14937. return;
  14938. }
  14939. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  14940. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  14941. return;
  14942. }
  14943. /* free cert manager if have one */
  14944. if (ctx->cm != NULL) {
  14945. wolfSSL_CertManagerFree(ctx->cm);
  14946. }
  14947. ctx->cm = str->cm;
  14948. ctx->x509_store.cm = str->cm;
  14949. /* free existing store if it exists */
  14950. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  14951. ctx->x509_store.cache = str->cache;
  14952. ctx->x509_store_pt = str; /* take ownership of store and free it
  14953. with CTX free */
  14954. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has ownership
  14955. and free it with CTX free*/
  14956. }
  14957. #ifdef OPENSSL_ALL
  14958. int wolfSSL_CTX_set1_verify_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  14959. {
  14960. WOLFSSL_ENTER("wolfSSL_CTX_set1_verify_cert_store");
  14961. if (ctx == NULL || str == NULL) {
  14962. WOLFSSL_MSG("Bad parameter");
  14963. return WOLFSSL_FAILURE;
  14964. }
  14965. /* NO-OP when setting existing store */
  14966. if (str == CTX_STORE(ctx))
  14967. return WOLFSSL_SUCCESS;
  14968. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  14969. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  14970. return WOLFSSL_FAILURE;
  14971. }
  14972. /* free existing store if it exists */
  14973. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  14974. ctx->x509_store_pt = str; /* take ownership of store and free it
  14975. with CTX free */
  14976. return WOLFSSL_SUCCESS;
  14977. }
  14978. #endif
  14979. int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  14980. {
  14981. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  14982. if (ssl == NULL || str == NULL) {
  14983. WOLFSSL_MSG("Bad parameter");
  14984. return WOLFSSL_FAILURE;
  14985. }
  14986. /* NO-OP when setting existing store */
  14987. if (str == SSL_STORE(ssl))
  14988. return WOLFSSL_SUCCESS;
  14989. /* free existing store if it exists */
  14990. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  14991. if (str == ssl->ctx->x509_store_pt)
  14992. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  14993. to using that instead */
  14994. else
  14995. ssl->x509_store_pt = str; /* take ownership of store and free it
  14996. with SSL free */
  14997. return WOLFSSL_SUCCESS;
  14998. }
  14999. int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  15000. {
  15001. WOLFSSL_ENTER("wolfSSL_set1_verify_cert_store");
  15002. if (ssl == NULL || str == NULL) {
  15003. WOLFSSL_MSG("Bad parameter");
  15004. return WOLFSSL_FAILURE;
  15005. }
  15006. /* NO-OP when setting existing store */
  15007. if (str == SSL_STORE(ssl))
  15008. return WOLFSSL_SUCCESS;
  15009. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  15010. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  15011. return WOLFSSL_FAILURE;
  15012. }
  15013. /* free existing store if it exists */
  15014. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  15015. if (str == ssl->ctx->x509_store_pt)
  15016. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  15017. to using that instead */
  15018. else
  15019. ssl->x509_store_pt = str; /* take ownership of store and free it
  15020. with SSL free */
  15021. return WOLFSSL_SUCCESS;
  15022. }
  15023. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  15024. #ifdef WOLFSSL_ENCRYPTED_KEYS
  15025. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  15026. void* userdata)
  15027. {
  15028. WOLFSSL_ENTER("wolfSSL_CTX_set_default_passwd_cb_userdata");
  15029. if (ctx)
  15030. ctx->passwd_userdata = userdata;
  15031. }
  15032. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx, wc_pem_password_cb*
  15033. cb)
  15034. {
  15035. WOLFSSL_ENTER("wolfSSL_CTX_set_default_passwd_cb");
  15036. if (ctx)
  15037. ctx->passwd_cb = cb;
  15038. }
  15039. wc_pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  15040. {
  15041. if (ctx == NULL || ctx->passwd_cb == NULL) {
  15042. return NULL;
  15043. }
  15044. return ctx->passwd_cb;
  15045. }
  15046. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  15047. {
  15048. if (ctx == NULL) {
  15049. return NULL;
  15050. }
  15051. return ctx->passwd_userdata;
  15052. }
  15053. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  15054. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
  15055. unsigned long wolfSSL_ERR_get_error(void)
  15056. {
  15057. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  15058. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15059. return wc_GetErrorNodeErr();
  15060. #else
  15061. return (unsigned long)(0 - NOT_COMPILED_IN);
  15062. #endif
  15063. }
  15064. #endif
  15065. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  15066. int wolfSSL_num_locks(void)
  15067. {
  15068. return 0;
  15069. }
  15070. void wolfSSL_set_locking_callback(mutex_cb* f)
  15071. {
  15072. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  15073. if (wc_SetMutexCb(f) != 0) {
  15074. WOLFSSL_MSG("Error when setting mutex call back");
  15075. }
  15076. }
  15077. mutex_cb* wolfSSL_get_locking_callback(void)
  15078. {
  15079. WOLFSSL_ENTER("wolfSSL_get_locking_callback");
  15080. return wc_GetMutexCb();
  15081. }
  15082. typedef unsigned long (idCb)(void);
  15083. static idCb* inner_idCb = NULL;
  15084. unsigned long wolfSSL_thread_id(void)
  15085. {
  15086. if (inner_idCb != NULL) {
  15087. return inner_idCb();
  15088. }
  15089. else {
  15090. return 0;
  15091. }
  15092. }
  15093. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  15094. {
  15095. inner_idCb = f;
  15096. }
  15097. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15098. #ifndef NO_BIO
  15099. /* print out and clear all errors */
  15100. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  15101. {
  15102. const char* file = NULL;
  15103. const char* reason = NULL;
  15104. int ret;
  15105. int line = 0;
  15106. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  15107. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  15108. if (bio == NULL) {
  15109. WOLFSSL_MSG("BIO passed in was null");
  15110. return;
  15111. }
  15112. do {
  15113. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  15114. if (ret >= 0) {
  15115. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  15116. if (XSNPRINTF(buf, sizeof(buf),
  15117. "error:%d:wolfSSL library:%s:%s:%d\n",
  15118. ret, r, file, line)
  15119. >= (int)sizeof(buf))
  15120. {
  15121. WOLFSSL_MSG("Buffer overrun formatting error message");
  15122. }
  15123. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  15124. wc_RemoveErrorNode(0);
  15125. }
  15126. } while (ret >= 0);
  15127. if (wolfSSL_BIO_write(bio, "", 1) != 1) {
  15128. WOLFSSL_MSG("Issue writing final string terminator");
  15129. }
  15130. }
  15131. #endif /* !NO_BIO */
  15132. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  15133. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  15134. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15135. defined(HAVE_SECRET_CALLBACK)
  15136. #if !defined(NO_WOLFSSL_SERVER)
  15137. /* Return the amount of random bytes copied over or error case.
  15138. * ssl : ssl struct after handshake
  15139. * out : buffer to hold random bytes
  15140. * outSz : either 0 (return max buffer sz) or size of out buffer
  15141. */
  15142. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  15143. size_t outSz)
  15144. {
  15145. size_t size;
  15146. /* return max size of buffer */
  15147. if (outSz == 0) {
  15148. return RAN_LEN;
  15149. }
  15150. if (ssl == NULL || out == NULL) {
  15151. return 0;
  15152. }
  15153. if (ssl->arrays == NULL) {
  15154. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15155. return 0;
  15156. }
  15157. if (outSz > RAN_LEN) {
  15158. size = RAN_LEN;
  15159. }
  15160. else {
  15161. size = outSz;
  15162. }
  15163. XMEMCPY(out, ssl->arrays->serverRandom, size);
  15164. return size;
  15165. }
  15166. #endif /* !NO_WOLFSSL_SERVER */
  15167. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15168. #ifdef OPENSSL_EXTRA
  15169. #if !defined(NO_WOLFSSL_SERVER)
  15170. /* Used to get the peer ephemeral public key sent during the connection
  15171. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  15172. * before the ephemeral key is stored.
  15173. * return WOLFSSL_SUCCESS on success */
  15174. int wolfSSL_get_peer_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  15175. {
  15176. WOLFSSL_EVP_PKEY* ret = NULL;
  15177. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  15178. if (ssl == NULL || pkey == NULL) {
  15179. WOLFSSL_MSG("Bad argument passed in");
  15180. return WOLFSSL_FAILURE;
  15181. }
  15182. #ifdef HAVE_ECC
  15183. if (ssl->peerEccKey != NULL) {
  15184. unsigned char* der;
  15185. const unsigned char* pt;
  15186. unsigned int derSz = 0;
  15187. int sz;
  15188. PRIVATE_KEY_UNLOCK();
  15189. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  15190. LENGTH_ONLY_E) {
  15191. WOLFSSL_MSG("get ecc der size failed");
  15192. PRIVATE_KEY_LOCK();
  15193. return WOLFSSL_FAILURE;
  15194. }
  15195. PRIVATE_KEY_LOCK();
  15196. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  15197. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  15198. if (der == NULL) {
  15199. WOLFSSL_MSG("Memory error");
  15200. return WOLFSSL_FAILURE;
  15201. }
  15202. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  15203. WOLFSSL_MSG("get ecc der failed");
  15204. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  15205. return WOLFSSL_FAILURE;
  15206. }
  15207. pt = der; /* in case pointer gets advanced */
  15208. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  15209. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  15210. }
  15211. #endif
  15212. *pkey = ret;
  15213. #ifdef HAVE_ECC
  15214. if (ret != NULL)
  15215. return WOLFSSL_SUCCESS;
  15216. else
  15217. #endif
  15218. return WOLFSSL_FAILURE;
  15219. }
  15220. #endif /* !NO_WOLFSSL_SERVER */
  15221. /**
  15222. * This function checks if any compiled in protocol versions are
  15223. * left enabled after calls to set_min or set_max API.
  15224. * @param major The SSL/TLS major version
  15225. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15226. * protocol versions are left enabled.
  15227. */
  15228. static int CheckSslMethodVersion(byte major, unsigned long options)
  15229. {
  15230. int sanityConfirmed = 0;
  15231. (void)options;
  15232. switch (major) {
  15233. #ifndef NO_TLS
  15234. case SSLv3_MAJOR:
  15235. #ifdef WOLFSSL_ALLOW_SSLV3
  15236. if (!(options & WOLFSSL_OP_NO_SSLv3)) {
  15237. sanityConfirmed = 1;
  15238. }
  15239. #endif
  15240. #ifndef NO_OLD_TLS
  15241. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15242. sanityConfirmed = 1;
  15243. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15244. sanityConfirmed = 1;
  15245. #endif
  15246. #ifndef WOLFSSL_NO_TLS12
  15247. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15248. sanityConfirmed = 1;
  15249. #endif
  15250. #ifdef WOLFSSL_TLS13
  15251. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15252. sanityConfirmed = 1;
  15253. #endif
  15254. break;
  15255. #endif
  15256. #ifdef WOLFSSL_DTLS
  15257. case DTLS_MAJOR:
  15258. sanityConfirmed = 1;
  15259. break;
  15260. #endif
  15261. default:
  15262. WOLFSSL_MSG("Invalid major version");
  15263. return WOLFSSL_FAILURE;
  15264. }
  15265. if (!sanityConfirmed) {
  15266. WOLFSSL_MSG("All compiled in TLS versions disabled");
  15267. return WOLFSSL_FAILURE;
  15268. }
  15269. return WOLFSSL_SUCCESS;
  15270. }
  15271. /**
  15272. * protoVerTbl holds (D)TLS version numbers in ascending order.
  15273. * Except DTLS versions, the newer version is located in the latter part of
  15274. * the table. This table is referred by wolfSSL_CTX_set_min_proto_version and
  15275. * wolfSSL_CTX_set_max_proto_version.
  15276. */
  15277. static const int protoVerTbl[] = {
  15278. SSL3_VERSION,
  15279. TLS1_VERSION,
  15280. TLS1_1_VERSION,
  15281. TLS1_2_VERSION,
  15282. TLS1_3_VERSION,
  15283. DTLS1_VERSION,
  15284. DTLS1_2_VERSION
  15285. };
  15286. /* number of protocol versions listed in protoVerTbl */
  15287. #define NUMBER_OF_PROTOCOLS (sizeof(protoVerTbl)/sizeof(int))
  15288. /**
  15289. * wolfSSL_CTX_set_min_proto_version attempts to set the minimum protocol
  15290. * version to use by SSL objects created from this WOLFSSL_CTX.
  15291. * This API guarantees that a version of SSL/TLS lower than specified
  15292. * here will not be allowed. If the version specified is not compiled in
  15293. * then this API sets the lowest compiled in protocol version.
  15294. * This API also accept 0 as version, to set the minimum version automatically.
  15295. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  15296. * are enabled.
  15297. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  15298. * @param version Any of the following
  15299. * * 0
  15300. * * SSL3_VERSION
  15301. * * TLS1_VERSION
  15302. * * TLS1_1_VERSION
  15303. * * TLS1_2_VERSION
  15304. * * TLS1_3_VERSION
  15305. * * DTLS1_VERSION
  15306. * * DTLS1_2_VERSION
  15307. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15308. * protocol versions are left enabled.
  15309. */
  15310. static int Set_CTX_min_proto_version(WOLFSSL_CTX* ctx, int version)
  15311. {
  15312. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version_ex");
  15313. if (ctx == NULL) {
  15314. return WOLFSSL_FAILURE;
  15315. }
  15316. switch (version) {
  15317. #ifndef NO_TLS
  15318. case SSL3_VERSION:
  15319. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  15320. ctx->minDowngrade = SSLv3_MINOR;
  15321. break;
  15322. #endif
  15323. case TLS1_VERSION:
  15324. #ifdef WOLFSSL_ALLOW_TLSV10
  15325. ctx->minDowngrade = TLSv1_MINOR;
  15326. break;
  15327. #endif
  15328. case TLS1_1_VERSION:
  15329. #ifndef NO_OLD_TLS
  15330. ctx->minDowngrade = TLSv1_1_MINOR;
  15331. break;
  15332. #endif
  15333. case TLS1_2_VERSION:
  15334. #ifndef WOLFSSL_NO_TLS12
  15335. ctx->minDowngrade = TLSv1_2_MINOR;
  15336. break;
  15337. #endif
  15338. case TLS1_3_VERSION:
  15339. #ifdef WOLFSSL_TLS13
  15340. ctx->minDowngrade = TLSv1_3_MINOR;
  15341. break;
  15342. #endif
  15343. #endif
  15344. #ifdef WOLFSSL_DTLS
  15345. case DTLS1_VERSION:
  15346. #ifndef NO_OLD_TLS
  15347. ctx->minDowngrade = DTLS_MINOR;
  15348. break;
  15349. #endif
  15350. case DTLS1_2_VERSION:
  15351. ctx->minDowngrade = DTLSv1_2_MINOR;
  15352. break;
  15353. #endif
  15354. default:
  15355. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15356. return WOLFSSL_FAILURE;
  15357. }
  15358. switch (version) {
  15359. #ifndef NO_TLS
  15360. case TLS1_3_VERSION:
  15361. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  15362. FALL_THROUGH;
  15363. case TLS1_2_VERSION:
  15364. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  15365. FALL_THROUGH;
  15366. case TLS1_1_VERSION:
  15367. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  15368. FALL_THROUGH;
  15369. case TLS1_VERSION:
  15370. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  15371. break;
  15372. case SSL3_VERSION:
  15373. case SSL2_VERSION:
  15374. /* Nothing to do here */
  15375. break;
  15376. #endif
  15377. #ifdef WOLFSSL_DTLS
  15378. case DTLS1_VERSION:
  15379. case DTLS1_2_VERSION:
  15380. break;
  15381. #endif
  15382. default:
  15383. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15384. return WOLFSSL_FAILURE;
  15385. }
  15386. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  15387. }
  15388. /* Sets the min protocol version allowed with WOLFSSL_CTX
  15389. * returns WOLFSSL_SUCCESS on success */
  15390. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  15391. {
  15392. int ret;
  15393. int proto = 0;
  15394. int maxProto = 0;
  15395. int i;
  15396. int idx = 0;
  15397. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  15398. if (ctx == NULL) {
  15399. return WOLFSSL_FAILURE;
  15400. }
  15401. if (version != 0) {
  15402. proto = version;
  15403. ctx->minProto = 0; /* turn min proto flag off */
  15404. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15405. if (protoVerTbl[i] == version) {
  15406. break;
  15407. }
  15408. }
  15409. }
  15410. else {
  15411. /* when 0 is specified as version, try to find out the min version */
  15412. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15413. ret = Set_CTX_min_proto_version(ctx, protoVerTbl[i]);
  15414. if (ret == WOLFSSL_SUCCESS) {
  15415. proto = protoVerTbl[i];
  15416. ctx->minProto = 1; /* turn min proto flag on */
  15417. break;
  15418. }
  15419. }
  15420. }
  15421. /* check case where max > min , if so then clear the NO_* options
  15422. * i is the index into the table for proto version used, see if the max
  15423. * proto version index found is smaller */
  15424. maxProto = wolfSSL_CTX_get_max_proto_version(ctx);
  15425. for (idx = 0; (unsigned)idx < NUMBER_OF_PROTOCOLS; idx++) {
  15426. if (protoVerTbl[idx] == maxProto) {
  15427. break;
  15428. }
  15429. }
  15430. if (idx < i) {
  15431. wolfSSL_CTX_clear_options(ctx, WOLFSSL_OP_NO_TLSv1 |
  15432. WOLFSSL_OP_NO_TLSv1_1 | WOLFSSL_OP_NO_TLSv1_2 |
  15433. WOLFSSL_OP_NO_TLSv1_3);
  15434. }
  15435. ret = Set_CTX_min_proto_version(ctx, proto);
  15436. return ret;
  15437. }
  15438. /**
  15439. * wolfSSL_CTX_set_max_proto_version attempts to set the maximum protocol
  15440. * version to use by SSL objects created from this WOLFSSL_CTX.
  15441. * This API guarantees that a version of SSL/TLS higher than specified
  15442. * here will not be allowed. If the version specified is not compiled in
  15443. * then this API sets the highest compiled in protocol version.
  15444. * This API also accept 0 as version, to set the maximum version automatically.
  15445. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  15446. * are enabled.
  15447. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  15448. * @param ver Any of the following
  15449. * * 0
  15450. * * SSL3_VERSION
  15451. * * TLS1_VERSION
  15452. * * TLS1_1_VERSION
  15453. * * TLS1_2_VERSION
  15454. * * TLS1_3_VERSION
  15455. * * DTLS1_VERSION
  15456. * * DTLS1_2_VERSION
  15457. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15458. * protocol versions are left enabled.
  15459. */
  15460. static int Set_CTX_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  15461. {
  15462. int ret;
  15463. WOLFSSL_ENTER("Set_CTX_max_proto_version");
  15464. if (!ctx || !ctx->method) {
  15465. WOLFSSL_MSG("Bad parameter");
  15466. return WOLFSSL_FAILURE;
  15467. }
  15468. switch (ver) {
  15469. case SSL2_VERSION:
  15470. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15471. return WOLFSSL_FAILURE;
  15472. #ifndef NO_TLS
  15473. case SSL3_VERSION:
  15474. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  15475. FALL_THROUGH;
  15476. case TLS1_VERSION:
  15477. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  15478. FALL_THROUGH;
  15479. case TLS1_1_VERSION:
  15480. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  15481. FALL_THROUGH;
  15482. case TLS1_2_VERSION:
  15483. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  15484. FALL_THROUGH;
  15485. case TLS1_3_VERSION:
  15486. /* Nothing to do here */
  15487. break;
  15488. #endif
  15489. #ifdef WOLFSSL_DTLS
  15490. case DTLS1_VERSION:
  15491. case DTLS1_2_VERSION:
  15492. break;
  15493. #endif
  15494. default:
  15495. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15496. return WOLFSSL_FAILURE;
  15497. }
  15498. ret = CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  15499. if (ret == WOLFSSL_SUCCESS) {
  15500. /* Check the major */
  15501. switch (ver) {
  15502. #ifndef NO_TLS
  15503. case SSL3_VERSION:
  15504. case TLS1_VERSION:
  15505. case TLS1_1_VERSION:
  15506. case TLS1_2_VERSION:
  15507. case TLS1_3_VERSION:
  15508. if (ctx->method->version.major != SSLv3_MAJOR) {
  15509. WOLFSSL_MSG("Mismatched protocol version");
  15510. return WOLFSSL_FAILURE;
  15511. }
  15512. break;
  15513. #endif
  15514. #ifdef WOLFSSL_DTLS
  15515. case DTLS1_VERSION:
  15516. case DTLS1_2_VERSION:
  15517. if (ctx->method->version.major != DTLS_MAJOR) {
  15518. WOLFSSL_MSG("Mismatched protocol version");
  15519. return WOLFSSL_FAILURE;
  15520. }
  15521. break;
  15522. #endif
  15523. }
  15524. /* Update the method */
  15525. switch (ver) {
  15526. case SSL2_VERSION:
  15527. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15528. return WOLFSSL_FAILURE;
  15529. #ifndef NO_TLS
  15530. case SSL3_VERSION:
  15531. ctx->method->version.minor = SSLv3_MINOR;
  15532. break;
  15533. case TLS1_VERSION:
  15534. ctx->method->version.minor = TLSv1_MINOR;
  15535. break;
  15536. case TLS1_1_VERSION:
  15537. ctx->method->version.minor = TLSv1_1_MINOR;
  15538. break;
  15539. case TLS1_2_VERSION:
  15540. ctx->method->version.minor = TLSv1_2_MINOR;
  15541. break;
  15542. case TLS1_3_VERSION:
  15543. ctx->method->version.minor = TLSv1_3_MINOR;
  15544. break;
  15545. #endif
  15546. #ifdef WOLFSSL_DTLS
  15547. case DTLS1_VERSION:
  15548. ctx->method->version.minor = DTLS_MINOR;
  15549. break;
  15550. case DTLS1_2_VERSION:
  15551. ctx->method->version.minor = DTLSv1_2_MINOR;
  15552. break;
  15553. #endif
  15554. default:
  15555. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15556. return WOLFSSL_FAILURE;
  15557. }
  15558. }
  15559. return ret;
  15560. }
  15561. /* Sets the max protocol version allowed with WOLFSSL_CTX
  15562. * returns WOLFSSL_SUCCESS on success */
  15563. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version)
  15564. {
  15565. int i;
  15566. int ret = WOLFSSL_FAILURE;
  15567. int minProto;
  15568. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  15569. if (ctx == NULL) {
  15570. return ret;
  15571. }
  15572. /* clear out flags and reset min protocol version */
  15573. minProto = wolfSSL_CTX_get_min_proto_version(ctx);
  15574. wolfSSL_CTX_clear_options(ctx,
  15575. WOLFSSL_OP_NO_TLSv1 | WOLFSSL_OP_NO_TLSv1_1 |
  15576. WOLFSSL_OP_NO_TLSv1_2 | WOLFSSL_OP_NO_TLSv1_3);
  15577. wolfSSL_CTX_set_min_proto_version(ctx, minProto);
  15578. if (version != 0) {
  15579. ctx->maxProto = 0; /* turn max proto flag off */
  15580. return Set_CTX_max_proto_version(ctx, version);
  15581. }
  15582. /* when 0 is specified as version, try to find out the min version from
  15583. * the bottom to top of the protoverTbl.
  15584. */
  15585. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15586. ret = Set_CTX_max_proto_version(ctx, protoVerTbl[i]);
  15587. if (ret == WOLFSSL_SUCCESS) {
  15588. ctx->maxProto = 1; /* turn max proto flag on */
  15589. break;
  15590. }
  15591. }
  15592. return ret;
  15593. }
  15594. static int Set_SSL_min_proto_version(WOLFSSL* ssl, int ver)
  15595. {
  15596. WOLFSSL_ENTER("Set_SSL_min_proto_version");
  15597. if (ssl == NULL) {
  15598. return WOLFSSL_FAILURE;
  15599. }
  15600. switch (ver) {
  15601. #ifndef NO_TLS
  15602. case SSL3_VERSION:
  15603. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  15604. ssl->options.minDowngrade = SSLv3_MINOR;
  15605. break;
  15606. #endif
  15607. case TLS1_VERSION:
  15608. #ifdef WOLFSSL_ALLOW_TLSV10
  15609. ssl->options.minDowngrade = TLSv1_MINOR;
  15610. break;
  15611. #endif
  15612. case TLS1_1_VERSION:
  15613. #ifndef NO_OLD_TLS
  15614. ssl->options.minDowngrade = TLSv1_1_MINOR;
  15615. break;
  15616. #endif
  15617. case TLS1_2_VERSION:
  15618. #ifndef WOLFSSL_NO_TLS12
  15619. ssl->options.minDowngrade = TLSv1_2_MINOR;
  15620. break;
  15621. #endif
  15622. case TLS1_3_VERSION:
  15623. #ifdef WOLFSSL_TLS13
  15624. ssl->options.minDowngrade = TLSv1_3_MINOR;
  15625. break;
  15626. #endif
  15627. #endif
  15628. #ifdef WOLFSSL_DTLS
  15629. case DTLS1_VERSION:
  15630. #ifndef NO_OLD_TLS
  15631. ssl->options.minDowngrade = DTLS_MINOR;
  15632. break;
  15633. #endif
  15634. case DTLS1_2_VERSION:
  15635. ssl->options.minDowngrade = DTLSv1_2_MINOR;
  15636. break;
  15637. #endif
  15638. default:
  15639. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15640. return WOLFSSL_FAILURE;
  15641. }
  15642. switch (ver) {
  15643. #ifndef NO_TLS
  15644. case TLS1_3_VERSION:
  15645. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15646. FALL_THROUGH;
  15647. case TLS1_2_VERSION:
  15648. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15649. FALL_THROUGH;
  15650. case TLS1_1_VERSION:
  15651. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15652. FALL_THROUGH;
  15653. case TLS1_VERSION:
  15654. ssl->options.mask |= WOLFSSL_OP_NO_SSLv3;
  15655. break;
  15656. case SSL3_VERSION:
  15657. case SSL2_VERSION:
  15658. /* Nothing to do here */
  15659. break;
  15660. #endif
  15661. #ifdef WOLFSSL_DTLS
  15662. case DTLS1_VERSION:
  15663. case DTLS1_2_VERSION:
  15664. break;
  15665. #endif
  15666. default:
  15667. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15668. return WOLFSSL_FAILURE;
  15669. }
  15670. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15671. }
  15672. int wolfSSL_set_min_proto_version(WOLFSSL* ssl, int version)
  15673. {
  15674. int i;
  15675. int ret = WOLFSSL_FAILURE;;
  15676. WOLFSSL_ENTER("wolfSSL_set_min_proto_version");
  15677. if (ssl == NULL) {
  15678. return WOLFSSL_FAILURE;
  15679. }
  15680. if (version != 0) {
  15681. return Set_SSL_min_proto_version(ssl, version);
  15682. }
  15683. /* when 0 is specified as version, try to find out the min version */
  15684. for (i= 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15685. ret = Set_SSL_min_proto_version(ssl, protoVerTbl[i]);
  15686. if (ret == WOLFSSL_SUCCESS)
  15687. break;
  15688. }
  15689. return ret;
  15690. }
  15691. static int Set_SSL_max_proto_version(WOLFSSL* ssl, int ver)
  15692. {
  15693. WOLFSSL_ENTER("Set_SSL_max_proto_version");
  15694. if (!ssl) {
  15695. WOLFSSL_MSG("Bad parameter");
  15696. return WOLFSSL_FAILURE;
  15697. }
  15698. switch (ver) {
  15699. case SSL2_VERSION:
  15700. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15701. return WOLFSSL_FAILURE;
  15702. #ifndef NO_TLS
  15703. case SSL3_VERSION:
  15704. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15705. FALL_THROUGH;
  15706. case TLS1_VERSION:
  15707. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15708. FALL_THROUGH;
  15709. case TLS1_1_VERSION:
  15710. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15711. FALL_THROUGH;
  15712. case TLS1_2_VERSION:
  15713. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3;
  15714. FALL_THROUGH;
  15715. case TLS1_3_VERSION:
  15716. /* Nothing to do here */
  15717. break;
  15718. #endif
  15719. #ifdef WOLFSSL_DTLS
  15720. case DTLS1_VERSION:
  15721. case DTLS1_2_VERSION:
  15722. break;
  15723. #endif
  15724. default:
  15725. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15726. return WOLFSSL_FAILURE;
  15727. }
  15728. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15729. }
  15730. int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version)
  15731. {
  15732. int i;
  15733. int ret = WOLFSSL_FAILURE;;
  15734. WOLFSSL_ENTER("wolfSSL_set_max_proto_version");
  15735. if (ssl == NULL) {
  15736. return WOLFSSL_FAILURE;
  15737. }
  15738. if (version != 0) {
  15739. return Set_SSL_max_proto_version(ssl, version);
  15740. }
  15741. /* when 0 is specified as version, try to find out the min version from
  15742. * the bottom to top of the protoverTbl.
  15743. */
  15744. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15745. ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]);
  15746. if (ret == WOLFSSL_SUCCESS)
  15747. break;
  15748. }
  15749. return ret;
  15750. }
  15751. static int GetMinProtoVersion(int minDowngrade)
  15752. {
  15753. int ret;
  15754. switch (minDowngrade) {
  15755. #ifndef NO_OLD_TLS
  15756. #ifdef WOLFSSL_ALLOW_SSLV3
  15757. case SSLv3_MINOR:
  15758. ret = SSL3_VERSION;
  15759. break;
  15760. #endif
  15761. #ifdef WOLFSSL_ALLOW_TLSV10
  15762. case TLSv1_MINOR:
  15763. ret = TLS1_VERSION;
  15764. break;
  15765. #endif
  15766. case TLSv1_1_MINOR:
  15767. ret = TLS1_1_VERSION;
  15768. break;
  15769. #endif
  15770. #ifndef WOLFSSL_NO_TLS12
  15771. case TLSv1_2_MINOR:
  15772. ret = TLS1_2_VERSION;
  15773. break;
  15774. #endif
  15775. #ifdef WOLFSSL_TLS13
  15776. case TLSv1_3_MINOR:
  15777. ret = TLS1_3_VERSION;
  15778. break;
  15779. #endif
  15780. default:
  15781. ret = 0;
  15782. break;
  15783. }
  15784. return ret;
  15785. }
  15786. int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  15787. {
  15788. int ret = 0;
  15789. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  15790. if (ctx != NULL) {
  15791. if (ctx->minProto) {
  15792. ret = 0;
  15793. }
  15794. else {
  15795. ret = GetMinProtoVersion(ctx->minDowngrade);
  15796. }
  15797. }
  15798. else {
  15799. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  15800. }
  15801. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  15802. return ret;
  15803. }
  15804. /* returns the maximum allowed protocol version given the 'options' used
  15805. * returns WOLFSSL_FATAL_ERROR on no match */
  15806. static int GetMaxProtoVersion(long options)
  15807. {
  15808. #ifndef NO_TLS
  15809. #ifdef WOLFSSL_TLS13
  15810. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15811. return TLS1_3_VERSION;
  15812. #endif
  15813. #ifndef WOLFSSL_NO_TLS12
  15814. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15815. return TLS1_2_VERSION;
  15816. #endif
  15817. #ifndef NO_OLD_TLS
  15818. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15819. return TLS1_1_VERSION;
  15820. #ifdef WOLFSSL_ALLOW_TLSV10
  15821. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15822. return TLS1_VERSION;
  15823. #endif
  15824. #ifdef WOLFSSL_ALLOW_SSLV3
  15825. if (!(options & WOLFSSL_OP_NO_SSLv3))
  15826. return SSL3_VERSION;
  15827. #endif
  15828. #endif
  15829. #else
  15830. (void)options;
  15831. #endif /* NO_TLS */
  15832. return WOLFSSL_FATAL_ERROR;
  15833. }
  15834. /* returns the maximum protocol version for 'ctx' */
  15835. int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx)
  15836. {
  15837. int ret = 0;
  15838. long options = 0; /* default to nothing set */
  15839. WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version");
  15840. if (ctx != NULL) {
  15841. options = wolfSSL_CTX_get_options(ctx);
  15842. }
  15843. if ((ctx != NULL) && ctx->maxProto) {
  15844. ret = 0;
  15845. }
  15846. else {
  15847. ret = GetMaxProtoVersion(options);
  15848. }
  15849. WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret);
  15850. if (ret == WOLFSSL_FATAL_ERROR) {
  15851. WOLFSSL_MSG("Error getting max proto version");
  15852. ret = 0; /* setting ret to 0 to match compat return */
  15853. }
  15854. return ret;
  15855. }
  15856. #endif /* OPENSSL_EXTRA */
  15857. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15858. defined(HAVE_SECRET_CALLBACK)
  15859. #if !defined(NO_WOLFSSL_CLIENT)
  15860. /* Return the amount of random bytes copied over or error case.
  15861. * ssl : ssl struct after handshake
  15862. * out : buffer to hold random bytes
  15863. * outSz : either 0 (return max buffer sz) or size of out buffer
  15864. */
  15865. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  15866. size_t outSz)
  15867. {
  15868. size_t size;
  15869. /* return max size of buffer */
  15870. if (outSz == 0) {
  15871. return RAN_LEN;
  15872. }
  15873. if (ssl == NULL || out == NULL) {
  15874. return 0;
  15875. }
  15876. if (ssl->arrays == NULL) {
  15877. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15878. return 0;
  15879. }
  15880. if (outSz > RAN_LEN) {
  15881. size = RAN_LEN;
  15882. }
  15883. else {
  15884. size = outSz;
  15885. }
  15886. XMEMCPY(out, ssl->arrays->clientRandom, size);
  15887. return size;
  15888. }
  15889. #endif /* !NO_WOLFSSL_CLIENT */
  15890. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15891. #ifdef OPENSSL_EXTRA
  15892. unsigned long wolfSSLeay(void)
  15893. {
  15894. return SSLEAY_VERSION_NUMBER;
  15895. }
  15896. unsigned long wolfSSL_OpenSSL_version_num(void)
  15897. {
  15898. return OPENSSL_VERSION_NUMBER;
  15899. }
  15900. const char* wolfSSLeay_version(int type)
  15901. {
  15902. (void)type;
  15903. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  15904. return wolfSSL_OpenSSL_version(type);
  15905. #else
  15906. return wolfSSL_OpenSSL_version();
  15907. #endif
  15908. }
  15909. #endif /* OPENSSL_EXTRA */
  15910. #ifdef OPENSSL_EXTRA
  15911. void wolfSSL_ERR_free_strings(void)
  15912. {
  15913. /* handled internally */
  15914. }
  15915. void wolfSSL_cleanup_all_ex_data(void)
  15916. {
  15917. /* nothing to do here */
  15918. }
  15919. #endif /* OPENSSL_EXTRA */
  15920. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) || \
  15921. defined(HAVE_CURL)
  15922. void wolfSSL_ERR_clear_error(void)
  15923. {
  15924. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  15925. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  15926. wc_ClearErrorNodes();
  15927. #endif
  15928. }
  15929. #endif
  15930. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15931. int wolfSSL_clear(WOLFSSL* ssl)
  15932. {
  15933. WOLFSSL_ENTER("wolfSSL_clear");
  15934. if (ssl == NULL) {
  15935. return WOLFSSL_FAILURE;
  15936. }
  15937. if (!ssl->options.handShakeDone) {
  15938. /* Only reset the session if we didn't complete a handshake */
  15939. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  15940. ssl->session = wolfSSL_NewSession(ssl->heap);
  15941. if (ssl->session == NULL) {
  15942. return WOLFSSL_FAILURE;
  15943. }
  15944. }
  15945. /* reset error */
  15946. ssl->error = 0;
  15947. /* reset option bits */
  15948. ssl->options.isClosed = 0;
  15949. ssl->options.connReset = 0;
  15950. ssl->options.sentNotify = 0;
  15951. ssl->options.closeNotify = 0;
  15952. ssl->options.sendVerify = 0;
  15953. ssl->options.serverState = NULL_STATE;
  15954. ssl->options.clientState = NULL_STATE;
  15955. ssl->options.connectState = CONNECT_BEGIN;
  15956. ssl->options.acceptState = ACCEPT_BEGIN;
  15957. ssl->options.handShakeState = NULL_STATE;
  15958. ssl->options.handShakeDone = 0;
  15959. ssl->options.processReply = 0; /* doProcessInit */
  15960. ssl->options.havePeerVerify = 0;
  15961. ssl->options.havePeerCert = 0;
  15962. ssl->options.peerAuthGood = 0;
  15963. ssl->options.tls1_3 = 0;
  15964. ssl->options.haveSessionId = 0;
  15965. ssl->options.tls = 0;
  15966. ssl->options.tls1_1 = 0;
  15967. #ifdef WOLFSSL_DTLS
  15968. ssl->options.dtlsStateful = 0;
  15969. #endif
  15970. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  15971. ssl->options.noPskDheKe = 0;
  15972. #ifdef HAVE_SUPPORTED_CURVES
  15973. ssl->options.onlyPskDheKe = 0;
  15974. #endif
  15975. #endif
  15976. #ifdef HAVE_SESSION_TICKET
  15977. #ifdef WOLFSSL_TLS13
  15978. ssl->options.ticketsSent = 0;
  15979. #endif
  15980. ssl->options.rejectTicket = 0;
  15981. #endif
  15982. #ifdef WOLFSSL_EARLY_DATA
  15983. ssl->earlyData = no_early_data;
  15984. ssl->earlyDataSz = 0;
  15985. #endif
  15986. #if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS)
  15987. TLSX_FreeAll(ssl->extensions, ssl->heap);
  15988. ssl->extensions = NULL;
  15989. #endif
  15990. if (ssl->keys.encryptionOn) {
  15991. ForceZero(ssl->buffers.inputBuffer.buffer -
  15992. ssl->buffers.inputBuffer.offset,
  15993. ssl->buffers.inputBuffer.bufferSize);
  15994. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15995. wc_MemZero_Check(ssl->buffers.inputBuffer.buffer -
  15996. ssl->buffers.inputBuffer.offset,
  15997. ssl->buffers.inputBuffer.bufferSize);
  15998. #endif
  15999. }
  16000. ssl->keys.encryptionOn = 0;
  16001. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  16002. if (InitSSL_Suites(ssl) != WOLFSSL_SUCCESS)
  16003. return WOLFSSL_FAILURE;
  16004. if (InitHandshakeHashes(ssl) != 0)
  16005. return WOLFSSL_FAILURE;
  16006. #ifdef KEEP_PEER_CERT
  16007. FreeX509(&ssl->peerCert);
  16008. InitX509(&ssl->peerCert, 0, ssl->heap);
  16009. #endif
  16010. #ifdef WOLFSSL_QUIC
  16011. wolfSSL_quic_clear(ssl);
  16012. #endif
  16013. return WOLFSSL_SUCCESS;
  16014. }
  16015. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16016. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
  16017. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  16018. {
  16019. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  16020. WOLFSSL_ENTER("wolfSSL_CTX_set_mode");
  16021. switch(mode) {
  16022. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  16023. ctx->partialWrite = 1;
  16024. break;
  16025. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16026. case SSL_MODE_RELEASE_BUFFERS:
  16027. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  16028. break;
  16029. #endif
  16030. case SSL_MODE_AUTO_RETRY:
  16031. ctx->autoRetry = 1;
  16032. break;
  16033. default:
  16034. WOLFSSL_MSG("Mode Not Implemented");
  16035. }
  16036. /* SSL_MODE_AUTO_RETRY
  16037. * Should not return -1 with renegotiation on read/write */
  16038. return mode;
  16039. }
  16040. long wolfSSL_CTX_clear_mode(WOLFSSL_CTX* ctx, long mode)
  16041. {
  16042. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  16043. WOLFSSL_ENTER("wolfSSL_CTX_clear_mode");
  16044. switch(mode) {
  16045. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  16046. ctx->partialWrite = 0;
  16047. break;
  16048. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16049. case SSL_MODE_RELEASE_BUFFERS:
  16050. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  16051. break;
  16052. #endif
  16053. case SSL_MODE_AUTO_RETRY:
  16054. ctx->autoRetry = 0;
  16055. break;
  16056. default:
  16057. WOLFSSL_MSG("Mode Not Implemented");
  16058. }
  16059. /* SSL_MODE_AUTO_RETRY
  16060. * Should not return -1 with renegotiation on read/write */
  16061. return 0;
  16062. }
  16063. #endif
  16064. #ifdef WOLFSSL_SESSION_ID_CTX
  16065. /* Storing app session context id, this value is inherited by WOLFSSL
  16066. * objects created from WOLFSSL_CTX. Any session that is imported with a
  16067. * different session context id will be rejected.
  16068. *
  16069. * ctx structure to set context in
  16070. * sid_ctx value of context to set
  16071. * sid_ctx_len length of sid_ctx buffer
  16072. *
  16073. * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing
  16074. */
  16075. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  16076. const unsigned char* sid_ctx,
  16077. unsigned int sid_ctx_len)
  16078. {
  16079. WOLFSSL_ENTER("wolfSSL_CTX_set_session_id_context");
  16080. /* No application specific context needed for wolfSSL */
  16081. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  16082. return WOLFSSL_FAILURE;
  16083. }
  16084. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  16085. ctx->sessionCtxSz = (byte)sid_ctx_len;
  16086. return WOLFSSL_SUCCESS;
  16087. }
  16088. /* Storing app session context id. Any session that is imported with a
  16089. * different session context id will be rejected.
  16090. *
  16091. * ssl structure to set context in
  16092. * id value of context to set
  16093. * len length of sid_ctx buffer
  16094. *
  16095. * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing
  16096. */
  16097. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  16098. unsigned int len)
  16099. {
  16100. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  16101. if (len > ID_LEN || ssl == NULL || id == NULL) {
  16102. return WOLFSSL_FAILURE;
  16103. }
  16104. XMEMCPY(ssl->sessionCtx, id, len);
  16105. ssl->sessionCtxSz = (byte)len;
  16106. return WOLFSSL_SUCCESS;
  16107. }
  16108. #endif
  16109. #ifdef OPENSSL_EXTRA
  16110. #ifndef NO_WOLFSSL_STUB
  16111. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  16112. {
  16113. /* TODO: */
  16114. (void)ssl;
  16115. WOLFSSL_STUB("SSL_get_mode");
  16116. return 0;
  16117. }
  16118. #endif
  16119. #ifndef NO_WOLFSSL_STUB
  16120. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  16121. {
  16122. /* TODO: */
  16123. (void)ctx;
  16124. WOLFSSL_STUB("SSL_CTX_get_mode");
  16125. return 0;
  16126. }
  16127. #endif
  16128. #ifndef NO_WOLFSSL_STUB
  16129. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  16130. {
  16131. /* TODO: maybe? */
  16132. (void)ctx;
  16133. (void)m;
  16134. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  16135. }
  16136. #endif
  16137. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  16138. {
  16139. (void)ctx;
  16140. #ifndef NO_SESSION_CACHE
  16141. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  16142. #else
  16143. return 0;
  16144. #endif
  16145. }
  16146. /* returns the unsigned error value and increments the pointer into the
  16147. * error queue.
  16148. *
  16149. * file pointer to file name
  16150. * line gets set to line number of error when not NULL
  16151. */
  16152. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  16153. {
  16154. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  16155. int ret = wc_PullErrorNode(file, NULL, line);
  16156. if (ret < 0) {
  16157. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  16158. WOLFSSL_MSG("Issue getting error node");
  16159. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  16160. ret = 0 - ret; /* return absolute value of error */
  16161. /* panic and try to clear out nodes */
  16162. wc_ClearErrorNodes();
  16163. }
  16164. return (unsigned long)ret;
  16165. #else
  16166. (void)file;
  16167. (void)line;
  16168. return 0;
  16169. #endif
  16170. }
  16171. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  16172. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  16173. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  16174. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  16175. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  16176. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  16177. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  16178. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  16179. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  16180. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  16181. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  16182. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  16183. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  16184. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  16185. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  16186. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  16187. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  16188. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  16189. /* switch with int mapped to function name for compatibility */
  16190. static const char* wolfSSL_ERR_sys_func(int fun)
  16191. {
  16192. switch (fun) {
  16193. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  16194. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  16195. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  16196. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  16197. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  16198. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  16199. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  16200. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  16201. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  16202. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  16203. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  16204. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  16205. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  16206. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  16207. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  16208. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  16209. default:
  16210. return "NULL";
  16211. }
  16212. }
  16213. #endif /* DEBUG_WOLFSSL */
  16214. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  16215. int line)
  16216. {
  16217. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  16218. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  16219. (void)fun;
  16220. (void)err;
  16221. (void)file;
  16222. (void)line;
  16223. WOLFSSL_MSG("Not compiled in debug mode");
  16224. #elif defined(OPENSSL_EXTRA) && \
  16225. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  16226. (void)fun;
  16227. (void)file;
  16228. (void)line;
  16229. WOLFSSL_ERROR(err);
  16230. #else
  16231. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  16232. file, NULL);
  16233. #endif
  16234. (void)lib;
  16235. }
  16236. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  16237. * more flexibility.
  16238. *
  16239. * file output pointer to file where error happened
  16240. * line output to line number of error
  16241. * data output data. Is a string if ERR_TXT_STRING flag is used
  16242. * flags output format of output
  16243. *
  16244. * Returns the error value or 0 if no errors are in the queue
  16245. */
  16246. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  16247. const char** data, int *flags)
  16248. {
  16249. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  16250. int ret;
  16251. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  16252. if (flags != NULL)
  16253. *flags = ERR_TXT_STRING; /* Clear the flags */
  16254. ret = wc_PullErrorNode(file, data, line);
  16255. if (ret < 0) {
  16256. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  16257. WOLFSSL_MSG("Error with pulling error node!");
  16258. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  16259. ret = 0 - ret; /* return absolute value of error */
  16260. /* panic and try to clear out nodes */
  16261. wc_ClearErrorNodes();
  16262. }
  16263. return (unsigned long)ret;
  16264. #else
  16265. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  16266. WOLFSSL_MSG("Error queue turned off, can not get error line");
  16267. (void)file;
  16268. (void)line;
  16269. (void)data;
  16270. (void)flags;
  16271. return 0;
  16272. #endif
  16273. }
  16274. #endif /* OPENSSL_EXTRA */
  16275. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  16276. (defined(OPENSSL_EXTRA) && defined(SESSION_CERTS))
  16277. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  16278. *
  16279. * x509 WOLFSSL_X509 object to decode into.
  16280. * in X509 DER data.
  16281. * len Length of the X509 DER data.
  16282. * returns the new certificate on success, otherwise NULL.
  16283. */
  16284. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  16285. {
  16286. int ret;
  16287. #ifdef WOLFSSL_SMALL_STACK
  16288. DecodedCert* cert;
  16289. #else
  16290. DecodedCert cert[1];
  16291. #endif
  16292. if (x509 == NULL || in == NULL || len <= 0)
  16293. return BAD_FUNC_ARG;
  16294. #ifdef WOLFSSL_SMALL_STACK
  16295. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  16296. DYNAMIC_TYPE_DCERT);
  16297. if (cert == NULL)
  16298. return MEMORY_E;
  16299. #endif
  16300. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  16301. */
  16302. InitDecodedCert(cert, (byte*)in, len, NULL);
  16303. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  16304. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  16305. if (x509->dynamicMemory != TRUE)
  16306. InitX509(x509, 0, NULL);
  16307. ret = CopyDecodedToX509(x509, cert);
  16308. }
  16309. FreeDecodedCert(cert);
  16310. #ifdef WOLFSSL_SMALL_STACK
  16311. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  16312. #endif
  16313. return ret;
  16314. }
  16315. #endif /* (KEEP_PEER_CERT & SESSION_CERTS) || (OPENSSL_EXTRA & SESSION_CERTS) */
  16316. #ifdef KEEP_PEER_CERT
  16317. WOLFSSL_ABI
  16318. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  16319. {
  16320. WOLFSSL_X509* ret = NULL;
  16321. WOLFSSL_ENTER("wolfSSL_get_peer_certificate");
  16322. if (ssl != NULL) {
  16323. if (ssl->peerCert.issuer.sz)
  16324. ret = wolfSSL_X509_dup(&ssl->peerCert);
  16325. #ifdef SESSION_CERTS
  16326. else if (ssl->session->chain.count > 0) {
  16327. if (DecodeToX509(&ssl->peerCert,
  16328. ssl->session->chain.certs[0].buffer,
  16329. ssl->session->chain.certs[0].length) == 0) {
  16330. ret = wolfSSL_X509_dup(&ssl->peerCert);
  16331. }
  16332. }
  16333. #endif
  16334. }
  16335. WOLFSSL_LEAVE("wolfSSL_get_peer_certificate", ret != NULL);
  16336. return ret;
  16337. }
  16338. #endif /* KEEP_PEER_CERT */
  16339. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16340. /* Return stack of peer certs.
  16341. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  16342. */
  16343. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  16344. {
  16345. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  16346. if (ssl == NULL)
  16347. return NULL;
  16348. /* Try to populate if NULL or empty */
  16349. if (ssl->peerCertChain == NULL ||
  16350. wolfSSL_sk_X509_num(ssl->peerCertChain) == 0)
  16351. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  16352. return ssl->peerCertChain;
  16353. }
  16354. #ifndef WOLFSSL_QT
  16355. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  16356. WOLFSSL_X509 *x);
  16357. /**
  16358. * Recursively push the issuer CA chain onto the stack
  16359. * @param cm The cert manager that is queried for the issuer
  16360. * @param x This cert's issuer will be queried in cm
  16361. * @param sk The issuer is pushed onto this stack
  16362. * @return WOLFSSL_SUCCESS on success
  16363. * WOLFSSL_FAILURE on no issuer found
  16364. * WOLFSSL_FATAL_ERROR on a fatal error
  16365. */
  16366. static int PushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  16367. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  16368. {
  16369. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  16370. int i;
  16371. int push = 1;
  16372. int ret = WOLFSSL_SUCCESS;
  16373. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  16374. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  16375. != WOLFSSL_SUCCESS)
  16376. break;
  16377. x = issuer[i];
  16378. }
  16379. if (i == 0) /* No further chain found */
  16380. return WOLFSSL_FAILURE;
  16381. i--;
  16382. for (; i >= 0; i--) {
  16383. if (push) {
  16384. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  16385. wolfSSL_X509_free(issuer[i]);
  16386. ret = WOLFSSL_FATAL_ERROR;
  16387. push = 0; /* Free the rest of the unpushed certs */
  16388. }
  16389. }
  16390. else {
  16391. wolfSSL_X509_free(issuer[i]);
  16392. }
  16393. }
  16394. return ret;
  16395. }
  16396. #endif /* !WOLFSSL_QT */
  16397. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  16398. based off of the ssl session chain. Attempts to place CA certificates
  16399. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  16400. NULL on failure */
  16401. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  16402. {
  16403. WOLFSSL_STACK* sk;
  16404. WOLFSSL_X509* x509;
  16405. int i = 0;
  16406. int ret;
  16407. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  16408. if ((ssl == NULL) || (ssl->session->chain.count == 0))
  16409. return NULL;
  16410. sk = wolfSSL_sk_X509_new_null();
  16411. i = ssl->session->chain.count-1;
  16412. for (; i >= 0; i--) {
  16413. x509 = wolfSSL_X509_new_ex(ssl->heap);
  16414. if (x509 == NULL) {
  16415. WOLFSSL_MSG("Error Creating X509");
  16416. wolfSSL_sk_X509_pop_free(sk, NULL);
  16417. return NULL;
  16418. }
  16419. ret = DecodeToX509(x509, ssl->session->chain.certs[i].buffer,
  16420. ssl->session->chain.certs[i].length);
  16421. #if !defined(WOLFSSL_QT)
  16422. if (ret == 0 && i == ssl->session->chain.count-1) {
  16423. /* On the last element in the chain try to add the CA chain
  16424. * first if we have one for this cert */
  16425. SSL_CM_WARNING(ssl);
  16426. if (PushCAx509Chain(SSL_CM(ssl), x509, sk)
  16427. == WOLFSSL_FATAL_ERROR) {
  16428. ret = WOLFSSL_FATAL_ERROR;
  16429. }
  16430. }
  16431. #endif
  16432. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  16433. WOLFSSL_MSG("Error decoding cert");
  16434. wolfSSL_X509_free(x509);
  16435. wolfSSL_sk_X509_pop_free(sk, NULL);
  16436. return NULL;
  16437. }
  16438. }
  16439. if (sk == NULL) {
  16440. WOLFSSL_MSG("Null session chain");
  16441. }
  16442. #if defined(OPENSSL_ALL)
  16443. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  16444. /* to be compliant with openssl
  16445. first element is kept as peer cert on server side.*/
  16446. wolfSSL_sk_X509_pop(sk);
  16447. }
  16448. #endif
  16449. if (ssl->peerCertChain != NULL)
  16450. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  16451. /* This is Free'd when ssl is Free'd */
  16452. ssl->peerCertChain = sk;
  16453. return sk;
  16454. }
  16455. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  16456. #ifndef NO_CERTS
  16457. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16458. /* create a generic wolfSSL stack node
  16459. * returns a new WOLFSSL_STACK structure on success */
  16460. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16461. {
  16462. WOLFSSL_STACK* sk;
  16463. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16464. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16465. DYNAMIC_TYPE_OPENSSL);
  16466. if (sk != NULL) {
  16467. XMEMSET(sk, 0, sizeof(*sk));
  16468. sk->heap = heap;
  16469. }
  16470. return sk;
  16471. }
  16472. /* free's node but does not free internal data such as in->data.x509 */
  16473. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16474. {
  16475. if (in != NULL) {
  16476. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16477. }
  16478. }
  16479. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16480. * also handles internal "num" for number of nodes on stack
  16481. * return WOLFSSL_SUCCESS on success
  16482. */
  16483. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16484. {
  16485. if (stack == NULL || in == NULL) {
  16486. return WOLFSSL_FAILURE;
  16487. }
  16488. if (*stack == NULL) {
  16489. in->num = 1;
  16490. *stack = in;
  16491. return WOLFSSL_SUCCESS;
  16492. }
  16493. in->num = (*stack)->num + 1;
  16494. in->next = *stack;
  16495. *stack = in;
  16496. return WOLFSSL_SUCCESS;
  16497. }
  16498. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16499. static WC_INLINE int compare_WOLFSSL_CIPHER(
  16500. WOLFSSL_CIPHER *a,
  16501. WOLFSSL_CIPHER *b)
  16502. {
  16503. if ((a->cipherSuite0 == b->cipherSuite0) &&
  16504. (a->cipherSuite == b->cipherSuite) &&
  16505. (a->ssl == b->ssl) &&
  16506. (XMEMCMP(a->description, b->description, sizeof a->description) == 0) &&
  16507. (a->offset == b->offset) &&
  16508. (a->in_stack == b->in_stack) &&
  16509. (a->bits == b->bits))
  16510. return 0;
  16511. else
  16512. return -1;
  16513. }
  16514. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16515. /* return 1 on success 0 on fail */
  16516. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16517. {
  16518. WOLFSSL_STACK* node;
  16519. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16520. WOLFSSL_CIPHER ciph;
  16521. #endif
  16522. WOLFSSL_ENTER("wolfSSL_sk_push");
  16523. if (!sk) {
  16524. return WOLFSSL_FAILURE;
  16525. }
  16526. /* Check if empty data */
  16527. switch (sk->type) {
  16528. case STACK_TYPE_CIPHER:
  16529. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16530. /* check if entire struct is zero */
  16531. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16532. if (compare_WOLFSSL_CIPHER(&sk->data.cipher, &ciph) == 0) {
  16533. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16534. sk->num = 1;
  16535. if (sk->hash_fn) {
  16536. sk->hash = sk->hash_fn(&sk->data.cipher);
  16537. }
  16538. return WOLFSSL_SUCCESS;
  16539. }
  16540. break;
  16541. #endif
  16542. case STACK_TYPE_X509:
  16543. case STACK_TYPE_GEN_NAME:
  16544. case STACK_TYPE_BIO:
  16545. case STACK_TYPE_OBJ:
  16546. case STACK_TYPE_STRING:
  16547. case STACK_TYPE_ACCESS_DESCRIPTION:
  16548. case STACK_TYPE_X509_EXT:
  16549. case STACK_TYPE_X509_REQ_ATTR:
  16550. case STACK_TYPE_NULL:
  16551. case STACK_TYPE_X509_NAME:
  16552. case STACK_TYPE_X509_NAME_ENTRY:
  16553. case STACK_TYPE_CONF_VALUE:
  16554. case STACK_TYPE_X509_INFO:
  16555. case STACK_TYPE_BY_DIR_entry:
  16556. case STACK_TYPE_BY_DIR_hash:
  16557. case STACK_TYPE_X509_OBJ:
  16558. case STACK_TYPE_DIST_POINT:
  16559. case STACK_TYPE_X509_CRL:
  16560. default:
  16561. /* All other types are pointers */
  16562. if (!sk->data.generic) {
  16563. sk->data.generic = (void*)data;
  16564. sk->num = 1;
  16565. #ifdef OPENSSL_ALL
  16566. if (sk->hash_fn) {
  16567. sk->hash = sk->hash_fn(sk->data.generic);
  16568. }
  16569. #endif
  16570. return WOLFSSL_SUCCESS;
  16571. }
  16572. break;
  16573. }
  16574. /* stack already has value(s) create a new node and add more */
  16575. node = wolfSSL_sk_new_node(sk->heap);
  16576. if (!node) {
  16577. WOLFSSL_MSG("Memory error");
  16578. return WOLFSSL_FAILURE;
  16579. }
  16580. /* push new x509 onto head of stack */
  16581. node->next = sk->next;
  16582. node->type = sk->type;
  16583. sk->next = node;
  16584. sk->num += 1;
  16585. #ifdef OPENSSL_ALL
  16586. node->hash_fn = sk->hash_fn;
  16587. node->hash = sk->hash;
  16588. sk->hash = 0;
  16589. #endif
  16590. switch (sk->type) {
  16591. case STACK_TYPE_CIPHER:
  16592. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16593. node->data.cipher = sk->data.cipher;
  16594. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16595. if (sk->hash_fn) {
  16596. sk->hash = sk->hash_fn(&sk->data.cipher);
  16597. }
  16598. break;
  16599. #endif
  16600. case STACK_TYPE_X509:
  16601. case STACK_TYPE_GEN_NAME:
  16602. case STACK_TYPE_BIO:
  16603. case STACK_TYPE_OBJ:
  16604. case STACK_TYPE_STRING:
  16605. case STACK_TYPE_ACCESS_DESCRIPTION:
  16606. case STACK_TYPE_X509_EXT:
  16607. case STACK_TYPE_X509_REQ_ATTR:
  16608. case STACK_TYPE_NULL:
  16609. case STACK_TYPE_X509_NAME:
  16610. case STACK_TYPE_X509_NAME_ENTRY:
  16611. case STACK_TYPE_CONF_VALUE:
  16612. case STACK_TYPE_X509_INFO:
  16613. case STACK_TYPE_BY_DIR_entry:
  16614. case STACK_TYPE_BY_DIR_hash:
  16615. case STACK_TYPE_X509_OBJ:
  16616. case STACK_TYPE_DIST_POINT:
  16617. case STACK_TYPE_X509_CRL:
  16618. default:
  16619. /* All other types are pointers */
  16620. node->data.generic = sk->data.generic;
  16621. sk->data.generic = (void*)data;
  16622. #ifdef OPENSSL_ALL
  16623. if (sk->hash_fn) {
  16624. sk->hash = sk->hash_fn(sk->data.generic);
  16625. }
  16626. #endif
  16627. break;
  16628. }
  16629. return WOLFSSL_SUCCESS;
  16630. }
  16631. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16632. #ifdef OPENSSL_EXTRA
  16633. /* returns the node at index "idx", NULL if not found */
  16634. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16635. {
  16636. int i;
  16637. WOLFSSL_STACK* ret = NULL;
  16638. WOLFSSL_STACK* current;
  16639. current = sk;
  16640. for (i = 0; i <= idx && current != NULL; i++) {
  16641. if (i == idx) {
  16642. ret = current;
  16643. break;
  16644. }
  16645. current = current->next;
  16646. }
  16647. return ret;
  16648. }
  16649. #endif /* OPENSSL_EXTRA */
  16650. #ifdef OPENSSL_EXTRA
  16651. #if defined(OPENSSL_ALL)
  16652. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16653. {
  16654. unsigned long hash;
  16655. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16656. if (!sk || !data) {
  16657. WOLFSSL_MSG("Bad parameters");
  16658. return NULL;
  16659. }
  16660. if (!sk->hash_fn) {
  16661. WOLFSSL_MSG("No hash function defined");
  16662. return NULL;
  16663. }
  16664. hash = sk->hash_fn(data);
  16665. while (sk) {
  16666. /* Calc hash if not done so yet */
  16667. if (!sk->hash) {
  16668. switch (sk->type) {
  16669. case STACK_TYPE_CIPHER:
  16670. sk->hash = sk->hash_fn(&sk->data.cipher);
  16671. break;
  16672. case STACK_TYPE_X509:
  16673. case STACK_TYPE_GEN_NAME:
  16674. case STACK_TYPE_BIO:
  16675. case STACK_TYPE_OBJ:
  16676. case STACK_TYPE_STRING:
  16677. case STACK_TYPE_ACCESS_DESCRIPTION:
  16678. case STACK_TYPE_X509_EXT:
  16679. case STACK_TYPE_X509_REQ_ATTR:
  16680. case STACK_TYPE_NULL:
  16681. case STACK_TYPE_X509_NAME:
  16682. case STACK_TYPE_X509_NAME_ENTRY:
  16683. case STACK_TYPE_CONF_VALUE:
  16684. case STACK_TYPE_X509_INFO:
  16685. case STACK_TYPE_BY_DIR_entry:
  16686. case STACK_TYPE_BY_DIR_hash:
  16687. case STACK_TYPE_X509_OBJ:
  16688. case STACK_TYPE_DIST_POINT:
  16689. case STACK_TYPE_X509_CRL:
  16690. default:
  16691. sk->hash = sk->hash_fn(sk->data.generic);
  16692. break;
  16693. }
  16694. }
  16695. if (sk->hash == hash) {
  16696. switch (sk->type) {
  16697. case STACK_TYPE_CIPHER:
  16698. return &sk->data.cipher;
  16699. case STACK_TYPE_X509:
  16700. case STACK_TYPE_GEN_NAME:
  16701. case STACK_TYPE_BIO:
  16702. case STACK_TYPE_OBJ:
  16703. case STACK_TYPE_STRING:
  16704. case STACK_TYPE_ACCESS_DESCRIPTION:
  16705. case STACK_TYPE_X509_EXT:
  16706. case STACK_TYPE_X509_REQ_ATTR:
  16707. case STACK_TYPE_NULL:
  16708. case STACK_TYPE_X509_NAME:
  16709. case STACK_TYPE_X509_NAME_ENTRY:
  16710. case STACK_TYPE_CONF_VALUE:
  16711. case STACK_TYPE_X509_INFO:
  16712. case STACK_TYPE_BY_DIR_entry:
  16713. case STACK_TYPE_BY_DIR_hash:
  16714. case STACK_TYPE_X509_OBJ:
  16715. case STACK_TYPE_DIST_POINT:
  16716. case STACK_TYPE_X509_CRL:
  16717. default:
  16718. return sk->data.generic;
  16719. }
  16720. }
  16721. sk = sk->next;
  16722. }
  16723. return NULL;
  16724. }
  16725. #endif /* OPENSSL_ALL */
  16726. #endif /* OPENSSL_EXTRA */
  16727. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  16728. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  16729. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  16730. defined(KEEP_OUR_CERT)
  16731. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  16732. {
  16733. if (ssl == NULL) {
  16734. return NULL;
  16735. }
  16736. if (ssl->buffers.weOwnCert) {
  16737. if (ssl->ourCert == NULL) {
  16738. if (ssl->buffers.certificate == NULL) {
  16739. WOLFSSL_MSG("Certificate buffer not set!");
  16740. return NULL;
  16741. }
  16742. #ifndef WOLFSSL_X509_STORE_CERTS
  16743. ssl->ourCert = wolfSSL_X509_d2i_ex(NULL,
  16744. ssl->buffers.certificate->buffer,
  16745. ssl->buffers.certificate->length,
  16746. ssl->heap);
  16747. #endif
  16748. }
  16749. return ssl->ourCert;
  16750. }
  16751. else { /* if cert not owned get parent ctx cert or return null */
  16752. if (ssl->ctx) {
  16753. if (ssl->ctx->ourCert == NULL) {
  16754. if (ssl->ctx->certificate == NULL) {
  16755. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16756. return NULL;
  16757. }
  16758. #ifndef WOLFSSL_X509_STORE_CERTS
  16759. ssl->ctx->ourCert = wolfSSL_X509_d2i_ex(NULL,
  16760. ssl->ctx->certificate->buffer,
  16761. ssl->ctx->certificate->length,
  16762. ssl->heap);
  16763. #endif
  16764. ssl->ctx->ownOurCert = 1;
  16765. }
  16766. return ssl->ctx->ourCert;
  16767. }
  16768. }
  16769. return NULL;
  16770. }
  16771. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  16772. {
  16773. if (ctx) {
  16774. if (ctx->ourCert == NULL) {
  16775. if (ctx->certificate == NULL) {
  16776. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16777. return NULL;
  16778. }
  16779. #ifndef WOLFSSL_X509_STORE_CERTS
  16780. ctx->ourCert = wolfSSL_X509_d2i_ex(NULL,
  16781. ctx->certificate->buffer,
  16782. ctx->certificate->length, ctx->heap);
  16783. #endif
  16784. ctx->ownOurCert = 1;
  16785. }
  16786. return ctx->ourCert;
  16787. }
  16788. return NULL;
  16789. }
  16790. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  16791. #endif /* NO_CERTS */
  16792. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16793. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  16794. {
  16795. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  16796. if (ssl == NULL) {
  16797. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  16798. return;
  16799. }
  16800. #ifndef NO_DH
  16801. /* client creates its own DH parameters on handshake */
  16802. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  16803. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  16804. DYNAMIC_TYPE_PUBLIC_KEY);
  16805. }
  16806. ssl->buffers.serverDH_P.buffer = NULL;
  16807. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  16808. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  16809. DYNAMIC_TYPE_PUBLIC_KEY);
  16810. }
  16811. ssl->buffers.serverDH_G.buffer = NULL;
  16812. #endif
  16813. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  16814. WOLFSSL_MSG("Error initializing client side");
  16815. }
  16816. }
  16817. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16818. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  16819. {
  16820. int isShutdown = 0;
  16821. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  16822. if (ssl) {
  16823. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16824. if (ssl->options.shutdownDone) {
  16825. /* The SSL object was possibly cleared with wolfSSL_clear after
  16826. * a successful shutdown. Simulate a response for a full
  16827. * bidirectional shutdown. */
  16828. isShutdown = WOLFSSL_SENT_SHUTDOWN | WOLFSSL_RECEIVED_SHUTDOWN;
  16829. }
  16830. else
  16831. #endif
  16832. {
  16833. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  16834. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  16835. if (ssl->options.sentNotify)
  16836. isShutdown |= WOLFSSL_SENT_SHUTDOWN;
  16837. if (ssl->options.closeNotify||ssl->options.connReset)
  16838. isShutdown |= WOLFSSL_RECEIVED_SHUTDOWN;
  16839. }
  16840. }
  16841. WOLFSSL_LEAVE("wolfSSL_get_shutdown", isShutdown);
  16842. return isShutdown;
  16843. }
  16844. int wolfSSL_session_reused(WOLFSSL* ssl)
  16845. {
  16846. int resuming = 0;
  16847. WOLFSSL_ENTER("wolfSSL_session_reused");
  16848. if (ssl) {
  16849. #ifndef HAVE_SECURE_RENEGOTIATION
  16850. resuming = ssl->options.resuming;
  16851. #else
  16852. resuming = ssl->options.resuming || ssl->options.resumed;
  16853. #endif
  16854. }
  16855. WOLFSSL_LEAVE("wolfSSL_session_reused", resuming);
  16856. return resuming;
  16857. }
  16858. /* return a new malloc'd session with default settings on success */
  16859. WOLFSSL_SESSION* wolfSSL_NewSession(void* heap)
  16860. {
  16861. WOLFSSL_SESSION* ret = NULL;
  16862. WOLFSSL_ENTER("wolfSSL_NewSession");
  16863. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap,
  16864. DYNAMIC_TYPE_SESSION);
  16865. if (ret != NULL) {
  16866. int err;
  16867. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  16868. wolfSSL_RefInit(&ret->ref, &err);
  16869. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  16870. if (err != 0) {
  16871. WOLFSSL_MSG("Error setting up session reference mutex");
  16872. XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION);
  16873. return NULL;
  16874. }
  16875. #else
  16876. (void)err;
  16877. #endif
  16878. #ifndef NO_SESSION_CACHE
  16879. ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */
  16880. #endif
  16881. ret->type = WOLFSSL_SESSION_TYPE_HEAP;
  16882. ret->heap = heap;
  16883. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16884. wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN);
  16885. wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN);
  16886. #endif
  16887. #ifdef HAVE_SESSION_TICKET
  16888. ret->ticket = ret->staticTicket;
  16889. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16890. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16891. ret->ticketNonce.data = ret->ticketNonce.dataStatic;
  16892. #endif
  16893. #endif
  16894. #ifdef HAVE_EX_DATA
  16895. ret->ownExData = 1;
  16896. if (crypto_ex_cb_ctx_session != NULL) {
  16897. crypto_ex_cb_setup_new_data(ret, crypto_ex_cb_ctx_session,
  16898. &ret->ex_data);
  16899. }
  16900. #endif
  16901. }
  16902. return ret;
  16903. }
  16904. WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap)
  16905. {
  16906. return wolfSSL_NewSession(heap);
  16907. }
  16908. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  16909. {
  16910. return wolfSSL_SESSION_new_ex(NULL);
  16911. }
  16912. /* add one to session reference count
  16913. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  16914. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  16915. {
  16916. int ret;
  16917. session = ClientSessionToSession(session);
  16918. if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP)
  16919. return WOLFSSL_FAILURE;
  16920. wolfSSL_RefInc(&session->ref, &ret);
  16921. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  16922. if (ret != 0) {
  16923. WOLFSSL_MSG("Failed to lock session mutex");
  16924. return WOLFSSL_FAILURE;
  16925. }
  16926. #else
  16927. (void)ret;
  16928. #endif
  16929. return WOLFSSL_SUCCESS;
  16930. }
  16931. /**
  16932. * Deep copy the contents from input to output.
  16933. * @param input The source of the copy.
  16934. * @param output The destination of the copy.
  16935. * @param avoidSysCalls If true, then system calls will be avoided or an error
  16936. * will be returned if it is not possible to proceed
  16937. * without a system call. This is useful for fetching
  16938. * sessions from cache. When a cache row is locked, we
  16939. * don't want to block other threads with long running
  16940. * system calls.
  16941. * @param ticketNonceBuf If not null and @avoidSysCalls is true, the copy of the
  16942. * ticketNonce will happen in this pre allocated buffer
  16943. * @param ticketNonceLen @ticketNonceBuf len as input, used length on output
  16944. * @param ticketNonceUsed if @ticketNonceBuf was used to copy the ticket noncet
  16945. * @return WOLFSSL_SUCCESS on success
  16946. * WOLFSSL_FAILURE on failure
  16947. */
  16948. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  16949. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  16950. byte* ticketNonceLen, byte* preallocUsed)
  16951. {
  16952. #ifdef HAVE_SESSION_TICKET
  16953. int ticLenAlloc = 0;
  16954. byte *ticBuff = NULL;
  16955. #endif
  16956. const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + sizeof(input->heap);
  16957. int ret = WOLFSSL_SUCCESS;
  16958. (void)avoidSysCalls;
  16959. (void)ticketNonceBuf;
  16960. (void)ticketNonceLen;
  16961. (void)preallocUsed;
  16962. input = ClientSessionToSession(input);
  16963. output = ClientSessionToSession(output);
  16964. if (input == NULL || output == NULL || input == output) {
  16965. WOLFSSL_MSG("input or output are null or same");
  16966. return WOLFSSL_FAILURE;
  16967. }
  16968. #ifdef HAVE_SESSION_TICKET
  16969. if (output->ticket != output->staticTicket) {
  16970. ticBuff = output->ticket;
  16971. ticLenAlloc = output->ticketLenAlloc;
  16972. }
  16973. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16974. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16975. /* free the data, it would be better to reuse the buffer but this
  16976. * maintain the code simpler. A smart allocator should reuse the free'd
  16977. * buffer in the next malloc without much performance penalties. */
  16978. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  16979. /* Callers that avoid syscall should never calls this with
  16980. * output->tickeNonce.data being a dynamic buffer.*/
  16981. if (avoidSysCalls) {
  16982. WOLFSSL_MSG("can't avoid syscalls with dynamic TicketNonce buffer");
  16983. return WOLFSSL_FAILURE;
  16984. }
  16985. XFREE(output->ticketNonce.data,
  16986. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16987. output->ticketNonce.data = output->ticketNonce.dataStatic;
  16988. output->ticketNonce.len = 0;
  16989. }
  16990. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  16991. #endif /* HAVE_SESSION_TICKET */
  16992. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16993. if (output->peer != NULL) {
  16994. if (avoidSysCalls) {
  16995. WOLFSSL_MSG("Can't free cert when avoiding syscalls");
  16996. return WOLFSSL_FAILURE;
  16997. }
  16998. wolfSSL_X509_free(output->peer);
  16999. output->peer = NULL;
  17000. }
  17001. #endif
  17002. XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset,
  17003. sizeof(WOLFSSL_SESSION) - copyOffset);
  17004. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  17005. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17006. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17007. /* fix pointer to static after the copy */
  17008. output->ticketNonce.data = output->ticketNonce.dataStatic;
  17009. #endif
  17010. /* Set sane values for copy */
  17011. #ifndef NO_SESSION_CACHE
  17012. if (output->type != WOLFSSL_SESSION_TYPE_CACHE)
  17013. output->cacheRow = INVALID_SESSION_ROW;
  17014. #endif
  17015. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17016. if (input->peer != NULL && input->peer->dynamicMemory) {
  17017. if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) {
  17018. WOLFSSL_MSG("Can't increase peer cert ref count");
  17019. output->peer = NULL;
  17020. }
  17021. }
  17022. else if (!avoidSysCalls)
  17023. output->peer = wolfSSL_X509_dup(input->peer);
  17024. else
  17025. /* output->peer is not that important to copy */
  17026. output->peer = NULL;
  17027. #endif
  17028. #ifdef HAVE_SESSION_TICKET
  17029. if (input->ticketLen > SESSION_TICKET_LEN) {
  17030. /* Need dynamic buffer */
  17031. if (ticBuff == NULL || ticLenAlloc < input->ticketLen) {
  17032. /* allocate new one */
  17033. byte* tmp;
  17034. if (avoidSysCalls) {
  17035. WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding"
  17036. " syscalls");
  17037. output->ticket = ticBuff;
  17038. output->ticketLenAlloc = (word16) ticLenAlloc;
  17039. output->ticketLen = 0;
  17040. ret = WOLFSSL_FAILURE;
  17041. }
  17042. else {
  17043. #ifdef WOLFSSL_NO_REALLOC
  17044. tmp = (byte*)XMALLOC(input->ticketLen,
  17045. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17046. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17047. ticBuff = NULL;
  17048. #else
  17049. tmp = (byte*)XREALLOC(ticBuff, input->ticketLen,
  17050. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17051. #endif /* WOLFSSL_NO_REALLOC */
  17052. if (tmp == NULL) {
  17053. WOLFSSL_MSG("Failed to allocate memory for ticket");
  17054. #ifndef WOLFSSL_NO_REALLOC
  17055. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17056. ticBuff = NULL;
  17057. #endif /* WOLFSSL_NO_REALLOC */
  17058. output->ticket = NULL;
  17059. output->ticketLen = 0;
  17060. output->ticketLenAlloc = 0;
  17061. ret = WOLFSSL_FAILURE;
  17062. }
  17063. else {
  17064. ticBuff = tmp;
  17065. ticLenAlloc = input->ticketLen;
  17066. }
  17067. }
  17068. }
  17069. if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) {
  17070. XMEMCPY(ticBuff, input->ticket, input->ticketLen);
  17071. output->ticket = ticBuff;
  17072. output->ticketLenAlloc = (word16) ticLenAlloc;
  17073. }
  17074. }
  17075. else {
  17076. /* Default ticket to non dynamic */
  17077. if (avoidSysCalls) {
  17078. /* Try to use ticBuf if available. Caller can later move it to
  17079. * the static buffer. */
  17080. if (ticBuff != NULL) {
  17081. if (ticLenAlloc >= input->ticketLen) {
  17082. output->ticket = ticBuff;
  17083. output->ticketLenAlloc = ticLenAlloc;
  17084. }
  17085. else {
  17086. WOLFSSL_MSG("ticket dynamic buffer too small but we are "
  17087. "avoiding system calls");
  17088. ret = WOLFSSL_FAILURE;
  17089. output->ticket = ticBuff;
  17090. output->ticketLenAlloc = (word16) ticLenAlloc;
  17091. output->ticketLen = 0;
  17092. }
  17093. }
  17094. else {
  17095. output->ticket = output->staticTicket;
  17096. output->ticketLenAlloc = 0;
  17097. }
  17098. }
  17099. else {
  17100. if (ticBuff != NULL)
  17101. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17102. output->ticket = output->staticTicket;
  17103. output->ticketLenAlloc = 0;
  17104. }
  17105. if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) {
  17106. /* Shouldn't happen as session should have placed this in
  17107. * the static buffer */
  17108. XMEMCPY(output->ticket, input->ticket,
  17109. input->ticketLen);
  17110. }
  17111. }
  17112. ticBuff = NULL;
  17113. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17114. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17115. if (preallocUsed != NULL)
  17116. *preallocUsed = 0;
  17117. if (input->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ &&
  17118. ret == WOLFSSL_SUCCESS) {
  17119. /* TicketNonce does not fit in the static buffer */
  17120. if (!avoidSysCalls) {
  17121. output->ticketNonce.data = (byte*)XMALLOC(input->ticketNonce.len,
  17122. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17123. if (output->ticketNonce.data == NULL) {
  17124. WOLFSSL_MSG("Failed to allocate space for ticket nonce");
  17125. output->ticketNonce.data = output->ticketNonce.dataStatic;
  17126. output->ticketNonce.len = 0;
  17127. ret = WOLFSSL_FAILURE;
  17128. }
  17129. else {
  17130. output->ticketNonce.len = input->ticketNonce.len;
  17131. XMEMCPY(output->ticketNonce.data, input->ticketNonce.data,
  17132. input->ticketNonce.len);
  17133. ret = WOLFSSL_SUCCESS;
  17134. }
  17135. }
  17136. /* we can't do syscalls. Use prealloc buffers if provided from the
  17137. * caller. */
  17138. else if (ticketNonceBuf != NULL &&
  17139. *ticketNonceLen >= input->ticketNonce.len) {
  17140. XMEMCPY(ticketNonceBuf, input->ticketNonce.data,
  17141. input->ticketNonce.len);
  17142. *ticketNonceLen = input->ticketNonce.len;
  17143. if (preallocUsed != NULL)
  17144. *preallocUsed = 1;
  17145. ret = WOLFSSL_SUCCESS;
  17146. }
  17147. else {
  17148. WOLFSSL_MSG("TicketNonce bigger than static buffer, and we can't "
  17149. "do syscalls");
  17150. ret = WOLFSSL_FAILURE;
  17151. }
  17152. }
  17153. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  17154. #endif /* HAVE_SESSION_TICKET */
  17155. #ifdef HAVE_EX_DATA
  17156. if (input->type != WOLFSSL_SESSION_TYPE_CACHE &&
  17157. output->type != WOLFSSL_SESSION_TYPE_CACHE) {
  17158. /* Not called with cache as that passes ownership of ex_data */
  17159. ret = crypto_ex_cb_dup_data(&input->ex_data, &output->ex_data,
  17160. crypto_ex_cb_ctx_session);
  17161. }
  17162. #endif
  17163. return ret;
  17164. }
  17165. /**
  17166. * Deep copy the contents from input to output.
  17167. * @param input The source of the copy.
  17168. * @param output The destination of the copy.
  17169. * @param avoidSysCalls If true, then system calls will be avoided or an error
  17170. * will be returned if it is not possible to proceed
  17171. * without a system call. This is useful for fetching
  17172. * sessions from cache. When a cache row is locked, we
  17173. * don't want to block other threads with long running
  17174. * system calls.
  17175. * @return WOLFSSL_SUCCESS on success
  17176. * WOLFSSL_FAILURE on failure
  17177. */
  17178. int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output,
  17179. int avoidSysCalls)
  17180. {
  17181. return wolfSSL_DupSessionEx(input, output, avoidSysCalls, NULL, NULL, NULL);
  17182. }
  17183. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  17184. {
  17185. WOLFSSL_SESSION* copy;
  17186. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  17187. session = ClientSessionToSession(session);
  17188. if (session == NULL)
  17189. return NULL;
  17190. #ifdef HAVE_SESSION_TICKET
  17191. if (session->ticketLenAlloc > 0 && !session->ticket) {
  17192. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  17193. return NULL;
  17194. }
  17195. #endif
  17196. copy = wolfSSL_NewSession(session->heap);
  17197. if (copy != NULL &&
  17198. wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) {
  17199. wolfSSL_FreeSession(NULL, copy);
  17200. copy = NULL;
  17201. }
  17202. return copy;
  17203. }
  17204. void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17205. {
  17206. session = ClientSessionToSession(session);
  17207. if (session == NULL)
  17208. return;
  17209. (void)ctx;
  17210. WOLFSSL_ENTER("wolfSSL_FreeSession");
  17211. if (session->ref.count > 0) {
  17212. int ret;
  17213. int isZero;
  17214. wolfSSL_RefDec(&session->ref, &isZero, &ret);
  17215. (void)ret;
  17216. if (!isZero) {
  17217. return;
  17218. }
  17219. wolfSSL_RefFree(&session->ref);
  17220. }
  17221. WOLFSSL_MSG("wolfSSL_FreeSession full free");
  17222. #ifdef HAVE_EX_DATA
  17223. if (session->ownExData) {
  17224. crypto_ex_cb_free_data(session, crypto_ex_cb_ctx_session,
  17225. &session->ex_data);
  17226. }
  17227. #endif
  17228. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17229. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17230. #endif
  17231. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17232. if (session->peer) {
  17233. wolfSSL_X509_free(session->peer);
  17234. session->peer = NULL;
  17235. }
  17236. #endif
  17237. #ifdef HAVE_SESSION_TICKET
  17238. if (session->ticketLenAlloc > 0) {
  17239. XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK);
  17240. session->ticket = session->staticTicket;
  17241. session->ticketLen = 0;
  17242. session->ticketLenAlloc = 0;
  17243. }
  17244. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17245. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17246. if (session->ticketNonce.data != session->ticketNonce.dataStatic) {
  17247. XFREE(session->ticketNonce.data, session->heap,
  17248. DYNAMIC_TYPE_SESSION_TICK);
  17249. session->ticketNonce.data = session->ticketNonce.dataStatic;
  17250. session->ticketNonce.len = 0;
  17251. }
  17252. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  17253. #endif
  17254. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17255. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17256. #endif
  17257. /* Make sure masterSecret is zeroed. */
  17258. ForceZero(session->masterSecret, SECRET_LEN);
  17259. /* Session ID is sensitive information too. */
  17260. ForceZero(session->sessionID, ID_LEN);
  17261. if (session->type == WOLFSSL_SESSION_TYPE_HEAP) {
  17262. XFREE(session, session->heap, DYNAMIC_TYPE_SESSION);
  17263. }
  17264. }
  17265. /* DO NOT use this API internally. Use wolfSSL_FreeSession directly instead
  17266. * and pass in the ctx parameter if possible (like from ssl->ctx). */
  17267. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  17268. {
  17269. session = ClientSessionToSession(session);
  17270. wolfSSL_FreeSession(NULL, session);
  17271. }
  17272. #ifndef NO_SESSION_CACHE
  17273. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17274. {
  17275. int error = 0;
  17276. const byte* id = NULL;
  17277. byte idSz = 0;
  17278. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  17279. session = ClientSessionToSession(session);
  17280. if (session == NULL)
  17281. return WOLFSSL_FAILURE;
  17282. /* Session cache is global */
  17283. (void)ctx;
  17284. if (session->haveAltSessionID) {
  17285. id = session->altSessionID;
  17286. idSz = ID_LEN;
  17287. }
  17288. else {
  17289. id = session->sessionID;
  17290. idSz = session->sessionIDSz;
  17291. }
  17292. error = AddSessionToCache(ctx, session, id, idSz,
  17293. NULL, session->side,
  17294. #ifdef HAVE_SESSION_TICKET
  17295. session->ticketLen > 0,
  17296. #else
  17297. 0,
  17298. #endif
  17299. NULL);
  17300. return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  17301. }
  17302. #endif
  17303. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  17304. /**
  17305. * set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER
  17306. * @param session a pointer to WOLFSSL_SESSION structure
  17307. * @param cipher a function pointer to WOLFSSL_CIPHER
  17308. * @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE
  17309. */
  17310. int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session,
  17311. const WOLFSSL_CIPHER* cipher)
  17312. {
  17313. WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher");
  17314. session = ClientSessionToSession(session);
  17315. /* sanity check */
  17316. if (session == NULL || cipher == NULL) {
  17317. WOLFSSL_MSG("bad argument");
  17318. return WOLFSSL_FAILURE;
  17319. }
  17320. session->cipherSuite0 = cipher->cipherSuite0;
  17321. session->cipherSuite = cipher->cipherSuite;
  17322. WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS);
  17323. return WOLFSSL_SUCCESS;
  17324. }
  17325. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  17326. /* helper function that takes in a protocol version struct and returns string */
  17327. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  17328. {
  17329. WOLFSSL_ENTER("wolfSSL_get_version");
  17330. if (version == NULL) {
  17331. return "Bad arg";
  17332. }
  17333. if (version->major == SSLv3_MAJOR) {
  17334. switch (version->minor) {
  17335. case SSLv3_MINOR :
  17336. return "SSLv3";
  17337. case TLSv1_MINOR :
  17338. return "TLSv1";
  17339. case TLSv1_1_MINOR :
  17340. return "TLSv1.1";
  17341. case TLSv1_2_MINOR :
  17342. return "TLSv1.2";
  17343. case TLSv1_3_MINOR :
  17344. return "TLSv1.3";
  17345. default:
  17346. return "unknown";
  17347. }
  17348. }
  17349. #ifdef WOLFSSL_DTLS
  17350. else if (version->major == DTLS_MAJOR) {
  17351. switch (version->minor) {
  17352. case DTLS_MINOR :
  17353. return "DTLS";
  17354. case DTLSv1_2_MINOR :
  17355. return "DTLSv1.2";
  17356. case DTLSv1_3_MINOR :
  17357. return "DTLSv1.3";
  17358. default:
  17359. return "unknown";
  17360. }
  17361. }
  17362. #endif /* WOLFSSL_DTLS */
  17363. return "unknown";
  17364. }
  17365. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  17366. {
  17367. if (ssl == NULL) {
  17368. WOLFSSL_MSG("Bad argument");
  17369. return "unknown";
  17370. }
  17371. return wolfSSL_internal_get_version(&ssl->version);
  17372. }
  17373. /* current library version */
  17374. const char* wolfSSL_lib_version(void)
  17375. {
  17376. return LIBWOLFSSL_VERSION_STRING;
  17377. }
  17378. #ifdef OPENSSL_EXTRA
  17379. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  17380. const char* wolfSSL_OpenSSL_version(int a)
  17381. {
  17382. (void)a;
  17383. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17384. }
  17385. #else
  17386. const char* wolfSSL_OpenSSL_version(void)
  17387. {
  17388. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17389. }
  17390. #endif /* WOLFSSL_QT */
  17391. #endif
  17392. /* current library version in hex */
  17393. word32 wolfSSL_lib_version_hex(void)
  17394. {
  17395. return LIBWOLFSSL_VERSION_HEX;
  17396. }
  17397. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  17398. {
  17399. WOLFSSL_ENTER("wolfSSL_get_current_cipher_suite");
  17400. if (ssl)
  17401. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  17402. return 0;
  17403. }
  17404. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  17405. {
  17406. WOLFSSL_ENTER("wolfSSL_get_current_cipher");
  17407. if (ssl) {
  17408. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  17409. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  17410. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17411. ssl->cipher.bits = ssl->specs.key_size * 8;
  17412. #endif
  17413. return &ssl->cipher;
  17414. }
  17415. else
  17416. return NULL;
  17417. }
  17418. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  17419. {
  17420. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  17421. if (cipher == NULL) {
  17422. return NULL;
  17423. }
  17424. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  17425. !defined(WOLFSSL_QT)
  17426. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  17427. #else
  17428. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  17429. cipher->cipherSuite);
  17430. #endif
  17431. }
  17432. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  17433. {
  17434. WOLFSSL_ENTER("wolfSSL_CIPHER_get_version");
  17435. if (cipher == NULL || cipher->ssl == NULL) {
  17436. return NULL;
  17437. }
  17438. return wolfSSL_get_version(cipher->ssl);
  17439. }
  17440. const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session)
  17441. {
  17442. session = ClientSessionToSession(session);
  17443. if (session == NULL) {
  17444. return NULL;
  17445. }
  17446. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  17447. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  17448. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  17449. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  17450. #else
  17451. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  17452. #endif
  17453. #else
  17454. return NULL;
  17455. #endif
  17456. }
  17457. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  17458. {
  17459. WOLFSSL_ENTER("wolfSSL_get_cipher");
  17460. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  17461. }
  17462. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  17463. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  17464. {
  17465. /* get access to cipher_name_idx in internal.c */
  17466. return wolfSSL_get_cipher_name_internal(ssl);
  17467. }
  17468. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  17469. const byte cipherSuite)
  17470. {
  17471. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  17472. }
  17473. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  17474. const byte cipherSuite)
  17475. {
  17476. return GetCipherNameIana(cipherSuite0, cipherSuite);
  17477. }
  17478. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  17479. byte* cipherSuite, int *flags) {
  17480. if ((name == NULL) ||
  17481. (cipherSuite0 == NULL) ||
  17482. (cipherSuite == NULL) ||
  17483. (flags == NULL))
  17484. return BAD_FUNC_ARG;
  17485. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  17486. }
  17487. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17488. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17489. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  17490. {
  17491. WOLFSSL_STACK* sk;
  17492. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  17493. sk = wolfSSL_sk_new_null();
  17494. if (sk == NULL)
  17495. return NULL;
  17496. sk->type = STACK_TYPE_CIPHER;
  17497. return sk;
  17498. }
  17499. /* return 1 on success 0 on fail */
  17500. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  17501. WOLFSSL_CIPHER* cipher)
  17502. {
  17503. return wolfSSL_sk_push(sk, cipher);
  17504. }
  17505. #ifndef NO_WOLFSSL_STUB
  17506. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17507. {
  17508. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  17509. (void)sk;
  17510. return NULL;
  17511. }
  17512. #endif /* NO_WOLFSSL_STUB */
  17513. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17514. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  17515. {
  17516. word16 cipher_id = 0;
  17517. WOLFSSL_ENTER("wolfSSL_CIPHER_get_id");
  17518. if (cipher && cipher->ssl) {
  17519. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  17520. cipher->ssl->options.cipherSuite;
  17521. }
  17522. return cipher_id;
  17523. }
  17524. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  17525. {
  17526. const WOLFSSL_CIPHER* cipher = NULL;
  17527. byte cipherSuite0, cipherSuite;
  17528. WOLFSSL_ENTER("wolfSSL_get_cipher_by_value");
  17529. /* extract cipher id information */
  17530. cipherSuite = (value & 0xFF);
  17531. cipherSuite0 = ((value >> 8) & 0xFF);
  17532. /* TODO: lookup by cipherSuite0 / cipherSuite */
  17533. (void)cipherSuite0;
  17534. (void)cipherSuite;
  17535. return cipher;
  17536. }
  17537. #if defined(OPENSSL_EXTRA)
  17538. /* Free the structure for WOLFSSL_CIPHER stack
  17539. *
  17540. * sk stack to free nodes in
  17541. */
  17542. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17543. {
  17544. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  17545. wolfSSL_sk_free(sk);
  17546. }
  17547. #endif /* OPENSSL_ALL */
  17548. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  17549. !defined(NO_DH)
  17550. #ifdef HAVE_FFDHE
  17551. static const char* wolfssl_ffdhe_name(word16 group)
  17552. {
  17553. const char* str = NULL;
  17554. switch (group) {
  17555. case WOLFSSL_FFDHE_2048:
  17556. str = "FFDHE_2048";
  17557. break;
  17558. case WOLFSSL_FFDHE_3072:
  17559. str = "FFDHE_3072";
  17560. break;
  17561. case WOLFSSL_FFDHE_4096:
  17562. str = "FFDHE_4096";
  17563. break;
  17564. case WOLFSSL_FFDHE_6144:
  17565. str = "FFDHE_6144";
  17566. break;
  17567. case WOLFSSL_FFDHE_8192:
  17568. str = "FFDHE_8192";
  17569. break;
  17570. default:
  17571. break;
  17572. }
  17573. return str;
  17574. }
  17575. #endif
  17576. /* Return the name of the curve used for key exchange as a printable string.
  17577. *
  17578. * ssl The SSL/TLS object.
  17579. * returns NULL if ECDH was not used, otherwise the name as a string.
  17580. */
  17581. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  17582. {
  17583. const char* cName = NULL;
  17584. WOLFSSL_ENTER("wolfSSL_get_curve_name");
  17585. if (ssl == NULL)
  17586. return NULL;
  17587. #if defined(WOLFSSL_TLS13) && defined(HAVE_PQC)
  17588. /* Check for post-quantum groups. Return now because we do not want the ECC
  17589. * check to override this result in the case of a hybrid. */
  17590. if (IsAtLeastTLSv1_3(ssl->version)) {
  17591. switch (ssl->namedGroup) {
  17592. #ifdef HAVE_LIBOQS
  17593. case WOLFSSL_KYBER_LEVEL1:
  17594. return "KYBER_LEVEL1";
  17595. case WOLFSSL_KYBER_LEVEL3:
  17596. return "KYBER_LEVEL3";
  17597. case WOLFSSL_KYBER_LEVEL5:
  17598. return "KYBER_LEVEL5";
  17599. case WOLFSSL_P256_KYBER_LEVEL1:
  17600. return "P256_KYBER_LEVEL1";
  17601. case WOLFSSL_P384_KYBER_LEVEL3:
  17602. return "P384_KYBER_LEVEL3";
  17603. case WOLFSSL_P521_KYBER_LEVEL5:
  17604. return "P521_KYBER_LEVEL5";
  17605. #elif defined(HAVE_PQM4)
  17606. case WOLFSSL_KYBER_LEVEL1:
  17607. return "KYBER_LEVEL1";
  17608. #elif defined(WOLFSSL_WC_KYBER)
  17609. #ifdef WOLFSSL_KYBER512
  17610. case WOLFSSL_KYBER_LEVEL1:
  17611. return "KYBER_LEVEL1";
  17612. #endif
  17613. #ifdef WOLFSSL_KYBER768
  17614. case WOLFSSL_KYBER_LEVEL3:
  17615. return "KYBER_LEVEL3";
  17616. #endif
  17617. #ifdef WOLFSSL_KYBER1024
  17618. case WOLFSSL_KYBER_LEVEL5:
  17619. return "KYBER_LEVEL5";
  17620. #endif
  17621. #endif
  17622. }
  17623. }
  17624. #endif /* WOLFSSL_TLS13 && HAVE_PQC */
  17625. #ifdef HAVE_FFDHE
  17626. if (ssl->namedGroup != 0) {
  17627. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  17628. }
  17629. #endif
  17630. #ifdef HAVE_CURVE25519
  17631. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  17632. cName = "X25519";
  17633. }
  17634. #endif
  17635. #ifdef HAVE_CURVE448
  17636. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  17637. cName = "X448";
  17638. }
  17639. #endif
  17640. #ifdef HAVE_ECC
  17641. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  17642. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  17643. NULL));
  17644. }
  17645. #endif
  17646. return cName;
  17647. }
  17648. #endif
  17649. #ifdef OPENSSL_EXTRA
  17650. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17651. /* return authentication NID corresponding to cipher suite
  17652. * @param cipher a pointer to WOLFSSL_CIPHER
  17653. * return NID if found, NID_undef if not found
  17654. */
  17655. int wolfSSL_CIPHER_get_auth_nid(const WOLFSSL_CIPHER* cipher)
  17656. {
  17657. static const struct authnid {
  17658. const char* alg_name;
  17659. const int nid;
  17660. } authnid_tbl[] = {
  17661. {"RSA", NID_auth_rsa},
  17662. {"PSK", NID_auth_psk},
  17663. {"SRP", NID_auth_srp},
  17664. {"ECDSA", NID_auth_ecdsa},
  17665. {"None", NID_auth_null},
  17666. {NULL, NID_undef}
  17667. };
  17668. const char* authStr;
  17669. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17670. if (GetCipherSegment(cipher, n) == NULL) {
  17671. WOLFSSL_MSG("no suitable cipher name found");
  17672. return NID_undef;
  17673. }
  17674. authStr = GetCipherAuthStr(n);
  17675. if (authStr != NULL) {
  17676. const struct authnid* sa;
  17677. for(sa = authnid_tbl; sa->alg_name != NULL; sa++) {
  17678. if (XSTRCMP(sa->alg_name, authStr) == 0) {
  17679. return sa->nid;
  17680. }
  17681. }
  17682. }
  17683. return NID_undef;
  17684. }
  17685. /* return cipher NID corresponding to cipher suite
  17686. * @param cipher a pointer to WOLFSSL_CIPHER
  17687. * return NID if found, NID_undef if not found
  17688. */
  17689. int wolfSSL_CIPHER_get_cipher_nid(const WOLFSSL_CIPHER* cipher)
  17690. {
  17691. static const struct ciphernid {
  17692. const char* alg_name;
  17693. const int nid;
  17694. } ciphernid_tbl[] = {
  17695. {"AESGCM(256)", NID_aes_256_gcm},
  17696. {"AESGCM(128)", NID_aes_128_gcm},
  17697. {"AESCCM(128)", NID_aes_128_ccm},
  17698. {"AES(128)", NID_aes_128_cbc},
  17699. {"AES(256)", NID_aes_256_cbc},
  17700. {"CAMELLIA(256)", NID_camellia_256_cbc},
  17701. {"CAMELLIA(128)", NID_camellia_128_cbc},
  17702. {"RC4", NID_rc4},
  17703. {"3DES", NID_des_ede3_cbc},
  17704. {"CHACHA20/POLY1305(256)", NID_chacha20_poly1305},
  17705. {"None", NID_undef},
  17706. {NULL, NID_undef}
  17707. };
  17708. const char* encStr;
  17709. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17710. WOLFSSL_ENTER("wolfSSL_CIPHER_get_cipher_nid");
  17711. if (GetCipherSegment(cipher, n) == NULL) {
  17712. WOLFSSL_MSG("no suitable cipher name found");
  17713. return NID_undef;
  17714. }
  17715. encStr = GetCipherEncStr(n);
  17716. if (encStr != NULL) {
  17717. const struct ciphernid* c;
  17718. for(c = ciphernid_tbl; c->alg_name != NULL; c++) {
  17719. if (XSTRCMP(c->alg_name, encStr) == 0) {
  17720. return c->nid;
  17721. }
  17722. }
  17723. }
  17724. return NID_undef;
  17725. }
  17726. /* return digest NID corresponding to cipher suite
  17727. * @param cipher a pointer to WOLFSSL_CIPHER
  17728. * return NID if found, NID_undef if not found
  17729. */
  17730. int wolfSSL_CIPHER_get_digest_nid(const WOLFSSL_CIPHER* cipher)
  17731. {
  17732. static const struct macnid {
  17733. const char* alg_name;
  17734. const int nid;
  17735. } macnid_tbl[] = {
  17736. {"SHA1", NID_sha1},
  17737. {"SHA256", NID_sha256},
  17738. {"SHA384", NID_sha384},
  17739. {NULL, NID_undef}
  17740. };
  17741. const char* name;
  17742. const char* macStr;
  17743. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17744. (void)name;
  17745. WOLFSSL_ENTER("wolfSSL_CIPHER_get_digest_nid");
  17746. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17747. WOLFSSL_MSG("no suitable cipher name found");
  17748. return NID_undef;
  17749. }
  17750. /* in MD5 case, NID will be NID_md5 */
  17751. if (XSTRSTR(name, "MD5") != NULL) {
  17752. return NID_md5;
  17753. }
  17754. macStr = GetCipherMacStr(n);
  17755. if (macStr != NULL) {
  17756. const struct macnid* mc;
  17757. for(mc = macnid_tbl; mc->alg_name != NULL; mc++) {
  17758. if (XSTRCMP(mc->alg_name, macStr) == 0) {
  17759. return mc->nid;
  17760. }
  17761. }
  17762. }
  17763. return NID_undef;
  17764. }
  17765. /* return key exchange NID corresponding to cipher suite
  17766. * @param cipher a pointer to WOLFSSL_CIPHER
  17767. * return NID if found, NID_undef if not found
  17768. */
  17769. int wolfSSL_CIPHER_get_kx_nid(const WOLFSSL_CIPHER* cipher)
  17770. {
  17771. static const struct kxnid {
  17772. const char* name;
  17773. const int nid;
  17774. } kxnid_table[] = {
  17775. {"ECDHEPSK", NID_kx_ecdhe_psk},
  17776. {"ECDH", NID_kx_ecdhe},
  17777. {"DHEPSK", NID_kx_dhe_psk},
  17778. {"DH", NID_kx_dhe},
  17779. {"RSAPSK", NID_kx_rsa_psk},
  17780. {"SRP", NID_kx_srp},
  17781. {"EDH", NID_kx_dhe},
  17782. {"RSA", NID_kx_rsa},
  17783. {NULL, NID_undef}
  17784. };
  17785. const char* keaStr;
  17786. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17787. WOLFSSL_ENTER("wolfSSL_CIPHER_get_kx_nid");
  17788. if (GetCipherSegment(cipher, n) == NULL) {
  17789. WOLFSSL_MSG("no suitable cipher name found");
  17790. return NID_undef;
  17791. }
  17792. /* in TLS 1.3 case, NID will be NID_kx_any */
  17793. if (XSTRCMP(n[0], "TLS13") == 0) {
  17794. return NID_kx_any;
  17795. }
  17796. keaStr = GetCipherKeaStr(n);
  17797. if (keaStr != NULL) {
  17798. const struct kxnid* k;
  17799. for(k = kxnid_table; k->name != NULL; k++) {
  17800. if (XSTRCMP(k->name, keaStr) == 0) {
  17801. return k->nid;
  17802. }
  17803. }
  17804. }
  17805. return NID_undef;
  17806. }
  17807. /* check if cipher suite is AEAD
  17808. * @param cipher a pointer to WOLFSSL_CIPHER
  17809. * return 1 if cipher is AEAD, 0 otherwise
  17810. */
  17811. int wolfSSL_CIPHER_is_aead(const WOLFSSL_CIPHER* cipher)
  17812. {
  17813. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17814. WOLFSSL_ENTER("wolfSSL_CIPHER_is_aead");
  17815. if (GetCipherSegment(cipher, n) == NULL) {
  17816. WOLFSSL_MSG("no suitable cipher name found");
  17817. return NID_undef;
  17818. }
  17819. return IsCipherAEAD(n);
  17820. }
  17821. /* Creates cipher->description based on cipher->offset
  17822. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  17823. * to a stack of ciphers.
  17824. * @param [in] cipher: A cipher from a stack of ciphers.
  17825. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  17826. */
  17827. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  17828. {
  17829. int strLen;
  17830. unsigned long offset;
  17831. char* dp;
  17832. const char* name;
  17833. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  17834. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17835. int len = MAX_DESCRIPTION_SZ-1;
  17836. const CipherSuiteInfo* cipher_names;
  17837. ProtocolVersion pv;
  17838. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  17839. if (cipher == NULL)
  17840. return WOLFSSL_FAILURE;
  17841. dp = cipher->description;
  17842. if (dp == NULL)
  17843. return WOLFSSL_FAILURE;
  17844. cipher_names = GetCipherNames();
  17845. offset = cipher->offset;
  17846. if (offset >= (unsigned long)GetCipherNamesSize())
  17847. return WOLFSSL_FAILURE;
  17848. pv.major = cipher_names[offset].major;
  17849. pv.minor = cipher_names[offset].minor;
  17850. protocol = wolfSSL_internal_get_version(&pv);
  17851. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17852. WOLFSSL_MSG("no suitable cipher name found");
  17853. return WOLFSSL_FAILURE;
  17854. }
  17855. /* keaStr */
  17856. keaStr = GetCipherKeaStr(n);
  17857. /* authStr */
  17858. authStr = GetCipherAuthStr(n);
  17859. /* encStr */
  17860. encStr = GetCipherEncStr(n);
  17861. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  17862. WOLFSSL_MSG("Cipher Bits Not Set.");
  17863. }
  17864. /* macStr */
  17865. macStr = GetCipherMacStr(n);
  17866. /* Build up the string by copying onto the end. */
  17867. XSTRNCPY(dp, name, len);
  17868. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17869. len -= strLen; dp += strLen;
  17870. XSTRNCPY(dp, " ", len);
  17871. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17872. len -= strLen; dp += strLen;
  17873. XSTRNCPY(dp, protocol, len);
  17874. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17875. len -= strLen; dp += strLen;
  17876. XSTRNCPY(dp, " Kx=", len);
  17877. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17878. len -= strLen; dp += strLen;
  17879. XSTRNCPY(dp, keaStr, len);
  17880. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17881. len -= strLen; dp += strLen;
  17882. XSTRNCPY(dp, " Au=", len);
  17883. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17884. len -= strLen; dp += strLen;
  17885. XSTRNCPY(dp, authStr, len);
  17886. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17887. len -= strLen; dp += strLen;
  17888. XSTRNCPY(dp, " Enc=", len);
  17889. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17890. len -= strLen; dp += strLen;
  17891. XSTRNCPY(dp, encStr, len);
  17892. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17893. len -= strLen; dp += strLen;
  17894. XSTRNCPY(dp, " Mac=", len);
  17895. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17896. len -= strLen; dp += strLen;
  17897. XSTRNCPY(dp, macStr, len);
  17898. dp[len-1] = '\0';
  17899. return WOLFSSL_SUCCESS;
  17900. }
  17901. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  17902. static WC_INLINE const char* wolfssl_kea_to_string(int kea)
  17903. {
  17904. const char* keaStr;
  17905. switch (kea) {
  17906. case no_kea:
  17907. keaStr = "None";
  17908. break;
  17909. #ifndef NO_RSA
  17910. case rsa_kea:
  17911. keaStr = "RSA";
  17912. break;
  17913. #endif
  17914. #ifndef NO_DH
  17915. case diffie_hellman_kea:
  17916. keaStr = "DHE";
  17917. break;
  17918. #endif
  17919. case fortezza_kea:
  17920. keaStr = "FZ";
  17921. break;
  17922. #ifndef NO_PSK
  17923. case psk_kea:
  17924. keaStr = "PSK";
  17925. break;
  17926. #ifndef NO_DH
  17927. case dhe_psk_kea:
  17928. keaStr = "DHEPSK";
  17929. break;
  17930. #endif
  17931. #ifdef HAVE_ECC
  17932. case ecdhe_psk_kea:
  17933. keaStr = "ECDHEPSK";
  17934. break;
  17935. #endif
  17936. #endif
  17937. #ifdef HAVE_ECC
  17938. case ecc_diffie_hellman_kea:
  17939. keaStr = "ECDHE";
  17940. break;
  17941. case ecc_static_diffie_hellman_kea:
  17942. keaStr = "ECDH";
  17943. break;
  17944. #endif
  17945. default:
  17946. keaStr = "unknown";
  17947. break;
  17948. }
  17949. return keaStr;
  17950. }
  17951. static WC_INLINE const char* wolfssl_sigalg_to_string(int sig_algo)
  17952. {
  17953. const char* authStr;
  17954. switch (sig_algo) {
  17955. case anonymous_sa_algo:
  17956. authStr = "None";
  17957. break;
  17958. #ifndef NO_RSA
  17959. case rsa_sa_algo:
  17960. authStr = "RSA";
  17961. break;
  17962. #ifdef WC_RSA_PSS
  17963. case rsa_pss_sa_algo:
  17964. authStr = "RSA-PSS";
  17965. break;
  17966. #endif
  17967. #endif
  17968. #ifndef NO_DSA
  17969. case dsa_sa_algo:
  17970. authStr = "DSA";
  17971. break;
  17972. #endif
  17973. #ifdef HAVE_ECC
  17974. case ecc_dsa_sa_algo:
  17975. authStr = "ECDSA";
  17976. break;
  17977. #endif
  17978. #ifdef WOLFSSL_SM2
  17979. case sm2_sa_algo:
  17980. authStr = "SM2";
  17981. break;
  17982. #endif
  17983. #ifdef HAVE_ED25519
  17984. case ed25519_sa_algo:
  17985. authStr = "Ed25519";
  17986. break;
  17987. #endif
  17988. #ifdef HAVE_ED448
  17989. case ed448_sa_algo:
  17990. authStr = "Ed448";
  17991. break;
  17992. #endif
  17993. default:
  17994. authStr = "unknown";
  17995. break;
  17996. }
  17997. return authStr;
  17998. }
  17999. static WC_INLINE const char* wolfssl_cipher_to_string(int cipher, int key_size)
  18000. {
  18001. const char* encStr;
  18002. (void)key_size;
  18003. switch (cipher) {
  18004. case wolfssl_cipher_null:
  18005. encStr = "None";
  18006. break;
  18007. #ifndef NO_RC4
  18008. case wolfssl_rc4:
  18009. encStr = "RC4(128)";
  18010. break;
  18011. #endif
  18012. #ifndef NO_DES3
  18013. case wolfssl_triple_des:
  18014. encStr = "3DES(168)";
  18015. break;
  18016. #endif
  18017. #ifndef NO_AES
  18018. case wolfssl_aes:
  18019. if (key_size == 128)
  18020. encStr = "AES(128)";
  18021. else if (key_size == 256)
  18022. encStr = "AES(256)";
  18023. else
  18024. encStr = "AES(?)";
  18025. break;
  18026. #ifdef HAVE_AESGCM
  18027. case wolfssl_aes_gcm:
  18028. if (key_size == 128)
  18029. encStr = "AESGCM(128)";
  18030. else if (key_size == 256)
  18031. encStr = "AESGCM(256)";
  18032. else
  18033. encStr = "AESGCM(?)";
  18034. break;
  18035. #endif
  18036. #ifdef HAVE_AESCCM
  18037. case wolfssl_aes_ccm:
  18038. if (key_size == 128)
  18039. encStr = "AESCCM(128)";
  18040. else if (key_size == 256)
  18041. encStr = "AESCCM(256)";
  18042. else
  18043. encStr = "AESCCM(?)";
  18044. break;
  18045. #endif
  18046. #endif
  18047. #ifdef HAVE_CHACHA
  18048. case wolfssl_chacha:
  18049. encStr = "CHACHA20/POLY1305(256)";
  18050. break;
  18051. #endif
  18052. #ifdef HAVE_ARIA
  18053. case wolfssl_aria_gcm:
  18054. if (key_size == 128)
  18055. encStr = "Aria(128)";
  18056. else if (key_size == 192)
  18057. encStr = "Aria(192)";
  18058. else if (key_size == 256)
  18059. encStr = "Aria(256)";
  18060. else
  18061. encStr = "Aria(?)";
  18062. break;
  18063. #endif
  18064. #ifdef HAVE_CAMELLIA
  18065. case wolfssl_camellia:
  18066. if (key_size == 128)
  18067. encStr = "Camellia(128)";
  18068. else if (key_size == 256)
  18069. encStr = "Camellia(256)";
  18070. else
  18071. encStr = "Camellia(?)";
  18072. break;
  18073. #endif
  18074. default:
  18075. encStr = "unknown";
  18076. break;
  18077. }
  18078. return encStr;
  18079. }
  18080. static WC_INLINE const char* wolfssl_mac_to_string(int mac)
  18081. {
  18082. const char* macStr;
  18083. switch (mac) {
  18084. case no_mac:
  18085. macStr = "None";
  18086. break;
  18087. #ifndef NO_MD5
  18088. case md5_mac:
  18089. macStr = "MD5";
  18090. break;
  18091. #endif
  18092. #ifndef NO_SHA
  18093. case sha_mac:
  18094. macStr = "SHA1";
  18095. break;
  18096. #endif
  18097. #ifdef HAVE_SHA224
  18098. case sha224_mac:
  18099. macStr = "SHA224";
  18100. break;
  18101. #endif
  18102. #ifndef NO_SHA256
  18103. case sha256_mac:
  18104. macStr = "SHA256";
  18105. break;
  18106. #endif
  18107. #ifdef HAVE_SHA384
  18108. case sha384_mac:
  18109. macStr = "SHA384";
  18110. break;
  18111. #endif
  18112. #ifdef HAVE_SHA512
  18113. case sha512_mac:
  18114. macStr = "SHA512";
  18115. break;
  18116. #endif
  18117. default:
  18118. macStr = "unknown";
  18119. break;
  18120. }
  18121. return macStr;
  18122. }
  18123. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  18124. int len)
  18125. {
  18126. char *ret = in;
  18127. const char *keaStr, *authStr, *encStr, *macStr;
  18128. size_t strLen;
  18129. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  18130. if (cipher == NULL || in == NULL)
  18131. return NULL;
  18132. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18133. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  18134. * Return the description based on cipher_names[cipher->offset]
  18135. */
  18136. if (cipher->in_stack == TRUE) {
  18137. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  18138. XSTRNCPY(in,cipher->description,len);
  18139. return ret;
  18140. }
  18141. #endif
  18142. /* Get the cipher description based on the SSL session cipher */
  18143. keaStr = wolfssl_kea_to_string(cipher->ssl->specs.kea);
  18144. authStr = wolfssl_sigalg_to_string(cipher->ssl->specs.sig_algo);
  18145. encStr = wolfssl_cipher_to_string(cipher->ssl->specs.bulk_cipher_algorithm,
  18146. cipher->ssl->specs.key_size);
  18147. macStr = wolfssl_mac_to_string(cipher->ssl->specs.mac_algorithm);
  18148. /* Build up the string by copying onto the end. */
  18149. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  18150. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18151. XSTRNCPY(in, " ", len);
  18152. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18153. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  18154. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18155. XSTRNCPY(in, " Kx=", len);
  18156. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18157. XSTRNCPY(in, keaStr, len);
  18158. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18159. XSTRNCPY(in, " Au=", len);
  18160. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18161. XSTRNCPY(in, authStr, len);
  18162. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18163. XSTRNCPY(in, " Enc=", len);
  18164. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18165. XSTRNCPY(in, encStr, len);
  18166. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18167. XSTRNCPY(in, " Mac=", len);
  18168. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18169. XSTRNCPY(in, macStr, len);
  18170. in[len-1] = '\0';
  18171. return ret;
  18172. }
  18173. #ifndef NO_WOLFSSL_STUB
  18174. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  18175. int* ssl)
  18176. {
  18177. (void)url;
  18178. (void)host;
  18179. (void)port;
  18180. (void)path;
  18181. (void)ssl;
  18182. WOLFSSL_STUB("OCSP_parse_url");
  18183. return 0;
  18184. }
  18185. #endif
  18186. #ifndef NO_WOLFSSL_STUB
  18187. void wolfSSL_RAND_screen(void)
  18188. {
  18189. WOLFSSL_STUB("RAND_screen");
  18190. }
  18191. #endif
  18192. int wolfSSL_RAND_load_file(const char* fname, long len)
  18193. {
  18194. (void)fname;
  18195. /* wolfCrypt provides enough entropy internally or will report error */
  18196. if (len == -1)
  18197. return 1024;
  18198. else
  18199. return (int)len;
  18200. }
  18201. #ifndef NO_WOLFSSL_STUB
  18202. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  18203. {
  18204. WOLFSSL_STUB("COMP_zlib");
  18205. return 0;
  18206. }
  18207. #endif
  18208. #ifndef NO_WOLFSSL_STUB
  18209. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  18210. {
  18211. WOLFSSL_STUB("COMP_rle");
  18212. return 0;
  18213. }
  18214. #endif
  18215. #ifndef NO_WOLFSSL_STUB
  18216. int wolfSSL_COMP_add_compression_method(int method, void* data)
  18217. {
  18218. (void)method;
  18219. (void)data;
  18220. WOLFSSL_STUB("COMP_add_compression_method");
  18221. return 0;
  18222. }
  18223. #endif
  18224. /* wolfSSL_set_dynlock_create_callback
  18225. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  18226. * This function exists for compatibility purposes because wolfSSL satisfies
  18227. * thread safety without relying on the callback.
  18228. */
  18229. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  18230. const char*, int))
  18231. {
  18232. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  18233. (void)f;
  18234. }
  18235. /* wolfSSL_set_dynlock_lock_callback
  18236. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  18237. * This function exists for compatibility purposes because wolfSSL satisfies
  18238. * thread safety without relying on the callback.
  18239. */
  18240. void wolfSSL_set_dynlock_lock_callback(
  18241. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  18242. {
  18243. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  18244. (void)f;
  18245. }
  18246. /* wolfSSL_set_dynlock_destroy_callback
  18247. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  18248. * This function exists for compatibility purposes because wolfSSL satisfies
  18249. * thread safety without relying on the callback.
  18250. */
  18251. void wolfSSL_set_dynlock_destroy_callback(
  18252. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  18253. {
  18254. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  18255. (void)f;
  18256. }
  18257. #endif /* OPENSSL_EXTRA */
  18258. #ifdef OPENSSL_EXTRA
  18259. #ifndef NO_CERTS
  18260. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  18261. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  18262. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  18263. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  18264. *
  18265. * Returns size of key buffer on success
  18266. */
  18267. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18268. {
  18269. return wolfSSL_EVP_PKEY_get_der(key, der);
  18270. }
  18271. int wolfSSL_i2d_PublicKey(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  18272. {
  18273. #if !defined(NO_RSA) || defined(HAVE_ECC)
  18274. #ifdef HAVE_ECC
  18275. unsigned char *local_der = NULL;
  18276. word32 local_derSz = 0;
  18277. unsigned char *pub_der = NULL;
  18278. ecc_key *eccKey = NULL;
  18279. word32 inOutIdx = 0;
  18280. #endif
  18281. word32 pub_derSz = 0;
  18282. int ret;
  18283. int key_type = 0;
  18284. if (key == NULL) {
  18285. return WOLFSSL_FATAL_ERROR;
  18286. }
  18287. key_type = key->type;
  18288. if ((key_type != EVP_PKEY_EC) && (key_type != EVP_PKEY_RSA)) {
  18289. return WOLFSSL_FATAL_ERROR;
  18290. }
  18291. #ifndef NO_RSA
  18292. if (key_type == EVP_PKEY_RSA) {
  18293. return wolfSSL_i2d_RSAPublicKey(key->rsa, der);
  18294. }
  18295. #endif
  18296. /* Now that RSA is taken care of, we only need to consider the ECC case. */
  18297. #ifdef HAVE_ECC
  18298. /* We need to get the DER, then convert it to a public key. But what we get
  18299. * might be a buffered private key so we need to decode it and then encode
  18300. * the public part. */
  18301. ret = wolfSSL_EVP_PKEY_get_der(key, &local_der);
  18302. if (ret <= 0) {
  18303. /* In this case, there was no buffered DER at all. This could be the
  18304. * case where the key that was passed in was generated. So now we
  18305. * have to create the local DER. */
  18306. local_derSz = wolfSSL_i2d_ECPrivateKey(key->ecc, &local_der);
  18307. if (local_derSz == 0) {
  18308. ret = WOLFSSL_FATAL_ERROR;
  18309. }
  18310. } else {
  18311. local_derSz = ret;
  18312. ret = 0;
  18313. }
  18314. if (ret == 0) {
  18315. eccKey = (ecc_key *)XMALLOC(sizeof(*eccKey), NULL, DYNAMIC_TYPE_ECC);
  18316. if (eccKey == NULL) {
  18317. WOLFSSL_MSG("Failed to allocate key buffer.");
  18318. ret = WOLFSSL_FATAL_ERROR;
  18319. }
  18320. }
  18321. if (ret == 0) {
  18322. ret = wc_ecc_init(eccKey);
  18323. }
  18324. if (ret == 0) {
  18325. ret = wc_EccPublicKeyDecode(local_der, &inOutIdx, eccKey, local_derSz);
  18326. if (ret < 0) {
  18327. /* We now try again as x.963 [point type][x][opt y]. */
  18328. ret = wc_ecc_import_x963(local_der, local_derSz, eccKey);
  18329. }
  18330. }
  18331. if (ret == 0) {
  18332. pub_derSz = wc_EccPublicKeyDerSize(eccKey, 0);
  18333. if ((int)pub_derSz <= 0) {
  18334. ret = WOLFSSL_FAILURE;
  18335. }
  18336. }
  18337. if (ret == 0) {
  18338. pub_der = (unsigned char*)XMALLOC(pub_derSz, NULL,
  18339. DYNAMIC_TYPE_PUBLIC_KEY);
  18340. if (pub_der == NULL) {
  18341. WOLFSSL_MSG("Failed to allocate output buffer.");
  18342. ret = WOLFSSL_FATAL_ERROR;
  18343. }
  18344. }
  18345. if (ret == 0) {
  18346. pub_derSz = wc_EccPublicKeyToDer(eccKey, pub_der, pub_derSz, 0);
  18347. if ((int)pub_derSz <= 0) {
  18348. ret = WOLFSSL_FATAL_ERROR;
  18349. }
  18350. }
  18351. /* This block is for actually returning the DER of the public key */
  18352. if ((ret == 0) && (der != NULL)) {
  18353. if (*der == NULL) {
  18354. *der = (unsigned char*)XMALLOC(pub_derSz, NULL,
  18355. DYNAMIC_TYPE_PUBLIC_KEY);
  18356. if (*der == NULL) {
  18357. WOLFSSL_MSG("Failed to allocate output buffer.");
  18358. ret = WOLFSSL_FATAL_ERROR;
  18359. }
  18360. if (ret == 0) {
  18361. XMEMCPY(*der, pub_der, pub_derSz);
  18362. }
  18363. }
  18364. else {
  18365. XMEMCPY(*der, pub_der, pub_derSz);
  18366. *der += pub_derSz;
  18367. }
  18368. }
  18369. XFREE(pub_der, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  18370. XFREE(local_der, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  18371. wc_ecc_free(eccKey);
  18372. XFREE(eccKey, NULL, DYNAMIC_TYPE_ECC);
  18373. #else
  18374. ret = WOLFSSL_FATAL_ERROR;
  18375. #endif /* HAVE_ECC */
  18376. if (ret == 0) {
  18377. return pub_derSz;
  18378. }
  18379. return ret;
  18380. #else
  18381. return WOLFSSL_FATAL_ERROR;
  18382. #endif /* !NO_RSA || HAVE_ECC */
  18383. }
  18384. #endif /* !NO_ASN && !NO_PWDBASED */
  18385. #endif /* !NO_CERTS */
  18386. #endif /* OPENSSL_EXTRA */
  18387. #ifdef OPENSSL_EXTRA
  18388. /* Sets the DNS hostname to name.
  18389. * Hostname is cleared if name is NULL or empty. */
  18390. int wolfSSL_set1_host(WOLFSSL * ssl, const char* name)
  18391. {
  18392. if (ssl == NULL) {
  18393. return WOLFSSL_FAILURE;
  18394. }
  18395. return wolfSSL_X509_VERIFY_PARAM_set1_host(ssl->param, name, 0);
  18396. }
  18397. /******************************************************************************
  18398. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  18399. *
  18400. * RETURNS:
  18401. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  18402. * Note: Returns WOLFSSL_SUCCESS, in case either parameter is NULL,
  18403. * same as openssl.
  18404. */
  18405. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  18406. {
  18407. if (ctx == NULL || vpm == NULL)
  18408. return WOLFSSL_SUCCESS;
  18409. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  18410. }
  18411. /******************************************************************************
  18412. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  18413. *
  18414. * RETURNS:
  18415. * returns pointer to the SSL verification parameters on success,
  18416. * otherwise returns NULL
  18417. */
  18418. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  18419. {
  18420. if (ctx == NULL) {
  18421. return NULL;
  18422. }
  18423. return ctx->param;
  18424. }
  18425. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  18426. {
  18427. if (ssl == NULL) {
  18428. return NULL;
  18429. }
  18430. return ssl->param;
  18431. }
  18432. #endif /* OPENSSL_EXTRA */
  18433. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18434. /* Gets an index to store SSL structure at.
  18435. *
  18436. * Returns positive index on success and negative values on failure
  18437. */
  18438. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  18439. {
  18440. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  18441. /* store SSL at index 0 */
  18442. return 0;
  18443. }
  18444. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18445. #ifdef OPENSSL_EXTRA
  18446. /* Sets a function callback that will send information about the state of all
  18447. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  18448. * in.
  18449. *
  18450. * ctx WOLFSSL_CTX structure to set callback function in
  18451. * f callback function to use
  18452. */
  18453. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  18454. void (*f)(const WOLFSSL* ssl, int type, int val))
  18455. {
  18456. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  18457. if (ctx == NULL) {
  18458. WOLFSSL_MSG("Bad function argument");
  18459. }
  18460. else {
  18461. ctx->CBIS = f;
  18462. }
  18463. }
  18464. void wolfSSL_set_info_callback(WOLFSSL* ssl,
  18465. void (*f)(const WOLFSSL* ssl, int type, int val))
  18466. {
  18467. WOLFSSL_ENTER("wolfSSL_set_info_callback");
  18468. if (ssl == NULL) {
  18469. WOLFSSL_MSG("Bad function argument");
  18470. }
  18471. else {
  18472. ssl->CBIS = f;
  18473. }
  18474. }
  18475. unsigned long wolfSSL_ERR_peek_error(void)
  18476. {
  18477. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  18478. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  18479. }
  18480. int wolfSSL_ERR_GET_LIB(unsigned long err)
  18481. {
  18482. unsigned long value;
  18483. value = (err & 0xFFFFFFL);
  18484. switch (value) {
  18485. case -SSL_R_HTTP_REQUEST:
  18486. return ERR_LIB_SSL;
  18487. case -ASN_NO_PEM_HEADER:
  18488. case PEM_R_NO_START_LINE:
  18489. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  18490. case PEM_R_BAD_PASSWORD_READ:
  18491. case PEM_R_BAD_DECRYPT:
  18492. return ERR_LIB_PEM;
  18493. case EVP_R_BAD_DECRYPT:
  18494. case EVP_R_BN_DECODE_ERROR:
  18495. case EVP_R_DECODE_ERROR:
  18496. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  18497. return ERR_LIB_EVP;
  18498. case ASN1_R_HEADER_TOO_LONG:
  18499. return ERR_LIB_ASN1;
  18500. default:
  18501. return 0;
  18502. }
  18503. }
  18504. /* This function is to find global error values that are the same through out
  18505. * all library version. With wolfSSL having only one set of error codes the
  18506. * return value is pretty straight forward. The only thing needed is all wolfSSL
  18507. * error values are typically negative.
  18508. *
  18509. * Returns the error reason
  18510. */
  18511. int wolfSSL_ERR_GET_REASON(unsigned long err)
  18512. {
  18513. int ret = (int)err;
  18514. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  18515. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  18516. /* Nginx looks for this error to know to stop parsing certificates.
  18517. * Same for HAProxy. */
  18518. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE) ||
  18519. ((err & 0xFFFFFFL) == -ASN_NO_PEM_HEADER) ||
  18520. ((err & 0xFFFL) == PEM_R_NO_START_LINE ))
  18521. return PEM_R_NO_START_LINE;
  18522. if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST))
  18523. return SSL_R_HTTP_REQUEST;
  18524. #endif
  18525. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  18526. if (err == ((ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG))
  18527. return ASN1_R_HEADER_TOO_LONG;
  18528. #endif
  18529. /* check if error value is in range of wolfSSL errors */
  18530. ret = 0 - ret; /* setting as negative value */
  18531. /* wolfCrypt range is less than MAX (-100)
  18532. wolfSSL range is MIN (-300) and lower */
  18533. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  18534. return ret;
  18535. }
  18536. else {
  18537. WOLFSSL_MSG("Not in range of typical error values");
  18538. ret = (int)err;
  18539. }
  18540. return ret;
  18541. }
  18542. /* returns a string that describes the alert
  18543. *
  18544. * alertID the alert value to look up
  18545. */
  18546. const char* wolfSSL_alert_type_string_long(int alertID)
  18547. {
  18548. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  18549. return AlertTypeToString(alertID);
  18550. }
  18551. const char* wolfSSL_alert_desc_string_long(int alertID)
  18552. {
  18553. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  18554. return AlertTypeToString(alertID);
  18555. }
  18556. #define STATE_STRINGS_PROTO(s) \
  18557. { \
  18558. {"SSLv3 " s, \
  18559. "SSLv3 " s, \
  18560. "SSLv3 " s}, \
  18561. {"TLSv1 " s, \
  18562. "TLSv1 " s, \
  18563. "TLSv1 " s}, \
  18564. {"TLSv1_1 " s, \
  18565. "TLSv1_1 " s, \
  18566. "TLSv1_1 " s}, \
  18567. {"TLSv1_2 " s, \
  18568. "TLSv1_2 " s, \
  18569. "TLSv1_2 " s}, \
  18570. {"TLSv1_3 " s, \
  18571. "TLSv1_3 " s, \
  18572. "TLSv1_3 " s}, \
  18573. {"DTLSv1 " s, \
  18574. "DTLSv1 " s, \
  18575. "DTLSv1 " s}, \
  18576. {"DTLSv1_2 " s, \
  18577. "DTLSv1_2 " s, \
  18578. "DTLSv1_2 " s}, \
  18579. {"DTLSv1_3 " s, \
  18580. "DTLSv1_3 " s, \
  18581. "DTLSv1_3 " s}, \
  18582. }
  18583. #define STATE_STRINGS_PROTO_RW(s) \
  18584. { \
  18585. {"SSLv3 read " s, \
  18586. "SSLv3 write " s, \
  18587. "SSLv3 " s}, \
  18588. {"TLSv1 read " s, \
  18589. "TLSv1 write " s, \
  18590. "TLSv1 " s}, \
  18591. {"TLSv1_1 read " s, \
  18592. "TLSv1_1 write " s, \
  18593. "TLSv1_1 " s}, \
  18594. {"TLSv1_2 read " s, \
  18595. "TLSv1_2 write " s, \
  18596. "TLSv1_2 " s}, \
  18597. {"TLSv1_3 read " s, \
  18598. "TLSv1_3 write " s, \
  18599. "TLSv1_3 " s}, \
  18600. {"DTLSv1 read " s, \
  18601. "DTLSv1 write " s, \
  18602. "DTLSv1 " s}, \
  18603. {"DTLSv1_2 read " s, \
  18604. "DTLSv1_2 write " s, \
  18605. "DTLSv1_2 " s}, \
  18606. {"DTLSv1_3 read " s, \
  18607. "DTLSv1_3 write " s, \
  18608. "DTLSv1_3 " s}, \
  18609. }
  18610. /* Gets the current state of the WOLFSSL structure
  18611. *
  18612. * ssl WOLFSSL structure to get state of
  18613. *
  18614. * Returns a human readable string of the WOLFSSL structure state
  18615. */
  18616. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  18617. {
  18618. static const char* OUTPUT_STR[24][8][3] = {
  18619. STATE_STRINGS_PROTO("Initialization"),
  18620. STATE_STRINGS_PROTO_RW("Server Hello Request"),
  18621. STATE_STRINGS_PROTO_RW("Server Hello Verify Request"),
  18622. STATE_STRINGS_PROTO_RW("Server Hello Retry Request"),
  18623. STATE_STRINGS_PROTO_RW("Server Hello"),
  18624. STATE_STRINGS_PROTO_RW("Server Certificate Status"),
  18625. STATE_STRINGS_PROTO_RW("Server Encrypted Extensions"),
  18626. STATE_STRINGS_PROTO_RW("Server Session Ticket"),
  18627. STATE_STRINGS_PROTO_RW("Server Certificate Request"),
  18628. STATE_STRINGS_PROTO_RW("Server Cert"),
  18629. STATE_STRINGS_PROTO_RW("Server Key Exchange"),
  18630. STATE_STRINGS_PROTO_RW("Server Hello Done"),
  18631. STATE_STRINGS_PROTO_RW("Server Change CipherSpec"),
  18632. STATE_STRINGS_PROTO_RW("Server Finished"),
  18633. STATE_STRINGS_PROTO_RW("server Key Update"),
  18634. STATE_STRINGS_PROTO_RW("Client Hello"),
  18635. STATE_STRINGS_PROTO_RW("Client Key Exchange"),
  18636. STATE_STRINGS_PROTO_RW("Client Cert"),
  18637. STATE_STRINGS_PROTO_RW("Client Change CipherSpec"),
  18638. STATE_STRINGS_PROTO_RW("Client Certificate Verify"),
  18639. STATE_STRINGS_PROTO_RW("Client End Of Early Data"),
  18640. STATE_STRINGS_PROTO_RW("Client Finished"),
  18641. STATE_STRINGS_PROTO_RW("Client Key Update"),
  18642. STATE_STRINGS_PROTO("Handshake Done"),
  18643. };
  18644. enum ProtocolVer {
  18645. SSL_V3 = 0,
  18646. TLS_V1,
  18647. TLS_V1_1,
  18648. TLS_V1_2,
  18649. TLS_V1_3,
  18650. DTLS_V1,
  18651. DTLS_V1_2,
  18652. DTLS_V1_3,
  18653. UNKNOWN = 100
  18654. };
  18655. enum IOMode {
  18656. SS_READ = 0,
  18657. SS_WRITE,
  18658. SS_NEITHER
  18659. };
  18660. enum SslState {
  18661. ss_null_state = 0,
  18662. ss_server_hellorequest,
  18663. ss_server_helloverify,
  18664. ss_server_helloretryrequest,
  18665. ss_server_hello,
  18666. ss_server_certificatestatus,
  18667. ss_server_encryptedextensions,
  18668. ss_server_sessionticket,
  18669. ss_server_certrequest,
  18670. ss_server_cert,
  18671. ss_server_keyexchange,
  18672. ss_server_hellodone,
  18673. ss_server_changecipherspec,
  18674. ss_server_finished,
  18675. ss_server_keyupdate,
  18676. ss_client_hello,
  18677. ss_client_keyexchange,
  18678. ss_client_cert,
  18679. ss_client_changecipherspec,
  18680. ss_client_certverify,
  18681. ss_client_endofearlydata,
  18682. ss_client_finished,
  18683. ss_client_keyupdate,
  18684. ss_handshake_done
  18685. };
  18686. int protocol = 0;
  18687. int cbmode = 0;
  18688. int state = 0;
  18689. WOLFSSL_ENTER("wolfSSL_state_string_long");
  18690. if (ssl == NULL) {
  18691. WOLFSSL_MSG("Null argument passed in");
  18692. return NULL;
  18693. }
  18694. /* Get state of callback */
  18695. if (ssl->cbmode == SSL_CB_MODE_WRITE) {
  18696. cbmode = SS_WRITE;
  18697. }
  18698. else if (ssl->cbmode == SSL_CB_MODE_READ) {
  18699. cbmode = SS_READ;
  18700. }
  18701. else {
  18702. cbmode = SS_NEITHER;
  18703. }
  18704. /* Get protocol version */
  18705. switch (ssl->version.major) {
  18706. case SSLv3_MAJOR:
  18707. switch (ssl->version.minor) {
  18708. case SSLv3_MINOR:
  18709. protocol = SSL_V3;
  18710. break;
  18711. case TLSv1_MINOR:
  18712. protocol = TLS_V1;
  18713. break;
  18714. case TLSv1_1_MINOR:
  18715. protocol = TLS_V1_1;
  18716. break;
  18717. case TLSv1_2_MINOR:
  18718. protocol = TLS_V1_2;
  18719. break;
  18720. case TLSv1_3_MINOR:
  18721. protocol = TLS_V1_3;
  18722. break;
  18723. default:
  18724. protocol = UNKNOWN;
  18725. }
  18726. break;
  18727. case DTLS_MAJOR:
  18728. switch (ssl->version.minor) {
  18729. case DTLS_MINOR:
  18730. protocol = DTLS_V1;
  18731. break;
  18732. case DTLSv1_2_MINOR:
  18733. protocol = DTLS_V1_2;
  18734. break;
  18735. case DTLSv1_3_MINOR:
  18736. protocol = DTLS_V1_3;
  18737. break;
  18738. default:
  18739. protocol = UNKNOWN;
  18740. }
  18741. break;
  18742. default:
  18743. protocol = UNKNOWN;
  18744. }
  18745. /* accept process */
  18746. if (ssl->cbmode == SSL_CB_MODE_READ) {
  18747. state = ssl->cbtype;
  18748. switch (state) {
  18749. case hello_request:
  18750. state = ss_server_hellorequest;
  18751. break;
  18752. case client_hello:
  18753. state = ss_client_hello;
  18754. break;
  18755. case server_hello:
  18756. state = ss_server_hello;
  18757. break;
  18758. case hello_verify_request:
  18759. state = ss_server_helloverify;
  18760. break;
  18761. case session_ticket:
  18762. state = ss_server_sessionticket;
  18763. break;
  18764. case end_of_early_data:
  18765. state = ss_client_endofearlydata;
  18766. break;
  18767. case hello_retry_request:
  18768. state = ss_server_helloretryrequest;
  18769. break;
  18770. case encrypted_extensions:
  18771. state = ss_server_encryptedextensions;
  18772. break;
  18773. case certificate:
  18774. if (ssl->options.side == WOLFSSL_SERVER_END)
  18775. state = ss_client_cert;
  18776. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18777. state = ss_server_cert;
  18778. else {
  18779. WOLFSSL_MSG("Unknown State");
  18780. state = ss_null_state;
  18781. }
  18782. break;
  18783. case server_key_exchange:
  18784. state = ss_server_keyexchange;
  18785. break;
  18786. case certificate_request:
  18787. state = ss_server_certrequest;
  18788. break;
  18789. case server_hello_done:
  18790. state = ss_server_hellodone;
  18791. break;
  18792. case certificate_verify:
  18793. state = ss_client_certverify;
  18794. break;
  18795. case client_key_exchange:
  18796. state = ss_client_keyexchange;
  18797. break;
  18798. case finished:
  18799. if (ssl->options.side == WOLFSSL_SERVER_END)
  18800. state = ss_client_finished;
  18801. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18802. state = ss_server_finished;
  18803. else {
  18804. WOLFSSL_MSG("Unknown State");
  18805. state = ss_null_state;
  18806. }
  18807. break;
  18808. case certificate_status:
  18809. state = ss_server_certificatestatus;
  18810. break;
  18811. case key_update:
  18812. if (ssl->options.side == WOLFSSL_SERVER_END)
  18813. state = ss_client_keyupdate;
  18814. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18815. state = ss_server_keyupdate;
  18816. else {
  18817. WOLFSSL_MSG("Unknown State");
  18818. state = ss_null_state;
  18819. }
  18820. break;
  18821. case change_cipher_hs:
  18822. if (ssl->options.side == WOLFSSL_SERVER_END)
  18823. state = ss_client_changecipherspec;
  18824. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18825. state = ss_server_changecipherspec;
  18826. else {
  18827. WOLFSSL_MSG("Unknown State");
  18828. state = ss_null_state;
  18829. }
  18830. break;
  18831. default:
  18832. WOLFSSL_MSG("Unknown State");
  18833. state = ss_null_state;
  18834. }
  18835. }
  18836. else {
  18837. /* Send process */
  18838. if (ssl->options.side == WOLFSSL_SERVER_END)
  18839. state = ssl->options.serverState;
  18840. else
  18841. state = ssl->options.clientState;
  18842. switch (state) {
  18843. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  18844. state = ss_server_helloverify;
  18845. break;
  18846. case SERVER_HELLO_RETRY_REQUEST_COMPLETE:
  18847. state = ss_server_helloretryrequest;
  18848. break;
  18849. case SERVER_HELLO_COMPLETE:
  18850. state = ss_server_hello;
  18851. break;
  18852. case SERVER_ENCRYPTED_EXTENSIONS_COMPLETE:
  18853. state = ss_server_encryptedextensions;
  18854. break;
  18855. case SERVER_CERT_COMPLETE:
  18856. state = ss_server_cert;
  18857. break;
  18858. case SERVER_KEYEXCHANGE_COMPLETE:
  18859. state = ss_server_keyexchange;
  18860. break;
  18861. case SERVER_HELLODONE_COMPLETE:
  18862. state = ss_server_hellodone;
  18863. break;
  18864. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  18865. state = ss_server_changecipherspec;
  18866. break;
  18867. case SERVER_FINISHED_COMPLETE:
  18868. state = ss_server_finished;
  18869. break;
  18870. case CLIENT_HELLO_RETRY:
  18871. case CLIENT_HELLO_COMPLETE:
  18872. state = ss_client_hello;
  18873. break;
  18874. case CLIENT_KEYEXCHANGE_COMPLETE:
  18875. state = ss_client_keyexchange;
  18876. break;
  18877. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  18878. state = ss_client_changecipherspec;
  18879. break;
  18880. case CLIENT_FINISHED_COMPLETE:
  18881. state = ss_client_finished;
  18882. break;
  18883. case HANDSHAKE_DONE:
  18884. state = ss_handshake_done;
  18885. break;
  18886. default:
  18887. WOLFSSL_MSG("Unknown State");
  18888. state = ss_null_state;
  18889. }
  18890. }
  18891. if (protocol == UNKNOWN) {
  18892. WOLFSSL_MSG("Unknown protocol");
  18893. return "";
  18894. }
  18895. else {
  18896. return OUTPUT_STR[state][protocol][cbmode];
  18897. }
  18898. }
  18899. /*
  18900. * Sets default PEM callback password if null is passed into
  18901. * the callback parameter of a PEM_read_bio_* function.
  18902. *
  18903. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  18904. */
  18905. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  18906. {
  18907. (void)w;
  18908. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  18909. /* We assume that the user passes a default password as userdata */
  18910. if (key) {
  18911. int sz = (int)XSTRLEN((const char*)key);
  18912. sz = (sz > num) ? num : sz;
  18913. XMEMCPY(name, key, sz);
  18914. return sz;
  18915. } else {
  18916. WOLFSSL_MSG("Error, default password cannot be created.");
  18917. return WOLFSSL_FAILURE;
  18918. }
  18919. }
  18920. #endif /* OPENSSL_EXTRA */
  18921. static long wolf_set_options(long old_op, long op)
  18922. {
  18923. /* if SSL_OP_ALL then turn all bug workarounds on */
  18924. if ((op & WOLFSSL_OP_ALL) == WOLFSSL_OP_ALL) {
  18925. WOLFSSL_MSG("\tSSL_OP_ALL");
  18926. }
  18927. /* by default cookie exchange is on with DTLS */
  18928. if ((op & WOLFSSL_OP_COOKIE_EXCHANGE) == WOLFSSL_OP_COOKIE_EXCHANGE) {
  18929. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  18930. }
  18931. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  18932. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  18933. }
  18934. #ifdef SSL_OP_NO_TLSv1_3
  18935. if ((op & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  18936. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  18937. }
  18938. #endif
  18939. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  18940. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  18941. }
  18942. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  18943. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  18944. }
  18945. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  18946. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  18947. }
  18948. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  18949. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  18950. }
  18951. if ((op & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) ==
  18952. WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  18953. WOLFSSL_MSG("\tWOLFSSL_OP_CIPHER_SERVER_PREFERENCE");
  18954. }
  18955. if ((op & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  18956. #ifdef HAVE_LIBZ
  18957. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  18958. #else
  18959. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  18960. #endif
  18961. }
  18962. return old_op | op;
  18963. }
  18964. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  18965. {
  18966. word16 haveRSA = 1;
  18967. word16 havePSK = 0;
  18968. int keySz = 0;
  18969. WOLFSSL_ENTER("wolfSSL_set_options");
  18970. if (ssl == NULL) {
  18971. return 0;
  18972. }
  18973. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  18974. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  18975. if (ssl->version.minor == TLSv1_3_MINOR)
  18976. ssl->version.minor = TLSv1_2_MINOR;
  18977. }
  18978. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  18979. if (ssl->version.minor == TLSv1_2_MINOR)
  18980. ssl->version.minor = TLSv1_1_MINOR;
  18981. }
  18982. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  18983. if (ssl->version.minor == TLSv1_1_MINOR)
  18984. ssl->version.minor = TLSv1_MINOR;
  18985. }
  18986. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  18987. if (ssl->version.minor == TLSv1_MINOR)
  18988. ssl->version.minor = SSLv3_MINOR;
  18989. }
  18990. if ((ssl->options.mask & WOLFSSL_OP_NO_COMPRESSION)
  18991. == WOLFSSL_OP_NO_COMPRESSION) {
  18992. #ifdef HAVE_LIBZ
  18993. ssl->options.usingCompression = 0;
  18994. #endif
  18995. }
  18996. #if defined(HAVE_SESSION_TICKET) && (defined(OPENSSL_EXTRA) \
  18997. || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL))
  18998. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  18999. ssl->options.noTicketTls12 = 1;
  19000. }
  19001. #endif
  19002. /* in the case of a version change the cipher suites should be reset */
  19003. #ifndef NO_PSK
  19004. havePSK = ssl->options.havePSK;
  19005. #endif
  19006. #ifdef NO_RSA
  19007. haveRSA = 0;
  19008. #endif
  19009. #ifndef NO_CERTS
  19010. keySz = ssl->buffers.keySz;
  19011. #endif
  19012. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  19013. if (AllocateSuites(ssl) != 0)
  19014. return 0;
  19015. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  19016. ssl->options.haveDH, ssl->options.haveECDSAsig,
  19017. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  19018. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  19019. ssl->options.useAnon, TRUE, ssl->options.side);
  19020. }
  19021. return ssl->options.mask;
  19022. }
  19023. long wolfSSL_get_options(const WOLFSSL* ssl)
  19024. {
  19025. WOLFSSL_ENTER("wolfSSL_get_options");
  19026. if(ssl == NULL)
  19027. return WOLFSSL_FAILURE;
  19028. return ssl->options.mask;
  19029. }
  19030. #if defined(HAVE_SECURE_RENEGOTIATION) \
  19031. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  19032. /* clears the counter for number of renegotiations done
  19033. * returns the current count before it is cleared */
  19034. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  19035. {
  19036. long total;
  19037. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  19038. if (s == NULL)
  19039. return 0;
  19040. total = s->secure_rene_count;
  19041. s->secure_rene_count = 0;
  19042. return total;
  19043. }
  19044. /* return the number of renegotiations since wolfSSL_new */
  19045. long wolfSSL_total_renegotiations(WOLFSSL *s)
  19046. {
  19047. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  19048. return wolfSSL_num_renegotiations(s);
  19049. }
  19050. /* return the number of renegotiations since wolfSSL_new */
  19051. long wolfSSL_num_renegotiations(WOLFSSL* s)
  19052. {
  19053. if (s == NULL) {
  19054. return 0;
  19055. }
  19056. return s->secure_rene_count;
  19057. }
  19058. /* Is there a renegotiation currently in progress? */
  19059. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  19060. {
  19061. return s && s->options.handShakeDone &&
  19062. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  19063. }
  19064. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  19065. #ifdef OPENSSL_EXTRA
  19066. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  19067. {
  19068. WOLFSSL_ENTER("wolfSSL_clear_options");
  19069. if(ssl == NULL)
  19070. return WOLFSSL_FAILURE;
  19071. ssl->options.mask &= ~opt;
  19072. return ssl->options.mask;
  19073. }
  19074. #ifdef HAVE_PK_CALLBACKS
  19075. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  19076. {
  19077. if (ssl == NULL) {
  19078. return WOLFSSL_FAILURE;
  19079. }
  19080. ssl->loggingCtx = arg;
  19081. return WOLFSSL_SUCCESS;
  19082. }
  19083. #endif /* HAVE_PK_CALLBACKS */
  19084. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  19085. const unsigned char *wolfSSL_SESSION_get0_id_context(
  19086. const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  19087. {
  19088. return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  19089. }
  19090. int wolfSSL_SESSION_set1_id(WOLFSSL_SESSION *s,
  19091. const unsigned char *sid, unsigned int sid_len)
  19092. {
  19093. if (s == NULL) {
  19094. return WOLFSSL_FAILURE;
  19095. }
  19096. if (sid_len > ID_LEN) {
  19097. return WOLFSSL_FAILURE;
  19098. }
  19099. s->sessionIDSz = sid_len;
  19100. if (sid != s->sessionID) {
  19101. XMEMCPY(s->sessionID, sid, sid_len);
  19102. }
  19103. return WOLFSSL_SUCCESS;
  19104. }
  19105. int wolfSSL_SESSION_set1_id_context(WOLFSSL_SESSION *s,
  19106. const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  19107. {
  19108. if (s == NULL) {
  19109. return WOLFSSL_FAILURE;
  19110. }
  19111. if (sid_ctx_len > ID_LEN) {
  19112. return WOLFSSL_FAILURE;
  19113. }
  19114. s->sessionCtxSz = sid_ctx_len;
  19115. if (sid_ctx != s->sessionCtx) {
  19116. XMEMCPY(s->sessionCtx, sid_ctx, sid_ctx_len);
  19117. }
  19118. return WOLFSSL_SUCCESS;
  19119. }
  19120. #endif
  19121. /*** TBD ***/
  19122. #ifndef NO_WOLFSSL_STUB
  19123. int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  19124. {
  19125. (void)st;
  19126. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  19127. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  19128. return WOLFSSL_FAILURE;
  19129. }
  19130. #endif
  19131. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  19132. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  19133. {
  19134. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  19135. if (s == NULL){
  19136. return BAD_FUNC_ARG;
  19137. }
  19138. if (type == TLSEXT_STATUSTYPE_ocsp){
  19139. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  19140. s->heap, s->devId);
  19141. return (long)r;
  19142. } else {
  19143. WOLFSSL_MSG(
  19144. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  19145. return WOLFSSL_FAILURE;
  19146. }
  19147. }
  19148. long wolfSSL_get_tlsext_status_type(WOLFSSL *s)
  19149. {
  19150. TLSX* extension;
  19151. if (s == NULL)
  19152. return WOLFSSL_FATAL_ERROR;
  19153. extension = TLSX_Find(s->extensions, TLSX_STATUS_REQUEST);
  19154. return extension != NULL ? TLSEXT_STATUSTYPE_ocsp : WOLFSSL_FATAL_ERROR;
  19155. }
  19156. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  19157. #ifndef NO_WOLFSSL_STUB
  19158. long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  19159. {
  19160. (void)s;
  19161. (void)arg;
  19162. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  19163. return WOLFSSL_FAILURE;
  19164. }
  19165. #endif
  19166. /*** TBD ***/
  19167. #ifndef NO_WOLFSSL_STUB
  19168. long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  19169. {
  19170. (void)s;
  19171. (void)arg;
  19172. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  19173. return WOLFSSL_FAILURE;
  19174. }
  19175. #endif
  19176. /*** TBD ***/
  19177. #ifndef NO_WOLFSSL_STUB
  19178. long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  19179. {
  19180. (void)s;
  19181. (void)arg;
  19182. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  19183. return WOLFSSL_FAILURE;
  19184. }
  19185. #endif
  19186. /*** TBD ***/
  19187. #ifndef NO_WOLFSSL_STUB
  19188. long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  19189. {
  19190. (void)s;
  19191. (void)arg;
  19192. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  19193. return WOLFSSL_FAILURE;
  19194. }
  19195. #endif
  19196. #ifndef NO_WOLFSSL_STUB
  19197. /*** TBD ***/
  19198. WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  19199. {
  19200. (void)ssl;
  19201. WOLFSSL_STUB("SSL_get_privatekey");
  19202. return NULL;
  19203. }
  19204. #endif
  19205. #ifndef NO_WOLFSSL_STUB
  19206. /*** TBD ***/
  19207. void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx,
  19208. WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  19209. {
  19210. (void)ctx;
  19211. (void)dh;
  19212. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  19213. }
  19214. #endif
  19215. #ifndef NO_WOLFSSL_STUB
  19216. /*** TBD ***/
  19217. WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  19218. {
  19219. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  19220. return NULL;
  19221. }
  19222. #endif
  19223. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  19224. {
  19225. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  19226. if (p == NULL) {
  19227. return WOLFSSL_FATAL_ERROR;
  19228. }
  19229. return (int)p->num;
  19230. }
  19231. WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  19232. {
  19233. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  19234. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  19235. }
  19236. #if !defined(NETOS)
  19237. void ERR_load_SSL_strings(void)
  19238. {
  19239. }
  19240. #endif
  19241. #ifdef HAVE_OCSP
  19242. long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  19243. {
  19244. if (s == NULL || resp == NULL)
  19245. return 0;
  19246. *resp = s->ocspResp;
  19247. return s->ocspRespSz;
  19248. }
  19249. long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp,
  19250. int len)
  19251. {
  19252. if (s == NULL)
  19253. return WOLFSSL_FAILURE;
  19254. s->ocspResp = resp;
  19255. s->ocspRespSz = len;
  19256. return WOLFSSL_SUCCESS;
  19257. }
  19258. #endif /* HAVE_OCSP */
  19259. #ifdef HAVE_MAX_FRAGMENT
  19260. #ifndef NO_WOLFSSL_CLIENT
  19261. /**
  19262. * Set max fragment tls extension
  19263. * @param c a pointer to WOLFSSL_CTX object
  19264. * @param mode maximum fragment length mode
  19265. * @return 1 on success, otherwise 0 or negative error code
  19266. */
  19267. int wolfSSL_CTX_set_tlsext_max_fragment_length(WOLFSSL_CTX *c,
  19268. unsigned char mode)
  19269. {
  19270. if (c == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  19271. return BAD_FUNC_ARG;
  19272. return wolfSSL_CTX_UseMaxFragment(c, mode);
  19273. }
  19274. /**
  19275. * Set max fragment tls extension
  19276. * @param c a pointer to WOLFSSL object
  19277. * @param mode maximum fragment length mode
  19278. * @return 1 on success, otherwise 0 or negative error code
  19279. */
  19280. int wolfSSL_set_tlsext_max_fragment_length(WOLFSSL *s, unsigned char mode)
  19281. {
  19282. if (s == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  19283. return BAD_FUNC_ARG;
  19284. return wolfSSL_UseMaxFragment(s, mode);
  19285. }
  19286. #endif /* NO_WOLFSSL_CLIENT */
  19287. #endif /* HAVE_MAX_FRAGMENT */
  19288. #endif /* OPENSSL_EXTRA */
  19289. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  19290. size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  19291. {
  19292. byte len = 0;
  19293. WOLFSSL_ENTER("wolfSSL_get_finished");
  19294. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  19295. WOLFSSL_MSG("Bad parameter");
  19296. return WOLFSSL_FAILURE;
  19297. }
  19298. if (ssl->options.side == WOLFSSL_SERVER_END) {
  19299. len = ssl->serverFinished_len;
  19300. XMEMCPY(buf, ssl->serverFinished, len);
  19301. }
  19302. else {
  19303. len = ssl->clientFinished_len;
  19304. XMEMCPY(buf, ssl->clientFinished, len);
  19305. }
  19306. return len;
  19307. }
  19308. size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  19309. {
  19310. byte len = 0;
  19311. WOLFSSL_ENTER("wolfSSL_get_peer_finished");
  19312. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  19313. WOLFSSL_MSG("Bad parameter");
  19314. return WOLFSSL_FAILURE;
  19315. }
  19316. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  19317. len = ssl->serverFinished_len;
  19318. XMEMCPY(buf, ssl->serverFinished, len);
  19319. }
  19320. else {
  19321. len = ssl->clientFinished_len;
  19322. XMEMCPY(buf, ssl->clientFinished, len);
  19323. }
  19324. return len;
  19325. }
  19326. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  19327. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  19328. defined(OPENSSL_ALL)
  19329. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  19330. {
  19331. if (ssl == NULL) {
  19332. return WOLFSSL_FAILURE;
  19333. }
  19334. return ssl->peerVerifyRet;
  19335. }
  19336. #endif
  19337. #ifdef OPENSSL_EXTRA
  19338. #ifndef NO_WOLFSSL_STUB
  19339. /* shows the number of accepts attempted by CTX in it's lifetime */
  19340. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  19341. {
  19342. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  19343. (void)ctx;
  19344. return 0;
  19345. }
  19346. #endif
  19347. #ifndef NO_WOLFSSL_STUB
  19348. /* shows the number of connects attempted CTX in it's lifetime */
  19349. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  19350. {
  19351. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  19352. (void)ctx;
  19353. return 0;
  19354. }
  19355. #endif
  19356. #ifndef NO_WOLFSSL_STUB
  19357. /* shows the number of accepts completed by CTX in it's lifetime */
  19358. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  19359. {
  19360. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  19361. (void)ctx;
  19362. return 0;
  19363. }
  19364. #endif
  19365. #ifndef NO_WOLFSSL_STUB
  19366. /* shows the number of connects completed by CTX in it's lifetime */
  19367. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  19368. {
  19369. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  19370. (void)ctx;
  19371. return 0;
  19372. }
  19373. #endif
  19374. #ifndef NO_WOLFSSL_STUB
  19375. /* shows the number of renegotiation accepts attempted by CTX */
  19376. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  19377. {
  19378. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  19379. (void)ctx;
  19380. return 0;
  19381. }
  19382. #endif
  19383. #ifndef NO_WOLFSSL_STUB
  19384. /* shows the number of renegotiation accepts attempted by CTX */
  19385. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  19386. {
  19387. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  19388. (void)ctx;
  19389. return 0;
  19390. }
  19391. #endif
  19392. #ifndef NO_WOLFSSL_STUB
  19393. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  19394. {
  19395. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  19396. (void)ctx;
  19397. return 0;
  19398. }
  19399. #endif
  19400. #ifndef NO_WOLFSSL_STUB
  19401. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  19402. {
  19403. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  19404. (void)ctx;
  19405. return 0;
  19406. }
  19407. #endif
  19408. #ifndef NO_WOLFSSL_STUB
  19409. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  19410. {
  19411. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  19412. (void)ctx;
  19413. return 0;
  19414. }
  19415. #endif
  19416. #ifndef NO_WOLFSSL_STUB
  19417. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  19418. {
  19419. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  19420. (void)ctx;
  19421. return 0;
  19422. }
  19423. #endif
  19424. #ifndef NO_WOLFSSL_STUB
  19425. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  19426. {
  19427. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  19428. (void)ctx;
  19429. return 0;
  19430. }
  19431. #endif
  19432. /* Return the total number of sessions */
  19433. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  19434. {
  19435. word32 total = 0;
  19436. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  19437. (void)ctx;
  19438. #if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE)
  19439. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  19440. WOLFSSL_MSG("Error getting session stats");
  19441. }
  19442. #else
  19443. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  19444. #endif
  19445. return (long)total;
  19446. }
  19447. #ifndef NO_CERTS
  19448. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  19449. {
  19450. byte* chain = NULL;
  19451. int derSz;
  19452. const byte* der;
  19453. int ret;
  19454. DerBuffer *derBuffer = NULL;
  19455. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  19456. if (ctx == NULL || x509 == NULL) {
  19457. WOLFSSL_MSG("Bad Argument");
  19458. return WOLFSSL_FAILURE;
  19459. }
  19460. der = wolfSSL_X509_get_der(x509, &derSz);
  19461. if (der == NULL || derSz <= 0) {
  19462. WOLFSSL_MSG("Error getting X509 DER");
  19463. return WOLFSSL_FAILURE;
  19464. }
  19465. if (ctx->certificate == NULL) {
  19466. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  19467. /* Process buffer makes first certificate the leaf. */
  19468. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  19469. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  19470. if (ret != WOLFSSL_SUCCESS) {
  19471. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  19472. return WOLFSSL_FAILURE;
  19473. }
  19474. }
  19475. else {
  19476. long chainSz = 0;
  19477. int idx = 0;
  19478. /* TODO: Do this elsewhere. */
  19479. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  19480. if (ret != 0) {
  19481. WOLFSSL_MSG("Memory Error");
  19482. return WOLFSSL_FAILURE;
  19483. }
  19484. XMEMCPY(derBuffer->buffer, der, derSz);
  19485. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  19486. GET_VERIFY_SETTING_CTX(ctx));
  19487. if (ret != WOLFSSL_SUCCESS) {
  19488. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  19489. return WOLFSSL_FAILURE;
  19490. }
  19491. /* adding cert to existing chain */
  19492. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  19493. chainSz += ctx->certChain->length;
  19494. }
  19495. chainSz += OPAQUE24_LEN + derSz;
  19496. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  19497. if (chain == NULL) {
  19498. WOLFSSL_MSG("Memory Error");
  19499. return WOLFSSL_FAILURE;
  19500. }
  19501. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  19502. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  19503. idx = ctx->certChain->length;
  19504. }
  19505. c32to24(derSz, chain + idx);
  19506. idx += OPAQUE24_LEN;
  19507. XMEMCPY(chain + idx, der, derSz);
  19508. idx += derSz;
  19509. #ifdef WOLFSSL_TLS13
  19510. ctx->certChainCnt++;
  19511. #endif
  19512. FreeDer(&ctx->certChain);
  19513. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  19514. if (ret == 0) {
  19515. XMEMCPY(ctx->certChain->buffer, chain, idx);
  19516. }
  19517. }
  19518. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  19519. wolfSSL_X509_free(x509);
  19520. if (chain != NULL)
  19521. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  19522. return WOLFSSL_SUCCESS;
  19523. }
  19524. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  19525. {
  19526. if (ctx == NULL || ctx->cm == NULL) {
  19527. return WOLFSSL_FAILURE;
  19528. }
  19529. ctx->cm->ocspIOCtx = arg;
  19530. return WOLFSSL_SUCCESS;
  19531. }
  19532. #endif /* !NO_CERTS */
  19533. int wolfSSL_get_read_ahead(const WOLFSSL* ssl)
  19534. {
  19535. if (ssl == NULL) {
  19536. return WOLFSSL_FAILURE;
  19537. }
  19538. return ssl->readAhead;
  19539. }
  19540. int wolfSSL_set_read_ahead(WOLFSSL* ssl, int v)
  19541. {
  19542. if (ssl == NULL) {
  19543. return WOLFSSL_FAILURE;
  19544. }
  19545. ssl->readAhead = (byte)v;
  19546. return WOLFSSL_SUCCESS;
  19547. }
  19548. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  19549. {
  19550. if (ctx == NULL) {
  19551. return WOLFSSL_FAILURE;
  19552. }
  19553. return ctx->readAhead;
  19554. }
  19555. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  19556. {
  19557. if (ctx == NULL) {
  19558. return WOLFSSL_FAILURE;
  19559. }
  19560. ctx->readAhead = (byte)v;
  19561. return WOLFSSL_SUCCESS;
  19562. }
  19563. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  19564. void* arg)
  19565. {
  19566. if (ctx == NULL) {
  19567. return WOLFSSL_FAILURE;
  19568. }
  19569. ctx->userPRFArg = arg;
  19570. return WOLFSSL_SUCCESS;
  19571. }
  19572. #endif /* OPENSSL_EXTRA */
  19573. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19574. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  19575. {
  19576. WOLFSSL_ENTER("wolfSSL_sk_num");
  19577. if (sk == NULL)
  19578. return 0;
  19579. return (int)sk->num;
  19580. }
  19581. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  19582. {
  19583. WOLFSSL_ENTER("wolfSSL_sk_value");
  19584. for (; sk != NULL && i > 0; i--)
  19585. sk = sk->next;
  19586. if (sk == NULL)
  19587. return NULL;
  19588. switch (sk->type) {
  19589. case STACK_TYPE_X509:
  19590. return (void*)sk->data.x509;
  19591. case STACK_TYPE_GEN_NAME:
  19592. return (void*)sk->data.gn;
  19593. case STACK_TYPE_BIO:
  19594. return (void*)sk->data.bio;
  19595. case STACK_TYPE_OBJ:
  19596. return (void*)sk->data.obj;
  19597. case STACK_TYPE_STRING:
  19598. return (void*)sk->data.string;
  19599. case STACK_TYPE_CIPHER:
  19600. return (void*)&sk->data.cipher;
  19601. case STACK_TYPE_ACCESS_DESCRIPTION:
  19602. return (void*)sk->data.access;
  19603. case STACK_TYPE_X509_EXT:
  19604. return (void*)sk->data.ext;
  19605. case STACK_TYPE_X509_REQ_ATTR:
  19606. return (void*)sk->data.generic;
  19607. case STACK_TYPE_NULL:
  19608. return (void*)sk->data.generic;
  19609. case STACK_TYPE_X509_NAME:
  19610. return (void*)sk->data.name;
  19611. case STACK_TYPE_X509_NAME_ENTRY:
  19612. return (void*)sk->data.name_entry;
  19613. case STACK_TYPE_CONF_VALUE:
  19614. #ifdef OPENSSL_EXTRA
  19615. return (void*)sk->data.conf;
  19616. #else
  19617. return NULL;
  19618. #endif
  19619. case STACK_TYPE_X509_INFO:
  19620. return (void*)sk->data.info;
  19621. case STACK_TYPE_BY_DIR_entry:
  19622. return (void*)sk->data.dir_entry;
  19623. case STACK_TYPE_BY_DIR_hash:
  19624. return (void*)sk->data.dir_hash;
  19625. case STACK_TYPE_X509_OBJ:
  19626. return (void*)sk->data.x509_obj;
  19627. case STACK_TYPE_DIST_POINT:
  19628. return (void*)sk->data.dp;
  19629. case STACK_TYPE_X509_CRL:
  19630. return (void*)sk->data.crl;
  19631. default:
  19632. return (void*)sk->data.generic;
  19633. }
  19634. }
  19635. /* copies over data of "in" to "out" */
  19636. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  19637. {
  19638. if (in == NULL || out == NULL)
  19639. return;
  19640. *out = *in;
  19641. }
  19642. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  19643. {
  19644. WOLFSSL_STACK* ret = NULL;
  19645. WOLFSSL_STACK* last = NULL;
  19646. WOLFSSL_ENTER("wolfSSL_sk_dup");
  19647. while (sk) {
  19648. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  19649. if (!cur) {
  19650. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  19651. goto error;
  19652. }
  19653. if (!ret) {
  19654. /* Set first node */
  19655. ret = cur;
  19656. }
  19657. if (last) {
  19658. last->next = cur;
  19659. }
  19660. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  19661. /* We will allocate new memory for this */
  19662. XMEMSET(&cur->data, 0, sizeof(cur->data));
  19663. cur->next = NULL;
  19664. switch (sk->type) {
  19665. case STACK_TYPE_X509:
  19666. if (!sk->data.x509)
  19667. break;
  19668. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  19669. if (!cur->data.x509) {
  19670. WOLFSSL_MSG("wolfSSL_X509_dup error");
  19671. goto error;
  19672. }
  19673. break;
  19674. case STACK_TYPE_CIPHER:
  19675. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  19676. break;
  19677. case STACK_TYPE_GEN_NAME:
  19678. if (!sk->data.gn)
  19679. break;
  19680. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  19681. if (!cur->data.gn) {
  19682. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  19683. goto error;
  19684. }
  19685. break;
  19686. case STACK_TYPE_OBJ:
  19687. if (!sk->data.obj)
  19688. break;
  19689. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  19690. if (!cur->data.obj) {
  19691. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  19692. goto error;
  19693. }
  19694. break;
  19695. case STACK_TYPE_BIO:
  19696. case STACK_TYPE_STRING:
  19697. case STACK_TYPE_ACCESS_DESCRIPTION:
  19698. case STACK_TYPE_X509_EXT:
  19699. case STACK_TYPE_X509_REQ_ATTR:
  19700. case STACK_TYPE_NULL:
  19701. case STACK_TYPE_X509_NAME:
  19702. case STACK_TYPE_X509_NAME_ENTRY:
  19703. case STACK_TYPE_CONF_VALUE:
  19704. case STACK_TYPE_X509_INFO:
  19705. case STACK_TYPE_BY_DIR_entry:
  19706. case STACK_TYPE_BY_DIR_hash:
  19707. case STACK_TYPE_X509_OBJ:
  19708. case STACK_TYPE_DIST_POINT:
  19709. case STACK_TYPE_X509_CRL:
  19710. default:
  19711. WOLFSSL_MSG("Unsupported stack type");
  19712. goto error;
  19713. }
  19714. sk = sk->next;
  19715. last = cur;
  19716. }
  19717. return ret;
  19718. error:
  19719. if (ret) {
  19720. wolfSSL_sk_GENERAL_NAME_free(ret);
  19721. }
  19722. return NULL;
  19723. }
  19724. WOLFSSL_STACK* wolfSSL_shallow_sk_dup(WOLFSSL_STACK* sk)
  19725. {
  19726. WOLFSSL_STACK* ret = NULL;
  19727. WOLFSSL_STACK** prev = &ret;
  19728. WOLFSSL_ENTER("wolfSSL_shallow_sk_dup");
  19729. for (; sk != NULL; sk = sk->next) {
  19730. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  19731. if (!cur) {
  19732. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  19733. goto error;
  19734. }
  19735. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  19736. cur->next = NULL;
  19737. *prev = cur;
  19738. prev = &cur->next;
  19739. }
  19740. return ret;
  19741. error:
  19742. if (ret) {
  19743. wolfSSL_sk_free(ret);
  19744. }
  19745. return NULL;
  19746. }
  19747. /* Free the just the stack structure */
  19748. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  19749. {
  19750. WOLFSSL_ENTER("wolfSSL_sk_free");
  19751. while (sk != NULL) {
  19752. WOLFSSL_STACK* next = sk->next;
  19753. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  19754. sk = next;
  19755. }
  19756. }
  19757. /* Frees each node in the stack and frees the stack.
  19758. */
  19759. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  19760. void (*f) (void*))
  19761. {
  19762. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  19763. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  19764. }
  19765. /* return 1 on success 0 on fail */
  19766. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  19767. {
  19768. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  19769. return wolfSSL_sk_push(sk, generic);
  19770. }
  19771. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  19772. {
  19773. wolfSSL_sk_free(sk);
  19774. }
  19775. /* Pop off data from the stack. Checks that the type matches the stack type.
  19776. *
  19777. * @param [in, out] sk Stack of objects.
  19778. * @param [in] type Type of stack.
  19779. * @return Object on success.
  19780. * @return NULL when stack is NULL or no nodes left in stack.
  19781. */
  19782. void* wolfssl_sk_pop_type(WOLFSSL_STACK* sk, WOLF_STACK_TYPE type)
  19783. {
  19784. WOLFSSL_STACK* node;
  19785. void* data = NULL;
  19786. /* Check we have a stack passed in of the right type. */
  19787. if ((sk != NULL) && (sk->type == type)) {
  19788. /* Get the next node to become the new first node. */
  19789. node = sk->next;
  19790. /* Get the ASN.1 OBJECT_ID object in the first node. */
  19791. data = sk->data.generic;
  19792. /* Check whether there is a next node. */
  19793. if (node != NULL) {
  19794. /* Move content out of next node into current node. */
  19795. sk->data.obj = node->data.obj;
  19796. sk->next = node->next;
  19797. /* Dispose of node. */
  19798. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  19799. }
  19800. else {
  19801. /* No more nodes - clear out data. */
  19802. sk->data.obj = NULL;
  19803. }
  19804. /* Decrement count as long as we thought we had nodes. */
  19805. if (sk->num > 0) {
  19806. sk->num -= 1;
  19807. }
  19808. }
  19809. return data;
  19810. }
  19811. /* Free all nodes in a stack including the pushed objects */
  19812. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  19813. wolfSSL_sk_freefunc func)
  19814. {
  19815. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  19816. if (sk == NULL) {
  19817. /* pop_free can be called with NULL, do not print bad argument */
  19818. return;
  19819. }
  19820. #if defined(WOLFSSL_QT)
  19821. /* In Qt v15.5, it calls OPENSSL_sk_free(xxx, OPENSSL_sk_free).
  19822. * By using OPENSSL_sk_free for free causes access violation.
  19823. * Therefore, switching free func to wolfSSL_ACCESS_DESCRIPTION_free
  19824. * is needed even the func isn't NULL.
  19825. */
  19826. if (sk->type == STACK_TYPE_ACCESS_DESCRIPTION) {
  19827. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  19828. }
  19829. #endif
  19830. if (func == NULL) {
  19831. switch(sk->type) {
  19832. case STACK_TYPE_ACCESS_DESCRIPTION:
  19833. #if defined(OPENSSL_ALL)
  19834. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  19835. #endif
  19836. break;
  19837. case STACK_TYPE_X509:
  19838. func = (wolfSSL_sk_freefunc)wolfSSL_X509_free;
  19839. break;
  19840. case STACK_TYPE_X509_OBJ:
  19841. #ifdef OPENSSL_ALL
  19842. func = (wolfSSL_sk_freefunc)wolfSSL_X509_OBJECT_free;
  19843. #endif
  19844. break;
  19845. case STACK_TYPE_OBJ:
  19846. func = (wolfSSL_sk_freefunc)wolfSSL_ASN1_OBJECT_free;
  19847. break;
  19848. case STACK_TYPE_DIST_POINT:
  19849. #ifdef OPENSSL_EXTRA
  19850. func = (wolfSSL_sk_freefunc)wolfSSL_DIST_POINT_free;
  19851. #endif
  19852. break;
  19853. case STACK_TYPE_GEN_NAME:
  19854. func = (wolfSSL_sk_freefunc)wolfSSL_GENERAL_NAME_free;
  19855. break;
  19856. case STACK_TYPE_STRING:
  19857. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  19858. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  19859. func = (wolfSSL_sk_freefunc)wolfSSL_WOLFSSL_STRING_free;
  19860. #endif
  19861. break;
  19862. case STACK_TYPE_X509_NAME:
  19863. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  19864. && !defined(WOLFCRYPT_ONLY)
  19865. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_free;
  19866. #endif
  19867. break;
  19868. case STACK_TYPE_X509_NAME_ENTRY:
  19869. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  19870. && !defined(WOLFCRYPT_ONLY)
  19871. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_ENTRY_free;
  19872. #endif
  19873. break;
  19874. case STACK_TYPE_X509_EXT:
  19875. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  19876. func = (wolfSSL_sk_freefunc)wolfSSL_X509_EXTENSION_free;
  19877. #endif
  19878. break;
  19879. case STACK_TYPE_X509_REQ_ATTR:
  19880. #if defined(OPENSSL_ALL) && \
  19881. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  19882. func = (wolfSSL_sk_freefunc)wolfSSL_X509_ATTRIBUTE_free;
  19883. #endif
  19884. break;
  19885. case STACK_TYPE_CONF_VALUE:
  19886. #if defined(OPENSSL_ALL)
  19887. func = (wolfSSL_sk_freefunc)wolfSSL_X509V3_conf_free;
  19888. #endif
  19889. break;
  19890. case STACK_TYPE_X509_INFO:
  19891. #if defined(OPENSSL_ALL)
  19892. func = (wolfSSL_sk_freefunc)wolfSSL_X509_INFO_free;
  19893. #endif
  19894. break;
  19895. case STACK_TYPE_BIO:
  19896. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  19897. func = (wolfSSL_sk_freefunc)wolfSSL_BIO_vfree;
  19898. #endif
  19899. break;
  19900. case STACK_TYPE_BY_DIR_entry:
  19901. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  19902. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_entry_free;
  19903. #endif
  19904. break;
  19905. case STACK_TYPE_BY_DIR_hash:
  19906. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  19907. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_HASH_free;
  19908. #endif
  19909. break;
  19910. case STACK_TYPE_X509_CRL:
  19911. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  19912. func = (wolfSSL_sk_freefunc)wolfSSL_X509_CRL_free;
  19913. #endif
  19914. break;
  19915. case STACK_TYPE_CIPHER:
  19916. case STACK_TYPE_NULL:
  19917. default:
  19918. break;
  19919. }
  19920. }
  19921. while (sk != NULL) {
  19922. WOLFSSL_STACK* next = sk->next;
  19923. if (func != NULL) {
  19924. if (sk->type != STACK_TYPE_CIPHER)
  19925. func(sk->data.generic);
  19926. }
  19927. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  19928. sk = next;
  19929. }
  19930. }
  19931. /* Creates a new stack of the requested type.
  19932. *
  19933. * @param [in] type Type of stack.
  19934. * @return Empty stack on success.
  19935. * @return NULL when dynamic memory allocation fails.
  19936. */
  19937. WOLFSSL_STACK* wolfssl_sk_new_type(WOLF_STACK_TYPE type)
  19938. {
  19939. WOLFSSL_STACK* sk;
  19940. /* Allocate a new stack - first node. */
  19941. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  19942. DYNAMIC_TYPE_OPENSSL);
  19943. if (sk == NULL) {
  19944. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  19945. }
  19946. else {
  19947. /* Clear node and set type. */
  19948. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  19949. sk->type = type;
  19950. }
  19951. return sk;
  19952. }
  19953. /* Creates and returns a new null stack. */
  19954. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  19955. {
  19956. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  19957. return wolfssl_sk_new_type(STACK_TYPE_NULL);
  19958. }
  19959. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  19960. {
  19961. if (sk == NULL)
  19962. return 0;
  19963. return (int)sk->num;
  19964. }
  19965. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19966. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  19967. defined(HAVE_EXT_CACHE))
  19968. /* stunnel 4.28 needs
  19969. *
  19970. * Callback that is called if a session tries to resume but could not find
  19971. * the session to resume it.
  19972. */
  19973. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  19974. WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*))
  19975. {
  19976. if (ctx == NULL)
  19977. return;
  19978. #ifdef HAVE_EXT_CACHE
  19979. ctx->get_sess_cb = f;
  19980. #else
  19981. (void)f;
  19982. #endif
  19983. }
  19984. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  19985. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  19986. {
  19987. if (ctx == NULL)
  19988. return;
  19989. #ifdef HAVE_EXT_CACHE
  19990. ctx->new_sess_cb = f;
  19991. #else
  19992. (void)f;
  19993. #endif
  19994. }
  19995. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  19996. WOLFSSL_SESSION*))
  19997. {
  19998. if (ctx == NULL)
  19999. return;
  20000. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  20001. ctx->rem_sess_cb = f;
  20002. #else
  20003. (void)f;
  20004. #endif
  20005. }
  20006. /*
  20007. *
  20008. * Note: It is expected that the importing and exporting function have been
  20009. * built with the same settings. For example if session tickets was
  20010. * enabled with the wolfSSL library exporting a session then it is
  20011. * expected to be turned on with the wolfSSL library importing the session.
  20012. */
  20013. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  20014. {
  20015. int size = 0;
  20016. #ifdef HAVE_EXT_CACHE
  20017. int idx = 0;
  20018. #ifdef SESSION_CERTS
  20019. int i;
  20020. #endif
  20021. WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION");
  20022. sess = ClientSessionToSession(sess);
  20023. if (sess == NULL) {
  20024. return BAD_FUNC_ARG;
  20025. }
  20026. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  20027. * haveEMS */
  20028. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  20029. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  20030. /* altSessionID */
  20031. size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0);
  20032. #ifdef SESSION_CERTS
  20033. /* Peer chain */
  20034. size += OPAQUE8_LEN;
  20035. for (i = 0; i < sess->chain.count; i++)
  20036. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  20037. #endif
  20038. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  20039. defined(HAVE_SESSION_TICKET))
  20040. /* Protocol version */
  20041. size += OPAQUE16_LEN;
  20042. #endif
  20043. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  20044. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  20045. /* cipher suite */
  20046. size += OPAQUE16_LEN;
  20047. #endif
  20048. #ifndef NO_CLIENT_CACHE
  20049. /* ServerID len | ServerID */
  20050. size += OPAQUE16_LEN + sess->idLen;
  20051. #endif
  20052. #ifdef WOLFSSL_SESSION_ID_CTX
  20053. /* session context ID len | session context ID */
  20054. size += OPAQUE8_LEN + sess->sessionCtxSz;
  20055. #endif
  20056. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20057. /* peerVerifyRet */
  20058. size += OPAQUE8_LEN;
  20059. #endif
  20060. #ifdef WOLFSSL_TLS13
  20061. /* namedGroup */
  20062. size += OPAQUE16_LEN;
  20063. #endif
  20064. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  20065. #ifdef WOLFSSL_TLS13
  20066. #ifdef WOLFSSL_32BIT_MILLI_TIME
  20067. /* ticketSeen | ticketAdd */
  20068. size += OPAQUE32_LEN + OPAQUE32_LEN;
  20069. #else
  20070. /* ticketSeen Hi 32 bits | ticketSeen Lo 32 bits | ticketAdd */
  20071. size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE32_LEN;
  20072. #endif
  20073. /* ticketNonce */
  20074. size += OPAQUE8_LEN + sess->ticketNonce.len;
  20075. #endif
  20076. #ifdef WOLFSSL_EARLY_DATA
  20077. size += OPAQUE32_LEN;
  20078. #endif
  20079. #endif
  20080. #ifdef HAVE_SESSION_TICKET
  20081. /* ticket len | ticket */
  20082. size += OPAQUE16_LEN + sess->ticketLen;
  20083. #endif
  20084. if (p != NULL) {
  20085. unsigned char *data;
  20086. if (*p == NULL)
  20087. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  20088. if (*p == NULL)
  20089. return 0;
  20090. data = *p;
  20091. data[idx++] = sess->side;
  20092. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  20093. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  20094. data[idx++] = sess->sessionIDSz;
  20095. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  20096. idx += sess->sessionIDSz;
  20097. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  20098. data[idx++] = (byte)sess->haveEMS;
  20099. data[idx++] = sess->haveAltSessionID ? ID_LEN : 0;
  20100. if (sess->haveAltSessionID) {
  20101. XMEMCPY(data + idx, sess->altSessionID, ID_LEN);
  20102. idx += ID_LEN;
  20103. }
  20104. #ifdef SESSION_CERTS
  20105. data[idx++] = (byte)sess->chain.count;
  20106. for (i = 0; i < sess->chain.count; i++) {
  20107. c16toa((word16)sess->chain.certs[i].length, data + idx);
  20108. idx += OPAQUE16_LEN;
  20109. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  20110. sess->chain.certs[i].length);
  20111. idx += sess->chain.certs[i].length;
  20112. }
  20113. #endif
  20114. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  20115. defined(HAVE_SESSION_TICKET))
  20116. data[idx++] = sess->version.major;
  20117. data[idx++] = sess->version.minor;
  20118. #endif
  20119. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  20120. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  20121. data[idx++] = sess->cipherSuite0;
  20122. data[idx++] = sess->cipherSuite;
  20123. #endif
  20124. #ifndef NO_CLIENT_CACHE
  20125. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  20126. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  20127. idx += sess->idLen;
  20128. #endif
  20129. #ifdef WOLFSSL_SESSION_ID_CTX
  20130. data[idx++] = sess->sessionCtxSz;
  20131. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  20132. idx += sess->sessionCtxSz;
  20133. #endif
  20134. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20135. data[idx++] = sess->peerVerifyRet;
  20136. #endif
  20137. #ifdef WOLFSSL_TLS13
  20138. c16toa(sess->namedGroup, data + idx);
  20139. idx += OPAQUE16_LEN;
  20140. #endif
  20141. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  20142. #ifdef WOLFSSL_TLS13
  20143. #ifdef WOLFSSL_32BIT_MILLI_TIME
  20144. c32toa(sess->ticketSeen, data + idx);
  20145. idx += OPAQUE32_LEN;
  20146. #else
  20147. c32toa((word32)(sess->ticketSeen >> 32), data + idx);
  20148. idx += OPAQUE32_LEN;
  20149. c32toa((word32)sess->ticketSeen, data + idx);
  20150. idx += OPAQUE32_LEN;
  20151. #endif
  20152. c32toa(sess->ticketAdd, data + idx);
  20153. idx += OPAQUE32_LEN;
  20154. data[idx++] = sess->ticketNonce.len;
  20155. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  20156. idx += sess->ticketNonce.len;
  20157. #endif
  20158. #ifdef WOLFSSL_EARLY_DATA
  20159. c32toa(sess->maxEarlyDataSz, data + idx);
  20160. idx += OPAQUE32_LEN;
  20161. #endif
  20162. #endif
  20163. #ifdef HAVE_SESSION_TICKET
  20164. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  20165. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  20166. idx += sess->ticketLen;
  20167. #endif
  20168. }
  20169. #endif
  20170. (void)sess;
  20171. (void)p;
  20172. #ifdef HAVE_EXT_CACHE
  20173. (void)idx;
  20174. #endif
  20175. return size;
  20176. }
  20177. /* TODO: no function to free new session.
  20178. *
  20179. * Note: It is expected that the importing and exporting function have been
  20180. * built with the same settings. For example if session tickets was
  20181. * enabled with the wolfSSL library exporting a session then it is
  20182. * expected to be turned on with the wolfSSL library importing the session.
  20183. */
  20184. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  20185. const unsigned char** p, long i)
  20186. {
  20187. WOLFSSL_SESSION* s = NULL;
  20188. int ret = 0;
  20189. #if defined(HAVE_EXT_CACHE)
  20190. int idx = 0;
  20191. byte* data;
  20192. #ifdef SESSION_CERTS
  20193. int j;
  20194. word16 length;
  20195. #endif
  20196. #endif /* HAVE_EXT_CACHE */
  20197. (void)p;
  20198. (void)i;
  20199. (void)ret;
  20200. (void)sess;
  20201. #ifdef HAVE_EXT_CACHE
  20202. if (p == NULL || *p == NULL)
  20203. return NULL;
  20204. s = wolfSSL_SESSION_new();
  20205. if (s == NULL)
  20206. return NULL;
  20207. idx = 0;
  20208. data = (byte*)*p;
  20209. /* side | bornOn | timeout | sessionID len */
  20210. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  20211. ret = BUFFER_ERROR;
  20212. goto end;
  20213. }
  20214. s->side = data[idx++];
  20215. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  20216. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  20217. s->sessionIDSz = data[idx++];
  20218. /* sessionID | secret | haveEMS | haveAltSessionID */
  20219. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) {
  20220. ret = BUFFER_ERROR;
  20221. goto end;
  20222. }
  20223. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  20224. idx += s->sessionIDSz;
  20225. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  20226. s->haveEMS = data[idx++];
  20227. if (data[idx] != ID_LEN && data[idx] != 0) {
  20228. ret = BUFFER_ERROR;
  20229. goto end;
  20230. }
  20231. s->haveAltSessionID = data[idx++] == ID_LEN;
  20232. /* altSessionID */
  20233. if (s->haveAltSessionID) {
  20234. if (i - idx < ID_LEN) {
  20235. ret = BUFFER_ERROR;
  20236. goto end;
  20237. }
  20238. XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN;
  20239. }
  20240. #ifdef SESSION_CERTS
  20241. /* Certificate chain */
  20242. if (i - idx == 0) {
  20243. ret = BUFFER_ERROR;
  20244. goto end;
  20245. }
  20246. s->chain.count = data[idx++];
  20247. for (j = 0; j < s->chain.count; j++) {
  20248. if (i - idx < OPAQUE16_LEN) {
  20249. ret = BUFFER_ERROR;
  20250. goto end;
  20251. }
  20252. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  20253. s->chain.certs[j].length = length;
  20254. if (i - idx < length) {
  20255. ret = BUFFER_ERROR;
  20256. goto end;
  20257. }
  20258. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  20259. idx += length;
  20260. }
  20261. #endif
  20262. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  20263. defined(HAVE_SESSION_TICKET))
  20264. /* Protocol Version */
  20265. if (i - idx < OPAQUE16_LEN) {
  20266. ret = BUFFER_ERROR;
  20267. goto end;
  20268. }
  20269. s->version.major = data[idx++];
  20270. s->version.minor = data[idx++];
  20271. #endif
  20272. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  20273. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  20274. /* Cipher suite */
  20275. if (i - idx < OPAQUE16_LEN) {
  20276. ret = BUFFER_ERROR;
  20277. goto end;
  20278. }
  20279. s->cipherSuite0 = data[idx++];
  20280. s->cipherSuite = data[idx++];
  20281. #endif
  20282. #ifndef NO_CLIENT_CACHE
  20283. /* ServerID len */
  20284. if (i - idx < OPAQUE16_LEN) {
  20285. ret = BUFFER_ERROR;
  20286. goto end;
  20287. }
  20288. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  20289. /* ServerID */
  20290. if (i - idx < s->idLen) {
  20291. ret = BUFFER_ERROR;
  20292. goto end;
  20293. }
  20294. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  20295. #endif
  20296. #ifdef WOLFSSL_SESSION_ID_CTX
  20297. /* byte for length of session context ID */
  20298. if (i - idx < OPAQUE8_LEN) {
  20299. ret = BUFFER_ERROR;
  20300. goto end;
  20301. }
  20302. s->sessionCtxSz = data[idx++];
  20303. /* app session context ID */
  20304. if (i - idx < s->sessionCtxSz) {
  20305. ret = BUFFER_ERROR;
  20306. goto end;
  20307. }
  20308. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  20309. #endif
  20310. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20311. /* byte for peerVerifyRet */
  20312. if (i - idx < OPAQUE8_LEN) {
  20313. ret = BUFFER_ERROR;
  20314. goto end;
  20315. }
  20316. s->peerVerifyRet = data[idx++];
  20317. #endif
  20318. #ifdef WOLFSSL_TLS13
  20319. if (i - idx < OPAQUE16_LEN) {
  20320. ret = BUFFER_ERROR;
  20321. goto end;
  20322. }
  20323. ato16(data + idx, &s->namedGroup);
  20324. idx += OPAQUE16_LEN;
  20325. #endif
  20326. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  20327. #ifdef WOLFSSL_TLS13
  20328. if (i - idx < (OPAQUE32_LEN * 2)) {
  20329. ret = BUFFER_ERROR;
  20330. goto end;
  20331. }
  20332. #ifdef WOLFSSL_32BIT_MILLI_TIME
  20333. ato32(data + idx, &s->ticketSeen);
  20334. idx += OPAQUE32_LEN;
  20335. #else
  20336. {
  20337. word32 seenHi, seenLo;
  20338. ato32(data + idx, &seenHi);
  20339. idx += OPAQUE32_LEN;
  20340. ato32(data + idx, &seenLo);
  20341. idx += OPAQUE32_LEN;
  20342. s->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  20343. }
  20344. #endif
  20345. ato32(data + idx, &s->ticketAdd);
  20346. idx += OPAQUE32_LEN;
  20347. if (i - idx < OPAQUE8_LEN) {
  20348. ret = BUFFER_ERROR;
  20349. goto end;
  20350. }
  20351. s->ticketNonce.len = data[idx++];
  20352. if (i - idx < s->ticketNonce.len) {
  20353. ret = BUFFER_ERROR;
  20354. goto end;
  20355. }
  20356. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  20357. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  20358. ret = SessionTicketNoncePopulate(s, data + idx, s->ticketNonce.len);
  20359. if (ret != 0)
  20360. goto end;
  20361. #else
  20362. if (s->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  20363. ret = BUFFER_ERROR;
  20364. goto end;
  20365. }
  20366. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  20367. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  20368. idx += s->ticketNonce.len;
  20369. #endif
  20370. #ifdef WOLFSSL_EARLY_DATA
  20371. if (i - idx < OPAQUE32_LEN) {
  20372. ret = BUFFER_ERROR;
  20373. goto end;
  20374. }
  20375. ato32(data + idx, &s->maxEarlyDataSz);
  20376. idx += OPAQUE32_LEN;
  20377. #endif
  20378. #endif
  20379. #ifdef HAVE_SESSION_TICKET
  20380. /* ticket len */
  20381. if (i - idx < OPAQUE16_LEN) {
  20382. ret = BUFFER_ERROR;
  20383. goto end;
  20384. }
  20385. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  20386. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  20387. if (s->ticketLenAlloc > 0) {
  20388. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  20389. }
  20390. if (s->ticketLen <= SESSION_TICKET_LEN)
  20391. s->ticket = s->staticTicket;
  20392. else {
  20393. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  20394. DYNAMIC_TYPE_SESSION_TICK);
  20395. if (s->ticket == NULL) {
  20396. ret = MEMORY_ERROR;
  20397. goto end;
  20398. }
  20399. s->ticketLenAlloc = (word16)s->ticketLen;
  20400. }
  20401. /* ticket */
  20402. if (i - idx < s->ticketLen) {
  20403. ret = BUFFER_ERROR;
  20404. goto end;
  20405. }
  20406. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  20407. #endif
  20408. (void)idx;
  20409. if (sess != NULL) {
  20410. *sess = s;
  20411. }
  20412. s->isSetup = 1;
  20413. *p += idx;
  20414. end:
  20415. if (ret != 0 && (sess == NULL || *sess != s)) {
  20416. wolfSSL_FreeSession(NULL, s);
  20417. s = NULL;
  20418. }
  20419. #endif /* HAVE_EXT_CACHE */
  20420. return s;
  20421. }
  20422. /* Check if there is a session ticket associated with this WOLFSSL_SESSION.
  20423. *
  20424. * sess - pointer to WOLFSSL_SESSION struct
  20425. *
  20426. * Returns 1 if has session ticket, otherwise 0 */
  20427. int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess)
  20428. {
  20429. WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket");
  20430. #ifdef HAVE_SESSION_TICKET
  20431. sess = ClientSessionToSession(sess);
  20432. if (sess) {
  20433. if ((sess->ticketLen > 0) && (sess->ticket != NULL)) {
  20434. return WOLFSSL_SUCCESS;
  20435. }
  20436. }
  20437. #else
  20438. (void)sess;
  20439. #endif
  20440. return WOLFSSL_FAILURE;
  20441. }
  20442. unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint(
  20443. const WOLFSSL_SESSION* sess)
  20444. {
  20445. WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint");
  20446. sess = ClientSessionToSession(sess);
  20447. if (sess) {
  20448. return sess->timeout;
  20449. }
  20450. return 0;
  20451. }
  20452. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  20453. {
  20454. long timeout = 0;
  20455. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  20456. sess = ClientSessionToSession(sess);
  20457. if (sess)
  20458. timeout = sess->timeout;
  20459. return timeout;
  20460. }
  20461. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  20462. {
  20463. word32 tmptime;
  20464. ses = ClientSessionToSession(ses);
  20465. if (ses == NULL || t < 0) {
  20466. return BAD_FUNC_ARG;
  20467. }
  20468. tmptime = t & 0xFFFFFFFF;
  20469. ses->timeout = tmptime;
  20470. return WOLFSSL_SUCCESS;
  20471. }
  20472. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  20473. {
  20474. long bornOn = 0;
  20475. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  20476. sess = ClientSessionToSession(sess);
  20477. if (sess)
  20478. bornOn = sess->bornOn;
  20479. return bornOn;
  20480. }
  20481. long wolfSSL_SESSION_set_time(WOLFSSL_SESSION *ses, long t)
  20482. {
  20483. ses = ClientSessionToSession(ses);
  20484. if (ses == NULL || t < 0) {
  20485. return 0;
  20486. }
  20487. ses->bornOn = (word32)t;
  20488. return t;
  20489. }
  20490. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  20491. #ifdef OPENSSL_EXTRA
  20492. #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
  20493. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  20494. {
  20495. int ret = WOLFSSL_FATAL_ERROR;
  20496. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  20497. if (ssl != NULL && fname != NULL)
  20498. {
  20499. #ifdef WOLFSSL_SMALL_STACK
  20500. byte staticBuffer[1]; /* force heap usage */
  20501. #else
  20502. byte staticBuffer[FILE_BUFFER_SIZE];
  20503. #endif
  20504. byte* myBuffer = staticBuffer;
  20505. int dynamic = 0;
  20506. XFILE file;
  20507. long sz = 0;
  20508. WOLFSSL_CTX* ctx = ssl->ctx;
  20509. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  20510. DerBuffer* fileDer = NULL;
  20511. file = XFOPEN(fname, "rb");
  20512. if (file == XBADFILE)
  20513. return WOLFSSL_BAD_FILE;
  20514. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  20515. XFCLOSE(file);
  20516. return WOLFSSL_BAD_FILE;
  20517. }
  20518. sz = XFTELL(file);
  20519. if (XFSEEK(file, 0, XSEEK_SET) != 0) {
  20520. XFCLOSE(file);
  20521. return WOLFSSL_BAD_FILE;
  20522. }
  20523. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  20524. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  20525. XFCLOSE(file);
  20526. return WOLFSSL_BAD_FILE;
  20527. }
  20528. if (sz > (long)sizeof(staticBuffer)) {
  20529. WOLFSSL_MSG("Getting dynamic buffer");
  20530. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  20531. dynamic = 1;
  20532. }
  20533. if ((myBuffer != NULL) &&
  20534. (sz > 0) &&
  20535. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  20536. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  20537. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  20538. (fileDer->length != 0) &&
  20539. (fileDer->length == peer_cert->derCert->length) &&
  20540. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  20541. fileDer->length) == 0))
  20542. {
  20543. ret = 0;
  20544. }
  20545. FreeDer(&fileDer);
  20546. if (dynamic)
  20547. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  20548. XFCLOSE(file);
  20549. }
  20550. return ret;
  20551. }
  20552. #endif
  20553. #endif /* OPENSSL_EXTRA */
  20554. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20555. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  20556. #ifndef NO_CERTS
  20557. /* oidCertExtType */
  20558. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  20559. "X509v3 Basic Constraints"},
  20560. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  20561. "X509v3 Subject Alternative Name"},
  20562. { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  20563. "X509v3 CRL Distribution Points"},
  20564. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  20565. "Authority Information Access"},
  20566. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  20567. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  20568. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  20569. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  20570. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  20571. "X509v3 Key Usage"},
  20572. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  20573. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  20574. { NID_ext_key_usage, EXT_KEY_USAGE_OID, oidCertExtType,
  20575. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  20576. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  20577. "nameConstraints", "X509v3 Name Constraints"},
  20578. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  20579. "certificatePolicies", "X509v3 Certificate Policies"},
  20580. /* oidCertAuthInfoType */
  20581. { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP",
  20582. "OCSP"},
  20583. { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  20584. "caIssuers", "CA Issuers"},
  20585. /* oidCertPolicyType */
  20586. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  20587. "X509v3 Any Policy"},
  20588. /* oidCertAltNameType */
  20589. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  20590. /* oidCertKeyUseType */
  20591. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  20592. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  20593. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  20594. "serverAuth", "TLS Web Server Authentication"},
  20595. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  20596. "clientAuth", "TLS Web Client Authentication"},
  20597. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  20598. "OCSPSigning", "OCSP Signing"},
  20599. /* oidCertNameType */
  20600. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  20601. #if !defined(WOLFSSL_CERT_REQ)
  20602. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  20603. #endif
  20604. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  20605. "serialNumber"},
  20606. { NID_userId, NID_userId, oidCertNameType, "UID", "userid"},
  20607. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  20608. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  20609. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  20610. "stateOrProvinceName"},
  20611. { NID_streetAddress, NID_streetAddress, oidCertNameType, "street",
  20612. "streetAddress"},
  20613. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  20614. "organizationName"},
  20615. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  20616. "OU", "organizationalUnitName"},
  20617. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  20618. "emailAddress"},
  20619. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  20620. "domainComponent"},
  20621. { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink",
  20622. "favouriteDrink"},
  20623. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  20624. "businessCategory"},
  20625. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  20626. "jurisdictionCountryName"},
  20627. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  20628. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  20629. { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"},
  20630. { NID_userId, NID_userId, oidCertNameType, "UID", "userId"},
  20631. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_NAME_ALL)
  20632. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  20633. oidCsrAttrType, "challengePassword", "challengePassword"},
  20634. { NID_pkcs9_contentType, PKCS9_CONTENT_TYPE_OID,
  20635. oidCsrAttrType, "contentType", "contentType" },
  20636. { NID_pkcs9_unstructuredName, UNSTRUCTURED_NAME_OID,
  20637. oidCsrAttrType, "unstructuredName", "unstructuredName" },
  20638. { NID_name, NAME_OID, oidCsrAttrType, "name", "name" },
  20639. { NID_surname, SURNAME_OID,
  20640. oidCsrAttrType, "surname", "surname" },
  20641. { NID_givenName, GIVEN_NAME_OID,
  20642. oidCsrAttrType, "givenName", "givenName" },
  20643. { NID_initials, INITIALS_OID,
  20644. oidCsrAttrType, "initials", "initials" },
  20645. { NID_dnQualifier, DNQUALIFIER_OID,
  20646. oidCsrAttrType, "dnQualifer", "dnQualifier" },
  20647. #endif
  20648. #endif
  20649. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  20650. /* oidHashType */
  20651. #ifdef WOLFSSL_MD2
  20652. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  20653. #endif
  20654. #ifdef WOLFSSL_MD5
  20655. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  20656. #endif
  20657. #ifndef NO_SHA
  20658. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  20659. #endif
  20660. #ifdef WOLFSSL_SHA224
  20661. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  20662. #endif
  20663. #ifndef NO_SHA256
  20664. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  20665. #endif
  20666. #ifdef WOLFSSL_SHA384
  20667. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  20668. #endif
  20669. #ifdef WOLFSSL_SHA512
  20670. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  20671. #endif
  20672. #ifdef WOLFSSL_SHA3
  20673. #ifndef WOLFSSL_NOSHA3_224
  20674. { NID_sha3_224, SHA3_224h, oidHashType, "SHA3-224", "sha3-224"},
  20675. #endif
  20676. #ifndef WOLFSSL_NOSHA3_256
  20677. { NID_sha3_256, SHA3_256h, oidHashType, "SHA3-256", "sha3-256"},
  20678. #endif
  20679. #ifndef WOLFSSL_NOSHA3_384
  20680. { NID_sha3_384, SHA3_384h, oidHashType, "SHA3-384", "sha3-384"},
  20681. #endif
  20682. #ifndef WOLFSSL_NOSHA3_512
  20683. { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"},
  20684. #endif
  20685. #endif /* WOLFSSL_SHA3 */
  20686. #ifdef WOLFSSL_SM3
  20687. { NID_sm3, SM3h, oidHashType, "SM3", "sm3"},
  20688. #endif
  20689. /* oidSigType */
  20690. #ifndef NO_DSA
  20691. #ifndef NO_SHA
  20692. { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  20693. { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  20694. "dsa_with_SHA256"},
  20695. #endif
  20696. #endif /* NO_DSA */
  20697. #ifndef NO_RSA
  20698. #ifdef WOLFSSL_MD2
  20699. { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  20700. "md2WithRSAEncryption"},
  20701. #endif
  20702. #ifndef NO_MD5
  20703. { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  20704. "md5WithRSAEncryption"},
  20705. #endif
  20706. #ifndef NO_SHA
  20707. { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  20708. "sha1WithRSAEncryption"},
  20709. #endif
  20710. #ifdef WOLFSSL_SHA224
  20711. { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  20712. "sha224WithRSAEncryption"},
  20713. #endif
  20714. #ifndef NO_SHA256
  20715. { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  20716. "sha256WithRSAEncryption"},
  20717. #endif
  20718. #ifdef WOLFSSL_SHA384
  20719. { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  20720. "sha384WithRSAEncryption"},
  20721. #endif
  20722. #ifdef WOLFSSL_SHA512
  20723. { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  20724. "sha512WithRSAEncryption"},
  20725. #endif
  20726. #ifdef WOLFSSL_SHA3
  20727. #ifndef WOLFSSL_NOSHA3_224
  20728. { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224",
  20729. "sha3-224WithRSAEncryption"},
  20730. #endif
  20731. #ifndef WOLFSSL_NOSHA3_256
  20732. { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256",
  20733. "sha3-256WithRSAEncryption"},
  20734. #endif
  20735. #ifndef WOLFSSL_NOSHA3_384
  20736. { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384",
  20737. "sha3-384WithRSAEncryption"},
  20738. #endif
  20739. #ifndef WOLFSSL_NOSHA3_512
  20740. { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512",
  20741. "sha3-512WithRSAEncryption"},
  20742. #endif
  20743. #endif
  20744. #ifdef WC_RSA_PSS
  20745. { NID_rsassaPss, CTC_RSASSAPSS, oidSigType, "RSASSA-PSS", "rsassaPss" },
  20746. #endif
  20747. #endif /* NO_RSA */
  20748. #ifdef HAVE_ECC
  20749. #ifndef NO_SHA
  20750. { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  20751. #endif
  20752. #ifdef WOLFSSL_SHA224
  20753. { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  20754. #endif
  20755. #ifndef NO_SHA256
  20756. { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  20757. #endif
  20758. #ifdef WOLFSSL_SHA384
  20759. { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  20760. #endif
  20761. #ifdef WOLFSSL_SHA512
  20762. { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  20763. #endif
  20764. #ifdef WOLFSSL_SHA3
  20765. #ifndef WOLFSSL_NOSHA3_224
  20766. { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224",
  20767. "ecdsa_with_SHA3-224"},
  20768. #endif
  20769. #ifndef WOLFSSL_NOSHA3_256
  20770. { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256",
  20771. "ecdsa_with_SHA3-256"},
  20772. #endif
  20773. #ifndef WOLFSSL_NOSHA3_384
  20774. { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384",
  20775. "ecdsa_with_SHA3-384"},
  20776. #endif
  20777. #ifndef WOLFSSL_NOSHA3_512
  20778. { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512",
  20779. "ecdsa_with_SHA3-512"},
  20780. #endif
  20781. #endif
  20782. #endif /* HAVE_ECC */
  20783. /* oidKeyType */
  20784. #ifndef NO_DSA
  20785. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  20786. #endif /* NO_DSA */
  20787. #ifndef NO_RSA
  20788. { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"},
  20789. #ifdef WC_RSA_PSS
  20790. { NID_rsassaPss, RSAPSSk, oidKeyType, "RSASSA-PSS", "rsassaPss"},
  20791. #endif
  20792. #endif /* NO_RSA */
  20793. #ifdef HAVE_ECC
  20794. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  20795. "id-ecPublicKey"},
  20796. #endif /* HAVE_ECC */
  20797. #ifndef NO_DH
  20798. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  20799. #endif
  20800. #ifdef HAVE_ED448
  20801. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  20802. #endif
  20803. #ifdef HAVE_ED25519
  20804. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  20805. #endif
  20806. #ifdef HAVE_PQC
  20807. #ifdef HAVE_FALCON
  20808. { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1",
  20809. "Falcon Level 1"},
  20810. { CTC_FALCON_LEVEL5, FALCON_LEVEL5k, oidKeyType, "Falcon Level 5",
  20811. "Falcon Level 5"},
  20812. #endif /* HAVE_FALCON */
  20813. #ifdef HAVE_DILITHIUM
  20814. { CTC_DILITHIUM_LEVEL2, DILITHIUM_LEVEL2k, oidKeyType,
  20815. "Dilithium Level 2", "Dilithium Level 2"},
  20816. { CTC_DILITHIUM_LEVEL3, DILITHIUM_LEVEL3k, oidKeyType,
  20817. "Dilithium Level 3", "Dilithium Level 3"},
  20818. { CTC_DILITHIUM_LEVEL5, DILITHIUM_LEVEL5k, oidKeyType,
  20819. "Dilithium Level 5", "Dilithium Level 5"},
  20820. #endif /* HAVE_DILITHIUM */
  20821. #endif /* HAVE_PQC */
  20822. /* oidCurveType */
  20823. #ifdef HAVE_ECC
  20824. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  20825. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  20826. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  20827. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  20828. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  20829. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  20830. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  20831. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  20832. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  20833. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  20834. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  20835. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  20836. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  20837. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  20838. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  20839. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  20840. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  20841. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  20842. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  20843. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  20844. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  20845. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  20846. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  20847. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  20848. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  20849. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  20850. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  20851. #ifdef WOLFSSL_SM2
  20852. { NID_sm2, ECC_SM2P256V1_OID, oidCurveType, "sm2", "sm2"},
  20853. #endif
  20854. #endif /* HAVE_ECC */
  20855. /* oidBlkType */
  20856. #ifdef WOLFSSL_AES_128
  20857. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  20858. #endif
  20859. #ifdef WOLFSSL_AES_192
  20860. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  20861. #endif
  20862. #ifdef WOLFSSL_AES_256
  20863. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  20864. #endif
  20865. #ifndef NO_DES3
  20866. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  20867. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  20868. #endif /* !NO_DES3 */
  20869. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  20870. { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, "ChaCha20-Poly1305", "chacha20-poly1305"},
  20871. #endif
  20872. /* oidOcspType */
  20873. #ifdef HAVE_OCSP
  20874. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  20875. "Basic OCSP Response"},
  20876. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  20877. "OCSP Nonce"},
  20878. #endif /* HAVE_OCSP */
  20879. #ifndef NO_PWDBASED
  20880. /* oidKdfType */
  20881. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  20882. /* oidPBEType */
  20883. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  20884. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  20885. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  20886. "pbeWithSHA1AndDES-CBC"},
  20887. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  20888. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  20889. #endif
  20890. /* oidKeyWrapType */
  20891. #ifdef WOLFSSL_AES_128
  20892. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  20893. #endif
  20894. #ifdef WOLFSSL_AES_192
  20895. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  20896. #endif
  20897. #ifdef WOLFSSL_AES_256
  20898. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  20899. #endif
  20900. #ifndef NO_PKCS7
  20901. #ifndef NO_DH
  20902. /* oidCmsKeyAgreeType */
  20903. #ifndef NO_SHA
  20904. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  20905. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  20906. #endif
  20907. #ifdef WOLFSSL_SHA224
  20908. { dhSinglePass_stdDH_sha224kdf_scheme,
  20909. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  20910. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  20911. #endif
  20912. #ifndef NO_SHA256
  20913. { dhSinglePass_stdDH_sha256kdf_scheme,
  20914. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  20915. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  20916. #endif
  20917. #ifdef WOLFSSL_SHA384
  20918. { dhSinglePass_stdDH_sha384kdf_scheme,
  20919. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  20920. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  20921. #endif
  20922. #ifdef WOLFSSL_SHA512
  20923. { dhSinglePass_stdDH_sha512kdf_scheme,
  20924. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  20925. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  20926. #endif
  20927. #endif
  20928. #endif
  20929. #if defined(WOLFSSL_APACHE_HTTPD)
  20930. /* "1.3.6.1.5.5.7.8.7" */
  20931. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  20932. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  20933. /* "1.3.6.1.4.1.311.20.2.3" */
  20934. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  20935. WOLFSSL_LN_MS_UPN },
  20936. /* "1.3.6.1.5.5.7.1.24" */
  20937. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  20938. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  20939. #endif
  20940. #endif /* OPENSSL_EXTRA */
  20941. };
  20942. #define WOLFSSL_OBJECT_INFO_SZ \
  20943. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  20944. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  20945. #endif
  20946. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20947. /* Free the dynamically allocated data.
  20948. *
  20949. * p Pointer to dynamically allocated memory.
  20950. */
  20951. void wolfSSL_OPENSSL_free(void* p)
  20952. {
  20953. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  20954. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  20955. }
  20956. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  20957. #ifdef OPENSSL_EXTRA
  20958. void *wolfSSL_OPENSSL_malloc(size_t a)
  20959. {
  20960. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  20961. }
  20962. int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
  20963. {
  20964. /* 'char' is unsigned on some platforms. */
  20965. return (int)(signed char)HexCharToByte((char)c);
  20966. }
  20967. unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
  20968. {
  20969. unsigned char* targetBuf;
  20970. int srcDigitHigh = 0;
  20971. int srcDigitLow = 0;
  20972. size_t srcLen;
  20973. size_t srcIdx = 0;
  20974. long targetIdx = 0;
  20975. srcLen = XSTRLEN(str);
  20976. targetBuf = (unsigned char*)XMALLOC(srcLen / 2, NULL, DYNAMIC_TYPE_OPENSSL);
  20977. if (targetBuf == NULL) {
  20978. return NULL;
  20979. }
  20980. while (srcIdx < srcLen) {
  20981. if (str[srcIdx] == ':') {
  20982. srcIdx++;
  20983. continue;
  20984. }
  20985. srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  20986. srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  20987. if (srcDigitHigh < 0 || srcDigitLow < 0) {
  20988. WOLFSSL_MSG("Invalid hex character.");
  20989. XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  20990. return NULL;
  20991. }
  20992. targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow);
  20993. }
  20994. if (len != NULL)
  20995. *len = targetIdx;
  20996. return targetBuf;
  20997. }
  20998. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  20999. {
  21000. (void)opts;
  21001. (void)settings;
  21002. return wolfSSL_library_init();
  21003. }
  21004. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  21005. {
  21006. (void)opts;
  21007. (void)settings;
  21008. return wolfSSL_library_init();
  21009. }
  21010. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  21011. int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  21012. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  21013. int maxDerSz)
  21014. {
  21015. int ret, paddingSz;
  21016. word32 idx, cipherInfoSz;
  21017. #ifdef WOLFSSL_SMALL_STACK
  21018. EncryptedInfo* info = NULL;
  21019. #else
  21020. EncryptedInfo info[1];
  21021. #endif
  21022. WOLFSSL_ENTER("EncryptDerKey");
  21023. if (der == NULL || derSz == NULL || cipher == NULL ||
  21024. passwd == NULL || cipherInfo == NULL)
  21025. return BAD_FUNC_ARG;
  21026. #ifdef WOLFSSL_SMALL_STACK
  21027. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  21028. DYNAMIC_TYPE_ENCRYPTEDINFO);
  21029. if (info == NULL) {
  21030. WOLFSSL_MSG("malloc failed");
  21031. return WOLFSSL_FAILURE;
  21032. }
  21033. #endif
  21034. XMEMSET(info, 0, sizeof(EncryptedInfo));
  21035. /* set the cipher name on info */
  21036. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  21037. info->name[NAME_SZ-1] = '\0'; /* null term */
  21038. ret = wc_EncryptedInfoGet(info, info->name);
  21039. if (ret != 0) {
  21040. WOLFSSL_MSG("unsupported cipher");
  21041. #ifdef WOLFSSL_SMALL_STACK
  21042. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21043. #endif
  21044. return WOLFSSL_FAILURE;
  21045. }
  21046. /* Generate a random salt */
  21047. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  21048. WOLFSSL_MSG("generate iv failed");
  21049. #ifdef WOLFSSL_SMALL_STACK
  21050. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21051. #endif
  21052. return WOLFSSL_FAILURE;
  21053. }
  21054. /* add the padding before encryption */
  21055. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  21056. if (paddingSz == 0)
  21057. paddingSz = info->ivSz;
  21058. if (maxDerSz < *derSz + paddingSz) {
  21059. WOLFSSL_MSG("not enough DER buffer allocated");
  21060. #ifdef WOLFSSL_SMALL_STACK
  21061. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21062. #endif
  21063. return WOLFSSL_FAILURE;
  21064. }
  21065. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  21066. (*derSz) += paddingSz;
  21067. /* encrypt buffer */
  21068. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  21069. WOLFSSL_MSG("encrypt key failed");
  21070. #ifdef WOLFSSL_SMALL_STACK
  21071. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21072. #endif
  21073. return WOLFSSL_FAILURE;
  21074. }
  21075. /* create cipher info : 'cipher_name,Salt(hex)' */
  21076. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  21077. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  21078. DYNAMIC_TYPE_STRING);
  21079. if (*cipherInfo == NULL) {
  21080. WOLFSSL_MSG("malloc failed");
  21081. #ifdef WOLFSSL_SMALL_STACK
  21082. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21083. #endif
  21084. return WOLFSSL_FAILURE;
  21085. }
  21086. XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  21087. XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz);
  21088. idx = (word32)XSTRLEN((char*)*cipherInfo);
  21089. cipherInfoSz -= idx;
  21090. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  21091. #ifdef WOLFSSL_SMALL_STACK
  21092. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  21093. #endif
  21094. if (ret != 0) {
  21095. WOLFSSL_MSG("Base16_Encode failed");
  21096. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  21097. return WOLFSSL_FAILURE;
  21098. }
  21099. return WOLFSSL_SUCCESS;
  21100. }
  21101. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  21102. #if !defined(NO_BIO)
  21103. static int pem_write_pubkey(WOLFSSL_EVP_PKEY* key, void* heap, byte** derBuf,
  21104. int* derSz)
  21105. {
  21106. byte* buf = NULL;
  21107. int sz = 0;
  21108. (void)heap;
  21109. if (key == NULL) {
  21110. WOLFSSL_MSG("Bad parameters");
  21111. return WOLFSSL_FAILURE;
  21112. }
  21113. switch (key->type) {
  21114. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
  21115. case EVP_PKEY_RSA:
  21116. if ((sz = wolfSSL_RSA_To_Der(key->rsa, &buf, 1, heap))
  21117. < 0) {
  21118. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  21119. break;
  21120. }
  21121. break;
  21122. #endif /* WOLFSSL_KEY_GEN && !NO_RSA */
  21123. #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  21124. defined(WOLFSSL_CERT_GEN))
  21125. case EVP_PKEY_DSA:
  21126. if (key->dsa == NULL) {
  21127. WOLFSSL_MSG("key->dsa is null");
  21128. break;
  21129. }
  21130. sz = MAX_DSA_PUBKEY_SZ;
  21131. buf = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  21132. if (buf == NULL) {
  21133. WOLFSSL_MSG("malloc failed");
  21134. break;
  21135. }
  21136. /* Key to DER */
  21137. sz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, buf, sz);
  21138. if (sz < 0) {
  21139. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  21140. break;
  21141. }
  21142. break;
  21143. #endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */
  21144. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  21145. case EVP_PKEY_EC:
  21146. {
  21147. if (key->ecc == NULL) {
  21148. WOLFSSL_MSG("key->ecc is null");
  21149. break;
  21150. }
  21151. if ((sz = wolfssl_ec_key_to_pubkey_der(key->ecc, &buf, heap)) <=
  21152. 0) {
  21153. WOLFSSL_MSG("wolfssl_ec_key_to_pubkey_der failed");
  21154. break;
  21155. }
  21156. break;
  21157. }
  21158. #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
  21159. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  21160. case EVP_PKEY_DH:
  21161. WOLFSSL_MSG("Writing DH PUBKEY not supported!");
  21162. break;
  21163. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  21164. default:
  21165. WOLFSSL_MSG("Unknown Key type!");
  21166. break;
  21167. }
  21168. if (buf == NULL || sz <= 0) {
  21169. if (buf != NULL)
  21170. XFREE(buf, heap, DYNAMIC_TYPE_DER);
  21171. return WOLFSSL_FAILURE;
  21172. }
  21173. *derBuf = buf;
  21174. *derSz = sz;
  21175. return WOLFSSL_SUCCESS;
  21176. }
  21177. #endif
  21178. #ifndef NO_BIO
  21179. static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  21180. {
  21181. int ret;
  21182. int derSz = 0;
  21183. byte* derBuf = NULL;
  21184. ret = pem_write_pubkey(key, bio->heap, &derBuf, &derSz);
  21185. if (ret == WOLFSSL_SUCCESS) {
  21186. ret = der_write_to_bio_as_pem(derBuf, derSz, bio, PUBLICKEY_TYPE);
  21187. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  21188. }
  21189. return ret;
  21190. }
  21191. /* Takes a public key and writes it out to a WOLFSSL_BIO
  21192. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  21193. */
  21194. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  21195. {
  21196. int ret;
  21197. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  21198. if ((bio == NULL) || (key == NULL)) {
  21199. ret = WOLFSSL_FAILURE;
  21200. }
  21201. else {
  21202. ret = pem_write_bio_pubkey(bio, key);
  21203. }
  21204. return ret;
  21205. }
  21206. /* Takes a private key and writes it out to a WOLFSSL_BIO
  21207. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  21208. */
  21209. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  21210. const WOLFSSL_EVP_CIPHER* cipher,
  21211. unsigned char* passwd, int len,
  21212. wc_pem_password_cb* cb, void* arg)
  21213. {
  21214. byte* keyDer;
  21215. int type;
  21216. (void)cipher;
  21217. (void)passwd;
  21218. (void)len;
  21219. (void)cb;
  21220. (void)arg;
  21221. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  21222. if (bio == NULL || key == NULL) {
  21223. WOLFSSL_MSG("Bad Function Arguments");
  21224. return WOLFSSL_FAILURE;
  21225. }
  21226. keyDer = (byte*)key->pkey.ptr;
  21227. switch (key->type) {
  21228. #ifndef NO_RSA
  21229. case EVP_PKEY_RSA:
  21230. type = PRIVATEKEY_TYPE;
  21231. break;
  21232. #endif
  21233. #ifndef NO_DSA
  21234. case EVP_PKEY_DSA:
  21235. type = DSA_PRIVATEKEY_TYPE;
  21236. break;
  21237. #endif
  21238. #ifdef HAVE_ECC
  21239. case EVP_PKEY_EC:
  21240. type = ECC_PRIVATEKEY_TYPE;
  21241. break;
  21242. #endif
  21243. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  21244. case EVP_PKEY_DH:
  21245. type = DH_PRIVATEKEY_TYPE;
  21246. break;
  21247. #endif
  21248. default:
  21249. WOLFSSL_MSG("Unknown Key type!");
  21250. type = PRIVATEKEY_TYPE;
  21251. }
  21252. return der_write_to_bio_as_pem(keyDer, key->pkey_sz, bio, type);
  21253. }
  21254. #endif /* !NO_BIO */
  21255. /* Colon separated list of <public key>+<digest> algorithms.
  21256. * Replaces list in context.
  21257. */
  21258. int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list)
  21259. {
  21260. WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list");
  21261. if (ctx == NULL || list == NULL) {
  21262. WOLFSSL_MSG("Bad function arguments");
  21263. return WOLFSSL_FAILURE;
  21264. }
  21265. if (AllocateCtxSuites(ctx) != 0)
  21266. return WOLFSSL_FAILURE;
  21267. return SetSuitesHashSigAlgo(ctx->suites, list);
  21268. }
  21269. /* Colon separated list of <public key>+<digest> algorithms.
  21270. * Replaces list in SSL.
  21271. */
  21272. int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list)
  21273. {
  21274. WOLFSSL_MSG("wolfSSL_set1_sigalg_list");
  21275. if (ssl == NULL || list == NULL) {
  21276. WOLFSSL_MSG("Bad function arguments");
  21277. return WOLFSSL_FAILURE;
  21278. }
  21279. if (AllocateSuites(ssl) != 0)
  21280. return WOLFSSL_FAILURE;
  21281. return SetSuitesHashSigAlgo(ssl->suites, list);
  21282. }
  21283. static int HashToNid(byte hashAlgo, int* nid)
  21284. {
  21285. int ret = WOLFSSL_SUCCESS;
  21286. /* Cast for compiler to check everything is implemented */
  21287. switch ((enum wc_MACAlgorithm)hashAlgo) {
  21288. case no_mac:
  21289. case rmd_mac:
  21290. *nid = NID_undef;
  21291. break;
  21292. case md5_mac:
  21293. *nid = NID_md5;
  21294. break;
  21295. case sha_mac:
  21296. *nid = NID_sha1;
  21297. break;
  21298. case sha224_mac:
  21299. *nid = NID_sha224;
  21300. break;
  21301. case sha256_mac:
  21302. *nid = NID_sha256;
  21303. break;
  21304. case sha384_mac:
  21305. *nid = NID_sha384;
  21306. break;
  21307. case sha512_mac:
  21308. *nid = NID_sha512;
  21309. break;
  21310. case blake2b_mac:
  21311. *nid = NID_blake2b512;
  21312. break;
  21313. case sm3_mac:
  21314. *nid = NID_sm3;
  21315. break;
  21316. default:
  21317. ret = WOLFSSL_FAILURE;
  21318. break;
  21319. }
  21320. return ret;
  21321. }
  21322. static int SaToNid(byte sa, int* nid)
  21323. {
  21324. int ret = WOLFSSL_SUCCESS;
  21325. /* Cast for compiler to check everything is implemented */
  21326. switch ((enum SignatureAlgorithm)sa) {
  21327. case anonymous_sa_algo:
  21328. *nid = NID_undef;
  21329. break;
  21330. case rsa_sa_algo:
  21331. *nid = NID_rsaEncryption;
  21332. break;
  21333. case dsa_sa_algo:
  21334. *nid = NID_dsa;
  21335. break;
  21336. case ecc_dsa_sa_algo:
  21337. *nid = NID_X9_62_id_ecPublicKey;
  21338. break;
  21339. case rsa_pss_sa_algo:
  21340. *nid = NID_rsassaPss;
  21341. break;
  21342. case ed25519_sa_algo:
  21343. #ifdef HAVE_ED25519
  21344. *nid = NID_ED25519;
  21345. #else
  21346. ret = WOLFSSL_FAILURE;
  21347. #endif
  21348. break;
  21349. case rsa_pss_pss_algo:
  21350. *nid = NID_rsassaPss;
  21351. break;
  21352. case ed448_sa_algo:
  21353. #ifdef HAVE_ED448
  21354. *nid = NID_ED448;
  21355. #else
  21356. ret = WOLFSSL_FAILURE;
  21357. #endif
  21358. break;
  21359. case falcon_level1_sa_algo:
  21360. *nid = CTC_FALCON_LEVEL1;
  21361. break;
  21362. case falcon_level5_sa_algo:
  21363. *nid = CTC_FALCON_LEVEL5;
  21364. break;
  21365. case dilithium_level2_sa_algo:
  21366. *nid = CTC_DILITHIUM_LEVEL2;
  21367. break;
  21368. case dilithium_level3_sa_algo:
  21369. *nid = CTC_DILITHIUM_LEVEL3;
  21370. break;
  21371. case dilithium_level5_sa_algo:
  21372. *nid = CTC_DILITHIUM_LEVEL5;
  21373. break;
  21374. case sm2_sa_algo:
  21375. *nid = NID_sm2;
  21376. break;
  21377. case invalid_sa_algo:
  21378. default:
  21379. ret = WOLFSSL_FAILURE;
  21380. break;
  21381. }
  21382. return ret;
  21383. }
  21384. /* This API returns the hash selected. */
  21385. int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid)
  21386. {
  21387. WOLFSSL_MSG("wolfSSL_get_signature_nid");
  21388. if (ssl == NULL || nid == NULL) {
  21389. WOLFSSL_MSG("Bad function arguments");
  21390. return WOLFSSL_FAILURE;
  21391. }
  21392. return HashToNid(ssl->options.hashAlgo, nid);
  21393. }
  21394. /* This API returns the signature selected. */
  21395. int wolfSSL_get_signature_type_nid(const WOLFSSL* ssl, int* nid)
  21396. {
  21397. WOLFSSL_MSG("wolfSSL_get_signature_type_nid");
  21398. if (ssl == NULL || nid == NULL) {
  21399. WOLFSSL_MSG("Bad function arguments");
  21400. return WOLFSSL_FAILURE;
  21401. }
  21402. return SaToNid(ssl->options.sigAlgo, nid);
  21403. }
  21404. int wolfSSL_get_peer_signature_nid(WOLFSSL* ssl, int* nid)
  21405. {
  21406. WOLFSSL_MSG("wolfSSL_get_peer_signature_nid");
  21407. if (ssl == NULL || nid == NULL) {
  21408. WOLFSSL_MSG("Bad function arguments");
  21409. return WOLFSSL_FAILURE;
  21410. }
  21411. return HashToNid(ssl->options.peerHashAlgo, nid);
  21412. }
  21413. int wolfSSL_get_peer_signature_type_nid(const WOLFSSL* ssl, int* nid)
  21414. {
  21415. WOLFSSL_MSG("wolfSSL_get_peer_signature_type_nid");
  21416. if (ssl == NULL || nid == NULL) {
  21417. WOLFSSL_MSG("Bad function arguments");
  21418. return WOLFSSL_FAILURE;
  21419. }
  21420. return SaToNid(ssl->options.peerSigAlgo, nid);
  21421. }
  21422. #ifdef HAVE_ECC
  21423. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  21424. static int populate_groups(int* groups, int max_count, const char *list)
  21425. {
  21426. const char *end;
  21427. int count = 0;
  21428. const WOLF_EC_NIST_NAME* nist_name;
  21429. if (!groups || !list) {
  21430. return -1;
  21431. }
  21432. for (end = list; ; list = ++end) {
  21433. int len;
  21434. if (count > max_count) {
  21435. WOLFSSL_MSG("Too many curves in list");
  21436. return -1;
  21437. }
  21438. while (*end != ':' && *end != '\0') end++;
  21439. len = (int)(end - list); /* end points to char after end
  21440. * of curve name so no need for -1 */
  21441. if ((len < kNistCurves_MIN_NAME_LEN) ||
  21442. (len > kNistCurves_MAX_NAME_LEN)) {
  21443. WOLFSSL_MSG("Unrecognized curve name in list");
  21444. return -1;
  21445. }
  21446. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  21447. if (len == nist_name->name_len &&
  21448. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  21449. break;
  21450. }
  21451. }
  21452. if (!nist_name->name) {
  21453. WOLFSSL_MSG("Unrecognized curve name in list");
  21454. return -1;
  21455. }
  21456. groups[count++] = nist_name->nid;
  21457. if (*end == '\0') break;
  21458. }
  21459. return count;
  21460. }
  21461. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, const char *list)
  21462. {
  21463. int groups[WOLFSSL_MAX_GROUP_COUNT];
  21464. int count = 0;
  21465. if (!ctx || !list) {
  21466. return WOLFSSL_FAILURE;
  21467. }
  21468. if ((count = populate_groups(groups,
  21469. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  21470. return WOLFSSL_FAILURE;
  21471. }
  21472. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  21473. }
  21474. int wolfSSL_set1_groups_list(WOLFSSL *ssl, const char *list)
  21475. {
  21476. int groups[WOLFSSL_MAX_GROUP_COUNT];
  21477. int count = 0;
  21478. if (!ssl || !list) {
  21479. return WOLFSSL_FAILURE;
  21480. }
  21481. if ((count = populate_groups(groups,
  21482. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  21483. return WOLFSSL_FAILURE;
  21484. }
  21485. return wolfSSL_set1_groups(ssl, groups, count);
  21486. }
  21487. #endif /* WOLFSSL_TLS13 */
  21488. #endif /* HAVE_ECC */
  21489. #ifndef NO_BIO
  21490. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  21491. WOLFSSL_EVP_PKEY** key,
  21492. wc_pem_password_cb* cb,
  21493. void* pass)
  21494. {
  21495. WOLFSSL_EVP_PKEY* pkey = NULL;
  21496. DerBuffer* der = NULL;
  21497. int keyFormat = 0;
  21498. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  21499. if (bio == NULL)
  21500. return pkey;
  21501. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat, &der)
  21502. >= 0) {
  21503. const unsigned char* ptr = der->buffer;
  21504. int type = -1;
  21505. if (keyFormat) {
  21506. /* keyFormat is Key_Sum enum */
  21507. if (keyFormat == RSAk)
  21508. type = EVP_PKEY_RSA;
  21509. else if (keyFormat == ECDSAk)
  21510. type = EVP_PKEY_EC;
  21511. else if (keyFormat == DSAk)
  21512. type = EVP_PKEY_DSA;
  21513. else if (keyFormat == DHk)
  21514. type = EVP_PKEY_DH;
  21515. }
  21516. else {
  21517. /* Default to RSA if format is not set */
  21518. type = EVP_PKEY_RSA;
  21519. }
  21520. /* handle case where reuse is attempted */
  21521. if (key != NULL && *key != NULL)
  21522. pkey = *key;
  21523. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  21524. if (pkey == NULL) {
  21525. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21526. }
  21527. }
  21528. FreeDer(&der);
  21529. if (key != NULL && pkey != NULL)
  21530. *key = pkey;
  21531. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  21532. return pkey;
  21533. }
  21534. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  21535. WOLFSSL_EVP_PKEY **key,
  21536. wc_pem_password_cb *cb,
  21537. void *pass)
  21538. {
  21539. WOLFSSL_EVP_PKEY* pkey = NULL;
  21540. DerBuffer* der = NULL;
  21541. int keyFormat = 0;
  21542. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  21543. if (bio == NULL)
  21544. return pkey;
  21545. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  21546. >= 0) {
  21547. const unsigned char* ptr = der->buffer;
  21548. /* handle case where reuse is attempted */
  21549. if (key != NULL && *key != NULL)
  21550. pkey = *key;
  21551. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  21552. if (pkey == NULL) {
  21553. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21554. }
  21555. }
  21556. FreeDer(&der);
  21557. if (key != NULL && pkey != NULL)
  21558. *key = pkey;
  21559. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  21560. return pkey;
  21561. }
  21562. #endif /* !NO_BIO */
  21563. #if !defined(NO_FILESYSTEM)
  21564. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **key,
  21565. wc_pem_password_cb *cb, void *pass)
  21566. {
  21567. WOLFSSL_EVP_PKEY* pkey = NULL;
  21568. DerBuffer* der = NULL;
  21569. int keyFormat = 0;
  21570. WOLFSSL_ENTER("wolfSSL_PEM_read_PUBKEY");
  21571. if ((pem_read_file_key(fp, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  21572. >= 0) && (der != NULL)) {
  21573. const unsigned char* ptr = der->buffer;
  21574. /* handle case where reuse is attempted */
  21575. if ((key != NULL) && (*key != NULL)) {
  21576. pkey = *key;
  21577. }
  21578. if ((wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length) == NULL) ||
  21579. (pkey == NULL)) {
  21580. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21581. pkey = NULL;
  21582. }
  21583. }
  21584. FreeDer(&der);
  21585. if ((key != NULL) && (pkey != NULL)) {
  21586. *key = pkey;
  21587. }
  21588. WOLFSSL_LEAVE("wolfSSL_PEM_read_PUBKEY", 0);
  21589. return pkey;
  21590. }
  21591. #endif /* NO_FILESYSTEM */
  21592. #endif /* OPENSSL_EXTRA */
  21593. #ifdef WOLFSSL_ALT_CERT_CHAINS
  21594. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  21595. {
  21596. int isUsing = 0;
  21597. if (ssl)
  21598. isUsing = ssl->options.usingAltCertChain;
  21599. return isUsing;
  21600. }
  21601. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  21602. #ifdef SESSION_CERTS
  21603. #ifdef WOLFSSL_ALT_CERT_CHAINS
  21604. /* Get peer's alternate certificate chain */
  21605. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  21606. {
  21607. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  21608. if (ssl)
  21609. return &ssl->session->altChain;
  21610. return 0;
  21611. }
  21612. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  21613. /* Get peer's certificate chain */
  21614. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  21615. {
  21616. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  21617. if (ssl)
  21618. return &ssl->session->chain;
  21619. return 0;
  21620. }
  21621. /* Get peer's certificate chain total count */
  21622. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  21623. {
  21624. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  21625. if (chain)
  21626. return chain->count;
  21627. return 0;
  21628. }
  21629. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  21630. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  21631. {
  21632. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  21633. if (chain)
  21634. return chain->certs[idx].length;
  21635. return 0;
  21636. }
  21637. /* Get peer's ASN.1 DER certificate at index (idx) */
  21638. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  21639. {
  21640. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  21641. if (chain)
  21642. return chain->certs[idx].buffer;
  21643. return 0;
  21644. }
  21645. /* Get peer's wolfSSL X509 certificate at index (idx) */
  21646. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  21647. {
  21648. int ret = 0;
  21649. WOLFSSL_X509* x509 = NULL;
  21650. #ifdef WOLFSSL_SMALL_STACK
  21651. DecodedCert* cert = NULL;
  21652. #else
  21653. DecodedCert cert[1];
  21654. #endif
  21655. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  21656. if (chain != NULL) {
  21657. #ifdef WOLFSSL_SMALL_STACK
  21658. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  21659. DYNAMIC_TYPE_DCERT);
  21660. if (cert != NULL)
  21661. #endif
  21662. {
  21663. InitDecodedCert(cert, chain->certs[idx].buffer,
  21664. chain->certs[idx].length, NULL);
  21665. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  21666. WOLFSSL_MSG("Failed to parse cert");
  21667. }
  21668. else {
  21669. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  21670. DYNAMIC_TYPE_X509);
  21671. if (x509 == NULL) {
  21672. WOLFSSL_MSG("Failed alloc X509");
  21673. }
  21674. else {
  21675. InitX509(x509, 1, NULL);
  21676. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  21677. WOLFSSL_MSG("Failed to copy decoded");
  21678. wolfSSL_X509_free(x509);
  21679. x509 = NULL;
  21680. }
  21681. }
  21682. }
  21683. FreeDecodedCert(cert);
  21684. #ifdef WOLFSSL_SMALL_STACK
  21685. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  21686. #endif
  21687. }
  21688. }
  21689. (void)ret;
  21690. return x509;
  21691. }
  21692. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  21693. enough else return error (-1). If buffer is NULL only calculate
  21694. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  21695. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  21696. unsigned char* buf, int inLen, int* outLen)
  21697. {
  21698. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  21699. const char* header = NULL;
  21700. const char* footer = NULL;
  21701. int headerLen;
  21702. int footerLen;
  21703. int i;
  21704. int err;
  21705. word32 szNeeded = 0;
  21706. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  21707. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  21708. return BAD_FUNC_ARG;
  21709. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  21710. if (err != 0)
  21711. return err;
  21712. headerLen = (int)XSTRLEN(header);
  21713. footerLen = (int)XSTRLEN(footer);
  21714. /* Null output buffer return size needed in outLen */
  21715. if(!buf) {
  21716. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  21717. NULL, &szNeeded) != LENGTH_ONLY_E)
  21718. return WOLFSSL_FAILURE;
  21719. *outLen = szNeeded + headerLen + footerLen;
  21720. return LENGTH_ONLY_E;
  21721. }
  21722. /* don't even try if inLen too short */
  21723. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  21724. return BAD_FUNC_ARG;
  21725. /* header */
  21726. if (XMEMCPY(buf, header, headerLen) == NULL)
  21727. return WOLFSSL_FATAL_ERROR;
  21728. i = headerLen;
  21729. /* body */
  21730. *outLen = inLen; /* input to Base64_Encode */
  21731. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  21732. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  21733. return err;
  21734. i += *outLen;
  21735. /* footer */
  21736. if ( (i + footerLen) > inLen)
  21737. return BAD_FUNC_ARG;
  21738. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  21739. return WOLFSSL_FATAL_ERROR;
  21740. *outLen += headerLen + footerLen;
  21741. return WOLFSSL_SUCCESS;
  21742. #else
  21743. (void)chain;
  21744. (void)idx;
  21745. (void)buf;
  21746. (void)inLen;
  21747. (void)outLen;
  21748. return WOLFSSL_FAILURE;
  21749. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  21750. }
  21751. /* get session ID */
  21752. WOLFSSL_ABI
  21753. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  21754. {
  21755. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  21756. session = ClientSessionToSession(session);
  21757. if (session)
  21758. return session->sessionID;
  21759. return NULL;
  21760. }
  21761. #endif /* SESSION_CERTS */
  21762. #ifdef HAVE_FUZZER
  21763. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  21764. {
  21765. if (ssl) {
  21766. ssl->fuzzerCb = cbf;
  21767. ssl->fuzzerCtx = fCtx;
  21768. }
  21769. }
  21770. #endif
  21771. #ifndef NO_CERTS
  21772. #ifdef HAVE_PK_CALLBACKS
  21773. #ifdef HAVE_ECC
  21774. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  21775. {
  21776. if (ctx)
  21777. ctx->EccKeyGenCb = cb;
  21778. }
  21779. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  21780. {
  21781. if (ssl)
  21782. ssl->EccKeyGenCtx = ctx;
  21783. }
  21784. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  21785. {
  21786. if (ssl)
  21787. return ssl->EccKeyGenCtx;
  21788. return NULL;
  21789. }
  21790. void wolfSSL_CTX_SetEccSignCtx(WOLFSSL_CTX* ctx, void *userCtx)
  21791. {
  21792. if (ctx)
  21793. ctx->EccSignCtx = userCtx;
  21794. }
  21795. void* wolfSSL_CTX_GetEccSignCtx(WOLFSSL_CTX* ctx)
  21796. {
  21797. if (ctx)
  21798. return ctx->EccSignCtx;
  21799. return NULL;
  21800. }
  21801. WOLFSSL_ABI
  21802. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  21803. {
  21804. if (ctx)
  21805. ctx->EccSignCb = cb;
  21806. }
  21807. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  21808. {
  21809. if (ssl)
  21810. ssl->EccSignCtx = ctx;
  21811. }
  21812. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  21813. {
  21814. if (ssl)
  21815. return ssl->EccSignCtx;
  21816. return NULL;
  21817. }
  21818. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  21819. {
  21820. if (ctx)
  21821. ctx->EccVerifyCb = cb;
  21822. }
  21823. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  21824. {
  21825. if (ssl)
  21826. ssl->EccVerifyCtx = ctx;
  21827. }
  21828. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  21829. {
  21830. if (ssl)
  21831. return ssl->EccVerifyCtx;
  21832. return NULL;
  21833. }
  21834. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  21835. {
  21836. if (ctx)
  21837. ctx->EccSharedSecretCb = cb;
  21838. }
  21839. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21840. {
  21841. if (ssl)
  21842. ssl->EccSharedSecretCtx = ctx;
  21843. }
  21844. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  21845. {
  21846. if (ssl)
  21847. return ssl->EccSharedSecretCtx;
  21848. return NULL;
  21849. }
  21850. #endif /* HAVE_ECC */
  21851. #ifdef HAVE_ED25519
  21852. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  21853. {
  21854. if (ctx)
  21855. ctx->Ed25519SignCb = cb;
  21856. }
  21857. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  21858. {
  21859. if (ssl)
  21860. ssl->Ed25519SignCtx = ctx;
  21861. }
  21862. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  21863. {
  21864. if (ssl)
  21865. return ssl->Ed25519SignCtx;
  21866. return NULL;
  21867. }
  21868. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  21869. {
  21870. if (ctx)
  21871. ctx->Ed25519VerifyCb = cb;
  21872. }
  21873. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  21874. {
  21875. if (ssl)
  21876. ssl->Ed25519VerifyCtx = ctx;
  21877. }
  21878. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  21879. {
  21880. if (ssl)
  21881. return ssl->Ed25519VerifyCtx;
  21882. return NULL;
  21883. }
  21884. #endif /* HAVE_ED25519 */
  21885. #ifdef HAVE_CURVE25519
  21886. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  21887. CallbackX25519KeyGen cb)
  21888. {
  21889. if (ctx)
  21890. ctx->X25519KeyGenCb = cb;
  21891. }
  21892. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  21893. {
  21894. if (ssl)
  21895. ssl->X25519KeyGenCtx = ctx;
  21896. }
  21897. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  21898. {
  21899. if (ssl)
  21900. return ssl->X25519KeyGenCtx;
  21901. return NULL;
  21902. }
  21903. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  21904. CallbackX25519SharedSecret cb)
  21905. {
  21906. if (ctx)
  21907. ctx->X25519SharedSecretCb = cb;
  21908. }
  21909. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21910. {
  21911. if (ssl)
  21912. ssl->X25519SharedSecretCtx = ctx;
  21913. }
  21914. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  21915. {
  21916. if (ssl)
  21917. return ssl->X25519SharedSecretCtx;
  21918. return NULL;
  21919. }
  21920. #endif /* HAVE_CURVE25519 */
  21921. #ifdef HAVE_ED448
  21922. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  21923. {
  21924. if (ctx)
  21925. ctx->Ed448SignCb = cb;
  21926. }
  21927. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  21928. {
  21929. if (ssl)
  21930. ssl->Ed448SignCtx = ctx;
  21931. }
  21932. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  21933. {
  21934. if (ssl)
  21935. return ssl->Ed448SignCtx;
  21936. return NULL;
  21937. }
  21938. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  21939. {
  21940. if (ctx)
  21941. ctx->Ed448VerifyCb = cb;
  21942. }
  21943. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  21944. {
  21945. if (ssl)
  21946. ssl->Ed448VerifyCtx = ctx;
  21947. }
  21948. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  21949. {
  21950. if (ssl)
  21951. return ssl->Ed448VerifyCtx;
  21952. return NULL;
  21953. }
  21954. #endif /* HAVE_ED448 */
  21955. #ifdef HAVE_CURVE448
  21956. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  21957. CallbackX448KeyGen cb)
  21958. {
  21959. if (ctx)
  21960. ctx->X448KeyGenCb = cb;
  21961. }
  21962. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  21963. {
  21964. if (ssl)
  21965. ssl->X448KeyGenCtx = ctx;
  21966. }
  21967. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  21968. {
  21969. if (ssl)
  21970. return ssl->X448KeyGenCtx;
  21971. return NULL;
  21972. }
  21973. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  21974. CallbackX448SharedSecret cb)
  21975. {
  21976. if (ctx)
  21977. ctx->X448SharedSecretCb = cb;
  21978. }
  21979. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21980. {
  21981. if (ssl)
  21982. ssl->X448SharedSecretCtx = ctx;
  21983. }
  21984. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  21985. {
  21986. if (ssl)
  21987. return ssl->X448SharedSecretCtx;
  21988. return NULL;
  21989. }
  21990. #endif /* HAVE_CURVE448 */
  21991. #ifndef NO_RSA
  21992. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  21993. {
  21994. if (ctx)
  21995. ctx->RsaSignCb = cb;
  21996. }
  21997. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  21998. {
  21999. if (ctx)
  22000. ctx->RsaSignCheckCb = cb;
  22001. }
  22002. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  22003. {
  22004. if (ssl)
  22005. ssl->RsaSignCtx = ctx;
  22006. }
  22007. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  22008. {
  22009. if (ssl)
  22010. return ssl->RsaSignCtx;
  22011. return NULL;
  22012. }
  22013. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  22014. {
  22015. if (ctx)
  22016. ctx->RsaVerifyCb = cb;
  22017. }
  22018. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  22019. {
  22020. if (ssl)
  22021. ssl->RsaVerifyCtx = ctx;
  22022. }
  22023. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  22024. {
  22025. if (ssl)
  22026. return ssl->RsaVerifyCtx;
  22027. return NULL;
  22028. }
  22029. #ifdef WC_RSA_PSS
  22030. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  22031. {
  22032. if (ctx)
  22033. ctx->RsaPssSignCb = cb;
  22034. }
  22035. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  22036. {
  22037. if (ctx)
  22038. ctx->RsaPssSignCheckCb = cb;
  22039. }
  22040. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  22041. {
  22042. if (ssl)
  22043. ssl->RsaPssSignCtx = ctx;
  22044. }
  22045. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  22046. {
  22047. if (ssl)
  22048. return ssl->RsaPssSignCtx;
  22049. return NULL;
  22050. }
  22051. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  22052. {
  22053. if (ctx)
  22054. ctx->RsaPssVerifyCb = cb;
  22055. }
  22056. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  22057. {
  22058. if (ssl)
  22059. ssl->RsaPssVerifyCtx = ctx;
  22060. }
  22061. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  22062. {
  22063. if (ssl)
  22064. return ssl->RsaPssVerifyCtx;
  22065. return NULL;
  22066. }
  22067. #endif /* WC_RSA_PSS */
  22068. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  22069. {
  22070. if (ctx)
  22071. ctx->RsaEncCb = cb;
  22072. }
  22073. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  22074. {
  22075. if (ssl)
  22076. ssl->RsaEncCtx = ctx;
  22077. }
  22078. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  22079. {
  22080. if (ssl)
  22081. return ssl->RsaEncCtx;
  22082. return NULL;
  22083. }
  22084. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  22085. {
  22086. if (ctx)
  22087. ctx->RsaDecCb = cb;
  22088. }
  22089. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  22090. {
  22091. if (ssl)
  22092. ssl->RsaDecCtx = ctx;
  22093. }
  22094. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  22095. {
  22096. if (ssl)
  22097. return ssl->RsaDecCtx;
  22098. return NULL;
  22099. }
  22100. #endif /* NO_RSA */
  22101. /* callback for premaster secret generation */
  22102. void wolfSSL_CTX_SetGenPreMasterCb(WOLFSSL_CTX* ctx, CallbackGenPreMaster cb)
  22103. {
  22104. if (ctx)
  22105. ctx->GenPreMasterCb = cb;
  22106. }
  22107. /* Set premaster secret generation callback context */
  22108. void wolfSSL_SetGenPreMasterCtx(WOLFSSL* ssl, void *ctx)
  22109. {
  22110. if (ssl)
  22111. ssl->GenPreMasterCtx = ctx;
  22112. }
  22113. /* Get premaster secret generation callback context */
  22114. void* wolfSSL_GetGenPreMasterCtx(WOLFSSL* ssl)
  22115. {
  22116. if (ssl)
  22117. return ssl->GenPreMasterCtx;
  22118. return NULL;
  22119. }
  22120. /* callback for master secret generation */
  22121. void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb)
  22122. {
  22123. if (ctx)
  22124. ctx->GenMasterCb = cb;
  22125. }
  22126. /* Set master secret generation callback context */
  22127. void wolfSSL_SetGenMasterSecretCtx(WOLFSSL* ssl, void *ctx)
  22128. {
  22129. if (ssl)
  22130. ssl->GenMasterCtx = ctx;
  22131. }
  22132. /* Get master secret generation callback context */
  22133. void* wolfSSL_GetGenMasterSecretCtx(WOLFSSL* ssl)
  22134. {
  22135. if (ssl)
  22136. return ssl->GenMasterCtx;
  22137. return NULL;
  22138. }
  22139. /* callback for session key generation */
  22140. void wolfSSL_CTX_SetGenSessionKeyCb(WOLFSSL_CTX* ctx, CallbackGenSessionKey cb)
  22141. {
  22142. if (ctx)
  22143. ctx->GenSessionKeyCb = cb;
  22144. }
  22145. /* Set session key generation callback context */
  22146. void wolfSSL_SetGenSessionKeyCtx(WOLFSSL* ssl, void *ctx)
  22147. {
  22148. if (ssl)
  22149. ssl->GenSessionKeyCtx = ctx;
  22150. }
  22151. /* Get session key generation callback context */
  22152. void* wolfSSL_GetGenSessionKeyCtx(WOLFSSL* ssl)
  22153. {
  22154. if (ssl)
  22155. return ssl->GenSessionKeyCtx;
  22156. return NULL;
  22157. }
  22158. /* callback for setting encryption keys */
  22159. void wolfSSL_CTX_SetEncryptKeysCb(WOLFSSL_CTX* ctx, CallbackEncryptKeys cb)
  22160. {
  22161. if (ctx)
  22162. ctx->EncryptKeysCb = cb;
  22163. }
  22164. /* Set encryption keys callback context */
  22165. void wolfSSL_SetEncryptKeysCtx(WOLFSSL* ssl, void *ctx)
  22166. {
  22167. if (ssl)
  22168. ssl->EncryptKeysCtx = ctx;
  22169. }
  22170. /* Get encryption keys callback context */
  22171. void* wolfSSL_GetEncryptKeysCtx(WOLFSSL* ssl)
  22172. {
  22173. if (ssl)
  22174. return ssl->EncryptKeysCtx;
  22175. return NULL;
  22176. }
  22177. /* callback for Tls finished */
  22178. /* the callback can be used to build TLS Finished message if enabled */
  22179. void wolfSSL_CTX_SetTlsFinishedCb(WOLFSSL_CTX* ctx, CallbackTlsFinished cb)
  22180. {
  22181. if (ctx)
  22182. ctx->TlsFinishedCb = cb;
  22183. }
  22184. /* Set Tls finished callback context */
  22185. void wolfSSL_SetTlsFinishedCtx(WOLFSSL* ssl, void *ctx)
  22186. {
  22187. if (ssl)
  22188. ssl->TlsFinishedCtx = ctx;
  22189. }
  22190. /* Get Tls finished callback context */
  22191. void* wolfSSL_GetTlsFinishedCtx(WOLFSSL* ssl)
  22192. {
  22193. if (ssl)
  22194. return ssl->TlsFinishedCtx;
  22195. return NULL;
  22196. }
  22197. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  22198. /* callback for verify data */
  22199. void wolfSSL_CTX_SetVerifyMacCb(WOLFSSL_CTX* ctx, CallbackVerifyMac cb)
  22200. {
  22201. if (ctx)
  22202. ctx->VerifyMacCb = cb;
  22203. }
  22204. /* Set set keys callback context */
  22205. void wolfSSL_SetVerifyMacCtx(WOLFSSL* ssl, void *ctx)
  22206. {
  22207. if (ssl)
  22208. ssl->VerifyMacCtx = ctx;
  22209. }
  22210. /* Get set keys callback context */
  22211. void* wolfSSL_GetVerifyMacCtx(WOLFSSL* ssl)
  22212. {
  22213. if (ssl)
  22214. return ssl->VerifyMacCtx;
  22215. return NULL;
  22216. }
  22217. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  22218. void wolfSSL_CTX_SetHKDFExpandLabelCb(WOLFSSL_CTX* ctx,
  22219. CallbackHKDFExpandLabel cb)
  22220. {
  22221. if (ctx)
  22222. ctx->HKDFExpandLabelCb = cb;
  22223. }
  22224. #ifdef WOLFSSL_PUBLIC_ASN
  22225. void wolfSSL_CTX_SetProcessPeerCertCb(WOLFSSL_CTX* ctx,
  22226. CallbackProcessPeerCert cb)
  22227. {
  22228. if (ctx)
  22229. ctx->ProcessPeerCertCb = cb;
  22230. }
  22231. #endif /* WOLFSSL_PUBLIC_ASN */
  22232. void wolfSSL_CTX_SetProcessServerSigKexCb(WOLFSSL_CTX* ctx,
  22233. CallbackProcessServerSigKex cb)
  22234. {
  22235. if (ctx)
  22236. ctx->ProcessServerSigKexCb = cb;
  22237. }
  22238. void wolfSSL_CTX_SetPerformTlsRecordProcessingCb(WOLFSSL_CTX* ctx,
  22239. CallbackPerformTlsRecordProcessing cb)
  22240. {
  22241. if (ctx)
  22242. ctx->PerformTlsRecordProcessingCb = cb;
  22243. }
  22244. #endif /* HAVE_PK_CALLBACKS */
  22245. #endif /* NO_CERTS */
  22246. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  22247. void wolfSSL_CTX_SetDhGenerateKeyPair(WOLFSSL_CTX* ctx,
  22248. CallbackDhGenerateKeyPair cb) {
  22249. if (ctx)
  22250. ctx->DhGenerateKeyPairCb = cb;
  22251. }
  22252. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  22253. {
  22254. if (ctx)
  22255. ctx->DhAgreeCb = cb;
  22256. }
  22257. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  22258. {
  22259. if (ssl)
  22260. ssl->DhAgreeCtx = ctx;
  22261. }
  22262. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  22263. {
  22264. if (ssl)
  22265. return ssl->DhAgreeCtx;
  22266. return NULL;
  22267. }
  22268. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  22269. #if defined(HAVE_PK_CALLBACKS) && defined(HAVE_HKDF)
  22270. void wolfSSL_CTX_SetHKDFExtractCb(WOLFSSL_CTX* ctx, CallbackHKDFExtract cb)
  22271. {
  22272. if (ctx)
  22273. ctx->HkdfExtractCb = cb;
  22274. }
  22275. void wolfSSL_SetHKDFExtractCtx(WOLFSSL* ssl, void *ctx)
  22276. {
  22277. if (ssl)
  22278. ssl->HkdfExtractCtx = ctx;
  22279. }
  22280. void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
  22281. {
  22282. if (ssl)
  22283. return ssl->HkdfExtractCtx;
  22284. return NULL;
  22285. }
  22286. #endif /* HAVE_PK_CALLBACKS && HAVE_HKDF */
  22287. #ifdef WOLFSSL_HAVE_WOLFSCEP
  22288. /* Used by autoconf to see if wolfSCEP is available */
  22289. void wolfSSL_wolfSCEP(void) {}
  22290. #endif
  22291. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  22292. /* Used by autoconf to see if cert service is available */
  22293. void wolfSSL_cert_service(void) {}
  22294. #endif
  22295. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  22296. !defined(WOLFCRYPT_ONLY)
  22297. #ifndef NO_CERTS
  22298. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22299. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22300. #if !defined(NO_FILESYSTEM)
  22301. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp,
  22302. WOLFSSL_EVP_PKEY **key, wc_pem_password_cb *cb, void *pass)
  22303. {
  22304. WOLFSSL_EVP_PKEY* pkey = NULL;
  22305. DerBuffer* der = NULL;
  22306. int keyFormat = 0;
  22307. WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey");
  22308. if (pem_read_file_key(fp, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  22309. &der) >= 0) {
  22310. const unsigned char* ptr = der->buffer;
  22311. int type = -1;
  22312. if (keyFormat) {
  22313. /* keyFormat is Key_Sum enum */
  22314. if (keyFormat == RSAk)
  22315. type = EVP_PKEY_RSA;
  22316. else if (keyFormat == ECDSAk)
  22317. type = EVP_PKEY_EC;
  22318. else if (keyFormat == DSAk)
  22319. type = EVP_PKEY_DSA;
  22320. else if (keyFormat == DHk)
  22321. type = EVP_PKEY_DH;
  22322. }
  22323. else {
  22324. /* Default to RSA if format is not set */
  22325. type = EVP_PKEY_RSA;
  22326. }
  22327. /* handle case where reuse is attempted */
  22328. if (key != NULL && *key != NULL)
  22329. pkey = *key;
  22330. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  22331. if (pkey == NULL) {
  22332. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  22333. }
  22334. }
  22335. FreeDer(&der);
  22336. if (key != NULL && pkey != NULL)
  22337. *key = pkey;
  22338. WOLFSSL_LEAVE("wolfSSL_PEM_read_PrivateKey", 0);
  22339. return pkey;
  22340. }
  22341. #endif
  22342. #endif
  22343. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/
  22344. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22345. #define PEM_BEGIN "-----BEGIN "
  22346. #define PEM_BEGIN_SZ 11
  22347. #define PEM_END "-----END "
  22348. #define PEM_END_SZ 9
  22349. #define PEM_HDR_FIN "-----"
  22350. #define PEM_HDR_FIN_SZ 5
  22351. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  22352. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  22353. #define PEM_HDR_FIN_EOL_SZ 6
  22354. #ifndef NO_BIO
  22355. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  22356. unsigned char **data, long *len)
  22357. {
  22358. int ret = WOLFSSL_SUCCESS;
  22359. char pem[256];
  22360. int pemLen;
  22361. char* p;
  22362. char* nameStr = NULL;
  22363. int nameLen = 0;
  22364. char* headerStr = NULL;
  22365. int headerFound = 0;
  22366. unsigned char* der = NULL;
  22367. word32 derLen = 0;
  22368. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  22369. len == NULL) {
  22370. return WOLFSSL_FAILURE;
  22371. }
  22372. /* Find header line. */
  22373. pem[sizeof(pem) - 1] = '\0';
  22374. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  22375. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  22376. break;
  22377. }
  22378. if (pemLen <= 0)
  22379. ret = WOLFSSL_FAILURE;
  22380. /* Have a header line. */
  22381. if (ret == WOLFSSL_SUCCESS) {
  22382. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  22383. pemLen--;
  22384. pem[pemLen] = '\0';
  22385. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  22386. PEM_HDR_FIN_SZ) != 0) {
  22387. ret = WOLFSSL_FAILURE;
  22388. }
  22389. }
  22390. /* Get out name. */
  22391. if (ret == WOLFSSL_SUCCESS) {
  22392. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  22393. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  22394. DYNAMIC_TYPE_TMP_BUFFER);
  22395. if (nameStr == NULL)
  22396. ret = WOLFSSL_FAILURE;
  22397. }
  22398. if (ret == WOLFSSL_SUCCESS) {
  22399. int headerLen;
  22400. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  22401. nameStr[nameLen] = '\0';
  22402. /* Get header of PEM - encryption header. */
  22403. headerLen = 0;
  22404. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  22405. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  22406. pem[pemLen - 1] == '\n')) {
  22407. pemLen--;
  22408. }
  22409. pem[pemLen++] = '\n';
  22410. pem[pemLen] = '\0';
  22411. /* Header separator is a blank line. */
  22412. if (pem[0] == '\n') {
  22413. headerFound = 1;
  22414. break;
  22415. }
  22416. /* Didn't find a blank line - no header. */
  22417. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  22418. der = (unsigned char*)headerStr;
  22419. derLen = headerLen;
  22420. /* Empty header - empty string. */
  22421. headerStr = (char*)XMALLOC(1, NULL,
  22422. DYNAMIC_TYPE_TMP_BUFFER);
  22423. if (headerStr == NULL)
  22424. ret = WOLFSSL_FAILURE;
  22425. else
  22426. headerStr[0] = '\0';
  22427. break;
  22428. }
  22429. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  22430. DYNAMIC_TYPE_TMP_BUFFER);
  22431. if (p == NULL) {
  22432. ret = WOLFSSL_FAILURE;
  22433. break;
  22434. }
  22435. headerStr = p;
  22436. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  22437. headerLen += pemLen;
  22438. }
  22439. if (pemLen <= 0)
  22440. ret = WOLFSSL_FAILURE;
  22441. }
  22442. /* Get body of PEM - if there was a header */
  22443. if (ret == WOLFSSL_SUCCESS && headerFound) {
  22444. derLen = 0;
  22445. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  22446. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  22447. pem[pemLen - 1] == '\n')) {
  22448. pemLen--;
  22449. }
  22450. pem[pemLen++] = '\n';
  22451. pem[pemLen] = '\0';
  22452. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  22453. break;
  22454. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  22455. DYNAMIC_TYPE_TMP_BUFFER);
  22456. if (p == NULL) {
  22457. ret = WOLFSSL_FAILURE;
  22458. break;
  22459. }
  22460. der = (unsigned char*)p;
  22461. XMEMCPY(der + derLen, pem, pemLen + 1);
  22462. derLen += pemLen;
  22463. }
  22464. if (pemLen <= 0)
  22465. ret = WOLFSSL_FAILURE;
  22466. }
  22467. /* Check trailer. */
  22468. if (ret == WOLFSSL_SUCCESS) {
  22469. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  22470. ret = WOLFSSL_FAILURE;
  22471. }
  22472. if (ret == WOLFSSL_SUCCESS) {
  22473. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  22474. PEM_HDR_FIN_EOL_NEWLINE,
  22475. PEM_HDR_FIN_EOL_SZ) != 0 &&
  22476. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  22477. PEM_HDR_FIN_EOL_NULL_TERM,
  22478. PEM_HDR_FIN_EOL_SZ) != 0) {
  22479. ret = WOLFSSL_FAILURE;
  22480. }
  22481. }
  22482. /* Base64 decode body. */
  22483. if (ret == WOLFSSL_SUCCESS) {
  22484. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  22485. ret = WOLFSSL_FAILURE;
  22486. }
  22487. if (ret == WOLFSSL_SUCCESS) {
  22488. *name = nameStr;
  22489. *header = headerStr;
  22490. *data = der;
  22491. *len = derLen;
  22492. nameStr = NULL;
  22493. headerStr = NULL;
  22494. der = NULL;
  22495. }
  22496. if (nameStr != NULL)
  22497. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22498. if (headerStr != NULL)
  22499. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22500. if (der != NULL)
  22501. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22502. return ret;
  22503. }
  22504. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  22505. const char *header, const unsigned char *data,
  22506. long len)
  22507. {
  22508. int err = 0;
  22509. int outSz = 0;
  22510. int nameLen;
  22511. int headerLen;
  22512. byte* pem = NULL;
  22513. word32 pemLen;
  22514. word32 derLen = (word32)len;
  22515. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  22516. return 0;
  22517. nameLen = (int)XSTRLEN(name);
  22518. headerLen = (int)XSTRLEN(header);
  22519. pemLen = (derLen + 2) / 3 * 4;
  22520. pemLen += (pemLen + 63) / 64;
  22521. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22522. err = pem == NULL;
  22523. if (!err)
  22524. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  22525. if (!err) {
  22526. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  22527. (int)PEM_BEGIN_SZ;
  22528. }
  22529. if (!err)
  22530. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  22531. if (!err) {
  22532. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  22533. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  22534. }
  22535. if (!err && headerLen > 0) {
  22536. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  22537. /* Blank line after a header and before body. */
  22538. if (!err)
  22539. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  22540. headerLen++;
  22541. }
  22542. if (!err)
  22543. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  22544. if (!err)
  22545. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  22546. (int)PEM_END_SZ;
  22547. if (!err)
  22548. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  22549. if (!err) {
  22550. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  22551. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  22552. }
  22553. if (!err) {
  22554. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  22555. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  22556. }
  22557. if (pem != NULL)
  22558. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22559. return outSz;
  22560. }
  22561. #if !defined(NO_FILESYSTEM)
  22562. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  22563. unsigned char **data, long *len)
  22564. {
  22565. int ret;
  22566. WOLFSSL_BIO* bio;
  22567. if (name == NULL || header == NULL || data == NULL || len == NULL)
  22568. return WOLFSSL_FAILURE;
  22569. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  22570. if (bio == NULL)
  22571. return 0;
  22572. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  22573. if (bio != NULL)
  22574. wolfSSL_BIO_free(bio);
  22575. return ret;
  22576. }
  22577. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  22578. const unsigned char *data, long len)
  22579. {
  22580. int ret;
  22581. WOLFSSL_BIO* bio;
  22582. if (name == NULL || header == NULL || data == NULL)
  22583. return 0;
  22584. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  22585. if (bio == NULL)
  22586. return 0;
  22587. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  22588. if (bio != NULL)
  22589. wolfSSL_BIO_free(bio);
  22590. return ret;
  22591. }
  22592. #endif
  22593. #endif /* !NO_BIO */
  22594. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  22595. EncryptedInfo* cipher)
  22596. {
  22597. if (header == NULL || cipher == NULL)
  22598. return WOLFSSL_FAILURE;
  22599. XMEMSET(cipher, 0, sizeof(*cipher));
  22600. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  22601. return WOLFSSL_FAILURE;
  22602. return WOLFSSL_SUCCESS;
  22603. }
  22604. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  22605. long* len, wc_pem_password_cb* callback,
  22606. void* ctx)
  22607. {
  22608. int ret = WOLFSSL_SUCCESS;
  22609. char password[NAME_SZ];
  22610. int passwordSz;
  22611. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  22612. return WOLFSSL_FAILURE;
  22613. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  22614. if (passwordSz < 0)
  22615. ret = WOLFSSL_FAILURE;
  22616. if (ret == WOLFSSL_SUCCESS) {
  22617. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  22618. passwordSz, WC_MD5) != 0) {
  22619. ret = WOLFSSL_FAILURE;
  22620. }
  22621. }
  22622. if (passwordSz > 0)
  22623. XMEMSET(password, 0, passwordSz);
  22624. return ret;
  22625. }
  22626. #ifndef NO_BIO
  22627. /*
  22628. * bp : bio to read X509 from
  22629. * x : x509 to write to
  22630. * cb : password call back for reading PEM
  22631. * u : password
  22632. * _AUX is for working with a trusted X509 certificate
  22633. */
  22634. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  22635. WOLFSSL_X509 **x, wc_pem_password_cb *cb,
  22636. void *u)
  22637. {
  22638. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  22639. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  22640. * and potentially a stack of "other" info. wolfSSL does not store
  22641. * friendly name or private key id yet in WOLFSSL_X509 for human
  22642. * readability and does not support extra trusted/rejected uses for
  22643. * root CA. */
  22644. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  22645. }
  22646. #endif /* !NO_BIO */
  22647. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  22648. #endif /* !NO_CERTS */
  22649. /* NID variables are dependent on compatibility header files currently
  22650. *
  22651. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  22652. * on fail
  22653. */
  22654. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  22655. {
  22656. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  22657. }
  22658. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  22659. WOLFSSL_ASN1_OBJECT* arg_obj)
  22660. {
  22661. word32 oidSz = 0;
  22662. int nid = 0;
  22663. const byte* oid;
  22664. word32 type = 0;
  22665. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  22666. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  22667. word32 objSz = 0;
  22668. const char* sName = NULL;
  22669. int i;
  22670. #ifdef WOLFSSL_DEBUG_OPENSSL
  22671. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj");
  22672. #endif
  22673. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  22674. if (wolfssl_object_info[i].nid == id) {
  22675. nid = id;
  22676. id = wolfssl_object_info[i].id;
  22677. sName = wolfssl_object_info[i].sName;
  22678. type = wolfssl_object_info[i].type;
  22679. break;
  22680. }
  22681. }
  22682. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  22683. WOLFSSL_MSG("NID not in table");
  22684. #ifdef WOLFSSL_QT
  22685. sName = NULL;
  22686. type = id;
  22687. #else
  22688. return NULL;
  22689. #endif
  22690. }
  22691. #ifdef HAVE_ECC
  22692. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  22693. type = oidCurveType;
  22694. }
  22695. #endif /* HAVE_ECC */
  22696. if (sName != NULL) {
  22697. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  22698. WOLFSSL_MSG("Attempted short name is too large");
  22699. return NULL;
  22700. }
  22701. }
  22702. oid = OidFromId(id, type, &oidSz);
  22703. /* set object ID to buffer */
  22704. if (obj == NULL){
  22705. obj = wolfSSL_ASN1_OBJECT_new();
  22706. if (obj == NULL) {
  22707. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  22708. return NULL;
  22709. }
  22710. }
  22711. obj->nid = nid;
  22712. obj->type = id;
  22713. obj->grp = type;
  22714. obj->sName[0] = '\0';
  22715. if (sName != NULL) {
  22716. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  22717. }
  22718. objBuf[0] = ASN_OBJECT_ID; objSz++;
  22719. objSz += SetLength(oidSz, objBuf + 1);
  22720. if (oidSz) {
  22721. XMEMCPY(objBuf + objSz, oid, oidSz);
  22722. objSz += oidSz;
  22723. }
  22724. if (obj->objSz == 0 || objSz != obj->objSz) {
  22725. obj->objSz = objSz;
  22726. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  22727. (obj->obj == NULL)) {
  22728. if (obj->obj != NULL)
  22729. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  22730. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  22731. if (obj->obj == NULL) {
  22732. wolfSSL_ASN1_OBJECT_free(obj);
  22733. return NULL;
  22734. }
  22735. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  22736. }
  22737. else {
  22738. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  22739. }
  22740. }
  22741. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  22742. (void)type;
  22743. return obj;
  22744. }
  22745. static const char* oid_translate_num_to_str(const char* oid)
  22746. {
  22747. const struct oid_dict {
  22748. const char* num;
  22749. const char* desc;
  22750. } oid_dict[] = {
  22751. { "2.5.29.37.0", "Any Extended Key Usage" },
  22752. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  22753. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  22754. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  22755. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  22756. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  22757. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  22758. { NULL, NULL }
  22759. };
  22760. const struct oid_dict* idx;
  22761. for (idx = oid_dict; idx->num != NULL; idx++) {
  22762. if (!XSTRCMP(oid, idx->num)) {
  22763. return idx->desc;
  22764. }
  22765. }
  22766. return NULL;
  22767. }
  22768. static int wolfssl_obj2txt_numeric(char *buf, int bufLen,
  22769. const WOLFSSL_ASN1_OBJECT *a)
  22770. {
  22771. int bufSz;
  22772. int length;
  22773. word32 idx = 0;
  22774. byte tag;
  22775. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  22776. return WOLFSSL_FAILURE;
  22777. }
  22778. if (tag != ASN_OBJECT_ID) {
  22779. WOLFSSL_MSG("Bad ASN1 Object");
  22780. return WOLFSSL_FAILURE;
  22781. }
  22782. if (GetLength((const byte*)a->obj, &idx, &length,
  22783. a->objSz) < 0 || length < 0) {
  22784. return ASN_PARSE_E;
  22785. }
  22786. if (bufLen < MAX_OID_STRING_SZ) {
  22787. bufSz = bufLen - 1;
  22788. }
  22789. else {
  22790. bufSz = MAX_OID_STRING_SZ;
  22791. }
  22792. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  22793. (word32)length)) <= 0) {
  22794. WOLFSSL_MSG("Error decoding OID");
  22795. return WOLFSSL_FAILURE;
  22796. }
  22797. buf[bufSz] = '\0';
  22798. return bufSz;
  22799. }
  22800. /* If no_name is one then use numerical form, otherwise short name.
  22801. *
  22802. * Returns the buffer size on success, WOLFSSL_FAILURE on error
  22803. */
  22804. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, const WOLFSSL_ASN1_OBJECT *a,
  22805. int no_name)
  22806. {
  22807. int bufSz;
  22808. const char* desc;
  22809. const char* name;
  22810. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt");
  22811. if (buf == NULL || bufLen <= 1 || a == NULL) {
  22812. WOLFSSL_MSG("Bad input argument");
  22813. return WOLFSSL_FAILURE;
  22814. }
  22815. if (no_name == 1) {
  22816. return wolfssl_obj2txt_numeric(buf, bufLen, a);
  22817. }
  22818. /* return long name unless using x509small, then return short name */
  22819. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  22820. name = a->sName;
  22821. #else
  22822. name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  22823. #endif
  22824. if (name == NULL) {
  22825. WOLFSSL_MSG("Name not found");
  22826. bufSz = 0;
  22827. }
  22828. else if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  22829. bufSz = (int)XSTRLEN(name);
  22830. }
  22831. else {
  22832. bufSz = bufLen - 1;
  22833. }
  22834. if (bufSz) {
  22835. XMEMCPY(buf, name, bufSz);
  22836. }
  22837. else if (a->type == GEN_DNS || a->type == GEN_EMAIL ||
  22838. a->type == GEN_URI) {
  22839. bufSz = (int)XSTRLEN((const char*)a->obj);
  22840. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  22841. }
  22842. else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) {
  22843. if ((desc = oid_translate_num_to_str(buf))) {
  22844. bufSz = (int)XSTRLEN(desc);
  22845. bufSz = min(bufSz, bufLen - 1);
  22846. XMEMCPY(buf, desc, bufSz);
  22847. }
  22848. }
  22849. else {
  22850. bufSz = 0;
  22851. }
  22852. buf[bufSz] = '\0';
  22853. return bufSz;
  22854. }
  22855. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  22856. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  22857. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  22858. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  22859. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS_SMALL)
  22860. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  22861. * n : NID value of ASN1_OBJECT to search */
  22862. const char* wolfSSL_OBJ_nid2ln(int n)
  22863. {
  22864. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  22865. size_t i;
  22866. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  22867. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  22868. if (obj_info->nid == n) {
  22869. return obj_info->lName;
  22870. }
  22871. }
  22872. WOLFSSL_MSG("NID not found in table");
  22873. return NULL;
  22874. }
  22875. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  22876. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY, WOLFSSL_WPAS_SMALL */
  22877. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  22878. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  22879. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  22880. defined(WOLFSSL_HAPROXY)
  22881. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  22882. {
  22883. int ret;
  22884. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  22885. if (!ctx || !x || !x->derCert) {
  22886. WOLFSSL_MSG("Bad parameter");
  22887. return WOLFSSL_FAILURE;
  22888. }
  22889. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  22890. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  22891. ctx->heap);
  22892. if (ret != 0)
  22893. return WOLFSSL_FAILURE;
  22894. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  22895. x->derCert->length);
  22896. #ifdef KEEP_OUR_CERT
  22897. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  22898. wolfSSL_X509_free(ctx->ourCert);
  22899. }
  22900. #ifndef WOLFSSL_X509_STORE_CERTS
  22901. ctx->ourCert = x;
  22902. if (wolfSSL_X509_up_ref(x) != 1) {
  22903. return WOLFSSL_FAILURE;
  22904. }
  22905. #else
  22906. ctx->ourCert = wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer,
  22907. x->derCert->length, ctx->heap);
  22908. if(ctx->ourCert == NULL){
  22909. return WOLFSSL_FAILURE;
  22910. }
  22911. #endif
  22912. /* We own the cert because either we up its reference counter
  22913. * or we create our own copy of the cert object. */
  22914. ctx->ownOurCert = 1;
  22915. #endif
  22916. /* Update the available options with public keys. */
  22917. switch (x->pubKeyOID) {
  22918. #ifndef NO_RSA
  22919. #ifdef WC_RSA_PSS
  22920. case RSAPSSk:
  22921. #endif
  22922. case RSAk:
  22923. ctx->haveRSA = 1;
  22924. break;
  22925. #endif
  22926. #ifdef HAVE_ED25519
  22927. case ED25519k:
  22928. #endif
  22929. #ifdef HAVE_ED448
  22930. case ED448k:
  22931. #endif
  22932. case ECDSAk:
  22933. ctx->haveECC = 1;
  22934. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22935. ctx->pkCurveOID = x->pkCurveOID;
  22936. #endif
  22937. break;
  22938. }
  22939. return WOLFSSL_SUCCESS;
  22940. }
  22941. static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn,
  22942. byte* cert, word32 certSz, void* heap)
  22943. {
  22944. int ret;
  22945. DerBuffer* inChain = NULL;
  22946. DerBuffer* der = NULL;
  22947. word32 len = 0;
  22948. if (inOutDer == NULL)
  22949. return BAD_FUNC_ARG;
  22950. inChain = *inOutDer;
  22951. if (inChain != NULL)
  22952. len = inChain->length;
  22953. ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE,
  22954. heap);
  22955. if (ret != 0) {
  22956. WOLFSSL_MSG("AllocDer error");
  22957. return ret;
  22958. }
  22959. if (inChain != NULL)
  22960. XMEMCPY(der->buffer, inChain->buffer, len);
  22961. c32to24(certSz, der->buffer + len);
  22962. XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz);
  22963. if (weOwn)
  22964. FreeDer(inOutDer);
  22965. *inOutDer = der;
  22966. return WOLFSSL_SUCCESS;
  22967. }
  22968. /**
  22969. * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it
  22970. * on success
  22971. */
  22972. int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  22973. {
  22974. WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert");
  22975. if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) {
  22976. return WOLFSSL_FAILURE;
  22977. }
  22978. wolfSSL_X509_free(x509);
  22979. return WOLFSSL_SUCCESS;
  22980. }
  22981. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  22982. {
  22983. int ret;
  22984. WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert");
  22985. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  22986. return WOLFSSL_FAILURE;
  22987. }
  22988. if (ctx->certificate == NULL)
  22989. ret = (int)wolfSSL_CTX_use_certificate(ctx, x509);
  22990. else {
  22991. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  22992. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  22993. return WOLFSSL_FAILURE;
  22994. }
  22995. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  22996. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  22997. if (ret == WOLFSSL_SUCCESS) {
  22998. /* push to ctx->certChain */
  22999. ret = PushCertToDerBuffer(&ctx->certChain, 1,
  23000. x509->derCert->buffer, x509->derCert->length, ctx->heap);
  23001. }
  23002. /* Store cert to free it later */
  23003. if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) {
  23004. ctx->x509Chain = wolfSSL_sk_X509_new_null();
  23005. if (ctx->x509Chain == NULL) {
  23006. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  23007. ret = WOLFSSL_FAILURE;
  23008. }
  23009. }
  23010. if (ret == WOLFSSL_SUCCESS &&
  23011. wolfSSL_sk_X509_push(ctx->x509Chain, x509)
  23012. != WOLFSSL_SUCCESS) {
  23013. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  23014. ret = WOLFSSL_FAILURE;
  23015. }
  23016. if (ret != WOLFSSL_SUCCESS)
  23017. wolfSSL_X509_free(x509); /* Decrease ref counter */
  23018. }
  23019. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  23020. }
  23021. #ifdef KEEP_OUR_CERT
  23022. int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  23023. {
  23024. int ret;
  23025. WOLFSSL_ENTER("wolfSSL_add0_chain_cert");
  23026. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  23027. x509->derCert == NULL)
  23028. return WOLFSSL_FAILURE;
  23029. if (ssl->buffers.certificate == NULL) {
  23030. ret = wolfSSL_use_certificate(ssl, x509);
  23031. /* Store cert to free it later */
  23032. if (ret == WOLFSSL_SUCCESS) {
  23033. if (ssl->buffers.weOwnCert)
  23034. wolfSSL_X509_free(ssl->ourCert);
  23035. ssl->ourCert = x509;
  23036. ssl->buffers.weOwnCert = 1;
  23037. }
  23038. }
  23039. else {
  23040. ret = PushCertToDerBuffer(&ssl->buffers.certChain,
  23041. ssl->buffers.weOwnCertChain, x509->derCert->buffer,
  23042. x509->derCert->length, ssl->heap);
  23043. if (ret == WOLFSSL_SUCCESS) {
  23044. ssl->buffers.weOwnCertChain = 1;
  23045. /* Store cert to free it later */
  23046. if (ssl->ourCertChain == NULL) {
  23047. ssl->ourCertChain = wolfSSL_sk_X509_new_null();
  23048. if (ssl->ourCertChain == NULL) {
  23049. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  23050. return WOLFSSL_FAILURE;
  23051. }
  23052. }
  23053. if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509)
  23054. != WOLFSSL_SUCCESS) {
  23055. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  23056. return WOLFSSL_FAILURE;
  23057. }
  23058. }
  23059. }
  23060. return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  23061. }
  23062. int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  23063. {
  23064. int ret;
  23065. WOLFSSL_ENTER("wolfSSL_add1_chain_cert");
  23066. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  23067. x509->derCert == NULL)
  23068. return WOLFSSL_FAILURE;
  23069. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  23070. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  23071. return WOLFSSL_FAILURE;
  23072. }
  23073. ret = wolfSSL_add0_chain_cert(ssl, x509);
  23074. /* Decrease ref counter on error */
  23075. if (ret != WOLFSSL_SUCCESS)
  23076. wolfSSL_X509_free(x509);
  23077. return ret;
  23078. }
  23079. #endif
  23080. /* Return the corresponding short name for the nid <n>.
  23081. * or NULL if short name can't be found.
  23082. */
  23083. const char * wolfSSL_OBJ_nid2sn(int n) {
  23084. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  23085. size_t i;
  23086. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  23087. if (n == NID_md5) {
  23088. /* NID_surname == NID_md5 and NID_surname comes before NID_md5 in
  23089. * wolfssl_object_info. As a result, the loop below will incorrectly
  23090. * return "SN" instead of "MD5." NID_surname isn't the true OpenSSL
  23091. * NID, but other functions rely on this table and modifying it to
  23092. * conform with OpenSSL's NIDs isn't trivial. */
  23093. return "MD5";
  23094. }
  23095. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  23096. if (obj_info->nid == n) {
  23097. return obj_info->sName;
  23098. }
  23099. }
  23100. WOLFSSL_MSG_EX("SN not found (nid:%d)",n);
  23101. return NULL;
  23102. }
  23103. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23104. int wolfSSL_OBJ_sn2nid(const char *sn) {
  23105. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  23106. if (sn == NULL)
  23107. return NID_undef;
  23108. return wc_OBJ_sn2nid(sn);
  23109. }
  23110. #endif
  23111. size_t wolfSSL_OBJ_length(const WOLFSSL_ASN1_OBJECT* o)
  23112. {
  23113. size_t ret = 0;
  23114. int err = 0;
  23115. word32 idx = 0;
  23116. int len = 0;
  23117. WOLFSSL_ENTER("wolfSSL_OBJ_length");
  23118. if (o == NULL || o->obj == NULL) {
  23119. WOLFSSL_MSG("Bad argument.");
  23120. err = 1;
  23121. }
  23122. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  23123. WOLFSSL_MSG("Error parsing ASN.1 header.");
  23124. err = 1;
  23125. }
  23126. if (err == 0) {
  23127. ret = len;
  23128. }
  23129. WOLFSSL_LEAVE("wolfSSL_OBJ_length", (int)ret);
  23130. return ret;
  23131. }
  23132. const unsigned char* wolfSSL_OBJ_get0_data(const WOLFSSL_ASN1_OBJECT* o)
  23133. {
  23134. const unsigned char* ret = NULL;
  23135. int err = 0;
  23136. word32 idx = 0;
  23137. int len = 0;
  23138. WOLFSSL_ENTER("wolfSSL_OBJ_get0_data");
  23139. if (o == NULL || o->obj == NULL) {
  23140. WOLFSSL_MSG("Bad argument.");
  23141. err = 1;
  23142. }
  23143. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  23144. WOLFSSL_MSG("Error parsing ASN.1 header.");
  23145. err = 1;
  23146. }
  23147. if (err == 0) {
  23148. ret = o->obj + idx;
  23149. }
  23150. return ret;
  23151. }
  23152. /* Gets the NID value that corresponds with the ASN1 object.
  23153. *
  23154. * o ASN1 object to get NID of
  23155. *
  23156. * Return NID on success and a negative value on failure
  23157. */
  23158. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  23159. {
  23160. word32 oid = 0;
  23161. word32 idx = 0;
  23162. int ret;
  23163. #ifdef WOLFSSL_DEBUG_OPENSSL
  23164. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  23165. #endif
  23166. if (o == NULL) {
  23167. return -1;
  23168. }
  23169. #ifdef WOLFSSL_QT
  23170. if (o->grp == oidCertExtType) {
  23171. /* If nid is an unknown extension, return NID_undef */
  23172. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  23173. return NID_undef;
  23174. }
  23175. #endif
  23176. if (o->nid > 0)
  23177. return o->nid;
  23178. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  23179. if (ret == ASN_OBJECT_ID_E) {
  23180. /* Put ASN object tag in front and try again */
  23181. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  23182. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23183. if (!buf) {
  23184. WOLFSSL_MSG("malloc error");
  23185. return -1;
  23186. }
  23187. idx = SetObjectId(o->objSz, buf);
  23188. XMEMCPY(buf + idx, o->obj, o->objSz);
  23189. idx = 0;
  23190. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  23191. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23192. if (ret < 0) {
  23193. WOLFSSL_MSG("Issue getting OID of object");
  23194. return -1;
  23195. }
  23196. }
  23197. else {
  23198. WOLFSSL_MSG("Issue getting OID of object");
  23199. return -1;
  23200. }
  23201. }
  23202. return oid2nid(oid, o->grp);
  23203. }
  23204. /* Return the corresponding NID for the long name <ln>
  23205. * or NID_undef if NID can't be found.
  23206. */
  23207. int wolfSSL_OBJ_ln2nid(const char *ln)
  23208. {
  23209. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  23210. size_t lnlen;
  23211. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  23212. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  23213. /* Accept input like "/commonName=" */
  23214. if (ln[0] == '/') {
  23215. ln++;
  23216. lnlen--;
  23217. }
  23218. if (lnlen) {
  23219. size_t i;
  23220. if (ln[lnlen-1] == '=') {
  23221. lnlen--;
  23222. }
  23223. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  23224. if (lnlen == XSTRLEN(obj_info->lName) &&
  23225. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  23226. return obj_info->nid;
  23227. }
  23228. }
  23229. }
  23230. }
  23231. return NID_undef;
  23232. }
  23233. /* compares two objects, return 0 if equal */
  23234. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  23235. const WOLFSSL_ASN1_OBJECT* b)
  23236. {
  23237. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  23238. if (a && b && a->obj && b->obj) {
  23239. if (a->objSz == b->objSz) {
  23240. return XMEMCMP(a->obj, b->obj, a->objSz);
  23241. }
  23242. else if (a->type == EXT_KEY_USAGE_OID ||
  23243. b->type == EXT_KEY_USAGE_OID) {
  23244. /* Special case for EXT_KEY_USAGE_OID so that
  23245. * cmp will be treated as a substring search */
  23246. /* Used in libest to check for id-kp-cmcRA in
  23247. * EXT_KEY_USAGE extension */
  23248. unsigned int idx;
  23249. const byte* s; /* shorter */
  23250. unsigned int sLen;
  23251. const byte* l; /* longer */
  23252. unsigned int lLen;
  23253. if (a->objSz > b->objSz) {
  23254. s = b->obj; sLen = b->objSz;
  23255. l = a->obj; lLen = a->objSz;
  23256. }
  23257. else {
  23258. s = a->obj; sLen = a->objSz;
  23259. l = b->obj; lLen = b->objSz;
  23260. }
  23261. for (idx = 0; idx <= lLen - sLen; idx++) {
  23262. if (XMEMCMP(l + idx, s, sLen) == 0) {
  23263. /* Found substring */
  23264. return 0;
  23265. }
  23266. }
  23267. }
  23268. }
  23269. return WOLFSSL_FATAL_ERROR;
  23270. }
  23271. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  23272. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  23273. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  23274. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  23275. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  23276. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  23277. /* Gets the NID value that is related to the OID string passed in. Example
  23278. * string would be "2.5.29.14" for subject key ID.
  23279. *
  23280. * returns NID value on success and NID_undef on error
  23281. */
  23282. int wolfSSL_OBJ_txt2nid(const char* s)
  23283. {
  23284. unsigned int i;
  23285. #ifdef WOLFSSL_CERT_EXT
  23286. int ret;
  23287. unsigned int sum = 0;
  23288. unsigned int outSz = MAX_OID_SZ;
  23289. unsigned char out[MAX_OID_SZ];
  23290. #endif
  23291. WOLFSSL_ENTER("wolfSSL_OBJ_txt2nid");
  23292. if (s == NULL) {
  23293. return NID_undef;
  23294. }
  23295. #ifdef WOLFSSL_CERT_EXT
  23296. ret = EncodePolicyOID(out, &outSz, s, NULL);
  23297. if (ret == 0) {
  23298. /* sum OID */
  23299. for (i = 0; i < outSz; i++) {
  23300. sum += out[i];
  23301. }
  23302. }
  23303. #endif /* WOLFSSL_CERT_EXT */
  23304. /* get the group that the OID's sum is in
  23305. * @TODO possible conflict with multiples */
  23306. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  23307. int len;
  23308. #ifdef WOLFSSL_CERT_EXT
  23309. if (ret == 0) {
  23310. if (wolfssl_object_info[i].id == (int)sum) {
  23311. return wolfssl_object_info[i].nid;
  23312. }
  23313. }
  23314. #endif
  23315. /* try as a short name */
  23316. len = (int)XSTRLEN(s);
  23317. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  23318. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  23319. return wolfssl_object_info[i].nid;
  23320. }
  23321. /* try as a long name */
  23322. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  23323. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  23324. return wolfssl_object_info[i].nid;
  23325. }
  23326. }
  23327. return NID_undef;
  23328. }
  23329. #endif
  23330. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  23331. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  23332. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  23333. defined(WOLFSSL_HAPROXY)
  23334. /* Creates new ASN1_OBJECT from short name, long name, or text
  23335. * representation of oid. If no_name is 0, then short name, long name, and
  23336. * numerical value of oid are interpreted. If no_name is 1, then only the
  23337. * numerical value of the oid is interpreted.
  23338. *
  23339. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  23340. */
  23341. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  23342. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  23343. {
  23344. int i, ret;
  23345. int nid = NID_undef;
  23346. unsigned int outSz = MAX_OID_SZ;
  23347. unsigned char out[MAX_OID_SZ];
  23348. WOLFSSL_ASN1_OBJECT* obj;
  23349. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  23350. if (s == NULL)
  23351. return NULL;
  23352. /* If s is numerical value, try to sum oid */
  23353. ret = EncodePolicyOID(out, &outSz, s, NULL);
  23354. if (ret == 0 && outSz > 0) {
  23355. /* If numerical encode succeeded then just
  23356. * create object from that because sums are
  23357. * not unique and can cause confusion. */
  23358. obj = wolfSSL_ASN1_OBJECT_new();
  23359. if (obj == NULL) {
  23360. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  23361. return NULL;
  23362. }
  23363. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  23364. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  23365. DYNAMIC_TYPE_ASN1);
  23366. if (obj->obj == NULL) {
  23367. wolfSSL_ASN1_OBJECT_free(obj);
  23368. return NULL;
  23369. }
  23370. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  23371. i = SetObjectId(outSz, (byte*)obj->obj);
  23372. XMEMCPY((byte*)obj->obj + i, out, outSz);
  23373. obj->objSz = i + outSz;
  23374. return obj;
  23375. }
  23376. /* TODO: update short names in wolfssl_object_info and check OID sums
  23377. are correct */
  23378. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  23379. /* Short name, long name, and numerical value are interpreted */
  23380. if (no_name == 0 &&
  23381. ((XSTRCMP(s, wolfssl_object_info[i].sName) == 0) ||
  23382. (XSTRCMP(s, wolfssl_object_info[i].lName) == 0)))
  23383. {
  23384. nid = wolfssl_object_info[i].nid;
  23385. }
  23386. }
  23387. if (nid != NID_undef)
  23388. return wolfSSL_OBJ_nid2obj(nid);
  23389. return NULL;
  23390. }
  23391. #endif
  23392. /* compatibility function. Its intended use is to remove OID's from an
  23393. * internal table that have been added with OBJ_create. wolfSSL manages its
  23394. * own internal OID values and does not currently support OBJ_create. */
  23395. void wolfSSL_OBJ_cleanup(void)
  23396. {
  23397. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup");
  23398. }
  23399. #ifndef NO_WOLFSSL_STUB
  23400. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  23401. {
  23402. (void)oid;
  23403. (void)sn;
  23404. (void)ln;
  23405. WOLFSSL_STUB("wolfSSL_OBJ_create");
  23406. return WOLFSSL_FAILURE;
  23407. }
  23408. #endif
  23409. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  23410. {
  23411. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23412. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  23413. ssl->options.verifyDepth = (byte)depth;
  23414. #endif
  23415. }
  23416. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  23417. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  23418. #ifdef OPENSSL_EXTRA
  23419. /* wolfSSL uses negative values for error states. This function returns an
  23420. * unsigned type so the value returned is the absolute value of the error.
  23421. */
  23422. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  23423. {
  23424. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  23425. (void)line;
  23426. (void)file;
  23427. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  23428. {
  23429. int ret;
  23430. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  23431. WOLFSSL_MSG("Issue peeking at error node in queue");
  23432. return 0;
  23433. }
  23434. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) \
  23435. || defined(WOLFSSL_HAPROXY)
  23436. if (ret == -ASN_NO_PEM_HEADER)
  23437. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  23438. #endif
  23439. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  23440. if (ret == ASN1_R_HEADER_TOO_LONG) {
  23441. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  23442. }
  23443. #endif
  23444. return (unsigned long)ret;
  23445. }
  23446. #else
  23447. return (unsigned long)(0 - NOT_COMPILED_IN);
  23448. #endif
  23449. }
  23450. #ifndef NO_CERTS
  23451. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  23452. {
  23453. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  23454. if (ctx == NULL || pkey == NULL) {
  23455. return WOLFSSL_FAILURE;
  23456. }
  23457. switch (pkey->type) {
  23458. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
  23459. case EVP_PKEY_RSA:
  23460. WOLFSSL_MSG("populating RSA key");
  23461. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS)
  23462. return WOLFSSL_FAILURE;
  23463. break;
  23464. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  23465. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  23466. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  23467. case EVP_PKEY_DSA:
  23468. break;
  23469. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  23470. #ifdef HAVE_ECC
  23471. case EVP_PKEY_EC:
  23472. WOLFSSL_MSG("populating ECC key");
  23473. if (ECC_populate_EVP_PKEY(pkey, pkey->ecc)
  23474. != WOLFSSL_SUCCESS)
  23475. return WOLFSSL_FAILURE;
  23476. break;
  23477. #endif
  23478. default:
  23479. return WOLFSSL_FAILURE;
  23480. }
  23481. if (pkey->pkey.ptr != NULL) {
  23482. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  23483. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  23484. (const unsigned char*)pkey->pkey.ptr,
  23485. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  23486. }
  23487. WOLFSSL_MSG("wolfSSL private key not set");
  23488. return BAD_FUNC_ARG;
  23489. }
  23490. #endif /* !NO_CERTS */
  23491. #endif /* OPENSSL_EXTRA */
  23492. #if defined(HAVE_EX_DATA) && \
  23493. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  23494. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  23495. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  23496. defined(WOLFSSL_WPAS_SMALL)
  23497. CRYPTO_EX_cb_ctx* crypto_ex_cb_ctx_session = NULL;
  23498. static int crypto_ex_cb_new(CRYPTO_EX_cb_ctx** dst, long ctx_l, void* ctx_ptr,
  23499. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  23500. WOLFSSL_CRYPTO_EX_free* free_func)
  23501. {
  23502. CRYPTO_EX_cb_ctx* new_ctx = (CRYPTO_EX_cb_ctx*)XMALLOC(
  23503. sizeof(CRYPTO_EX_cb_ctx), NULL, DYNAMIC_TYPE_OPENSSL);
  23504. if (new_ctx == NULL)
  23505. return -1;
  23506. new_ctx->ctx_l = ctx_l;
  23507. new_ctx->ctx_ptr = ctx_ptr;
  23508. new_ctx->new_func = new_func;
  23509. new_ctx->free_func = free_func;
  23510. new_ctx->dup_func = dup_func;
  23511. new_ctx->next = NULL;
  23512. /* Push to end of list */
  23513. while (*dst != NULL)
  23514. dst = &(*dst)->next;
  23515. *dst = new_ctx;
  23516. return 0;
  23517. }
  23518. void crypto_ex_cb_free(CRYPTO_EX_cb_ctx* cb_ctx)
  23519. {
  23520. while (cb_ctx != NULL) {
  23521. CRYPTO_EX_cb_ctx* next = cb_ctx->next;
  23522. XFREE(cb_ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23523. cb_ctx = next;
  23524. }
  23525. }
  23526. void crypto_ex_cb_setup_new_data(void *new_obj, CRYPTO_EX_cb_ctx* cb_ctx,
  23527. WOLFSSL_CRYPTO_EX_DATA* ex_data)
  23528. {
  23529. int idx = 0;
  23530. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23531. if (cb_ctx->new_func != NULL)
  23532. cb_ctx->new_func(new_obj, NULL, ex_data, idx, cb_ctx->ctx_l,
  23533. cb_ctx->ctx_ptr);
  23534. }
  23535. }
  23536. int crypto_ex_cb_dup_data(const WOLFSSL_CRYPTO_EX_DATA *in,
  23537. WOLFSSL_CRYPTO_EX_DATA *out, CRYPTO_EX_cb_ctx* cb_ctx)
  23538. {
  23539. int idx = 0;
  23540. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23541. if (cb_ctx->dup_func != NULL) {
  23542. void* ptr = wolfSSL_CRYPTO_get_ex_data(in, idx);
  23543. if (!cb_ctx->dup_func(out, in,
  23544. &ptr, idx,
  23545. cb_ctx->ctx_l, cb_ctx->ctx_ptr)) {
  23546. return WOLFSSL_FAILURE;
  23547. }
  23548. wolfSSL_CRYPTO_set_ex_data(out, idx, ptr);
  23549. }
  23550. }
  23551. return WOLFSSL_SUCCESS;
  23552. }
  23553. void crypto_ex_cb_free_data(void *obj, CRYPTO_EX_cb_ctx* cb_ctx,
  23554. WOLFSSL_CRYPTO_EX_DATA* ex_data)
  23555. {
  23556. int idx = 0;
  23557. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23558. if (cb_ctx->free_func != NULL)
  23559. cb_ctx->free_func(obj, NULL, ex_data, idx, cb_ctx->ctx_l,
  23560. cb_ctx->ctx_ptr);
  23561. }
  23562. }
  23563. /**
  23564. * get_ex_new_index is a helper function for the following
  23565. * xx_get_ex_new_index functions:
  23566. * - wolfSSL_CRYPTO_get_ex_new_index
  23567. * - wolfSSL_CTX_get_ex_new_index
  23568. * - wolfSSL_get_ex_new_index
  23569. * Issues a unique index number for the specified class-index.
  23570. * Returns an index number greater or equal to zero on success,
  23571. * -1 on failure.
  23572. */
  23573. int wolfssl_get_ex_new_index(int class_index, long ctx_l, void* ctx_ptr,
  23574. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  23575. WOLFSSL_CRYPTO_EX_free* free_func)
  23576. {
  23577. /* index counter for each class index*/
  23578. static int ctx_idx = 0;
  23579. static int ssl_idx = 0;
  23580. static int ssl_session_idx = 0;
  23581. static int x509_idx = 0;
  23582. int idx = -1;
  23583. switch(class_index) {
  23584. case WOLF_CRYPTO_EX_INDEX_SSL:
  23585. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23586. dup_func, free_func);
  23587. idx = ssl_idx++;
  23588. break;
  23589. case WOLF_CRYPTO_EX_INDEX_SSL_CTX:
  23590. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23591. dup_func, free_func);
  23592. idx = ctx_idx++;
  23593. break;
  23594. case WOLF_CRYPTO_EX_INDEX_X509:
  23595. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23596. dup_func, free_func);
  23597. idx = x509_idx++;
  23598. break;
  23599. case WOLF_CRYPTO_EX_INDEX_SSL_SESSION:
  23600. if (crypto_ex_cb_new(&crypto_ex_cb_ctx_session, ctx_l, ctx_ptr,
  23601. new_func, dup_func, free_func) != 0)
  23602. return -1;
  23603. idx = ssl_session_idx++;
  23604. break;
  23605. /* following class indexes are not supoprted */
  23606. case WOLF_CRYPTO_EX_INDEX_X509_STORE:
  23607. case WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX:
  23608. case WOLF_CRYPTO_EX_INDEX_DH:
  23609. case WOLF_CRYPTO_EX_INDEX_DSA:
  23610. case WOLF_CRYPTO_EX_INDEX_EC_KEY:
  23611. case WOLF_CRYPTO_EX_INDEX_RSA:
  23612. case WOLF_CRYPTO_EX_INDEX_ENGINE:
  23613. case WOLF_CRYPTO_EX_INDEX_UI:
  23614. case WOLF_CRYPTO_EX_INDEX_BIO:
  23615. case WOLF_CRYPTO_EX_INDEX_APP:
  23616. case WOLF_CRYPTO_EX_INDEX_UI_METHOD:
  23617. case WOLF_CRYPTO_EX_INDEX_DRBG:
  23618. default:
  23619. break;
  23620. }
  23621. if (idx >= MAX_EX_DATA)
  23622. return -1;
  23623. return idx;
  23624. }
  23625. #endif /* HAVE_EX_DATA || WOLFSSL_WPAS_SMALL */
  23626. #if defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL)
  23627. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  23628. {
  23629. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  23630. #ifdef HAVE_EX_DATA
  23631. if(ctx != NULL) {
  23632. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  23633. }
  23634. #else
  23635. (void)ctx;
  23636. (void)idx;
  23637. #endif
  23638. return NULL;
  23639. }
  23640. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg,
  23641. WOLFSSL_CRYPTO_EX_new* new_func,
  23642. WOLFSSL_CRYPTO_EX_dup* dup_func,
  23643. WOLFSSL_CRYPTO_EX_free* free_func)
  23644. {
  23645. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  23646. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX, idx, arg,
  23647. new_func, dup_func, free_func);
  23648. }
  23649. /* Return the index that can be used for the WOLFSSL structure to store
  23650. * application data.
  23651. *
  23652. */
  23653. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  23654. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  23655. WOLFSSL_CRYPTO_EX_free* cb3)
  23656. {
  23657. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  23658. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL, argValue, arg,
  23659. cb1, cb2, cb3);
  23660. }
  23661. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  23662. {
  23663. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  23664. #ifdef HAVE_EX_DATA
  23665. if (ctx != NULL)
  23666. {
  23667. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  23668. }
  23669. #else
  23670. (void)ctx;
  23671. (void)idx;
  23672. (void)data;
  23673. #endif
  23674. return WOLFSSL_FAILURE;
  23675. }
  23676. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  23677. int wolfSSL_CTX_set_ex_data_with_cleanup(
  23678. WOLFSSL_CTX* ctx,
  23679. int idx,
  23680. void* data,
  23681. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  23682. {
  23683. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data_with_cleanup");
  23684. if (ctx != NULL)
  23685. {
  23686. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  23687. cleanup_routine);
  23688. }
  23689. return WOLFSSL_FAILURE;
  23690. }
  23691. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  23692. #endif /* defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL) */
  23693. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23694. /* Returns char* to app data stored in ex[0].
  23695. *
  23696. * ssl WOLFSSL structure to get app data from
  23697. */
  23698. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  23699. {
  23700. /* checkout exdata stuff... */
  23701. WOLFSSL_ENTER("wolfSSL_get_app_data");
  23702. return wolfSSL_get_ex_data(ssl, 0);
  23703. }
  23704. /* Set ex array 0 to have app data
  23705. *
  23706. * ssl WOLFSSL struct to set app data in
  23707. * arg data to be stored
  23708. *
  23709. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  23710. */
  23711. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  23712. WOLFSSL_ENTER("wolfSSL_set_app_data");
  23713. return wolfSSL_set_ex_data(ssl, 0, arg);
  23714. }
  23715. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  23716. #if defined(HAVE_EX_DATA) || defined(OPENSSL_EXTRA) || \
  23717. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  23718. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  23719. {
  23720. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  23721. #ifdef HAVE_EX_DATA
  23722. if (ssl != NULL)
  23723. {
  23724. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  23725. }
  23726. #else
  23727. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  23728. (void)ssl;
  23729. (void)idx;
  23730. (void)data;
  23731. #endif
  23732. return WOLFSSL_FAILURE;
  23733. }
  23734. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  23735. int wolfSSL_set_ex_data_with_cleanup(
  23736. WOLFSSL* ssl,
  23737. int idx,
  23738. void* data,
  23739. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  23740. {
  23741. WOLFSSL_ENTER("wolfSSL_set_ex_data_with_cleanup");
  23742. if (ssl != NULL)
  23743. {
  23744. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ssl->ex_data, idx, data,
  23745. cleanup_routine);
  23746. }
  23747. return WOLFSSL_FAILURE;
  23748. }
  23749. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  23750. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  23751. {
  23752. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  23753. #ifdef HAVE_EX_DATA
  23754. if (ssl != NULL) {
  23755. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  23756. }
  23757. #else
  23758. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  23759. (void)ssl;
  23760. (void)idx;
  23761. #endif
  23762. return 0;
  23763. }
  23764. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  23765. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  23766. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  23767. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  23768. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  23769. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  23770. {
  23771. int pSz, gSz;
  23772. byte *p, *g;
  23773. int ret=0;
  23774. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  23775. if(!ctx || !dh)
  23776. return BAD_FUNC_ARG;
  23777. /* Get needed size for p and g */
  23778. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  23779. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  23780. if(pSz <= 0 || gSz <= 0)
  23781. return WOLFSSL_FATAL_ERROR;
  23782. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23783. if(!p)
  23784. return MEMORY_E;
  23785. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23786. if(!g) {
  23787. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23788. return MEMORY_E;
  23789. }
  23790. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  23791. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  23792. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  23793. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  23794. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23795. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23796. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  23797. }
  23798. #endif /* OPENSSL_EXTRA && !NO_DH */
  23799. /* returns the enum value associated with handshake state
  23800. *
  23801. * ssl the WOLFSSL structure to get state of
  23802. */
  23803. int wolfSSL_get_state(const WOLFSSL* ssl)
  23804. {
  23805. WOLFSSL_ENTER("wolfSSL_get_state");
  23806. if (ssl == NULL) {
  23807. WOLFSSL_MSG("Null argument passed in");
  23808. return WOLFSSL_FAILURE;
  23809. }
  23810. return ssl->options.handShakeState;
  23811. }
  23812. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  23813. #ifdef OPENSSL_EXTRA
  23814. void wolfSSL_certs_clear(WOLFSSL* ssl)
  23815. {
  23816. WOLFSSL_ENTER("wolfSSL_certs_clear");
  23817. if (ssl == NULL)
  23818. return;
  23819. /* ctx still owns certificate, certChain, key, dh, and cm */
  23820. if (ssl->buffers.weOwnCert)
  23821. FreeDer(&ssl->buffers.certificate);
  23822. ssl->buffers.certificate = NULL;
  23823. if (ssl->buffers.weOwnCertChain)
  23824. FreeDer(&ssl->buffers.certChain);
  23825. ssl->buffers.certChain = NULL;
  23826. #ifdef WOLFSSL_TLS13
  23827. ssl->buffers.certChainCnt = 0;
  23828. #endif
  23829. if (ssl->buffers.weOwnKey)
  23830. FreeDer(&ssl->buffers.key);
  23831. ssl->buffers.key = NULL;
  23832. ssl->buffers.keyType = 0;
  23833. ssl->buffers.keyId = 0;
  23834. ssl->buffers.keyLabel = 0;
  23835. ssl->buffers.keySz = 0;
  23836. ssl->buffers.keyDevId = 0;
  23837. #ifdef WOLFSSL_DUAL_ALG_CERTS
  23838. if (ssl->buffers.weOwnAltKey)
  23839. FreeDer(&ssl->buffers.altKey);
  23840. ssl->buffers.altKey = NULL;
  23841. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  23842. }
  23843. #endif
  23844. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  23845. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  23846. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  23847. {
  23848. WOLFSSL_ENTER("wolfSSL_ctrl");
  23849. if (ssl == NULL)
  23850. return BAD_FUNC_ARG;
  23851. switch (cmd) {
  23852. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  23853. #ifdef HAVE_SNI
  23854. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  23855. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  23856. if (pt == NULL) {
  23857. WOLFSSL_MSG("Passed in NULL Host Name.");
  23858. break;
  23859. }
  23860. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  23861. #endif /* HAVE_SNI */
  23862. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  23863. default:
  23864. WOLFSSL_MSG("Case not implemented.");
  23865. }
  23866. (void)opt;
  23867. (void)pt;
  23868. return WOLFSSL_FAILURE;
  23869. }
  23870. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  23871. {
  23872. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  23873. long ctrl_opt;
  23874. #endif
  23875. long ret = WOLFSSL_SUCCESS;
  23876. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  23877. if (ctx == NULL)
  23878. return WOLFSSL_FAILURE;
  23879. switch (cmd) {
  23880. case SSL_CTRL_CHAIN:
  23881. #ifdef SESSION_CERTS
  23882. {
  23883. /*
  23884. * We don't care about opt here because a copy of the certificate is
  23885. * stored anyway so increasing the reference counter is not necessary.
  23886. * Just check to make sure that it is set to one of the correct values.
  23887. */
  23888. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  23889. WOLFSSL_X509* x509;
  23890. int i;
  23891. if (opt != 0 && opt != 1) {
  23892. ret = WOLFSSL_FAILURE;
  23893. break;
  23894. }
  23895. /* Clear certificate chain */
  23896. FreeDer(&ctx->certChain);
  23897. if (sk) {
  23898. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  23899. x509 = wolfSSL_sk_X509_value(sk, i);
  23900. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  23901. if (wolfSSL_X509_up_ref(x509) != 1) {
  23902. WOLFSSL_MSG("Error increasing reference count");
  23903. continue;
  23904. }
  23905. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  23906. WOLFSSL_SUCCESS) {
  23907. WOLFSSL_MSG("Error adding certificate to context");
  23908. /* Decrease reference count on failure */
  23909. wolfSSL_X509_free(x509);
  23910. }
  23911. }
  23912. }
  23913. /* Free previous chain */
  23914. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  23915. ctx->x509Chain = sk;
  23916. if (sk && opt == 1) {
  23917. /* up all refs when opt == 1 */
  23918. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  23919. x509 = wolfSSL_sk_X509_value(sk, i);
  23920. if (wolfSSL_X509_up_ref(x509) != 1) {
  23921. WOLFSSL_MSG("Error increasing reference count");
  23922. continue;
  23923. }
  23924. }
  23925. }
  23926. }
  23927. #else
  23928. WOLFSSL_MSG("Session certificates not compiled in");
  23929. ret = WOLFSSL_FAILURE;
  23930. #endif
  23931. break;
  23932. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  23933. case SSL_CTRL_OPTIONS:
  23934. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  23935. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  23936. #ifdef WOLFSSL_QT
  23937. /* Set whether to use client or server cipher preference */
  23938. if ((ctrl_opt & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE)
  23939. == WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  23940. WOLFSSL_MSG("Using Server's Cipher Preference.");
  23941. ctx->useClientOrder = FALSE;
  23942. } else {
  23943. WOLFSSL_MSG("Using Client's Cipher Preference.");
  23944. ctx->useClientOrder = TRUE;
  23945. }
  23946. #endif /* WOLFSSL_QT */
  23947. return ctrl_opt;
  23948. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  23949. case SSL_CTRL_EXTRA_CHAIN_CERT:
  23950. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  23951. if (pt == NULL) {
  23952. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  23953. ret = WOLFSSL_FAILURE;
  23954. break;
  23955. }
  23956. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  23957. #ifndef NO_DH
  23958. case SSL_CTRL_SET_TMP_DH:
  23959. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  23960. if (pt == NULL) {
  23961. WOLFSSL_MSG("Passed in DH pointer NULL.");
  23962. ret = WOLFSSL_FAILURE;
  23963. break;
  23964. }
  23965. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  23966. #endif
  23967. #ifdef HAVE_ECC
  23968. case SSL_CTRL_SET_TMP_ECDH:
  23969. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  23970. if (pt == NULL) {
  23971. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  23972. ret = WOLFSSL_FAILURE;
  23973. break;
  23974. }
  23975. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  23976. #endif
  23977. case SSL_CTRL_MODE:
  23978. wolfSSL_CTX_set_mode(ctx,opt);
  23979. break;
  23980. case SSL_CTRL_SET_MIN_PROTO_VERSION:
  23981. WOLFSSL_MSG("set min proto version");
  23982. return wolfSSL_CTX_set_min_proto_version(ctx, (int)opt);
  23983. case SSL_CTRL_SET_MAX_PROTO_VERSION:
  23984. WOLFSSL_MSG("set max proto version");
  23985. return wolfSSL_CTX_set_max_proto_version(ctx, (int)opt);
  23986. case SSL_CTRL_GET_MIN_PROTO_VERSION:
  23987. WOLFSSL_MSG("get min proto version");
  23988. return wolfSSL_CTX_get_min_proto_version(ctx);
  23989. case SSL_CTRL_GET_MAX_PROTO_VERSION:
  23990. WOLFSSL_MSG("get max proto version");
  23991. return wolfSSL_CTX_get_max_proto_version(ctx);
  23992. default:
  23993. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  23994. ret = WOLFSSL_FAILURE;
  23995. break;
  23996. }
  23997. (void)ctx;
  23998. (void)cmd;
  23999. (void)opt;
  24000. (void)pt;
  24001. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  24002. return ret;
  24003. }
  24004. #ifndef WOLFSSL_NO_STUB
  24005. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  24006. {
  24007. (void) ctx;
  24008. (void) cmd;
  24009. (void) fp;
  24010. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  24011. return WOLFSSL_FAILURE;
  24012. }
  24013. #endif /* WOLFSSL_NO_STUB */
  24014. #ifndef NO_WOLFSSL_STUB
  24015. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  24016. {
  24017. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0L, NULL);
  24018. }
  24019. #endif
  24020. /* Returns the verifyCallback from the ssl structure if successful.
  24021. Returns NULL otherwise. */
  24022. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  24023. {
  24024. WOLFSSL_ENTER("wolfSSL_get_verify_callback");
  24025. if (ssl) {
  24026. return ssl->verifyCallback;
  24027. }
  24028. return NULL;
  24029. }
  24030. /* Adds the ASN1 certificate to the user ctx.
  24031. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  24032. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  24033. const unsigned char *der)
  24034. {
  24035. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1");
  24036. if (der != NULL && ctx != NULL) {
  24037. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  24038. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  24039. return WOLFSSL_SUCCESS;
  24040. }
  24041. }
  24042. return WOLFSSL_FAILURE;
  24043. }
  24044. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
  24045. /* Adds the rsa private key to the user ctx.
  24046. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  24047. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  24048. {
  24049. int ret;
  24050. int derSize;
  24051. unsigned char *maxDerBuf;
  24052. unsigned char* key = NULL;
  24053. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey");
  24054. if (ctx == NULL || rsa == NULL) {
  24055. WOLFSSL_MSG("one or more inputs were NULL");
  24056. return BAD_FUNC_ARG;
  24057. }
  24058. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24059. if (maxDerBuf == NULL) {
  24060. WOLFSSL_MSG("Malloc failure");
  24061. return MEMORY_E;
  24062. }
  24063. key = maxDerBuf;
  24064. /* convert RSA struct to der encoded buffer and get the size */
  24065. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  24066. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  24067. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24068. return WOLFSSL_FAILURE;
  24069. }
  24070. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  24071. derSize, SSL_FILETYPE_ASN1);
  24072. if (ret != WOLFSSL_SUCCESS) {
  24073. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  24074. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24075. return WOLFSSL_FAILURE;
  24076. }
  24077. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24078. return ret;
  24079. }
  24080. #endif /* WOLFSSL_KEY_GEN && !NO_RSA */
  24081. #ifndef NO_BIO
  24082. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  24083. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  24084. is a failure.*/
  24085. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  24086. WOLFSSL_EVP_PKEY** out)
  24087. {
  24088. unsigned char* mem = NULL;
  24089. int memSz = 0;
  24090. WOLFSSL_EVP_PKEY* key = NULL;
  24091. unsigned char* extraBioMem = NULL;
  24092. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio");
  24093. if (bio == NULL) {
  24094. return NULL;
  24095. }
  24096. (void)out;
  24097. memSz = wolfSSL_BIO_get_len(bio);
  24098. if (memSz <= 0) {
  24099. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  24100. return NULL;
  24101. }
  24102. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24103. if (mem == NULL) {
  24104. WOLFSSL_MSG("Malloc failure");
  24105. return NULL;
  24106. }
  24107. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  24108. int extraBioMemSz;
  24109. int derLength;
  24110. /* Determines key type and returns the new private EVP_PKEY object */
  24111. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  24112. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  24113. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24114. return NULL;
  24115. }
  24116. /* Write extra data back into bio object if necessary. */
  24117. derLength = key->pkey_sz;
  24118. extraBioMemSz = (memSz - derLength);
  24119. if (extraBioMemSz > 0) {
  24120. int i;
  24121. int j = 0;
  24122. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  24123. DYNAMIC_TYPE_TMP_BUFFER);
  24124. if (extraBioMem == NULL) {
  24125. WOLFSSL_MSG("Malloc failure");
  24126. XFREE((unsigned char*)extraBioMem, bio->heap,
  24127. DYNAMIC_TYPE_TMP_BUFFER);
  24128. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24129. return NULL;
  24130. }
  24131. for (i = derLength; i < memSz; i++) {
  24132. *(extraBioMem + j) = *(mem + i);
  24133. j++;
  24134. }
  24135. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  24136. if (wolfSSL_BIO_get_len(bio) <= 0) {
  24137. WOLFSSL_MSG("Failed to write memory to bio");
  24138. XFREE((unsigned char*)extraBioMem, bio->heap,
  24139. DYNAMIC_TYPE_TMP_BUFFER);
  24140. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24141. return NULL;
  24142. }
  24143. XFREE((unsigned char*)extraBioMem, bio->heap,
  24144. DYNAMIC_TYPE_TMP_BUFFER);
  24145. }
  24146. if (out != NULL) {
  24147. *out = key;
  24148. }
  24149. }
  24150. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24151. return key;
  24152. }
  24153. #endif /* !NO_BIO */
  24154. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  24155. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \
  24156. defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL)
  24157. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  24158. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  24159. * on fail */
  24160. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  24161. unsigned char** in, long inSz)
  24162. {
  24163. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP");
  24164. return d2iGenericKey(out, (const unsigned char**)in, inSz, 1);
  24165. }
  24166. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/
  24167. /* stunnel compatibility functions*/
  24168. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  24169. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  24170. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  24171. void wolfSSL_ERR_remove_thread_state(void* pid)
  24172. {
  24173. (void) pid;
  24174. return;
  24175. }
  24176. #ifndef NO_FILESYSTEM
  24177. /***TBD ***/
  24178. void wolfSSL_print_all_errors_fp(XFILE fp)
  24179. {
  24180. (void)fp;
  24181. }
  24182. #endif /* !NO_FILESYSTEM */
  24183. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  24184. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  24185. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  24186. defined(HAVE_EX_DATA)
  24187. #if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
  24188. static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx,
  24189. void* data, byte get, void** getRet, int* setRet)
  24190. {
  24191. int row;
  24192. int i;
  24193. int error = 0;
  24194. SessionRow* sessRow = NULL;
  24195. const byte* id;
  24196. byte foundCache = 0;
  24197. if (getRet != NULL)
  24198. *getRet = NULL;
  24199. if (setRet != NULL)
  24200. *setRet = WOLFSSL_FAILURE;
  24201. id = session->sessionID;
  24202. if (session->haveAltSessionID)
  24203. id = session->altSessionID;
  24204. row = (int)(HashObject(id, ID_LEN, &error) % SESSION_ROWS);
  24205. if (error != 0) {
  24206. WOLFSSL_MSG("Hash session failed");
  24207. return;
  24208. }
  24209. sessRow = &SessionCache[row];
  24210. if (get)
  24211. error = SESSION_ROW_RD_LOCK(sessRow);
  24212. else
  24213. error = SESSION_ROW_WR_LOCK(sessRow);
  24214. if (error != 0) {
  24215. WOLFSSL_MSG("Session row lock failed");
  24216. return;
  24217. }
  24218. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  24219. WOLFSSL_SESSION* cacheSession;
  24220. #ifdef SESSION_CACHE_DYNAMIC_MEM
  24221. cacheSession = sessRow->Sessions[i];
  24222. #else
  24223. cacheSession = &sessRow->Sessions[i];
  24224. #endif
  24225. if (cacheSession &&
  24226. XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0
  24227. && session->side == cacheSession->side
  24228. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  24229. && (IsAtLeastTLSv1_3(session->version) ==
  24230. IsAtLeastTLSv1_3(cacheSession->version))
  24231. #endif
  24232. ) {
  24233. if (get) {
  24234. if (getRet) {
  24235. *getRet = wolfSSL_CRYPTO_get_ex_data(
  24236. &cacheSession->ex_data, idx);
  24237. }
  24238. }
  24239. else {
  24240. if (setRet) {
  24241. *setRet = wolfSSL_CRYPTO_set_ex_data(
  24242. &cacheSession->ex_data, idx, data);
  24243. }
  24244. }
  24245. foundCache = 1;
  24246. break;
  24247. }
  24248. }
  24249. SESSION_ROW_UNLOCK(sessRow);
  24250. /* If we don't have a session in cache then clear the ex_data and
  24251. * own it */
  24252. if (!foundCache) {
  24253. XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA));
  24254. session->ownExData = 1;
  24255. if (!get) {
  24256. *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx,
  24257. data);
  24258. }
  24259. }
  24260. }
  24261. #endif
  24262. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  24263. {
  24264. int ret = WOLFSSL_FAILURE;
  24265. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  24266. #ifdef HAVE_EX_DATA
  24267. session = ClientSessionToSession(session);
  24268. if (session != NULL) {
  24269. #ifndef NO_SESSION_CACHE
  24270. if (!session->ownExData) {
  24271. /* Need to update in cache */
  24272. SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret);
  24273. }
  24274. else
  24275. #endif
  24276. {
  24277. ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  24278. }
  24279. }
  24280. #else
  24281. (void)session;
  24282. (void)idx;
  24283. (void)data;
  24284. #endif
  24285. return ret;
  24286. }
  24287. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  24288. int wolfSSL_SESSION_set_ex_data_with_cleanup(
  24289. WOLFSSL_SESSION* session,
  24290. int idx,
  24291. void* data,
  24292. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  24293. {
  24294. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup");
  24295. session = ClientSessionToSession(session);
  24296. if(session != NULL) {
  24297. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx,
  24298. data, cleanup_routine);
  24299. }
  24300. return WOLFSSL_FAILURE;
  24301. }
  24302. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  24303. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  24304. {
  24305. void* ret = NULL;
  24306. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  24307. #ifdef HAVE_EX_DATA
  24308. session = ClientSessionToSession(session);
  24309. if (session != NULL) {
  24310. #ifndef NO_SESSION_CACHE
  24311. if (!session->ownExData) {
  24312. /* Need to retrieve the data from the session cache */
  24313. SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL,
  24314. 1, &ret, NULL);
  24315. }
  24316. else
  24317. #endif
  24318. {
  24319. ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  24320. }
  24321. }
  24322. #else
  24323. (void)session;
  24324. (void)idx;
  24325. #endif
  24326. return ret;
  24327. }
  24328. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */
  24329. /* Note: This is a huge section of API's - through
  24330. * wolfSSL_X509_OBJECT_get0_X509_CRL */
  24331. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \
  24332. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  24333. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  24334. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))
  24335. #ifdef HAVE_EX_DATA
  24336. int wolfSSL_SESSION_get_ex_new_index(long ctx_l,void* ctx_ptr,
  24337. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  24338. WOLFSSL_CRYPTO_EX_free* free_func)
  24339. {
  24340. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  24341. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, ctx_l,
  24342. ctx_ptr, new_func, dup_func, free_func);
  24343. }
  24344. #endif
  24345. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY) && \
  24346. !defined(WOLFSSL_STATIC_MEMORY)
  24347. static wolfSSL_OSSL_Malloc_cb ossl_malloc = NULL;
  24348. static wolfSSL_OSSL_Free_cb ossl_free = NULL;
  24349. static wolfSSL_OSSL_Realloc_cb ossl_realloc = NULL;
  24350. static void* OSSL_Malloc(size_t size)
  24351. {
  24352. if (ossl_malloc != NULL)
  24353. return ossl_malloc(size, NULL, 0);
  24354. else
  24355. return NULL;
  24356. }
  24357. static void OSSL_Free(void *ptr)
  24358. {
  24359. if (ossl_free != NULL)
  24360. ossl_free(ptr, NULL, 0);
  24361. }
  24362. static void* OSSL_Realloc(void *ptr, size_t size)
  24363. {
  24364. if (ossl_realloc != NULL)
  24365. return ossl_realloc(ptr, size, NULL, 0);
  24366. else
  24367. return NULL;
  24368. }
  24369. #endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY &&
  24370. * !WOLFSSL_STATIC_MEMORY */
  24371. int wolfSSL_CRYPTO_set_mem_functions(
  24372. wolfSSL_OSSL_Malloc_cb m,
  24373. wolfSSL_OSSL_Realloc_cb r,
  24374. wolfSSL_OSSL_Free_cb f)
  24375. {
  24376. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
  24377. #ifdef WOLFSSL_DEBUG_MEMORY
  24378. WOLFSSL_MSG("mem functions will receive function name instead of "
  24379. "file name");
  24380. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)m, (wolfSSL_Free_cb)f,
  24381. (wolfSSL_Realloc_cb)r) == 0)
  24382. return WOLFSSL_SUCCESS;
  24383. #else
  24384. WOLFSSL_MSG("wolfSSL was compiled without WOLFSSL_DEBUG_MEMORY mem "
  24385. "functions will receive a NULL file name and 0 for the "
  24386. "line number.");
  24387. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)OSSL_Malloc,
  24388. (wolfSSL_Free_cb)OSSL_Free, (wolfSSL_Realloc_cb)OSSL_Realloc) == 0) {
  24389. ossl_malloc = m;
  24390. ossl_free = f;
  24391. ossl_realloc = r;
  24392. return WOLFSSL_SUCCESS;
  24393. }
  24394. #endif
  24395. else
  24396. return WOLFSSL_FAILURE;
  24397. #else
  24398. (void)m;
  24399. (void)r;
  24400. (void)f;
  24401. WOLFSSL_MSG("wolfSSL allocator callback functions not compiled in");
  24402. return WOLFSSL_FAILURE;
  24403. #endif
  24404. }
  24405. int wolfSSL_ERR_load_ERR_strings(void)
  24406. {
  24407. return WOLFSSL_SUCCESS;
  24408. }
  24409. void wolfSSL_ERR_load_crypto_strings(void)
  24410. {
  24411. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  24412. /* Do nothing */
  24413. return;
  24414. }
  24415. int wolfSSL_FIPS_mode(void)
  24416. {
  24417. #ifdef HAVE_FIPS
  24418. return 1;
  24419. #else
  24420. return 0;
  24421. #endif
  24422. }
  24423. int wolfSSL_FIPS_mode_set(int r)
  24424. {
  24425. #ifdef HAVE_FIPS
  24426. if (r == 0) {
  24427. WOLFSSL_MSG("Cannot disable FIPS at runtime.");
  24428. return WOLFSSL_FAILURE;
  24429. }
  24430. return WOLFSSL_SUCCESS;
  24431. #else
  24432. if (r == 0) {
  24433. return WOLFSSL_SUCCESS;
  24434. }
  24435. WOLFSSL_MSG("Cannot enable FIPS. This isn't the wolfSSL FIPS code.");
  24436. return WOLFSSL_FAILURE;
  24437. #endif
  24438. }
  24439. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  24440. {
  24441. int ret = WOLFSSL_FAILURE;
  24442. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  24443. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  24444. (void)alg_bits;
  24445. if (c!= NULL)
  24446. ret = c->bits;
  24447. #else
  24448. if (c != NULL && c->ssl != NULL) {
  24449. ret = 8 * c->ssl->specs.key_size;
  24450. if (alg_bits != NULL) {
  24451. *alg_bits = ret;
  24452. }
  24453. }
  24454. #endif
  24455. return ret;
  24456. }
  24457. /* returns value less than 0 on fail to match
  24458. * On a successful match the priority level found is returned
  24459. */
  24460. int wolfSSL_sk_SSL_CIPHER_find(
  24461. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  24462. {
  24463. WOLFSSL_STACK* next;
  24464. int i, sz;
  24465. if (sk == NULL || toFind == NULL) {
  24466. return WOLFSSL_FATAL_ERROR;
  24467. }
  24468. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  24469. next = sk;
  24470. for (i = 0; i < sz && next != NULL; i++) {
  24471. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  24472. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  24473. return sz - i; /* reverse because stack pushed highest on first */
  24474. }
  24475. next = next->next;
  24476. }
  24477. return WOLFSSL_FATAL_ERROR;
  24478. }
  24479. /* free's all nodes in the stack and there data */
  24480. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  24481. {
  24482. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_free");
  24483. wolfSSL_sk_free(sk);
  24484. }
  24485. #ifdef HAVE_SNI
  24486. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  24487. {
  24488. int ret;
  24489. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  24490. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  24491. host_name, (word16)XSTRLEN(host_name));
  24492. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  24493. return ret;
  24494. }
  24495. #ifndef NO_WOLFSSL_SERVER
  24496. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  24497. {
  24498. void * serverName = NULL;
  24499. if (ssl == NULL)
  24500. return NULL;
  24501. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  24502. return (const char *)serverName;
  24503. }
  24504. #endif /* NO_WOLFSSL_SERVER */
  24505. #endif /* HAVE_SNI */
  24506. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  24507. {
  24508. int ret;
  24509. /* This method requires some explanation. Its sibling is
  24510. * int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  24511. * which re-inits the WOLFSSL* with all settings in the new CTX.
  24512. * That one is the right one to use *before* a handshake is started.
  24513. *
  24514. * This method was added by OpenSSL to be used *during* the handshake, e.g.
  24515. * when a server inspects the SNI in a ClientHello callback and
  24516. * decides which set of certificates to use.
  24517. *
  24518. * Since, at the time the SNI callback is run, some decisions on
  24519. * Extensions or the ServerHello might already have been taken, this
  24520. * method is very restricted in what it does:
  24521. * - changing the server certificate(s)
  24522. * - changing the server id for session handling
  24523. * and everything else in WOLFSSL* needs to remain untouched.
  24524. */
  24525. WOLFSSL_ENTER("wolfSSL_set_SSL_CTX");
  24526. if (ssl == NULL || ctx == NULL)
  24527. return NULL;
  24528. if (ssl->ctx == ctx)
  24529. return ssl->ctx;
  24530. wolfSSL_RefInc(&ctx->ref, &ret);
  24531. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  24532. if (ret != 0) {
  24533. /* can only fail on serious stuff, like mutex not working
  24534. * or ctx refcount out of whack. */
  24535. return NULL;
  24536. }
  24537. #else
  24538. (void)ret;
  24539. #endif
  24540. if (ssl->ctx != NULL)
  24541. wolfSSL_CTX_free(ssl->ctx);
  24542. ssl->ctx = ctx;
  24543. #ifndef NO_CERTS
  24544. /* ctx owns certificate, certChain and key */
  24545. ssl->buffers.certificate = ctx->certificate;
  24546. ssl->buffers.certChain = ctx->certChain;
  24547. #ifdef WOLFSSL_TLS13
  24548. ssl->buffers.certChainCnt = ctx->certChainCnt;
  24549. #endif
  24550. ssl->buffers.key = ctx->privateKey;
  24551. ssl->buffers.keyType = ctx->privateKeyType;
  24552. ssl->buffers.keyId = ctx->privateKeyId;
  24553. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  24554. ssl->buffers.keySz = ctx->privateKeySz;
  24555. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  24556. /* flags indicating what certs/keys are available */
  24557. ssl->options.haveRSA = ctx->haveRSA;
  24558. ssl->options.haveDH = ctx->haveDH;
  24559. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  24560. ssl->options.haveECC = ctx->haveECC;
  24561. ssl->options.haveStaticECC = ctx->haveStaticECC;
  24562. ssl->options.haveFalconSig = ctx->haveFalconSig;
  24563. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  24564. #ifdef WOLFSSL_DUAL_ALG_CERTS
  24565. ssl->buffers.altKey = ctx->altPrivateKey;
  24566. ssl->buffers.altKeySz = ctx->altPrivateKeySz;
  24567. ssl->buffers.altKeyType = ctx->altPrivateKeyType;
  24568. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  24569. #endif
  24570. #ifdef WOLFSSL_SESSION_ID_CTX
  24571. /* copy over application session context ID */
  24572. ssl->sessionCtxSz = ctx->sessionCtxSz;
  24573. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  24574. #endif
  24575. return ssl->ctx;
  24576. }
  24577. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  24578. {
  24579. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  24580. if(ctx)
  24581. return ctx->verifyCallback;
  24582. return NULL;
  24583. }
  24584. #ifdef HAVE_SNI
  24585. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  24586. {
  24587. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  24588. if (ctx)
  24589. ctx->sniRecvCb = cb;
  24590. }
  24591. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  24592. CallbackSniRecv cb)
  24593. {
  24594. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  24595. if (ctx) {
  24596. ctx->sniRecvCb = cb;
  24597. return WOLFSSL_SUCCESS;
  24598. }
  24599. return WOLFSSL_FAILURE;
  24600. }
  24601. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  24602. {
  24603. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  24604. if (ctx) {
  24605. ctx->sniRecvCbArg = arg;
  24606. return WOLFSSL_SUCCESS;
  24607. }
  24608. return WOLFSSL_FAILURE;
  24609. }
  24610. #endif /* HAVE_SNI */
  24611. #ifndef NO_BIO
  24612. void wolfSSL_ERR_load_BIO_strings(void) {
  24613. WOLFSSL_ENTER("wolfSSL_ERR_load_BIO_strings");
  24614. /* do nothing */
  24615. }
  24616. #endif
  24617. #ifndef NO_WOLFSSL_STUB
  24618. /* Set THREADID callback, return 1 on success, 0 on error */
  24619. int wolfSSL_THREADID_set_callback(
  24620. void(*threadid_func)(WOLFSSL_CRYPTO_THREADID*))
  24621. {
  24622. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  24623. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  24624. (void)threadid_func;
  24625. return 1;
  24626. }
  24627. #endif
  24628. #ifndef NO_WOLFSSL_STUB
  24629. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  24630. {
  24631. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  24632. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  24633. (void)id;
  24634. (void)val;
  24635. return;
  24636. }
  24637. #endif
  24638. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  24639. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  24640. * HAVE_SBLIM_SFCB)) */
  24641. #if defined(OPENSSL_EXTRA)
  24642. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  24643. {
  24644. if (!a || !b)
  24645. return 0;
  24646. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  24647. }
  24648. unsigned long wolfSSL_ERR_peek_last_error(void)
  24649. {
  24650. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  24651. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  24652. {
  24653. int ret;
  24654. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  24655. WOLFSSL_MSG("Issue peeking at error node in queue");
  24656. return 0;
  24657. }
  24658. if (ret == -ASN_NO_PEM_HEADER)
  24659. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  24660. #if defined(WOLFSSL_PYTHON)
  24661. if (ret == ASN1_R_HEADER_TOO_LONG)
  24662. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  24663. #endif
  24664. return (unsigned long)ret;
  24665. }
  24666. #else
  24667. return (unsigned long)(0 - NOT_COMPILED_IN);
  24668. #endif
  24669. }
  24670. #endif /* OPENSSL_EXTRA */
  24671. int wolfSSL_version(WOLFSSL* ssl)
  24672. {
  24673. WOLFSSL_ENTER("wolfSSL_version");
  24674. if (ssl->version.major == SSLv3_MAJOR) {
  24675. switch (ssl->version.minor) {
  24676. case SSLv3_MINOR :
  24677. return SSL3_VERSION;
  24678. case TLSv1_MINOR :
  24679. return TLS1_VERSION;
  24680. case TLSv1_1_MINOR :
  24681. return TLS1_1_VERSION;
  24682. case TLSv1_2_MINOR :
  24683. return TLS1_2_VERSION;
  24684. case TLSv1_3_MINOR :
  24685. return TLS1_3_VERSION;
  24686. default:
  24687. return WOLFSSL_FAILURE;
  24688. }
  24689. }
  24690. else if (ssl->version.major == DTLS_MAJOR) {
  24691. switch (ssl->version.minor) {
  24692. case DTLS_MINOR :
  24693. return DTLS1_VERSION;
  24694. case DTLSv1_2_MINOR :
  24695. return DTLS1_2_VERSION;
  24696. case DTLSv1_3_MINOR:
  24697. return DTLS1_3_VERSION;
  24698. default:
  24699. return WOLFSSL_FAILURE;
  24700. }
  24701. }
  24702. return WOLFSSL_FAILURE;
  24703. }
  24704. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  24705. {
  24706. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  24707. return ssl->ctx;
  24708. }
  24709. #if defined(OPENSSL_ALL) || \
  24710. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  24711. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  24712. const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess,
  24713. unsigned int* idLen)
  24714. {
  24715. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  24716. sess = ClientSessionToSession(sess);
  24717. if (sess == NULL || idLen == NULL) {
  24718. WOLFSSL_MSG("Bad func args. Please provide idLen");
  24719. return NULL;
  24720. }
  24721. #ifdef HAVE_SESSION_TICKET
  24722. if (sess->haveAltSessionID) {
  24723. *idLen = ID_LEN;
  24724. return sess->altSessionID;
  24725. }
  24726. #endif
  24727. *idLen = sess->sessionIDSz;
  24728. return sess->sessionID;
  24729. }
  24730. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  24731. !defined(NO_FILESYSTEM)
  24732. #ifndef NO_BIO
  24733. #if defined(SESSION_CERTS) || \
  24734. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  24735. /* returns a pointer to the protocol used by the session */
  24736. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  24737. {
  24738. in = ClientSessionToSession(in);
  24739. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  24740. }
  24741. #endif
  24742. /* returns true (non 0) if the session has EMS (extended master secret) */
  24743. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  24744. {
  24745. in = ClientSessionToSession(in);
  24746. if (in == NULL)
  24747. return 0;
  24748. return in->haveEMS;
  24749. }
  24750. #if defined(HAVE_SESSION_TICKET)
  24751. /* prints out the ticket to bio passed in
  24752. * return WOLFSSL_SUCCESS on success
  24753. */
  24754. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  24755. const WOLFSSL_SESSION* in, const char* tab)
  24756. {
  24757. unsigned short i, j, z, sz;
  24758. short tag = 0;
  24759. byte* pt;
  24760. in = ClientSessionToSession(in);
  24761. if (in == NULL || bio == NULL) {
  24762. return BAD_FUNC_ARG;
  24763. }
  24764. sz = in->ticketLen;
  24765. pt = in->ticket;
  24766. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  24767. return WOLFSSL_FAILURE;
  24768. for (i = 0; i < sz;) {
  24769. char asc[16];
  24770. XMEMSET(asc, 0, sizeof(asc));
  24771. if (sz - i < 16) {
  24772. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  24773. return WOLFSSL_FAILURE;
  24774. }
  24775. else {
  24776. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  24777. return WOLFSSL_FAILURE;
  24778. }
  24779. for (j = 0; i < sz && j < 8; j++,i++) {
  24780. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24781. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  24782. return WOLFSSL_FAILURE;
  24783. }
  24784. if (i < sz) {
  24785. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24786. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  24787. return WOLFSSL_FAILURE;
  24788. j++;
  24789. i++;
  24790. }
  24791. for (; i < sz && j < 16; j++,i++) {
  24792. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24793. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  24794. return WOLFSSL_FAILURE;
  24795. }
  24796. /* pad out spacing */
  24797. for (z = j; z < 17; z++) {
  24798. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  24799. return WOLFSSL_FAILURE;
  24800. }
  24801. for (z = 0; z < j; z++) {
  24802. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  24803. return WOLFSSL_FAILURE;
  24804. }
  24805. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  24806. return WOLFSSL_FAILURE;
  24807. tag += 16;
  24808. }
  24809. return WOLFSSL_SUCCESS;
  24810. }
  24811. #endif /* HAVE_SESSION_TICKET */
  24812. /* prints out the session information in human readable form
  24813. * return WOLFSSL_SUCCESS on success
  24814. */
  24815. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session)
  24816. {
  24817. const unsigned char* pt;
  24818. unsigned char buf[SECRET_LEN];
  24819. unsigned int sz = 0, i;
  24820. int ret;
  24821. session = ClientSessionToSession(session);
  24822. if (session == NULL) {
  24823. return WOLFSSL_FAILURE;
  24824. }
  24825. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  24826. return WOLFSSL_FAILURE;
  24827. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  24828. defined(HAVE_SESSION_TICKET))
  24829. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  24830. wolfSSL_SESSION_get_protocol(session)) <= 0)
  24831. return WOLFSSL_FAILURE;
  24832. #endif
  24833. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  24834. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  24835. return WOLFSSL_FAILURE;
  24836. pt = wolfSSL_SESSION_get_id(session, &sz);
  24837. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  24838. return WOLFSSL_FAILURE;
  24839. for (i = 0; i < sz; i++) {
  24840. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  24841. return WOLFSSL_FAILURE;
  24842. }
  24843. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  24844. return WOLFSSL_FAILURE;
  24845. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  24846. return WOLFSSL_FAILURE;
  24847. ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf));
  24848. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  24849. return WOLFSSL_FAILURE;
  24850. if (ret > 0) {
  24851. sz = (unsigned int)ret;
  24852. for (i = 0; i < sz; i++) {
  24853. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  24854. return WOLFSSL_FAILURE;
  24855. }
  24856. }
  24857. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  24858. return WOLFSSL_FAILURE;
  24859. /* @TODO PSK identity hint and SRP */
  24860. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  24861. return WOLFSSL_FAILURE;
  24862. #ifdef HAVE_SESSION_TICKET
  24863. if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS)
  24864. return WOLFSSL_FAILURE;
  24865. #endif
  24866. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  24867. defined(HAVE_EXT_CACHE))
  24868. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  24869. wolfSSL_SESSION_get_time(session)) <= 0)
  24870. return WOLFSSL_FAILURE;
  24871. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  24872. wolfSSL_SESSION_get_timeout(session)) <= 0)
  24873. return WOLFSSL_FAILURE;
  24874. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  24875. /* @TODO verify return code print */
  24876. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  24877. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  24878. return WOLFSSL_FAILURE;
  24879. return WOLFSSL_SUCCESS;
  24880. }
  24881. #endif /* !NO_BIO */
  24882. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  24883. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  24884. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  24885. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  24886. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  24887. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  24888. int mode = 0;
  24889. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  24890. if (!ssl) {
  24891. return WOLFSSL_FAILURE;
  24892. }
  24893. if (ssl->options.verifyNone) {
  24894. mode = WOLFSSL_VERIFY_NONE;
  24895. }
  24896. else {
  24897. if (ssl->options.verifyPeer) {
  24898. mode |= WOLFSSL_VERIFY_PEER;
  24899. }
  24900. if (ssl->options.failNoCert) {
  24901. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  24902. }
  24903. if (ssl->options.failNoCertxPSK) {
  24904. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  24905. }
  24906. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  24907. if (ssl->options.verifyPostHandshake) {
  24908. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  24909. }
  24910. #endif
  24911. }
  24912. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  24913. return mode;
  24914. }
  24915. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  24916. {
  24917. int mode = 0;
  24918. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  24919. if (!ctx) {
  24920. return WOLFSSL_FAILURE;
  24921. }
  24922. if (ctx->verifyNone) {
  24923. mode = WOLFSSL_VERIFY_NONE;
  24924. }
  24925. else {
  24926. if (ctx->verifyPeer) {
  24927. mode |= WOLFSSL_VERIFY_PEER;
  24928. }
  24929. if (ctx->failNoCert) {
  24930. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  24931. }
  24932. if (ctx->failNoCertxPSK) {
  24933. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  24934. }
  24935. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  24936. if (ctx->verifyPostHandshake) {
  24937. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  24938. }
  24939. #endif
  24940. }
  24941. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  24942. return mode;
  24943. }
  24944. #endif
  24945. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  24946. /* return 1 if success, 0 if error
  24947. * output keys are little endian format
  24948. */
  24949. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  24950. unsigned char *pub, unsigned int *pubSz)
  24951. {
  24952. #ifndef WOLFSSL_KEY_GEN
  24953. WOLFSSL_MSG("No Key Gen built in");
  24954. (void) priv;
  24955. (void) privSz;
  24956. (void) pub;
  24957. (void) pubSz;
  24958. return WOLFSSL_FAILURE;
  24959. #else /* WOLFSSL_KEY_GEN */
  24960. int ret = WOLFSSL_FAILURE;
  24961. int initTmpRng = 0;
  24962. WC_RNG *rng = NULL;
  24963. #ifdef WOLFSSL_SMALL_STACK
  24964. WC_RNG *tmpRNG = NULL;
  24965. #else
  24966. WC_RNG tmpRNG[1];
  24967. #endif
  24968. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  24969. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  24970. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  24971. WOLFSSL_MSG("Bad arguments");
  24972. return WOLFSSL_FAILURE;
  24973. }
  24974. #ifdef WOLFSSL_SMALL_STACK
  24975. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24976. if (tmpRNG == NULL)
  24977. return WOLFSSL_FAILURE;
  24978. #endif
  24979. if (wc_InitRng(tmpRNG) == 0) {
  24980. rng = tmpRNG;
  24981. initTmpRng = 1;
  24982. }
  24983. else {
  24984. WOLFSSL_MSG("Bad RNG Init, trying global");
  24985. if (initGlobalRNG == 0)
  24986. WOLFSSL_MSG("Global RNG no Init");
  24987. else
  24988. rng = &globalRNG;
  24989. }
  24990. if (rng) {
  24991. curve25519_key key;
  24992. if (wc_curve25519_init(&key) != MP_OKAY)
  24993. WOLFSSL_MSG("wc_curve25519_init failed");
  24994. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  24995. WOLFSSL_MSG("wc_curve25519_make_key failed");
  24996. /* export key pair */
  24997. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  24998. pubSz, EC25519_LITTLE_ENDIAN)
  24999. != MP_OKAY)
  25000. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  25001. else
  25002. ret = WOLFSSL_SUCCESS;
  25003. wc_curve25519_free(&key);
  25004. }
  25005. if (initTmpRng)
  25006. wc_FreeRng(tmpRNG);
  25007. #ifdef WOLFSSL_SMALL_STACK
  25008. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25009. #endif
  25010. return ret;
  25011. #endif /* WOLFSSL_KEY_GEN */
  25012. }
  25013. /* return 1 if success, 0 if error
  25014. * input and output keys are little endian format
  25015. */
  25016. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  25017. const unsigned char *priv, unsigned int privSz,
  25018. const unsigned char *pub, unsigned int pubSz)
  25019. {
  25020. #ifndef WOLFSSL_KEY_GEN
  25021. WOLFSSL_MSG("No Key Gen built in");
  25022. (void) shared;
  25023. (void) sharedSz;
  25024. (void) priv;
  25025. (void) privSz;
  25026. (void) pub;
  25027. (void) pubSz;
  25028. return WOLFSSL_FAILURE;
  25029. #else /* WOLFSSL_KEY_GEN */
  25030. int ret = WOLFSSL_FAILURE;
  25031. curve25519_key privkey, pubkey;
  25032. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  25033. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  25034. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  25035. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  25036. WOLFSSL_MSG("Bad arguments");
  25037. return WOLFSSL_FAILURE;
  25038. }
  25039. /* import private key */
  25040. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  25041. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  25042. return ret;
  25043. }
  25044. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  25045. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  25046. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  25047. wc_curve25519_free(&privkey);
  25048. return ret;
  25049. }
  25050. /* import public key */
  25051. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  25052. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  25053. wc_curve25519_free(&privkey);
  25054. return ret;
  25055. }
  25056. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  25057. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  25058. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  25059. wc_curve25519_free(&privkey);
  25060. wc_curve25519_free(&pubkey);
  25061. return ret;
  25062. }
  25063. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  25064. shared, sharedSz,
  25065. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  25066. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  25067. else
  25068. ret = WOLFSSL_SUCCESS;
  25069. wc_curve25519_free(&privkey);
  25070. wc_curve25519_free(&pubkey);
  25071. return ret;
  25072. #endif /* WOLFSSL_KEY_GEN */
  25073. }
  25074. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  25075. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  25076. /* return 1 if success, 0 if error
  25077. * output keys are little endian format
  25078. */
  25079. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  25080. unsigned char *pub, unsigned int *pubSz)
  25081. {
  25082. #ifndef WOLFSSL_KEY_GEN
  25083. WOLFSSL_MSG("No Key Gen built in");
  25084. (void) priv;
  25085. (void) privSz;
  25086. (void) pub;
  25087. (void) pubSz;
  25088. return WOLFSSL_FAILURE;
  25089. #elif !defined(HAVE_ED25519_KEY_EXPORT)
  25090. WOLFSSL_MSG("No ED25519 key export built in");
  25091. (void) priv;
  25092. (void) privSz;
  25093. (void) pub;
  25094. (void) pubSz;
  25095. return WOLFSSL_FAILURE;
  25096. #else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  25097. int ret = WOLFSSL_FAILURE;
  25098. int initTmpRng = 0;
  25099. WC_RNG *rng = NULL;
  25100. #ifdef WOLFSSL_SMALL_STACK
  25101. WC_RNG *tmpRNG = NULL;
  25102. #else
  25103. WC_RNG tmpRNG[1];
  25104. #endif
  25105. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  25106. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  25107. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  25108. WOLFSSL_MSG("Bad arguments");
  25109. return WOLFSSL_FAILURE;
  25110. }
  25111. #ifdef WOLFSSL_SMALL_STACK
  25112. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25113. if (tmpRNG == NULL)
  25114. return WOLFSSL_FATAL_ERROR;
  25115. #endif
  25116. if (wc_InitRng(tmpRNG) == 0) {
  25117. rng = tmpRNG;
  25118. initTmpRng = 1;
  25119. }
  25120. else {
  25121. WOLFSSL_MSG("Bad RNG Init, trying global");
  25122. if (initGlobalRNG == 0)
  25123. WOLFSSL_MSG("Global RNG no Init");
  25124. else
  25125. rng = &globalRNG;
  25126. }
  25127. if (rng) {
  25128. ed25519_key key;
  25129. if (wc_ed25519_init(&key) != MP_OKAY)
  25130. WOLFSSL_MSG("wc_ed25519_init failed");
  25131. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  25132. WOLFSSL_MSG("wc_ed25519_make_key failed");
  25133. /* export private key */
  25134. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  25135. WOLFSSL_MSG("wc_ed25519_export_key failed");
  25136. else
  25137. ret = WOLFSSL_SUCCESS;
  25138. wc_ed25519_free(&key);
  25139. }
  25140. if (initTmpRng)
  25141. wc_FreeRng(tmpRNG);
  25142. #ifdef WOLFSSL_SMALL_STACK
  25143. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25144. #endif
  25145. return ret;
  25146. #endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  25147. }
  25148. /* return 1 if success, 0 if error
  25149. * input and output keys are little endian format
  25150. * priv is a buffer containing private and public part of key
  25151. */
  25152. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  25153. const unsigned char *priv, unsigned int privSz,
  25154. unsigned char *sig, unsigned int *sigSz)
  25155. {
  25156. #if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  25157. #if !defined(HAVE_ED25519_SIGN)
  25158. WOLFSSL_MSG("No ED25519 sign built in");
  25159. #elif !defined(WOLFSSL_KEY_GEN)
  25160. WOLFSSL_MSG("No Key Gen built in");
  25161. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  25162. WOLFSSL_MSG("No ED25519 Key import built in");
  25163. #endif
  25164. (void) msg;
  25165. (void) msgSz;
  25166. (void) priv;
  25167. (void) privSz;
  25168. (void) sig;
  25169. (void) sigSz;
  25170. return WOLFSSL_FAILURE;
  25171. #else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  25172. ed25519_key key;
  25173. int ret = WOLFSSL_FAILURE;
  25174. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  25175. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  25176. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  25177. WOLFSSL_MSG("Bad arguments");
  25178. return WOLFSSL_FAILURE;
  25179. }
  25180. /* import key */
  25181. if (wc_ed25519_init(&key) != MP_OKAY) {
  25182. WOLFSSL_MSG("wc_curve25519_init failed");
  25183. return ret;
  25184. }
  25185. if (wc_ed25519_import_private_key(priv, privSz/2,
  25186. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  25187. &key) != MP_OKAY){
  25188. WOLFSSL_MSG("wc_ed25519_import_private failed");
  25189. wc_ed25519_free(&key);
  25190. return ret;
  25191. }
  25192. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  25193. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  25194. else
  25195. ret = WOLFSSL_SUCCESS;
  25196. wc_ed25519_free(&key);
  25197. return ret;
  25198. #endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  25199. }
  25200. /* return 1 if success, 0 if error
  25201. * input and output keys are little endian format
  25202. * pub is a buffer containing public part of key
  25203. */
  25204. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  25205. const unsigned char *pub, unsigned int pubSz,
  25206. const unsigned char *sig, unsigned int sigSz)
  25207. {
  25208. #if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  25209. #if !defined(HAVE_ED25519_VERIFY)
  25210. WOLFSSL_MSG("No ED25519 verify built in");
  25211. #elif !defined(WOLFSSL_KEY_GEN)
  25212. WOLFSSL_MSG("No Key Gen built in");
  25213. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  25214. WOLFSSL_MSG("No ED25519 Key import built in");
  25215. #endif
  25216. (void) msg;
  25217. (void) msgSz;
  25218. (void) pub;
  25219. (void) pubSz;
  25220. (void) sig;
  25221. (void) sigSz;
  25222. return WOLFSSL_FAILURE;
  25223. #else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  25224. ed25519_key key;
  25225. int ret = WOLFSSL_FAILURE, check = 0;
  25226. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  25227. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  25228. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  25229. WOLFSSL_MSG("Bad arguments");
  25230. return WOLFSSL_FAILURE;
  25231. }
  25232. /* import key */
  25233. if (wc_ed25519_init(&key) != MP_OKAY) {
  25234. WOLFSSL_MSG("wc_curve25519_init failed");
  25235. return ret;
  25236. }
  25237. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  25238. WOLFSSL_MSG("wc_ed25519_import_public failed");
  25239. wc_ed25519_free(&key);
  25240. return ret;
  25241. }
  25242. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  25243. &check, &key)) != MP_OKAY) {
  25244. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  25245. }
  25246. else if (!check)
  25247. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  25248. else
  25249. ret = WOLFSSL_SUCCESS;
  25250. wc_ed25519_free(&key);
  25251. return ret;
  25252. #endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  25253. }
  25254. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  25255. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  25256. /* return 1 if success, 0 if error
  25257. * output keys are little endian format
  25258. */
  25259. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  25260. unsigned char *pub, unsigned int *pubSz)
  25261. {
  25262. #ifndef WOLFSSL_KEY_GEN
  25263. WOLFSSL_MSG("No Key Gen built in");
  25264. (void) priv;
  25265. (void) privSz;
  25266. (void) pub;
  25267. (void) pubSz;
  25268. return WOLFSSL_FAILURE;
  25269. #else /* WOLFSSL_KEY_GEN */
  25270. int ret = WOLFSSL_FAILURE;
  25271. int initTmpRng = 0;
  25272. WC_RNG *rng = NULL;
  25273. #ifdef WOLFSSL_SMALL_STACK
  25274. WC_RNG *tmpRNG = NULL;
  25275. #else
  25276. WC_RNG tmpRNG[1];
  25277. #endif
  25278. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  25279. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  25280. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  25281. WOLFSSL_MSG("Bad arguments");
  25282. return WOLFSSL_FAILURE;
  25283. }
  25284. #ifdef WOLFSSL_SMALL_STACK
  25285. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25286. if (tmpRNG == NULL)
  25287. return WOLFSSL_FAILURE;
  25288. #endif
  25289. if (wc_InitRng(tmpRNG) == 0) {
  25290. rng = tmpRNG;
  25291. initTmpRng = 1;
  25292. }
  25293. else {
  25294. WOLFSSL_MSG("Bad RNG Init, trying global");
  25295. if (initGlobalRNG == 0)
  25296. WOLFSSL_MSG("Global RNG no Init");
  25297. else
  25298. rng = &globalRNG;
  25299. }
  25300. if (rng) {
  25301. curve448_key key;
  25302. if (wc_curve448_init(&key) != MP_OKAY)
  25303. WOLFSSL_MSG("wc_curve448_init failed");
  25304. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  25305. WOLFSSL_MSG("wc_curve448_make_key failed");
  25306. /* export key pair */
  25307. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  25308. EC448_LITTLE_ENDIAN)
  25309. != MP_OKAY)
  25310. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  25311. else
  25312. ret = WOLFSSL_SUCCESS;
  25313. wc_curve448_free(&key);
  25314. }
  25315. if (initTmpRng)
  25316. wc_FreeRng(tmpRNG);
  25317. #ifdef WOLFSSL_SMALL_STACK
  25318. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25319. #endif
  25320. return ret;
  25321. #endif /* WOLFSSL_KEY_GEN */
  25322. }
  25323. /* return 1 if success, 0 if error
  25324. * input and output keys are little endian format
  25325. */
  25326. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  25327. const unsigned char *priv, unsigned int privSz,
  25328. const unsigned char *pub, unsigned int pubSz)
  25329. {
  25330. #ifndef WOLFSSL_KEY_GEN
  25331. WOLFSSL_MSG("No Key Gen built in");
  25332. (void) shared;
  25333. (void) sharedSz;
  25334. (void) priv;
  25335. (void) privSz;
  25336. (void) pub;
  25337. (void) pubSz;
  25338. return WOLFSSL_FAILURE;
  25339. #else /* WOLFSSL_KEY_GEN */
  25340. int ret = WOLFSSL_FAILURE;
  25341. curve448_key privkey, pubkey;
  25342. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  25343. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  25344. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  25345. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  25346. WOLFSSL_MSG("Bad arguments");
  25347. return WOLFSSL_FAILURE;
  25348. }
  25349. /* import private key */
  25350. if (wc_curve448_init(&privkey) != MP_OKAY) {
  25351. WOLFSSL_MSG("wc_curve448_init privkey failed");
  25352. return ret;
  25353. }
  25354. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  25355. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  25356. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  25357. wc_curve448_free(&privkey);
  25358. return ret;
  25359. }
  25360. /* import public key */
  25361. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  25362. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  25363. wc_curve448_free(&privkey);
  25364. return ret;
  25365. }
  25366. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  25367. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  25368. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  25369. wc_curve448_free(&privkey);
  25370. wc_curve448_free(&pubkey);
  25371. return ret;
  25372. }
  25373. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  25374. EC448_LITTLE_ENDIAN) != MP_OKAY)
  25375. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  25376. else
  25377. ret = WOLFSSL_SUCCESS;
  25378. wc_curve448_free(&privkey);
  25379. wc_curve448_free(&pubkey);
  25380. return ret;
  25381. #endif /* WOLFSSL_KEY_GEN */
  25382. }
  25383. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  25384. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  25385. /* return 1 if success, 0 if error
  25386. * output keys are little endian format
  25387. */
  25388. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  25389. unsigned char *pub, unsigned int *pubSz)
  25390. {
  25391. #ifndef WOLFSSL_KEY_GEN
  25392. WOLFSSL_MSG("No Key Gen built in");
  25393. (void) priv;
  25394. (void) privSz;
  25395. (void) pub;
  25396. (void) pubSz;
  25397. return WOLFSSL_FAILURE;
  25398. #elif !defined(HAVE_ED448_KEY_EXPORT)
  25399. WOLFSSL_MSG("No ED448 key export built in");
  25400. (void) priv;
  25401. (void) privSz;
  25402. (void) pub;
  25403. (void) pubSz;
  25404. return WOLFSSL_FAILURE;
  25405. #else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  25406. int ret = WOLFSSL_FAILURE;
  25407. int initTmpRng = 0;
  25408. WC_RNG *rng = NULL;
  25409. #ifdef WOLFSSL_SMALL_STACK
  25410. WC_RNG *tmpRNG = NULL;
  25411. #else
  25412. WC_RNG tmpRNG[1];
  25413. #endif
  25414. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  25415. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  25416. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  25417. WOLFSSL_MSG("Bad arguments");
  25418. return WOLFSSL_FAILURE;
  25419. }
  25420. #ifdef WOLFSSL_SMALL_STACK
  25421. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25422. if (tmpRNG == NULL)
  25423. return WOLFSSL_FATAL_ERROR;
  25424. #endif
  25425. if (wc_InitRng(tmpRNG) == 0) {
  25426. rng = tmpRNG;
  25427. initTmpRng = 1;
  25428. }
  25429. else {
  25430. WOLFSSL_MSG("Bad RNG Init, trying global");
  25431. if (initGlobalRNG == 0)
  25432. WOLFSSL_MSG("Global RNG no Init");
  25433. else
  25434. rng = &globalRNG;
  25435. }
  25436. if (rng) {
  25437. ed448_key key;
  25438. if (wc_ed448_init(&key) != MP_OKAY)
  25439. WOLFSSL_MSG("wc_ed448_init failed");
  25440. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  25441. WOLFSSL_MSG("wc_ed448_make_key failed");
  25442. /* export private key */
  25443. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  25444. WOLFSSL_MSG("wc_ed448_export_key failed");
  25445. else
  25446. ret = WOLFSSL_SUCCESS;
  25447. wc_ed448_free(&key);
  25448. }
  25449. if (initTmpRng)
  25450. wc_FreeRng(tmpRNG);
  25451. #ifdef WOLFSSL_SMALL_STACK
  25452. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25453. #endif
  25454. return ret;
  25455. #endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  25456. }
  25457. /* return 1 if success, 0 if error
  25458. * input and output keys are little endian format
  25459. * priv is a buffer containing private and public part of key
  25460. */
  25461. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  25462. const unsigned char *priv, unsigned int privSz,
  25463. unsigned char *sig, unsigned int *sigSz)
  25464. {
  25465. #if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  25466. #if !defined(HAVE_ED448_SIGN)
  25467. WOLFSSL_MSG("No ED448 sign built in");
  25468. #elif !defined(WOLFSSL_KEY_GEN)
  25469. WOLFSSL_MSG("No Key Gen built in");
  25470. #elif !defined(HAVE_ED448_KEY_IMPORT)
  25471. WOLFSSL_MSG("No ED448 Key import built in");
  25472. #endif
  25473. (void) msg;
  25474. (void) msgSz;
  25475. (void) priv;
  25476. (void) privSz;
  25477. (void) sig;
  25478. (void) sigSz;
  25479. return WOLFSSL_FAILURE;
  25480. #else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  25481. ed448_key key;
  25482. int ret = WOLFSSL_FAILURE;
  25483. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  25484. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  25485. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  25486. WOLFSSL_MSG("Bad arguments");
  25487. return WOLFSSL_FAILURE;
  25488. }
  25489. /* import key */
  25490. if (wc_ed448_init(&key) != MP_OKAY) {
  25491. WOLFSSL_MSG("wc_curve448_init failed");
  25492. return ret;
  25493. }
  25494. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  25495. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  25496. WOLFSSL_MSG("wc_ed448_import_private failed");
  25497. wc_ed448_free(&key);
  25498. return ret;
  25499. }
  25500. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  25501. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  25502. else
  25503. ret = WOLFSSL_SUCCESS;
  25504. wc_ed448_free(&key);
  25505. return ret;
  25506. #endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  25507. }
  25508. /* return 1 if success, 0 if error
  25509. * input and output keys are little endian format
  25510. * pub is a buffer containing public part of key
  25511. */
  25512. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  25513. const unsigned char *pub, unsigned int pubSz,
  25514. const unsigned char *sig, unsigned int sigSz)
  25515. {
  25516. #if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  25517. #if !defined(HAVE_ED448_VERIFY)
  25518. WOLFSSL_MSG("No ED448 verify built in");
  25519. #elif !defined(WOLFSSL_KEY_GEN)
  25520. WOLFSSL_MSG("No Key Gen built in");
  25521. #elif !defined(HAVE_ED448_KEY_IMPORT)
  25522. WOLFSSL_MSG("No ED448 Key import built in");
  25523. #endif
  25524. (void) msg;
  25525. (void) msgSz;
  25526. (void) pub;
  25527. (void) pubSz;
  25528. (void) sig;
  25529. (void) sigSz;
  25530. return WOLFSSL_FAILURE;
  25531. #else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  25532. ed448_key key;
  25533. int ret = WOLFSSL_FAILURE, check = 0;
  25534. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  25535. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  25536. sig == NULL || sigSz != ED448_SIG_SIZE) {
  25537. WOLFSSL_MSG("Bad arguments");
  25538. return WOLFSSL_FAILURE;
  25539. }
  25540. /* import key */
  25541. if (wc_ed448_init(&key) != MP_OKAY) {
  25542. WOLFSSL_MSG("wc_curve448_init failed");
  25543. return ret;
  25544. }
  25545. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  25546. WOLFSSL_MSG("wc_ed448_import_public failed");
  25547. wc_ed448_free(&key);
  25548. return ret;
  25549. }
  25550. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  25551. &key, NULL, 0)) != MP_OKAY) {
  25552. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  25553. }
  25554. else if (!check)
  25555. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  25556. else
  25557. ret = WOLFSSL_SUCCESS;
  25558. wc_ed448_free(&key);
  25559. return ret;
  25560. #endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */
  25561. }
  25562. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  25563. #ifdef WOLFSSL_JNI
  25564. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  25565. {
  25566. WOLFSSL_ENTER("wolfSSL_set_jobject");
  25567. if (ssl != NULL)
  25568. {
  25569. ssl->jObjectRef = objPtr;
  25570. return WOLFSSL_SUCCESS;
  25571. }
  25572. return WOLFSSL_FAILURE;
  25573. }
  25574. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  25575. {
  25576. WOLFSSL_ENTER("wolfSSL_get_jobject");
  25577. if (ssl != NULL)
  25578. return ssl->jObjectRef;
  25579. return NULL;
  25580. }
  25581. #endif /* WOLFSSL_JNI */
  25582. #ifdef WOLFSSL_ASYNC_CRYPT
  25583. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  25584. WOLF_EVENT_FLAG flags, int* eventCount)
  25585. {
  25586. if (ctx == NULL) {
  25587. return BAD_FUNC_ARG;
  25588. }
  25589. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  25590. events, maxEvents, flags, eventCount);
  25591. }
  25592. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  25593. {
  25594. int ret, eventCount = 0;
  25595. WOLF_EVENT* events[1];
  25596. if (ssl == NULL) {
  25597. return BAD_FUNC_ARG;
  25598. }
  25599. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  25600. events, sizeof(events)/sizeof(events[0]), flags, &eventCount);
  25601. if (ret == 0) {
  25602. ret = eventCount;
  25603. }
  25604. return ret;
  25605. }
  25606. #endif /* WOLFSSL_ASYNC_CRYPT */
  25607. #ifdef OPENSSL_EXTRA
  25608. static int peek_ignore_err(int err)
  25609. {
  25610. switch(err) {
  25611. case -WANT_READ:
  25612. case -WANT_WRITE:
  25613. case -ZERO_RETURN:
  25614. case -WOLFSSL_ERROR_ZERO_RETURN:
  25615. case -SOCKET_PEER_CLOSED_E:
  25616. case -SOCKET_ERROR_E:
  25617. return 1;
  25618. default:
  25619. return 0;
  25620. }
  25621. }
  25622. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  25623. const char **data, int *flags)
  25624. {
  25625. unsigned long err;
  25626. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  25627. err = wc_PeekErrorNodeLineData(file, line, data, flags, peek_ignore_err);
  25628. if (err == -ASN_NO_PEM_HEADER)
  25629. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  25630. #ifdef OPENSSL_ALL
  25631. /* PARSE_ERROR is returned if an HTTP request is detected. */
  25632. else if (err == -SSL_R_HTTP_REQUEST)
  25633. return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST;
  25634. #endif
  25635. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  25636. else if (err == ASN1_R_HEADER_TOO_LONG)
  25637. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  25638. #endif
  25639. return err;
  25640. }
  25641. #endif
  25642. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  25643. #if !defined(WOLFSSL_USER_IO)
  25644. /* converts an IPv6 or IPv4 address into an octet string for use with rfc3280
  25645. * example input would be "127.0.0.1" and the returned value would be 7F000001
  25646. */
  25647. WOLFSSL_ASN1_STRING* wolfSSL_a2i_IPADDRESS(const char* ipa)
  25648. {
  25649. int ipaSz = WOLFSSL_IP4_ADDR_LEN;
  25650. char buf[WOLFSSL_IP6_ADDR_LEN + 1]; /* plus 1 for terminator */
  25651. int af = WOLFSSL_IP4;
  25652. WOLFSSL_ASN1_STRING *ret = NULL;
  25653. if (ipa == NULL)
  25654. return NULL;
  25655. if (XSTRSTR(ipa, ":") != NULL) {
  25656. af = WOLFSSL_IP6;
  25657. ipaSz = WOLFSSL_IP6_ADDR_LEN;
  25658. }
  25659. buf[WOLFSSL_IP6_ADDR_LEN] = '\0';
  25660. if (XINET_PTON(af, ipa, (void*)buf) != 1) {
  25661. WOLFSSL_MSG("Error parsing IP address");
  25662. return NULL;
  25663. }
  25664. ret = wolfSSL_ASN1_STRING_new();
  25665. if (ret != NULL) {
  25666. if (wolfSSL_ASN1_STRING_set(ret, buf, ipaSz) != WOLFSSL_SUCCESS) {
  25667. WOLFSSL_MSG("Error setting the string");
  25668. wolfSSL_ASN1_STRING_free(ret);
  25669. ret = NULL;
  25670. }
  25671. }
  25672. return ret;
  25673. }
  25674. #endif /* !WOLFSSL_USER_IO */
  25675. /* Is the specified cipher suite a fake one used an an extension proxy? */
  25676. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  25677. {
  25678. (void)suite0;
  25679. (void)suite;
  25680. #ifdef HAVE_RENEGOTIATION_INDICATION
  25681. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  25682. return 1;
  25683. #endif
  25684. return 0;
  25685. }
  25686. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  25687. byte suite)
  25688. {
  25689. const CipherSuiteInfo* cipher_names = GetCipherNames();
  25690. int cipherSz = GetCipherNamesSize();
  25691. int i;
  25692. for (i = 0; i < cipherSz; i++)
  25693. if (cipher_names[i].cipherSuite0 == suite0 &&
  25694. cipher_names[i].cipherSuite == suite)
  25695. break;
  25696. if (i == cipherSz)
  25697. return 1;
  25698. /* Check min version */
  25699. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  25700. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  25701. cipher_names[i].minor >= TLSv1_MINOR)
  25702. /* 1.0 ciphersuites are in general available in 1.1 and
  25703. * 1.1 ciphersuites are in general available in 1.2 */
  25704. return 0;
  25705. return 1;
  25706. }
  25707. /* Check max version */
  25708. switch (cipher_names[i].minor) {
  25709. case SSLv3_MINOR :
  25710. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  25711. case TLSv1_MINOR :
  25712. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  25713. case TLSv1_1_MINOR :
  25714. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  25715. case TLSv1_2_MINOR :
  25716. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  25717. case TLSv1_3_MINOR :
  25718. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  25719. default:
  25720. WOLFSSL_MSG("Unrecognized minor version");
  25721. return 1;
  25722. }
  25723. }
  25724. /* returns a pointer to internal cipher suite list. Should not be free'd by
  25725. * caller.
  25726. */
  25727. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  25728. {
  25729. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  25730. const Suites* suites;
  25731. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25732. const CipherSuiteInfo* cipher_names = GetCipherNames();
  25733. int cipherSz = GetCipherNamesSize();
  25734. #endif
  25735. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  25736. if (ssl == NULL)
  25737. return NULL;
  25738. suites = WOLFSSL_SUITES(ssl);
  25739. if (suites == NULL)
  25740. return NULL;
  25741. /* check if stack needs populated */
  25742. if (ssl->suitesStack == NULL) {
  25743. int i;
  25744. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25745. int j;
  25746. /* higher priority of cipher suite will be on top of stack */
  25747. for (i = suites->suiteSz - 2; i >=0; i-=2) {
  25748. #else
  25749. for (i = 0; i < suites->suiteSz; i+=2) {
  25750. #endif
  25751. WOLFSSL_STACK* add;
  25752. /* A couple of suites are placeholders for special options,
  25753. * skip those. */
  25754. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  25755. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  25756. suites->suites[i+1])) {
  25757. continue;
  25758. }
  25759. add = wolfSSL_sk_new_node(ssl->heap);
  25760. if (add != NULL) {
  25761. add->type = STACK_TYPE_CIPHER;
  25762. add->data.cipher.cipherSuite0 = suites->suites[i];
  25763. add->data.cipher.cipherSuite = suites->suites[i+1];
  25764. add->data.cipher.ssl = ssl;
  25765. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25766. for (j = 0; j < cipherSz; j++) {
  25767. if (cipher_names[j].cipherSuite0 ==
  25768. add->data.cipher.cipherSuite0 &&
  25769. cipher_names[j].cipherSuite ==
  25770. add->data.cipher.cipherSuite) {
  25771. add->data.cipher.offset = j;
  25772. break;
  25773. }
  25774. }
  25775. #endif
  25776. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  25777. /* in_stack is checked in wolfSSL_CIPHER_description */
  25778. add->data.cipher.in_stack = 1;
  25779. #endif
  25780. add->next = ret;
  25781. if (ret != NULL) {
  25782. add->num = ret->num + 1;
  25783. }
  25784. else {
  25785. add->num = 1;
  25786. }
  25787. ret = add;
  25788. }
  25789. }
  25790. ((WOLFSSL*)ssl)->suitesStack = ret;
  25791. }
  25792. return ssl->suitesStack;
  25793. }
  25794. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  25795. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  25796. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK)
  25797. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  25798. {
  25799. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  25800. if (ctx == NULL)
  25801. return 0;
  25802. return ctx->timeout;
  25803. }
  25804. /* returns the time in seconds of the current timeout */
  25805. long wolfSSL_get_timeout(WOLFSSL* ssl)
  25806. {
  25807. WOLFSSL_ENTER("wolfSSL_get_timeout");
  25808. if (ssl == NULL)
  25809. return 0;
  25810. return ssl->timeout;
  25811. }
  25812. #endif
  25813. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  25814. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  25815. #ifdef HAVE_ECC
  25816. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  25817. {
  25818. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  25819. if (ctx == NULL || ecdh == NULL)
  25820. return BAD_FUNC_ARG;
  25821. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  25822. return WOLFSSL_SUCCESS;
  25823. }
  25824. #endif
  25825. #ifndef NO_SESSION_CACHE
  25826. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  25827. {
  25828. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25829. int rem_called = FALSE;
  25830. #endif
  25831. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  25832. s = ClientSessionToSession(s);
  25833. if (ctx == NULL || s == NULL)
  25834. return BAD_FUNC_ARG;
  25835. #ifdef HAVE_EXT_CACHE
  25836. if (!ctx->internalCacheOff)
  25837. #endif
  25838. {
  25839. const byte* id;
  25840. WOLFSSL_SESSION *sess = NULL;
  25841. word32 row = 0;
  25842. int ret;
  25843. id = s->sessionID;
  25844. if (s->haveAltSessionID)
  25845. id = s->altSessionID;
  25846. ret = TlsSessionCacheGetAndWrLock(id, &sess, &row, ctx->method->side);
  25847. if (ret == 0 && sess != NULL) {
  25848. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25849. if (sess->rem_sess_cb != NULL) {
  25850. rem_called = TRUE;
  25851. }
  25852. #endif
  25853. /* Call this before changing ownExData so that calls to ex_data
  25854. * don't try to access the SessionCache again. */
  25855. EvictSessionFromCache(sess);
  25856. #ifdef HAVE_EX_DATA
  25857. if (sess->ownExData) {
  25858. /* Most recent version of ex data is in cache. Copy it
  25859. * over so the user can free it. */
  25860. XMEMCPY(&s->ex_data, &sess->ex_data,
  25861. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  25862. s->ownExData = 1;
  25863. sess->ownExData = 0;
  25864. }
  25865. #endif
  25866. #ifdef SESSION_CACHE_DYNAMIC_MEM
  25867. {
  25868. /* Find and clear entry. Row is locked so we are good to go. */
  25869. int idx;
  25870. for (idx = 0; idx < SESSIONS_PER_ROW; idx++) {
  25871. if (sess == SessionCache[row].Sessions[idx]) {
  25872. XFREE(sess, sess->heap, DYNAMIC_TYPE_SESSION);
  25873. SessionCache[row].Sessions[idx] = NULL;
  25874. break;
  25875. }
  25876. }
  25877. }
  25878. #endif
  25879. TlsSessionCacheUnlockRow(row);
  25880. }
  25881. }
  25882. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25883. if (ctx->rem_sess_cb != NULL && !rem_called) {
  25884. ctx->rem_sess_cb(ctx, s);
  25885. }
  25886. #endif
  25887. /* s cannot be resumed at this point */
  25888. s->timeout = 0;
  25889. return 0;
  25890. }
  25891. #endif /* !NO_SESSION_CACHE */
  25892. #ifndef NO_BIO
  25893. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  25894. {
  25895. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  25896. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  25897. * The setting buffer size doesn't do anything so return NULL for both.
  25898. */
  25899. if (s == NULL)
  25900. return NULL;
  25901. return s->biord;
  25902. }
  25903. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  25904. {
  25905. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  25906. (void)s;
  25907. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  25908. * The setting buffer size doesn't do anything so return NULL for both.
  25909. */
  25910. if (s == NULL)
  25911. return NULL;
  25912. return s->biowr;
  25913. }
  25914. #endif /* !NO_BIO */
  25915. int wolfSSL_SSL_do_handshake_internal(WOLFSSL *s)
  25916. {
  25917. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake_internal");
  25918. if (s == NULL)
  25919. return WOLFSSL_FAILURE;
  25920. if (s->options.side == WOLFSSL_CLIENT_END) {
  25921. #ifndef NO_WOLFSSL_CLIENT
  25922. return wolfSSL_connect(s);
  25923. #else
  25924. WOLFSSL_MSG("Client not compiled in");
  25925. return WOLFSSL_FAILURE;
  25926. #endif
  25927. }
  25928. #ifndef NO_WOLFSSL_SERVER
  25929. return wolfSSL_accept(s);
  25930. #else
  25931. WOLFSSL_MSG("Server not compiled in");
  25932. return WOLFSSL_FAILURE;
  25933. #endif
  25934. }
  25935. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  25936. {
  25937. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  25938. #ifdef WOLFSSL_QUIC
  25939. if (WOLFSSL_IS_QUIC(s)) {
  25940. return wolfSSL_quic_do_handshake(s);
  25941. }
  25942. #endif
  25943. return wolfSSL_SSL_do_handshake_internal(s);
  25944. }
  25945. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  25946. int wolfSSL_SSL_in_init(const WOLFSSL *ssl)
  25947. #else
  25948. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  25949. #endif
  25950. {
  25951. WOLFSSL_ENTER("wolfSSL_SSL_in_init");
  25952. return !wolfSSL_is_init_finished(ssl);
  25953. }
  25954. int wolfSSL_SSL_in_before(const WOLFSSL *ssl)
  25955. {
  25956. WOLFSSL_ENTER("wolfSSL_SSL_in_before");
  25957. if (ssl == NULL)
  25958. return WOLFSSL_FAILURE;
  25959. return ssl->options.handShakeState == NULL_STATE;
  25960. }
  25961. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  25962. {
  25963. WOLFSSL_ENTER("wolfSSL_SSL_in_connect_init");
  25964. if (ssl == NULL)
  25965. return WOLFSSL_FAILURE;
  25966. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  25967. return ssl->options.connectState > CONNECT_BEGIN &&
  25968. ssl->options.connectState < SECOND_REPLY_DONE;
  25969. }
  25970. return ssl->options.acceptState > ACCEPT_BEGIN &&
  25971. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  25972. }
  25973. #ifndef NO_SESSION_CACHE
  25974. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  25975. {
  25976. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  25977. return ssl->session;
  25978. }
  25979. #endif /* NO_SESSION_CACHE */
  25980. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  25981. /* Expected return values from implementations of OpenSSL ticket key callback.
  25982. */
  25983. #define TICKET_KEY_CB_RET_FAILURE (-1)
  25984. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  25985. #define TICKET_KEY_CB_RET_OK 1
  25986. #define TICKET_KEY_CB_RET_RENEW 2
  25987. /* Implementation of session ticket encryption/decryption using OpenSSL
  25988. * callback to initialize the cipher and HMAC.
  25989. *
  25990. * ssl The SSL/TLS object.
  25991. * keyName The key name - used to identify the key to be used.
  25992. * iv The IV to use.
  25993. * mac The MAC of the encrypted data.
  25994. * enc Encrypt ticket.
  25995. * encTicket The ticket data.
  25996. * encTicketLen The length of the ticket data.
  25997. * encLen The encrypted/decrypted ticket length - output length.
  25998. * ctx Ignored. Application specific data.
  25999. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  26000. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  26001. * WOLFSSL_TICKET_RET_FATAL on error.
  26002. */
  26003. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  26004. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  26005. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  26006. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  26007. int enc, unsigned char* encTicket,
  26008. int encTicketLen, int* encLen, void* ctx)
  26009. {
  26010. byte digest[WC_MAX_DIGEST_SIZE];
  26011. #ifdef WOLFSSL_SMALL_STACK
  26012. WOLFSSL_EVP_CIPHER_CTX *evpCtx;
  26013. #else
  26014. WOLFSSL_EVP_CIPHER_CTX evpCtx[1];
  26015. #endif
  26016. WOLFSSL_HMAC_CTX hmacCtx;
  26017. unsigned int mdSz = 0;
  26018. int len = 0;
  26019. int ret = WOLFSSL_TICKET_RET_FATAL;
  26020. int res;
  26021. int totalSz = 0;
  26022. (void)ctx;
  26023. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  26024. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncWrapCb == NULL) {
  26025. WOLFSSL_MSG("Bad parameter");
  26026. return WOLFSSL_TICKET_RET_FATAL;
  26027. }
  26028. #ifdef WOLFSSL_SMALL_STACK
  26029. evpCtx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(sizeof(*evpCtx), ssl->heap,
  26030. DYNAMIC_TYPE_TMP_BUFFER);
  26031. if (evpCtx == NULL) {
  26032. WOLFSSL_MSG("out of memory");
  26033. return WOLFSSL_TICKET_RET_FATAL;
  26034. }
  26035. #endif
  26036. /* Initialize the cipher and HMAC. */
  26037. wolfSSL_EVP_CIPHER_CTX_init(evpCtx);
  26038. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  26039. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  26040. #ifdef WOLFSSL_SMALL_STACK
  26041. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26042. #endif
  26043. return WOLFSSL_TICKET_RET_FATAL;
  26044. }
  26045. res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
  26046. iv, evpCtx, &hmacCtx, enc);
  26047. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  26048. WOLFSSL_MSG("Ticket callback error");
  26049. ret = WOLFSSL_TICKET_RET_FATAL;
  26050. goto end;
  26051. }
  26052. if (wolfSSL_HMAC_size(&hmacCtx) > WOLFSSL_TICKET_MAC_SZ) {
  26053. WOLFSSL_MSG("Ticket cipher MAC size error");
  26054. goto end;
  26055. }
  26056. if (enc)
  26057. {
  26058. /* Encrypt in place. */
  26059. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  26060. encTicket, encTicketLen))
  26061. goto end;
  26062. totalSz = len;
  26063. if (totalSz > *encLen)
  26064. goto end;
  26065. if (!wolfSSL_EVP_EncryptFinal(evpCtx, &encTicket[len], &len))
  26066. goto end;
  26067. /* Total length of encrypted data. */
  26068. totalSz += len;
  26069. if (totalSz > *encLen)
  26070. goto end;
  26071. /* HMAC the encrypted data into the parameter 'mac'. */
  26072. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, totalSz))
  26073. goto end;
  26074. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  26075. goto end;
  26076. }
  26077. else
  26078. {
  26079. /* HMAC the encrypted data and compare it to the passed in data. */
  26080. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  26081. goto end;
  26082. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  26083. goto end;
  26084. if (XMEMCMP(mac, digest, mdSz) != 0)
  26085. goto end;
  26086. /* Decrypt the ticket data in place. */
  26087. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  26088. encTicket, encTicketLen))
  26089. goto end;
  26090. totalSz = len;
  26091. if (totalSz > encTicketLen)
  26092. goto end;
  26093. if (!wolfSSL_EVP_DecryptFinal(evpCtx, &encTicket[len], &len))
  26094. goto end;
  26095. /* Total length of decrypted data. */
  26096. totalSz += len;
  26097. if (totalSz > encTicketLen)
  26098. goto end;
  26099. }
  26100. *encLen = totalSz;
  26101. if (res == TICKET_KEY_CB_RET_RENEW && !IsAtLeastTLSv1_3(ssl->version)
  26102. && !enc)
  26103. ret = WOLFSSL_TICKET_RET_CREATE;
  26104. else
  26105. ret = WOLFSSL_TICKET_RET_OK;
  26106. end:
  26107. (void)wc_HmacFree(&hmacCtx.hmac);
  26108. (void)wolfSSL_EVP_CIPHER_CTX_cleanup(evpCtx);
  26109. #ifdef WOLFSSL_SMALL_STACK
  26110. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26111. #endif
  26112. return ret;
  26113. }
  26114. /* Set the callback to use when encrypting/decrypting tickets.
  26115. *
  26116. * ctx The SSL/TLS context object.
  26117. * cb The OpenSSL session ticket callback.
  26118. * returns WOLFSSL_SUCCESS to indicate success.
  26119. */
  26120. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  26121. {
  26122. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  26123. * callback.
  26124. */
  26125. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  26126. ctx->ticketEncWrapCb = cb;
  26127. return WOLFSSL_SUCCESS;
  26128. }
  26129. #endif /* HAVE_SESSION_TICKET */
  26130. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  26131. OPENSSL_EXTRA || HAVE_LIGHTY */
  26132. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  26133. !defined(NO_WOLFSSL_SERVER)
  26134. /* Serialize the session ticket encryption keys.
  26135. *
  26136. * @param [in] ctx SSL/TLS context object.
  26137. * @param [in] keys Buffer to hold session ticket keys.
  26138. * @param [in] keylen Length of buffer.
  26139. * @return WOLFSSL_SUCCESS on success.
  26140. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  26141. * correct length.
  26142. */
  26143. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  26144. unsigned char *keys, int keylen)
  26145. {
  26146. if (ctx == NULL || keys == NULL) {
  26147. return WOLFSSL_FAILURE;
  26148. }
  26149. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  26150. return WOLFSSL_FAILURE;
  26151. }
  26152. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  26153. keys += WOLFSSL_TICKET_NAME_SZ;
  26154. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  26155. keys += WOLFSSL_TICKET_KEY_SZ;
  26156. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  26157. keys += WOLFSSL_TICKET_KEY_SZ;
  26158. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  26159. keys += OPAQUE32_LEN;
  26160. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  26161. return WOLFSSL_SUCCESS;
  26162. }
  26163. /* Deserialize the session ticket encryption keys.
  26164. *
  26165. * @param [in] ctx SSL/TLS context object.
  26166. * @param [in] keys Session ticket keys.
  26167. * @param [in] keylen Length of data.
  26168. * @return WOLFSSL_SUCCESS on success.
  26169. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  26170. * correct length.
  26171. */
  26172. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  26173. unsigned char *keys, int keylen)
  26174. {
  26175. if (ctx == NULL || keys == NULL) {
  26176. return WOLFSSL_FAILURE;
  26177. }
  26178. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  26179. return WOLFSSL_FAILURE;
  26180. }
  26181. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  26182. keys += WOLFSSL_TICKET_NAME_SZ;
  26183. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  26184. keys += WOLFSSL_TICKET_KEY_SZ;
  26185. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  26186. keys += WOLFSSL_TICKET_KEY_SZ;
  26187. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  26188. keys += OPAQUE32_LEN;
  26189. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  26190. return WOLFSSL_SUCCESS;
  26191. }
  26192. #endif
  26193. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  26194. #ifdef HAVE_OCSP
  26195. /* Not an OpenSSL API. */
  26196. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  26197. {
  26198. *response = ssl->ocspResp;
  26199. return ssl->ocspRespSz;
  26200. }
  26201. /* Not an OpenSSL API. */
  26202. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  26203. {
  26204. return ssl->url;
  26205. }
  26206. /* Not an OpenSSL API. */
  26207. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  26208. {
  26209. if (ssl == NULL)
  26210. return WOLFSSL_FAILURE;
  26211. ssl->url = url;
  26212. return WOLFSSL_SUCCESS;
  26213. }
  26214. #endif /* OCSP */
  26215. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  26216. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  26217. int wolfSSL_get_ocsp_producedDate(
  26218. WOLFSSL *ssl,
  26219. byte *producedDate,
  26220. size_t producedDate_space,
  26221. int *producedDateFormat)
  26222. {
  26223. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  26224. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  26225. return BAD_FUNC_ARG;
  26226. if ((producedDate == NULL) || (producedDateFormat == NULL))
  26227. return BAD_FUNC_ARG;
  26228. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  26229. return BUFFER_E;
  26230. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  26231. *producedDateFormat = ssl->ocspProducedDateFormat;
  26232. return 0;
  26233. }
  26234. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  26235. int idx = 0;
  26236. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  26237. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  26238. return BAD_FUNC_ARG;
  26239. if (produced_tm == NULL)
  26240. return BAD_FUNC_ARG;
  26241. if (ExtractDate(ssl->ocspProducedDate,
  26242. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  26243. return 0;
  26244. else
  26245. return ASN_PARSE_E;
  26246. }
  26247. #endif
  26248. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  26249. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  26250. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  26251. {
  26252. word32 idx;
  26253. word32 length;
  26254. WOLFSSL_STACK* node;
  26255. WOLFSSL_STACK* last = NULL;
  26256. if (ctx == NULL || chain == NULL) {
  26257. chain = NULL;
  26258. return WOLFSSL_FAILURE;
  26259. }
  26260. if (ctx->x509Chain != NULL) {
  26261. *chain = ctx->x509Chain;
  26262. return WOLFSSL_SUCCESS;
  26263. }
  26264. /* If there are no chains then success! */
  26265. *chain = NULL;
  26266. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  26267. return WOLFSSL_SUCCESS;
  26268. }
  26269. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  26270. for (idx = 0; idx < ctx->certChain->length; ) {
  26271. node = wolfSSL_sk_X509_new_null();
  26272. if (node == NULL)
  26273. return WOLFSSL_FAILURE;
  26274. node->next = NULL;
  26275. /* 3 byte length | X509 DER data */
  26276. ato24(ctx->certChain->buffer + idx, &length);
  26277. idx += 3;
  26278. /* Create a new X509 from DER encoded data. */
  26279. node->data.x509 = wolfSSL_X509_d2i_ex(NULL,
  26280. ctx->certChain->buffer + idx, length, ctx->heap);
  26281. if (node->data.x509 == NULL) {
  26282. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  26283. /* Return as much of the chain as we created. */
  26284. ctx->x509Chain = *chain;
  26285. return WOLFSSL_FAILURE;
  26286. }
  26287. idx += length;
  26288. /* Add object to the end of the stack. */
  26289. if (last == NULL) {
  26290. node->num = 1;
  26291. *chain = node;
  26292. }
  26293. else {
  26294. (*chain)->num++;
  26295. last->next = node;
  26296. }
  26297. last = node;
  26298. }
  26299. ctx->x509Chain = *chain;
  26300. return WOLFSSL_SUCCESS;
  26301. }
  26302. int wolfSSL_CTX_get_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb* cb)
  26303. {
  26304. if (ctx == NULL || ctx->cm == NULL || cb == NULL)
  26305. return WOLFSSL_FAILURE;
  26306. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  26307. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  26308. if (ctx->cm->ocsp_stapling == NULL)
  26309. return WOLFSSL_FAILURE;
  26310. *cb = ctx->cm->ocsp_stapling->statusCb;
  26311. #else
  26312. (void)cb;
  26313. *cb = NULL;
  26314. #endif
  26315. return WOLFSSL_SUCCESS;
  26316. }
  26317. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb cb)
  26318. {
  26319. if (ctx == NULL || ctx->cm == NULL)
  26320. return WOLFSSL_FAILURE;
  26321. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  26322. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  26323. /* Ensure stapling is on for callback to be used. */
  26324. wolfSSL_CTX_EnableOCSPStapling(ctx);
  26325. if (ctx->cm->ocsp_stapling == NULL)
  26326. return WOLFSSL_FAILURE;
  26327. ctx->cm->ocsp_stapling->statusCb = cb;
  26328. #else
  26329. (void)cb;
  26330. #endif
  26331. return WOLFSSL_SUCCESS;
  26332. }
  26333. int wolfSSL_CTX_get0_chain_certs(WOLFSSL_CTX *ctx,
  26334. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  26335. {
  26336. WOLFSSL_ENTER("wolfSSL_CTX_get0_chain_certs");
  26337. if (ctx == NULL || sk == NULL) {
  26338. WOLFSSL_MSG("Bad parameter");
  26339. return WOLFSSL_FAILURE;
  26340. }
  26341. /* This function should return ctx->x509Chain if it is populated, otherwise
  26342. it should be populated from ctx->certChain. This matches the behavior of
  26343. wolfSSL_CTX_get_extra_chain_certs, so it is used directly. */
  26344. return wolfSSL_CTX_get_extra_chain_certs(ctx, sk);
  26345. }
  26346. #ifdef KEEP_OUR_CERT
  26347. int wolfSSL_get0_chain_certs(WOLFSSL *ssl,
  26348. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  26349. {
  26350. WOLFSSL_ENTER("wolfSSL_get0_chain_certs");
  26351. if (ssl == NULL || sk == NULL) {
  26352. WOLFSSL_MSG("Bad parameter");
  26353. return WOLFSSL_FAILURE;
  26354. }
  26355. *sk = ssl->ourCertChain;
  26356. return WOLFSSL_SUCCESS;
  26357. }
  26358. #endif
  26359. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  26360. {
  26361. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  26362. if (ret) {
  26363. ret->type = STACK_TYPE_STRING;
  26364. }
  26365. return ret;
  26366. }
  26367. void wolfSSL_WOLFSSL_STRING_free(WOLFSSL_STRING s)
  26368. {
  26369. WOLFSSL_ENTER("wolfSSL_WOLFSSL_STRING_free");
  26370. if (s != NULL)
  26371. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  26372. }
  26373. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  26374. {
  26375. WOLFSSL_STACK* tmp;
  26376. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  26377. if (sk == NULL)
  26378. return;
  26379. /* parse through stack freeing each node */
  26380. while (sk) {
  26381. tmp = sk->next;
  26382. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  26383. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  26384. sk = tmp;
  26385. }
  26386. }
  26387. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  26388. int idx)
  26389. {
  26390. for (; idx > 0 && strings != NULL; idx--)
  26391. strings = strings->next;
  26392. if (strings == NULL)
  26393. return NULL;
  26394. return strings->data.string;
  26395. }
  26396. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  26397. {
  26398. if (strings)
  26399. return (int)strings->num;
  26400. return 0;
  26401. }
  26402. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  26403. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  26404. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) || \
  26405. defined(WOLFSSL_QUIC)
  26406. #ifdef HAVE_ALPN
  26407. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  26408. unsigned int *len)
  26409. {
  26410. word16 nameLen;
  26411. if (ssl != NULL && data != NULL && len != NULL) {
  26412. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  26413. *len = nameLen;
  26414. }
  26415. }
  26416. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  26417. const unsigned char *in, unsigned int inLen,
  26418. const unsigned char *clientNames,
  26419. unsigned int clientLen)
  26420. {
  26421. unsigned int i, j;
  26422. byte lenIn, lenClient;
  26423. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  26424. return OPENSSL_NPN_UNSUPPORTED;
  26425. for (i = 0; i < inLen; i += lenIn) {
  26426. lenIn = in[i++];
  26427. for (j = 0; j < clientLen; j += lenClient) {
  26428. lenClient = clientNames[j++];
  26429. if (lenIn != lenClient)
  26430. continue;
  26431. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  26432. *out = (unsigned char *)(in + i);
  26433. *outLen = lenIn;
  26434. return OPENSSL_NPN_NEGOTIATED;
  26435. }
  26436. }
  26437. }
  26438. *out = (unsigned char *)clientNames + 1;
  26439. *outLen = clientNames[0];
  26440. return OPENSSL_NPN_NO_OVERLAP;
  26441. }
  26442. void wolfSSL_set_alpn_select_cb(WOLFSSL *ssl,
  26443. int (*cb) (WOLFSSL *ssl,
  26444. const unsigned char **out,
  26445. unsigned char *outlen,
  26446. const unsigned char *in,
  26447. unsigned int inlen,
  26448. void *arg), void *arg)
  26449. {
  26450. if (ssl != NULL) {
  26451. ssl->alpnSelect = cb;
  26452. ssl->alpnSelectArg = arg;
  26453. }
  26454. }
  26455. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  26456. int (*cb) (WOLFSSL *ssl,
  26457. const unsigned char **out,
  26458. unsigned char *outlen,
  26459. const unsigned char *in,
  26460. unsigned int inlen,
  26461. void *arg), void *arg)
  26462. {
  26463. if (ctx != NULL) {
  26464. ctx->alpnSelect = cb;
  26465. ctx->alpnSelectArg = arg;
  26466. }
  26467. }
  26468. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  26469. int (*cb) (WOLFSSL *ssl,
  26470. const unsigned char
  26471. **out,
  26472. unsigned int *outlen,
  26473. void *arg), void *arg)
  26474. {
  26475. (void)s;
  26476. (void)cb;
  26477. (void)arg;
  26478. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  26479. }
  26480. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  26481. int (*cb) (WOLFSSL *ssl,
  26482. unsigned char **out,
  26483. unsigned char *outlen,
  26484. const unsigned char *in,
  26485. unsigned int inlen,
  26486. void *arg), void *arg)
  26487. {
  26488. (void)s;
  26489. (void)cb;
  26490. (void)arg;
  26491. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  26492. }
  26493. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  26494. unsigned *len)
  26495. {
  26496. (void)s;
  26497. (void)data;
  26498. (void)len;
  26499. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  26500. }
  26501. #endif /* HAVE_ALPN */
  26502. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  26503. #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
  26504. int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, word16 curve_id)
  26505. {
  26506. if (curve_id >= WOLFSSL_FFDHE_START) {
  26507. /* DH parameters are never disabled. */
  26508. return 0;
  26509. }
  26510. if (curve_id > WOLFSSL_ECC_MAX_AVAIL) {
  26511. WOLFSSL_MSG("Curve id out of supported range");
  26512. /* Disabled if not in valid range. */
  26513. return 1;
  26514. }
  26515. if (curve_id >= 32) {
  26516. /* 0 is for invalid and 1-14 aren't used otherwise. */
  26517. return (ssl->disabledCurves & (1U << (curve_id - 32))) != 0;
  26518. }
  26519. return (ssl->disabledCurves & (1U << curve_id)) != 0;
  26520. }
  26521. #if (defined(HAVE_ECC) || \
  26522. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  26523. static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
  26524. {
  26525. int idx, start = 0, len, i, ret = WOLFSSL_FAILURE;
  26526. word16 curve;
  26527. word32 disabled;
  26528. char name[MAX_CURVE_NAME_SZ];
  26529. byte groups_len = 0;
  26530. #ifdef WOLFSSL_SMALL_STACK
  26531. void *heap = ssl? ssl->heap : ctx ? ctx->heap : NULL;
  26532. int *groups;
  26533. #else
  26534. int groups[WOLFSSL_MAX_GROUP_COUNT];
  26535. #endif
  26536. #ifdef WOLFSSL_SMALL_STACK
  26537. groups = (int*)XMALLOC(sizeof(int)*WOLFSSL_MAX_GROUP_COUNT,
  26538. heap, DYNAMIC_TYPE_TMP_BUFFER);
  26539. if (groups == NULL) {
  26540. ret = MEMORY_E;
  26541. goto leave;
  26542. }
  26543. #endif
  26544. for (idx = 1; names[idx-1] != '\0'; idx++) {
  26545. if (names[idx] != ':' && names[idx] != '\0')
  26546. continue;
  26547. len = idx - start;
  26548. if (len > MAX_CURVE_NAME_SZ - 1)
  26549. goto leave;
  26550. XMEMCPY(name, names + start, len);
  26551. name[len++] = 0;
  26552. /* Use XSTRNCMP to avoid valgrind error. */
  26553. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  26554. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  26555. (XSTRNCMP(name, "P-256", len) == 0))
  26556. {
  26557. curve = WOLFSSL_ECC_SECP256R1;
  26558. }
  26559. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  26560. (XSTRNCMP(name, "P-384", len) == 0))
  26561. {
  26562. curve = WOLFSSL_ECC_SECP384R1;
  26563. }
  26564. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  26565. (XSTRNCMP(name, "P-521", len) == 0))
  26566. {
  26567. curve = WOLFSSL_ECC_SECP521R1;
  26568. }
  26569. #ifdef WOLFSSL_SM2
  26570. else if ((XSTRNCMP(name, "sm2p256v1", len) == 0) ||
  26571. (XSTRNCMP(name, "SM2", len) == 0))
  26572. {
  26573. curve = WOLFSSL_ECC_SM2P256V1;
  26574. }
  26575. #endif
  26576. #ifdef HAVE_CURVE25519
  26577. else if (XSTRNCMP(name, "X25519", len) == 0)
  26578. {
  26579. curve = WOLFSSL_ECC_X25519;
  26580. }
  26581. #endif
  26582. #ifdef HAVE_CURVE448
  26583. else if (XSTRNCMP(name, "X448", len) == 0)
  26584. {
  26585. curve = WOLFSSL_ECC_X448;
  26586. }
  26587. #endif
  26588. else {
  26589. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  26590. int nret;
  26591. const ecc_set_type *eccSet;
  26592. nret = wc_ecc_get_curve_idx_from_name(name);
  26593. if (nret < 0) {
  26594. WOLFSSL_MSG("Could not find name in set");
  26595. goto leave;
  26596. }
  26597. eccSet = wc_ecc_get_curve_params(ret);
  26598. if (eccSet == NULL) {
  26599. WOLFSSL_MSG("NULL set returned");
  26600. goto leave;
  26601. }
  26602. curve = GetCurveByOID(eccSet->oidSum);
  26603. #else
  26604. WOLFSSL_MSG("API not present to search farther using name");
  26605. goto leave;
  26606. #endif
  26607. }
  26608. if (curve >= WOLFSSL_ECC_MAX_AVAIL) {
  26609. WOLFSSL_MSG("curve value is not supported");
  26610. goto leave;
  26611. }
  26612. for (i = 0; i < groups_len; ++i) {
  26613. if (groups[i] == curve) {
  26614. /* silently drop duplicates */
  26615. break;
  26616. }
  26617. }
  26618. if (i >= groups_len) {
  26619. if (groups_len >= WOLFSSL_MAX_GROUP_COUNT) {
  26620. WOLFSSL_MSG_EX("setting %d or more supported "
  26621. "curves is not permitted", groups_len);
  26622. goto leave;
  26623. }
  26624. groups[groups_len++] = (int)curve;
  26625. }
  26626. start = idx + 1;
  26627. }
  26628. /* Disable all curves so that only the ones the user wants are enabled. */
  26629. disabled = 0xFFFFFFFFUL;
  26630. for (i = 0; i < groups_len; ++i) {
  26631. /* Switch the bit to off and therefore is enabled. */
  26632. curve = (word16)groups[i];
  26633. if (curve >= 32) {
  26634. /* 0 is for invalid and 1-14 aren't used otherwise. */
  26635. disabled &= ~(1U << (curve - 32));
  26636. }
  26637. else {
  26638. disabled &= ~(1U << curve);
  26639. }
  26640. #ifdef HAVE_SUPPORTED_CURVES
  26641. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_OLD_SET_CURVES_LIST)
  26642. /* using the wolfSSL API to set the groups, this will populate
  26643. * (ssl|ctx)->groups and reset any TLSX_SUPPORTED_GROUPS.
  26644. * The order in (ssl|ctx)->groups will then be respected
  26645. * when TLSX_KEY_SHARE needs to be established */
  26646. if ((ssl && wolfSSL_set_groups(ssl, groups, groups_len)
  26647. != WOLFSSL_SUCCESS)
  26648. || (ctx && wolfSSL_CTX_set_groups(ctx, groups, groups_len)
  26649. != WOLFSSL_SUCCESS)) {
  26650. WOLFSSL_MSG("Unable to set supported curve");
  26651. goto leave;
  26652. }
  26653. #elif !defined(NO_WOLFSSL_CLIENT)
  26654. /* set the supported curve so client TLS extension contains only the
  26655. * desired curves */
  26656. if ((ssl && wolfSSL_UseSupportedCurve(ssl, curve) != WOLFSSL_SUCCESS)
  26657. || (ctx && wolfSSL_CTX_UseSupportedCurve(ctx, curve)
  26658. != WOLFSSL_SUCCESS)) {
  26659. WOLFSSL_MSG("Unable to set supported curve");
  26660. goto leave;
  26661. }
  26662. #endif
  26663. #endif /* HAVE_SUPPORTED_CURVES */
  26664. }
  26665. if (ssl)
  26666. ssl->disabledCurves = disabled;
  26667. else
  26668. ctx->disabledCurves = disabled;
  26669. ret = WOLFSSL_SUCCESS;
  26670. leave:
  26671. #ifdef WOLFSSL_SMALL_STACK
  26672. if (groups)
  26673. XFREE((void*)groups, heap, DYNAMIC_TYPE_TMP_BUFFER);
  26674. #endif
  26675. return ret;
  26676. }
  26677. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  26678. {
  26679. if (ctx == NULL || names == NULL) {
  26680. WOLFSSL_MSG("ctx or names was NULL");
  26681. return WOLFSSL_FAILURE;
  26682. }
  26683. return set_curves_list(NULL, ctx, names);
  26684. }
  26685. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  26686. {
  26687. if (ssl == NULL || names == NULL) {
  26688. WOLFSSL_MSG("ssl or names was NULL");
  26689. return WOLFSSL_FAILURE;
  26690. }
  26691. return set_curves_list(ssl, NULL, names);
  26692. }
  26693. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) */
  26694. #endif /* OPENSSL_EXTRA || HAVE_CURL */
  26695. #ifdef OPENSSL_EXTRA
  26696. /* Sets a callback for when sending and receiving protocol messages.
  26697. * This callback is copied to all WOLFSSL objects created from the ctx.
  26698. *
  26699. * ctx WOLFSSL_CTX structure to set callback in
  26700. * cb callback to use
  26701. *
  26702. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE with error case
  26703. */
  26704. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  26705. {
  26706. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback");
  26707. if (ctx == NULL) {
  26708. WOLFSSL_MSG("Null ctx passed in");
  26709. return WOLFSSL_FAILURE;
  26710. }
  26711. ctx->protoMsgCb = cb;
  26712. return WOLFSSL_SUCCESS;
  26713. }
  26714. /* Sets a callback for when sending and receiving protocol messages.
  26715. *
  26716. * ssl WOLFSSL structure to set callback in
  26717. * cb callback to use
  26718. *
  26719. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE with error case
  26720. */
  26721. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  26722. {
  26723. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  26724. if (ssl == NULL) {
  26725. return WOLFSSL_FAILURE;
  26726. }
  26727. if (cb != NULL) {
  26728. ssl->toInfoOn = 1;
  26729. }
  26730. ssl->protoMsgCb = cb;
  26731. return WOLFSSL_SUCCESS;
  26732. }
  26733. /* set the user argument to pass to the msg callback when called
  26734. * return WOLFSSL_SUCCESS on success */
  26735. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  26736. {
  26737. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback_arg");
  26738. if (ctx == NULL) {
  26739. WOLFSSL_MSG("Null WOLFSSL_CTX passed in");
  26740. return WOLFSSL_FAILURE;
  26741. }
  26742. ctx->protoMsgCtx = arg;
  26743. return WOLFSSL_SUCCESS;
  26744. }
  26745. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  26746. {
  26747. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  26748. if (ssl == NULL)
  26749. return WOLFSSL_FAILURE;
  26750. ssl->protoMsgCtx = arg;
  26751. return WOLFSSL_SUCCESS;
  26752. }
  26753. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  26754. {
  26755. void *ret;
  26756. (void)file;
  26757. (void)line;
  26758. if (data == NULL || siz >= INT_MAX)
  26759. return NULL;
  26760. ret = OPENSSL_malloc(siz);
  26761. if (ret == NULL) {
  26762. return NULL;
  26763. }
  26764. return XMEMCPY(ret, data, siz);
  26765. }
  26766. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  26767. {
  26768. if (ptr)
  26769. ForceZero(ptr, (word32)len);
  26770. }
  26771. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  26772. unsigned int p_len)
  26773. {
  26774. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  26775. if (ctx == NULL)
  26776. return BAD_FUNC_ARG;
  26777. if (ctx->alpn_cli_protos != NULL) {
  26778. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  26779. }
  26780. ctx->alpn_cli_protos = (const unsigned char*)XMALLOC(p_len,
  26781. ctx->heap, DYNAMIC_TYPE_OPENSSL);
  26782. if (ctx->alpn_cli_protos == NULL) {
  26783. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26784. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26785. * the function reverses the return value convention.
  26786. */
  26787. return 1;
  26788. #else
  26789. return WOLFSSL_FAILURE;
  26790. #endif
  26791. }
  26792. XMEMCPY((void*)ctx->alpn_cli_protos, p, p_len);
  26793. ctx->alpn_cli_protos_len = p_len;
  26794. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26795. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26796. * the function reverses the return value convention.
  26797. */
  26798. return 0;
  26799. #else
  26800. return WOLFSSL_SUCCESS;
  26801. #endif
  26802. }
  26803. #ifdef HAVE_ALPN
  26804. #ifndef NO_BIO
  26805. /* Sets the ALPN extension protos
  26806. *
  26807. * example format is
  26808. * unsigned char p[] = {
  26809. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  26810. * };
  26811. *
  26812. * returns WOLFSSL_SUCCESS on success */
  26813. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  26814. const unsigned char* p, unsigned int p_len)
  26815. {
  26816. WOLFSSL_BIO* bio;
  26817. char* pt = NULL;
  26818. unsigned int sz;
  26819. unsigned int idx = 0;
  26820. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  26821. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  26822. if (ssl == NULL || p_len <= 1) {
  26823. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26824. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26825. * the function reverses the return value convention.
  26826. */
  26827. return 1;
  26828. #else
  26829. return WOLFSSL_FAILURE;
  26830. #endif
  26831. }
  26832. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  26833. if (bio == NULL) {
  26834. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26835. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26836. * the function reverses the return value convention.
  26837. */
  26838. return 1;
  26839. #else
  26840. return WOLFSSL_FAILURE;
  26841. #endif
  26842. }
  26843. /* convert into comma separated list */
  26844. while (idx < p_len - 1) {
  26845. unsigned int i;
  26846. sz = p[idx++];
  26847. if (idx + sz > p_len) {
  26848. WOLFSSL_MSG("Bad list format");
  26849. wolfSSL_BIO_free(bio);
  26850. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26851. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26852. * the function reverses the return value convention.
  26853. */
  26854. return 1;
  26855. #else
  26856. return WOLFSSL_FAILURE;
  26857. #endif
  26858. }
  26859. if (sz > 0) {
  26860. for (i = 0; i < sz; i++) {
  26861. wolfSSL_BIO_write(bio, &p[idx++], 1);
  26862. }
  26863. if (idx < p_len - 1)
  26864. wolfSSL_BIO_write(bio, ",", 1);
  26865. }
  26866. }
  26867. wolfSSL_BIO_write(bio, "\0", 1);
  26868. /* clears out all current ALPN extensions set */
  26869. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  26870. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  26871. wolfSSL_UseALPN(ssl, pt, sz, (byte) alpn_opt);
  26872. }
  26873. wolfSSL_BIO_free(bio);
  26874. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26875. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26876. * the function reverses the return value convention.
  26877. */
  26878. return 0;
  26879. #else
  26880. return WOLFSSL_SUCCESS;
  26881. #endif
  26882. }
  26883. #endif /* !NO_BIO */
  26884. #endif /* HAVE_ALPN */
  26885. #endif /* OPENSSL_EXTRA */
  26886. #if defined(OPENSSL_EXTRA)
  26887. #ifndef NO_BIO
  26888. #define WOLFSSL_BIO_INCLUDED
  26889. #include "src/bio.c"
  26890. #endif
  26891. word32 nid2oid(int nid, int grp)
  26892. {
  26893. /* get OID type */
  26894. switch (grp) {
  26895. /* oidHashType */
  26896. case oidHashType:
  26897. switch (nid) {
  26898. #ifdef WOLFSSL_MD2
  26899. case NID_md2:
  26900. return MD2h;
  26901. #endif
  26902. #ifndef NO_MD5
  26903. case NID_md5:
  26904. return MD5h;
  26905. #endif
  26906. #ifndef NO_SHA
  26907. case NID_sha1:
  26908. return SHAh;
  26909. #endif
  26910. case NID_sha224:
  26911. return SHA224h;
  26912. #ifndef NO_SHA256
  26913. case NID_sha256:
  26914. return SHA256h;
  26915. #endif
  26916. #ifdef WOLFSSL_SHA384
  26917. case NID_sha384:
  26918. return SHA384h;
  26919. #endif
  26920. #ifdef WOLFSSL_SHA512
  26921. case NID_sha512:
  26922. return SHA512h;
  26923. #endif
  26924. #ifndef WOLFSSL_NOSHA3_224
  26925. case NID_sha3_224:
  26926. return SHA3_224h;
  26927. #endif
  26928. #ifndef WOLFSSL_NOSHA3_256
  26929. case NID_sha3_256:
  26930. return SHA3_256h;
  26931. #endif
  26932. #ifndef WOLFSSL_NOSHA3_384
  26933. case NID_sha3_384:
  26934. return SHA3_384h;
  26935. #endif
  26936. #ifndef WOLFSSL_NOSHA3_512
  26937. case NID_sha3_512:
  26938. return SHA3_512h;
  26939. #endif
  26940. }
  26941. break;
  26942. /* oidSigType */
  26943. case oidSigType:
  26944. switch (nid) {
  26945. #ifndef NO_DSA
  26946. case NID_dsaWithSHA1:
  26947. return CTC_SHAwDSA;
  26948. case NID_dsa_with_SHA256:
  26949. return CTC_SHA256wDSA;
  26950. #endif /* NO_DSA */
  26951. #ifndef NO_RSA
  26952. case NID_md2WithRSAEncryption:
  26953. return CTC_MD2wRSA;
  26954. case NID_md5WithRSAEncryption:
  26955. return CTC_MD5wRSA;
  26956. case NID_sha1WithRSAEncryption:
  26957. return CTC_SHAwRSA;
  26958. case NID_sha224WithRSAEncryption:
  26959. return CTC_SHA224wRSA;
  26960. case NID_sha256WithRSAEncryption:
  26961. return CTC_SHA256wRSA;
  26962. case NID_sha384WithRSAEncryption:
  26963. return CTC_SHA384wRSA;
  26964. case NID_sha512WithRSAEncryption:
  26965. return CTC_SHA512wRSA;
  26966. #ifdef WOLFSSL_SHA3
  26967. case NID_RSA_SHA3_224:
  26968. return CTC_SHA3_224wRSA;
  26969. case NID_RSA_SHA3_256:
  26970. return CTC_SHA3_256wRSA;
  26971. case NID_RSA_SHA3_384:
  26972. return CTC_SHA3_384wRSA;
  26973. case NID_RSA_SHA3_512:
  26974. return CTC_SHA3_512wRSA;
  26975. #endif
  26976. #endif /* NO_RSA */
  26977. #ifdef HAVE_ECC
  26978. case NID_ecdsa_with_SHA1:
  26979. return CTC_SHAwECDSA;
  26980. case NID_ecdsa_with_SHA224:
  26981. return CTC_SHA224wECDSA;
  26982. case NID_ecdsa_with_SHA256:
  26983. return CTC_SHA256wECDSA;
  26984. case NID_ecdsa_with_SHA384:
  26985. return CTC_SHA384wECDSA;
  26986. case NID_ecdsa_with_SHA512:
  26987. return CTC_SHA512wECDSA;
  26988. #ifdef WOLFSSL_SHA3
  26989. case NID_ecdsa_with_SHA3_224:
  26990. return CTC_SHA3_224wECDSA;
  26991. case NID_ecdsa_with_SHA3_256:
  26992. return CTC_SHA3_256wECDSA;
  26993. case NID_ecdsa_with_SHA3_384:
  26994. return CTC_SHA3_384wECDSA;
  26995. case NID_ecdsa_with_SHA3_512:
  26996. return CTC_SHA3_512wECDSA;
  26997. #endif
  26998. #endif /* HAVE_ECC */
  26999. }
  27000. break;
  27001. /* oidKeyType */
  27002. case oidKeyType:
  27003. switch (nid) {
  27004. #ifndef NO_DSA
  27005. case NID_dsa:
  27006. return DSAk;
  27007. #endif /* NO_DSA */
  27008. #ifndef NO_RSA
  27009. case NID_rsaEncryption:
  27010. return RSAk;
  27011. #endif /* NO_RSA */
  27012. #ifdef HAVE_ECC
  27013. case NID_X9_62_id_ecPublicKey:
  27014. return ECDSAk;
  27015. #endif /* HAVE_ECC */
  27016. }
  27017. break;
  27018. #ifdef HAVE_ECC
  27019. case oidCurveType:
  27020. switch (nid) {
  27021. case NID_X9_62_prime192v1:
  27022. return ECC_SECP192R1_OID;
  27023. case NID_X9_62_prime192v2:
  27024. return ECC_PRIME192V2_OID;
  27025. case NID_X9_62_prime192v3:
  27026. return ECC_PRIME192V3_OID;
  27027. case NID_X9_62_prime239v1:
  27028. return ECC_PRIME239V1_OID;
  27029. case NID_X9_62_prime239v2:
  27030. return ECC_PRIME239V2_OID;
  27031. case NID_X9_62_prime239v3:
  27032. return ECC_PRIME239V3_OID;
  27033. case NID_X9_62_prime256v1:
  27034. return ECC_SECP256R1_OID;
  27035. case NID_secp112r1:
  27036. return ECC_SECP112R1_OID;
  27037. case NID_secp112r2:
  27038. return ECC_SECP112R2_OID;
  27039. case NID_secp128r1:
  27040. return ECC_SECP128R1_OID;
  27041. case NID_secp128r2:
  27042. return ECC_SECP128R2_OID;
  27043. case NID_secp160r1:
  27044. return ECC_SECP160R1_OID;
  27045. case NID_secp160r2:
  27046. return ECC_SECP160R2_OID;
  27047. case NID_secp224r1:
  27048. return ECC_SECP224R1_OID;
  27049. case NID_secp384r1:
  27050. return ECC_SECP384R1_OID;
  27051. case NID_secp521r1:
  27052. return ECC_SECP521R1_OID;
  27053. case NID_secp160k1:
  27054. return ECC_SECP160K1_OID;
  27055. case NID_secp192k1:
  27056. return ECC_SECP192K1_OID;
  27057. case NID_secp224k1:
  27058. return ECC_SECP224K1_OID;
  27059. case NID_secp256k1:
  27060. return ECC_SECP256K1_OID;
  27061. case NID_brainpoolP160r1:
  27062. return ECC_BRAINPOOLP160R1_OID;
  27063. case NID_brainpoolP192r1:
  27064. return ECC_BRAINPOOLP192R1_OID;
  27065. case NID_brainpoolP224r1:
  27066. return ECC_BRAINPOOLP224R1_OID;
  27067. case NID_brainpoolP256r1:
  27068. return ECC_BRAINPOOLP256R1_OID;
  27069. case NID_brainpoolP320r1:
  27070. return ECC_BRAINPOOLP320R1_OID;
  27071. case NID_brainpoolP384r1:
  27072. return ECC_BRAINPOOLP384R1_OID;
  27073. case NID_brainpoolP512r1:
  27074. return ECC_BRAINPOOLP512R1_OID;
  27075. }
  27076. break;
  27077. #endif /* HAVE_ECC */
  27078. /* oidBlkType */
  27079. case oidBlkType:
  27080. switch (nid) {
  27081. #ifdef WOLFSSL_AES_128
  27082. case AES128CBCb:
  27083. return AES128CBCb;
  27084. #endif
  27085. #ifdef WOLFSSL_AES_192
  27086. case AES192CBCb:
  27087. return AES192CBCb;
  27088. #endif
  27089. #ifdef WOLFSSL_AES_256
  27090. case AES256CBCb:
  27091. return AES256CBCb;
  27092. #endif
  27093. #ifndef NO_DES3
  27094. case NID_des:
  27095. return DESb;
  27096. case NID_des3:
  27097. return DES3b;
  27098. #endif
  27099. }
  27100. break;
  27101. #ifdef HAVE_OCSP
  27102. case oidOcspType:
  27103. switch (nid) {
  27104. case NID_id_pkix_OCSP_basic:
  27105. return OCSP_BASIC_OID;
  27106. case OCSP_NONCE_OID:
  27107. return OCSP_NONCE_OID;
  27108. }
  27109. break;
  27110. #endif /* HAVE_OCSP */
  27111. /* oidCertExtType */
  27112. case oidCertExtType:
  27113. switch (nid) {
  27114. case NID_basic_constraints:
  27115. return BASIC_CA_OID;
  27116. case NID_subject_alt_name:
  27117. return ALT_NAMES_OID;
  27118. case NID_crl_distribution_points:
  27119. return CRL_DIST_OID;
  27120. case NID_info_access:
  27121. return AUTH_INFO_OID;
  27122. case NID_authority_key_identifier:
  27123. return AUTH_KEY_OID;
  27124. case NID_subject_key_identifier:
  27125. return SUBJ_KEY_OID;
  27126. case NID_inhibit_any_policy:
  27127. return INHIBIT_ANY_OID;
  27128. case NID_key_usage:
  27129. return KEY_USAGE_OID;
  27130. case NID_name_constraints:
  27131. return NAME_CONS_OID;
  27132. case NID_certificate_policies:
  27133. return CERT_POLICY_OID;
  27134. case NID_ext_key_usage:
  27135. return EXT_KEY_USAGE_OID;
  27136. }
  27137. break;
  27138. /* oidCertAuthInfoType */
  27139. case oidCertAuthInfoType:
  27140. switch (nid) {
  27141. case NID_ad_OCSP:
  27142. return AIA_OCSP_OID;
  27143. case NID_ad_ca_issuers:
  27144. return AIA_CA_ISSUER_OID;
  27145. }
  27146. break;
  27147. /* oidCertPolicyType */
  27148. case oidCertPolicyType:
  27149. switch (nid) {
  27150. case NID_any_policy:
  27151. return CP_ANY_OID;
  27152. }
  27153. break;
  27154. /* oidCertAltNameType */
  27155. case oidCertAltNameType:
  27156. switch (nid) {
  27157. case NID_hw_name_oid:
  27158. return HW_NAME_OID;
  27159. }
  27160. break;
  27161. /* oidCertKeyUseType */
  27162. case oidCertKeyUseType:
  27163. switch (nid) {
  27164. case NID_anyExtendedKeyUsage:
  27165. return EKU_ANY_OID;
  27166. case EKU_SERVER_AUTH_OID:
  27167. return EKU_SERVER_AUTH_OID;
  27168. case EKU_CLIENT_AUTH_OID:
  27169. return EKU_CLIENT_AUTH_OID;
  27170. case EKU_OCSP_SIGN_OID:
  27171. return EKU_OCSP_SIGN_OID;
  27172. }
  27173. break;
  27174. /* oidKdfType */
  27175. case oidKdfType:
  27176. switch (nid) {
  27177. case PBKDF2_OID:
  27178. return PBKDF2_OID;
  27179. }
  27180. break;
  27181. /* oidPBEType */
  27182. case oidPBEType:
  27183. switch (nid) {
  27184. case PBE_SHA1_RC4_128:
  27185. return PBE_SHA1_RC4_128;
  27186. case PBE_SHA1_DES:
  27187. return PBE_SHA1_DES;
  27188. case PBE_SHA1_DES3:
  27189. return PBE_SHA1_DES3;
  27190. }
  27191. break;
  27192. /* oidKeyWrapType */
  27193. case oidKeyWrapType:
  27194. switch (nid) {
  27195. #ifdef WOLFSSL_AES_128
  27196. case AES128_WRAP:
  27197. return AES128_WRAP;
  27198. #endif
  27199. #ifdef WOLFSSL_AES_192
  27200. case AES192_WRAP:
  27201. return AES192_WRAP;
  27202. #endif
  27203. #ifdef WOLFSSL_AES_256
  27204. case AES256_WRAP:
  27205. return AES256_WRAP;
  27206. #endif
  27207. }
  27208. break;
  27209. /* oidCmsKeyAgreeType */
  27210. case oidCmsKeyAgreeType:
  27211. switch (nid) {
  27212. #ifndef NO_SHA
  27213. case dhSinglePass_stdDH_sha1kdf_scheme:
  27214. return dhSinglePass_stdDH_sha1kdf_scheme;
  27215. #endif
  27216. #ifdef WOLFSSL_SHA224
  27217. case dhSinglePass_stdDH_sha224kdf_scheme:
  27218. return dhSinglePass_stdDH_sha224kdf_scheme;
  27219. #endif
  27220. #ifndef NO_SHA256
  27221. case dhSinglePass_stdDH_sha256kdf_scheme:
  27222. return dhSinglePass_stdDH_sha256kdf_scheme;
  27223. #endif
  27224. #ifdef WOLFSSL_SHA384
  27225. case dhSinglePass_stdDH_sha384kdf_scheme:
  27226. return dhSinglePass_stdDH_sha384kdf_scheme;
  27227. #endif
  27228. #ifdef WOLFSSL_SHA512
  27229. case dhSinglePass_stdDH_sha512kdf_scheme:
  27230. return dhSinglePass_stdDH_sha512kdf_scheme;
  27231. #endif
  27232. }
  27233. break;
  27234. /* oidCmsKeyAgreeType */
  27235. #ifdef WOLFSSL_CERT_REQ
  27236. case oidCsrAttrType:
  27237. switch (nid) {
  27238. case NID_pkcs9_contentType:
  27239. return PKCS9_CONTENT_TYPE_OID;
  27240. case NID_pkcs9_challengePassword:
  27241. return CHALLENGE_PASSWORD_OID;
  27242. case NID_serialNumber:
  27243. return SERIAL_NUMBER_OID;
  27244. case NID_userId:
  27245. return USER_ID_OID;
  27246. case NID_surname:
  27247. return SURNAME_OID;
  27248. }
  27249. break;
  27250. #endif
  27251. default:
  27252. WOLFSSL_MSG("NID not in table");
  27253. /* MSVC warns without the cast */
  27254. return (word32)-1;
  27255. }
  27256. /* MSVC warns without the cast */
  27257. return (word32)-1;
  27258. }
  27259. int oid2nid(word32 oid, int grp)
  27260. {
  27261. size_t i;
  27262. /* get OID type */
  27263. switch (grp) {
  27264. /* oidHashType */
  27265. case oidHashType:
  27266. switch (oid) {
  27267. #ifdef WOLFSSL_MD2
  27268. case MD2h:
  27269. return NID_md2;
  27270. #endif
  27271. #ifndef NO_MD5
  27272. case MD5h:
  27273. return NID_md5;
  27274. #endif
  27275. #ifndef NO_SHA
  27276. case SHAh:
  27277. return NID_sha1;
  27278. #endif
  27279. case SHA224h:
  27280. return NID_sha224;
  27281. #ifndef NO_SHA256
  27282. case SHA256h:
  27283. return NID_sha256;
  27284. #endif
  27285. #ifdef WOLFSSL_SHA384
  27286. case SHA384h:
  27287. return NID_sha384;
  27288. #endif
  27289. #ifdef WOLFSSL_SHA512
  27290. case SHA512h:
  27291. return NID_sha512;
  27292. #endif
  27293. }
  27294. break;
  27295. /* oidSigType */
  27296. case oidSigType:
  27297. switch (oid) {
  27298. #ifndef NO_DSA
  27299. case CTC_SHAwDSA:
  27300. return NID_dsaWithSHA1;
  27301. case CTC_SHA256wDSA:
  27302. return NID_dsa_with_SHA256;
  27303. #endif /* NO_DSA */
  27304. #ifndef NO_RSA
  27305. case CTC_MD2wRSA:
  27306. return NID_md2WithRSAEncryption;
  27307. case CTC_MD5wRSA:
  27308. return NID_md5WithRSAEncryption;
  27309. case CTC_SHAwRSA:
  27310. return NID_sha1WithRSAEncryption;
  27311. case CTC_SHA224wRSA:
  27312. return NID_sha224WithRSAEncryption;
  27313. case CTC_SHA256wRSA:
  27314. return NID_sha256WithRSAEncryption;
  27315. case CTC_SHA384wRSA:
  27316. return NID_sha384WithRSAEncryption;
  27317. case CTC_SHA512wRSA:
  27318. return NID_sha512WithRSAEncryption;
  27319. #ifdef WOLFSSL_SHA3
  27320. case CTC_SHA3_224wRSA:
  27321. return NID_RSA_SHA3_224;
  27322. case CTC_SHA3_256wRSA:
  27323. return NID_RSA_SHA3_256;
  27324. case CTC_SHA3_384wRSA:
  27325. return NID_RSA_SHA3_384;
  27326. case CTC_SHA3_512wRSA:
  27327. return NID_RSA_SHA3_512;
  27328. #endif
  27329. #ifdef WC_RSA_PSS
  27330. case CTC_RSASSAPSS:
  27331. return NID_rsassaPss;
  27332. #endif
  27333. #endif /* NO_RSA */
  27334. #ifdef HAVE_ECC
  27335. case CTC_SHAwECDSA:
  27336. return NID_ecdsa_with_SHA1;
  27337. case CTC_SHA224wECDSA:
  27338. return NID_ecdsa_with_SHA224;
  27339. case CTC_SHA256wECDSA:
  27340. return NID_ecdsa_with_SHA256;
  27341. case CTC_SHA384wECDSA:
  27342. return NID_ecdsa_with_SHA384;
  27343. case CTC_SHA512wECDSA:
  27344. return NID_ecdsa_with_SHA512;
  27345. #ifdef WOLFSSL_SHA3
  27346. case CTC_SHA3_224wECDSA:
  27347. return NID_ecdsa_with_SHA3_224;
  27348. case CTC_SHA3_256wECDSA:
  27349. return NID_ecdsa_with_SHA3_256;
  27350. case CTC_SHA3_384wECDSA:
  27351. return NID_ecdsa_with_SHA3_384;
  27352. case CTC_SHA3_512wECDSA:
  27353. return NID_ecdsa_with_SHA3_512;
  27354. #endif
  27355. #endif /* HAVE_ECC */
  27356. }
  27357. break;
  27358. /* oidKeyType */
  27359. case oidKeyType:
  27360. switch (oid) {
  27361. #ifndef NO_DSA
  27362. case DSAk:
  27363. return NID_dsa;
  27364. #endif /* NO_DSA */
  27365. #ifndef NO_RSA
  27366. case RSAk:
  27367. return NID_rsaEncryption;
  27368. #ifdef WC_RSA_PSS
  27369. case RSAPSSk:
  27370. return NID_rsassaPss;
  27371. #endif
  27372. #endif /* NO_RSA */
  27373. #ifdef HAVE_ECC
  27374. case ECDSAk:
  27375. return NID_X9_62_id_ecPublicKey;
  27376. #endif /* HAVE_ECC */
  27377. }
  27378. break;
  27379. #ifdef HAVE_ECC
  27380. case oidCurveType:
  27381. switch (oid) {
  27382. case ECC_SECP192R1_OID:
  27383. return NID_X9_62_prime192v1;
  27384. case ECC_PRIME192V2_OID:
  27385. return NID_X9_62_prime192v2;
  27386. case ECC_PRIME192V3_OID:
  27387. return NID_X9_62_prime192v3;
  27388. case ECC_PRIME239V1_OID:
  27389. return NID_X9_62_prime239v1;
  27390. case ECC_PRIME239V2_OID:
  27391. return NID_X9_62_prime239v2;
  27392. case ECC_PRIME239V3_OID:
  27393. return NID_X9_62_prime239v3;
  27394. case ECC_SECP256R1_OID:
  27395. return NID_X9_62_prime256v1;
  27396. case ECC_SECP112R1_OID:
  27397. return NID_secp112r1;
  27398. case ECC_SECP112R2_OID:
  27399. return NID_secp112r2;
  27400. case ECC_SECP128R1_OID:
  27401. return NID_secp128r1;
  27402. case ECC_SECP128R2_OID:
  27403. return NID_secp128r2;
  27404. case ECC_SECP160R1_OID:
  27405. return NID_secp160r1;
  27406. case ECC_SECP160R2_OID:
  27407. return NID_secp160r2;
  27408. case ECC_SECP224R1_OID:
  27409. return NID_secp224r1;
  27410. case ECC_SECP384R1_OID:
  27411. return NID_secp384r1;
  27412. case ECC_SECP521R1_OID:
  27413. return NID_secp521r1;
  27414. case ECC_SECP160K1_OID:
  27415. return NID_secp160k1;
  27416. case ECC_SECP192K1_OID:
  27417. return NID_secp192k1;
  27418. case ECC_SECP224K1_OID:
  27419. return NID_secp224k1;
  27420. case ECC_SECP256K1_OID:
  27421. return NID_secp256k1;
  27422. case ECC_BRAINPOOLP160R1_OID:
  27423. return NID_brainpoolP160r1;
  27424. case ECC_BRAINPOOLP192R1_OID:
  27425. return NID_brainpoolP192r1;
  27426. case ECC_BRAINPOOLP224R1_OID:
  27427. return NID_brainpoolP224r1;
  27428. case ECC_BRAINPOOLP256R1_OID:
  27429. return NID_brainpoolP256r1;
  27430. case ECC_BRAINPOOLP320R1_OID:
  27431. return NID_brainpoolP320r1;
  27432. case ECC_BRAINPOOLP384R1_OID:
  27433. return NID_brainpoolP384r1;
  27434. case ECC_BRAINPOOLP512R1_OID:
  27435. return NID_brainpoolP512r1;
  27436. }
  27437. break;
  27438. #endif /* HAVE_ECC */
  27439. /* oidBlkType */
  27440. case oidBlkType:
  27441. switch (oid) {
  27442. #ifdef WOLFSSL_AES_128
  27443. case AES128CBCb:
  27444. return AES128CBCb;
  27445. #endif
  27446. #ifdef WOLFSSL_AES_192
  27447. case AES192CBCb:
  27448. return AES192CBCb;
  27449. #endif
  27450. #ifdef WOLFSSL_AES_256
  27451. case AES256CBCb:
  27452. return AES256CBCb;
  27453. #endif
  27454. #ifndef NO_DES3
  27455. case DESb:
  27456. return NID_des;
  27457. case DES3b:
  27458. return NID_des3;
  27459. #endif
  27460. }
  27461. break;
  27462. #ifdef HAVE_OCSP
  27463. case oidOcspType:
  27464. switch (oid) {
  27465. case OCSP_BASIC_OID:
  27466. return NID_id_pkix_OCSP_basic;
  27467. case OCSP_NONCE_OID:
  27468. return OCSP_NONCE_OID;
  27469. }
  27470. break;
  27471. #endif /* HAVE_OCSP */
  27472. /* oidCertExtType */
  27473. case oidCertExtType:
  27474. switch (oid) {
  27475. case BASIC_CA_OID:
  27476. return NID_basic_constraints;
  27477. case ALT_NAMES_OID:
  27478. return NID_subject_alt_name;
  27479. case CRL_DIST_OID:
  27480. return NID_crl_distribution_points;
  27481. case AUTH_INFO_OID:
  27482. return NID_info_access;
  27483. case AUTH_KEY_OID:
  27484. return NID_authority_key_identifier;
  27485. case SUBJ_KEY_OID:
  27486. return NID_subject_key_identifier;
  27487. case INHIBIT_ANY_OID:
  27488. return NID_inhibit_any_policy;
  27489. case KEY_USAGE_OID:
  27490. return NID_key_usage;
  27491. case NAME_CONS_OID:
  27492. return NID_name_constraints;
  27493. case CERT_POLICY_OID:
  27494. return NID_certificate_policies;
  27495. case EXT_KEY_USAGE_OID:
  27496. return NID_ext_key_usage;
  27497. }
  27498. break;
  27499. /* oidCertAuthInfoType */
  27500. case oidCertAuthInfoType:
  27501. switch (oid) {
  27502. case AIA_OCSP_OID:
  27503. return NID_ad_OCSP;
  27504. case AIA_CA_ISSUER_OID:
  27505. return NID_ad_ca_issuers;
  27506. }
  27507. break;
  27508. /* oidCertPolicyType */
  27509. case oidCertPolicyType:
  27510. switch (oid) {
  27511. case CP_ANY_OID:
  27512. return NID_any_policy;
  27513. }
  27514. break;
  27515. /* oidCertAltNameType */
  27516. case oidCertAltNameType:
  27517. switch (oid) {
  27518. case HW_NAME_OID:
  27519. return NID_hw_name_oid;
  27520. }
  27521. break;
  27522. /* oidCertKeyUseType */
  27523. case oidCertKeyUseType:
  27524. switch (oid) {
  27525. case EKU_ANY_OID:
  27526. return NID_anyExtendedKeyUsage;
  27527. case EKU_SERVER_AUTH_OID:
  27528. return EKU_SERVER_AUTH_OID;
  27529. case EKU_CLIENT_AUTH_OID:
  27530. return EKU_CLIENT_AUTH_OID;
  27531. case EKU_OCSP_SIGN_OID:
  27532. return EKU_OCSP_SIGN_OID;
  27533. }
  27534. break;
  27535. /* oidKdfType */
  27536. case oidKdfType:
  27537. switch (oid) {
  27538. case PBKDF2_OID:
  27539. return PBKDF2_OID;
  27540. }
  27541. break;
  27542. /* oidPBEType */
  27543. case oidPBEType:
  27544. switch (oid) {
  27545. case PBE_SHA1_RC4_128:
  27546. return PBE_SHA1_RC4_128;
  27547. case PBE_SHA1_DES:
  27548. return PBE_SHA1_DES;
  27549. case PBE_SHA1_DES3:
  27550. return PBE_SHA1_DES3;
  27551. }
  27552. break;
  27553. /* oidKeyWrapType */
  27554. case oidKeyWrapType:
  27555. switch (oid) {
  27556. #ifdef WOLFSSL_AES_128
  27557. case AES128_WRAP:
  27558. return AES128_WRAP;
  27559. #endif
  27560. #ifdef WOLFSSL_AES_192
  27561. case AES192_WRAP:
  27562. return AES192_WRAP;
  27563. #endif
  27564. #ifdef WOLFSSL_AES_256
  27565. case AES256_WRAP:
  27566. return AES256_WRAP;
  27567. #endif
  27568. }
  27569. break;
  27570. /* oidCmsKeyAgreeType */
  27571. case oidCmsKeyAgreeType:
  27572. switch (oid) {
  27573. #ifndef NO_SHA
  27574. case dhSinglePass_stdDH_sha1kdf_scheme:
  27575. return dhSinglePass_stdDH_sha1kdf_scheme;
  27576. #endif
  27577. #ifdef WOLFSSL_SHA224
  27578. case dhSinglePass_stdDH_sha224kdf_scheme:
  27579. return dhSinglePass_stdDH_sha224kdf_scheme;
  27580. #endif
  27581. #ifndef NO_SHA256
  27582. case dhSinglePass_stdDH_sha256kdf_scheme:
  27583. return dhSinglePass_stdDH_sha256kdf_scheme;
  27584. #endif
  27585. #ifdef WOLFSSL_SHA384
  27586. case dhSinglePass_stdDH_sha384kdf_scheme:
  27587. return dhSinglePass_stdDH_sha384kdf_scheme;
  27588. #endif
  27589. #ifdef WOLFSSL_SHA512
  27590. case dhSinglePass_stdDH_sha512kdf_scheme:
  27591. return dhSinglePass_stdDH_sha512kdf_scheme;
  27592. #endif
  27593. }
  27594. break;
  27595. #ifdef WOLFSSL_CERT_REQ
  27596. case oidCsrAttrType:
  27597. switch (oid) {
  27598. case PKCS9_CONTENT_TYPE_OID:
  27599. return NID_pkcs9_contentType;
  27600. case CHALLENGE_PASSWORD_OID:
  27601. return NID_pkcs9_challengePassword;
  27602. case SERIAL_NUMBER_OID:
  27603. return NID_serialNumber;
  27604. case USER_ID_OID:
  27605. return NID_userId;
  27606. }
  27607. break;
  27608. #endif
  27609. default:
  27610. WOLFSSL_MSG("OID not in table");
  27611. }
  27612. /* If not found in above switch then try the table */
  27613. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  27614. if (wolfssl_object_info[i].id == (int)oid) {
  27615. return wolfssl_object_info[i].nid;
  27616. }
  27617. }
  27618. return -1;
  27619. }
  27620. /* frees all nodes in the current threads error queue
  27621. *
  27622. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  27623. * current threads queue will be free'd.
  27624. */
  27625. void wolfSSL_ERR_remove_state(unsigned long id)
  27626. {
  27627. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  27628. (void)id;
  27629. if (wc_ERR_remove_state() != 0) {
  27630. WOLFSSL_MSG("Error with removing the state");
  27631. }
  27632. }
  27633. #endif /* OPENSSL_EXTRA */
  27634. #ifdef OPENSSL_ALL
  27635. #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8)
  27636. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  27637. WOLFSSL_EVP_PKEY* pkey,
  27638. const WOLFSSL_EVP_CIPHER* enc,
  27639. char* passwd, int passwdSz,
  27640. wc_pem_password_cb* cb, void* ctx)
  27641. {
  27642. int ret = 0;
  27643. char password[NAME_SZ];
  27644. byte* key = NULL;
  27645. word32 keySz;
  27646. byte* pem = NULL;
  27647. int pemSz = 0;
  27648. int type = PKCS8_PRIVATEKEY_TYPE;
  27649. const byte* curveOid;
  27650. word32 oidSz;
  27651. if (bio == NULL || pkey == NULL)
  27652. return -1;
  27653. keySz = pkey->pkey_sz + 128;
  27654. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27655. if (key == NULL)
  27656. ret = MEMORY_E;
  27657. if (ret == 0 && enc != NULL && passwd == NULL) {
  27658. passwdSz = cb(password, sizeof(password), 1, ctx);
  27659. if (passwdSz < 0)
  27660. ret = WOLFSSL_FAILURE;
  27661. passwd = password;
  27662. }
  27663. if (ret == 0 && enc != NULL) {
  27664. WC_RNG rng;
  27665. ret = wc_InitRng(&rng);
  27666. if (ret == 0) {
  27667. int encAlgId = 0;
  27668. #ifndef NO_DES3
  27669. if (enc == EVP_DES_CBC)
  27670. encAlgId = DESb;
  27671. else if (enc == EVP_DES_EDE3_CBC)
  27672. encAlgId = DES3b;
  27673. else
  27674. #endif
  27675. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  27676. #ifdef WOLFSSL_AES_256
  27677. if (enc == EVP_AES_256_CBC)
  27678. encAlgId = AES256CBCb;
  27679. else
  27680. #endif
  27681. #endif
  27682. ret = -1;
  27683. if (ret == 0) {
  27684. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  27685. &keySz, passwd, passwdSz, PKCS5, PBES2,
  27686. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  27687. &rng, NULL);
  27688. if (ret > 0) {
  27689. keySz = ret;
  27690. ret = 0;
  27691. }
  27692. }
  27693. wc_FreeRng(&rng);
  27694. }
  27695. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  27696. }
  27697. if (ret == 0 && enc == NULL) {
  27698. int algId;
  27699. type = PKCS8_PRIVATEKEY_TYPE;
  27700. #ifdef HAVE_ECC
  27701. if (pkey->type == EVP_PKEY_EC) {
  27702. algId = ECDSAk;
  27703. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  27704. &oidSz);
  27705. }
  27706. else
  27707. #endif
  27708. {
  27709. algId = RSAk;
  27710. curveOid = NULL;
  27711. oidSz = 0;
  27712. }
  27713. #ifdef HAVE_ECC
  27714. if (ret >= 0)
  27715. #endif
  27716. {
  27717. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  27718. pkey->pkey_sz, algId, curveOid, oidSz);
  27719. keySz = ret;
  27720. }
  27721. }
  27722. if (password == passwd)
  27723. XMEMSET(password, 0, passwdSz);
  27724. if (ret >= 0) {
  27725. pemSz = 2 * keySz + 2 * 64;
  27726. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27727. if (pem == NULL)
  27728. ret = MEMORY_E;
  27729. }
  27730. if (ret >= 0)
  27731. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  27732. if (key != NULL)
  27733. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27734. if (ret >= 0) {
  27735. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  27736. ret = -1;
  27737. }
  27738. if (pem != NULL)
  27739. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27740. return ret < 0 ? 0 : ret;
  27741. }
  27742. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  27743. int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey,
  27744. const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz,
  27745. wc_pem_password_cb* cb, void* ctx)
  27746. {
  27747. int ret = WOLFSSL_SUCCESS;
  27748. BIO *b;
  27749. WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey");
  27750. b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE);
  27751. if (b == NULL) {
  27752. ret = WOLFSSL_FAILURE;
  27753. }
  27754. if (ret == WOLFSSL_SUCCESS) {
  27755. ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd,
  27756. passwdSz, cb, ctx);
  27757. }
  27758. wolfSSL_BIO_free(b);
  27759. return ret;
  27760. }
  27761. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  27762. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  27763. {
  27764. int ret = 0;
  27765. byte* mem = NULL;
  27766. ret = wolfSSL_BIO_get_len(bio);
  27767. if (ret > 0) {
  27768. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27769. if (mem == NULL) {
  27770. WOLFSSL_MSG("Memory error");
  27771. ret = MEMORY_E;
  27772. }
  27773. if (ret >= 0) {
  27774. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  27775. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27776. ret = MEMORY_E;
  27777. mem = NULL;
  27778. }
  27779. }
  27780. }
  27781. *data = mem;
  27782. return ret;
  27783. }
  27784. /* DER data is PKCS#8 encrypted. */
  27785. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  27786. WOLFSSL_EVP_PKEY** pkey,
  27787. wc_pem_password_cb* cb,
  27788. void* ctx)
  27789. {
  27790. int ret;
  27791. byte* der;
  27792. int len;
  27793. byte* p;
  27794. word32 algId;
  27795. WOLFSSL_EVP_PKEY* key;
  27796. if ((len = bio_get_data(bio, &der)) < 0)
  27797. return NULL;
  27798. if (cb != NULL) {
  27799. char password[NAME_SZ];
  27800. int passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  27801. if (passwordSz < 0) {
  27802. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27803. return NULL;
  27804. }
  27805. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27806. wc_MemZero_Add("wolfSSL_d2i_PKCS8PrivateKey_bio password", password,
  27807. passwordSz);
  27808. #endif
  27809. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  27810. if (ret < 0) {
  27811. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27812. return NULL;
  27813. }
  27814. ForceZero(password, passwordSz);
  27815. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27816. wc_MemZero_Check(password, passwordSz);
  27817. #endif
  27818. }
  27819. p = der;
  27820. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  27821. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27822. return key;
  27823. }
  27824. #endif /* !NO_BIO && !NO_PWDBASED && HAVE_PKCS8 */
  27825. /* Detect which type of key it is before decoding. */
  27826. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  27827. const unsigned char** pp,
  27828. long length)
  27829. {
  27830. int ret;
  27831. WOLFSSL_EVP_PKEY* key = NULL;
  27832. const byte* der = *pp;
  27833. word32 idx = 0;
  27834. int len = 0;
  27835. int cnt = 0;
  27836. word32 algId;
  27837. word32 keyLen = (word32)length;
  27838. /* Take off PKCS#8 wrapper if found. */
  27839. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  27840. der += idx;
  27841. keyLen = len;
  27842. }
  27843. idx = 0;
  27844. len = 0;
  27845. /* Use the number of elements in the outer sequence to determine key type.
  27846. */
  27847. ret = GetSequence(der, &idx, &len, keyLen);
  27848. if (ret >= 0) {
  27849. word32 end = idx + len;
  27850. while (ret >= 0 && idx < end) {
  27851. /* Skip type */
  27852. idx++;
  27853. /* Get length and skip over - keeping count */
  27854. len = 0;
  27855. ret = GetLength(der, &idx, &len, keyLen);
  27856. if (ret >= 0) {
  27857. if (idx + len > end)
  27858. ret = ASN_PARSE_E;
  27859. else {
  27860. idx += len;
  27861. cnt++;
  27862. }
  27863. }
  27864. }
  27865. }
  27866. if (ret >= 0) {
  27867. int type;
  27868. /* ECC includes version, private[, curve][, public key] */
  27869. if (cnt >= 2 && cnt <= 4)
  27870. type = EVP_PKEY_EC;
  27871. else
  27872. type = EVP_PKEY_RSA;
  27873. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  27874. *pp = der;
  27875. }
  27876. return key;
  27877. }
  27878. #endif /* OPENSSL_ALL */
  27879. #ifdef WOLFSSL_STATIC_EPHEMERAL
  27880. int wolfSSL_StaticEphemeralKeyLoad(WOLFSSL* ssl, int keyAlgo, void* keyPtr)
  27881. {
  27882. int ret;
  27883. word32 idx = 0;
  27884. DerBuffer* der = NULL;
  27885. if (ssl == NULL || ssl->ctx == NULL || keyPtr == NULL) {
  27886. return BAD_FUNC_ARG;
  27887. }
  27888. #ifndef SINGLE_THREADED
  27889. if (!ssl->ctx->staticKELockInit) {
  27890. return BUFFER_E; /* no keys set */
  27891. }
  27892. ret = wc_LockMutex(&ssl->ctx->staticKELock);
  27893. if (ret != 0) {
  27894. return ret;
  27895. }
  27896. #endif
  27897. ret = BUFFER_E; /* set default error */
  27898. switch (keyAlgo) {
  27899. #ifndef NO_DH
  27900. case WC_PK_TYPE_DH:
  27901. if (ssl != NULL)
  27902. der = ssl->staticKE.dhKey;
  27903. if (der == NULL)
  27904. der = ssl->ctx->staticKE.dhKey;
  27905. if (der != NULL) {
  27906. DhKey* key = (DhKey*)keyPtr;
  27907. WOLFSSL_MSG("Using static DH key");
  27908. ret = wc_DhKeyDecode(der->buffer, &idx, key, der->length);
  27909. }
  27910. break;
  27911. #endif
  27912. #ifdef HAVE_ECC
  27913. case WC_PK_TYPE_ECDH:
  27914. if (ssl != NULL)
  27915. der = ssl->staticKE.ecKey;
  27916. if (der == NULL)
  27917. der = ssl->ctx->staticKE.ecKey;
  27918. if (der != NULL) {
  27919. ecc_key* key = (ecc_key*)keyPtr;
  27920. WOLFSSL_MSG("Using static ECDH key");
  27921. ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length);
  27922. }
  27923. break;
  27924. #endif
  27925. #ifdef HAVE_CURVE25519
  27926. case WC_PK_TYPE_CURVE25519:
  27927. if (ssl != NULL)
  27928. der = ssl->staticKE.x25519Key;
  27929. if (der == NULL)
  27930. der = ssl->ctx->staticKE.x25519Key;
  27931. if (der != NULL) {
  27932. curve25519_key* key = (curve25519_key*)keyPtr;
  27933. WOLFSSL_MSG("Using static X25519 key");
  27934. ret = wc_Curve25519PrivateKeyDecode(der->buffer, &idx, key,
  27935. der->length);
  27936. }
  27937. break;
  27938. #endif
  27939. #ifdef HAVE_CURVE448
  27940. case WC_PK_TYPE_CURVE448:
  27941. if (ssl != NULL)
  27942. der = ssl->staticKE.x448Key;
  27943. if (der == NULL)
  27944. der = ssl->ctx->staticKE.x448Key;
  27945. if (der != NULL) {
  27946. curve448_key* key = (curve448_key*)keyPtr;
  27947. WOLFSSL_MSG("Using static X448 key");
  27948. ret = wc_Curve448PrivateKeyDecode(der->buffer, &idx, key,
  27949. der->length);
  27950. }
  27951. break;
  27952. #endif
  27953. default:
  27954. /* not supported */
  27955. ret = NOT_COMPILED_IN;
  27956. break;
  27957. }
  27958. #ifndef SINGLE_THREADED
  27959. wc_UnLockMutex(&ssl->ctx->staticKELock);
  27960. #endif
  27961. return ret;
  27962. }
  27963. static int SetStaticEphemeralKey(WOLFSSL_CTX* ctx,
  27964. StaticKeyExchangeInfo_t* staticKE, int keyAlgo, const char* key,
  27965. unsigned int keySz, int format, void* heap)
  27966. {
  27967. int ret = 0;
  27968. DerBuffer* der = NULL;
  27969. byte* keyBuf = NULL;
  27970. #ifndef NO_FILESYSTEM
  27971. const char* keyFile = NULL;
  27972. #endif
  27973. /* allow empty key to free buffer */
  27974. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  27975. return BAD_FUNC_ARG;
  27976. }
  27977. WOLFSSL_ENTER("SetStaticEphemeralKey");
  27978. /* if just free'ing key then skip loading */
  27979. if (key != NULL) {
  27980. #ifndef NO_FILESYSTEM
  27981. /* load file from filesystem */
  27982. if (key != NULL && keySz == 0) {
  27983. size_t keyBufSz = 0;
  27984. keyFile = (const char*)key;
  27985. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  27986. if (ret != 0) {
  27987. return ret;
  27988. }
  27989. keySz = (unsigned int)keyBufSz;
  27990. }
  27991. else
  27992. #endif
  27993. {
  27994. /* use as key buffer directly */
  27995. keyBuf = (byte*)key;
  27996. }
  27997. if (format == WOLFSSL_FILETYPE_PEM) {
  27998. #ifdef WOLFSSL_PEM_TO_DER
  27999. int keyFormat = 0;
  28000. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  28001. heap, NULL, &keyFormat);
  28002. /* auto detect key type */
  28003. if (ret == 0 && keyAlgo == WC_PK_TYPE_NONE) {
  28004. if (keyFormat == ECDSAk)
  28005. keyAlgo = WC_PK_TYPE_ECDH;
  28006. else if (keyFormat == X25519k)
  28007. keyAlgo = WC_PK_TYPE_CURVE25519;
  28008. else
  28009. keyAlgo = WC_PK_TYPE_DH;
  28010. }
  28011. #else
  28012. ret = NOT_COMPILED_IN;
  28013. #endif
  28014. }
  28015. else {
  28016. /* Detect PK type (if required) */
  28017. #ifdef HAVE_ECC
  28018. if (keyAlgo == WC_PK_TYPE_NONE) {
  28019. word32 idx = 0;
  28020. ecc_key eccKey;
  28021. ret = wc_ecc_init_ex(&eccKey, heap, INVALID_DEVID);
  28022. if (ret == 0) {
  28023. ret = wc_EccPrivateKeyDecode(keyBuf, &idx, &eccKey, keySz);
  28024. if (ret == 0)
  28025. keyAlgo = WC_PK_TYPE_ECDH;
  28026. wc_ecc_free(&eccKey);
  28027. }
  28028. }
  28029. #endif
  28030. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
  28031. if (keyAlgo == WC_PK_TYPE_NONE) {
  28032. word32 idx = 0;
  28033. DhKey dhKey;
  28034. ret = wc_InitDhKey_ex(&dhKey, heap, INVALID_DEVID);
  28035. if (ret == 0) {
  28036. ret = wc_DhKeyDecode(keyBuf, &idx, &dhKey, keySz);
  28037. if (ret == 0)
  28038. keyAlgo = WC_PK_TYPE_DH;
  28039. wc_FreeDhKey(&dhKey);
  28040. }
  28041. }
  28042. #endif
  28043. #ifdef HAVE_CURVE25519
  28044. if (keyAlgo == WC_PK_TYPE_NONE) {
  28045. word32 idx = 0;
  28046. curve25519_key x25519Key;
  28047. ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID);
  28048. if (ret == 0) {
  28049. ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key,
  28050. keySz);
  28051. if (ret == 0)
  28052. keyAlgo = WC_PK_TYPE_CURVE25519;
  28053. wc_curve25519_free(&x25519Key);
  28054. }
  28055. }
  28056. #endif
  28057. #ifdef HAVE_CURVE448
  28058. if (keyAlgo == WC_PK_TYPE_NONE) {
  28059. word32 idx = 0;
  28060. curve448_key x448Key;
  28061. ret = wc_curve448_init(&x448Key);
  28062. if (ret == 0) {
  28063. ret = wc_Curve448PrivateKeyDecode(keyBuf, &idx, &x448Key,
  28064. keySz);
  28065. if (ret == 0)
  28066. keyAlgo = WC_PK_TYPE_CURVE448;
  28067. wc_curve448_free(&x448Key);
  28068. }
  28069. }
  28070. #endif
  28071. if (keyAlgo != WC_PK_TYPE_NONE) {
  28072. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  28073. if (ret == 0) {
  28074. XMEMCPY(der->buffer, keyBuf, keySz);
  28075. }
  28076. }
  28077. }
  28078. }
  28079. #ifndef NO_FILESYSTEM
  28080. /* done with keyFile buffer */
  28081. if (keyFile && keyBuf) {
  28082. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  28083. }
  28084. #endif
  28085. #ifndef SINGLE_THREADED
  28086. if (ret == 0 && !ctx->staticKELockInit) {
  28087. ret = wc_InitMutex(&ctx->staticKELock);
  28088. if (ret == 0) {
  28089. ctx->staticKELockInit = 1;
  28090. }
  28091. }
  28092. #endif
  28093. if (ret == 0
  28094. #ifndef SINGLE_THREADED
  28095. && (ret = wc_LockMutex(&ctx->staticKELock)) == 0
  28096. #endif
  28097. ) {
  28098. switch (keyAlgo) {
  28099. #ifndef NO_DH
  28100. case WC_PK_TYPE_DH:
  28101. FreeDer(&staticKE->dhKey);
  28102. staticKE->dhKey = der; der = NULL;
  28103. break;
  28104. #endif
  28105. #ifdef HAVE_ECC
  28106. case WC_PK_TYPE_ECDH:
  28107. FreeDer(&staticKE->ecKey);
  28108. staticKE->ecKey = der; der = NULL;
  28109. break;
  28110. #endif
  28111. #ifdef HAVE_CURVE25519
  28112. case WC_PK_TYPE_CURVE25519:
  28113. FreeDer(&staticKE->x25519Key);
  28114. staticKE->x25519Key = der; der = NULL;
  28115. break;
  28116. #endif
  28117. #ifdef HAVE_CURVE448
  28118. case WC_PK_TYPE_CURVE448:
  28119. FreeDer(&staticKE->x448Key);
  28120. staticKE->x448Key = der; der = NULL;
  28121. break;
  28122. #endif
  28123. default:
  28124. /* not supported */
  28125. ret = NOT_COMPILED_IN;
  28126. break;
  28127. }
  28128. #ifndef SINGLE_THREADED
  28129. wc_UnLockMutex(&ctx->staticKELock);
  28130. #endif
  28131. }
  28132. if (ret != 0) {
  28133. FreeDer(&der);
  28134. }
  28135. (void)ctx; /* not used for single threaded */
  28136. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  28137. return ret;
  28138. }
  28139. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  28140. const char* key, unsigned int keySz, int format)
  28141. {
  28142. if (ctx == NULL) {
  28143. return BAD_FUNC_ARG;
  28144. }
  28145. return SetStaticEphemeralKey(ctx, &ctx->staticKE, keyAlgo,
  28146. key, keySz, format, ctx->heap);
  28147. }
  28148. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  28149. const char* key, unsigned int keySz, int format)
  28150. {
  28151. if (ssl == NULL || ssl->ctx == NULL) {
  28152. return BAD_FUNC_ARG;
  28153. }
  28154. return SetStaticEphemeralKey(ssl->ctx, &ssl->staticKE, keyAlgo,
  28155. key, keySz, format, ssl->heap);
  28156. }
  28157. static int GetStaticEphemeralKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  28158. int keyAlgo, const unsigned char** key, unsigned int* keySz)
  28159. {
  28160. int ret = 0;
  28161. DerBuffer* der = NULL;
  28162. if (key) *key = NULL;
  28163. if (keySz) *keySz = 0;
  28164. #ifndef SINGLE_THREADED
  28165. if (ctx->staticKELockInit &&
  28166. (ret = wc_LockMutex(&ctx->staticKELock)) != 0) {
  28167. return ret;
  28168. }
  28169. #endif
  28170. switch (keyAlgo) {
  28171. #ifndef NO_DH
  28172. case WC_PK_TYPE_DH:
  28173. if (ssl != NULL)
  28174. der = ssl->staticKE.dhKey;
  28175. if (der == NULL)
  28176. der = ctx->staticKE.dhKey;
  28177. break;
  28178. #endif
  28179. #ifdef HAVE_ECC
  28180. case WC_PK_TYPE_ECDH:
  28181. if (ssl != NULL)
  28182. der = ssl->staticKE.ecKey;
  28183. if (der == NULL)
  28184. der = ctx->staticKE.ecKey;
  28185. break;
  28186. #endif
  28187. #ifdef HAVE_CURVE25519
  28188. case WC_PK_TYPE_CURVE25519:
  28189. if (ssl != NULL)
  28190. der = ssl->staticKE.x25519Key;
  28191. if (der == NULL)
  28192. der = ctx->staticKE.x25519Key;
  28193. break;
  28194. #endif
  28195. #ifdef HAVE_CURVE448
  28196. case WC_PK_TYPE_CURVE448:
  28197. if (ssl != NULL)
  28198. der = ssl->staticKE.x448Key;
  28199. if (der == NULL)
  28200. der = ctx->staticKE.x448Key;
  28201. break;
  28202. #endif
  28203. default:
  28204. /* not supported */
  28205. ret = NOT_COMPILED_IN;
  28206. break;
  28207. }
  28208. if (der) {
  28209. if (key)
  28210. *key = der->buffer;
  28211. if (keySz)
  28212. *keySz = der->length;
  28213. }
  28214. #ifndef SINGLE_THREADED
  28215. wc_UnLockMutex(&ctx->staticKELock);
  28216. #endif
  28217. return ret;
  28218. }
  28219. /* returns pointer to currently loaded static ephemeral as ASN.1 */
  28220. /* this can be converted to PEM using wc_DerToPem */
  28221. int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  28222. const unsigned char** key, unsigned int* keySz)
  28223. {
  28224. if (ctx == NULL) {
  28225. return BAD_FUNC_ARG;
  28226. }
  28227. return GetStaticEphemeralKey(ctx, NULL, keyAlgo, key, keySz);
  28228. }
  28229. int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  28230. const unsigned char** key, unsigned int* keySz)
  28231. {
  28232. if (ssl == NULL || ssl->ctx == NULL) {
  28233. return BAD_FUNC_ARG;
  28234. }
  28235. return GetStaticEphemeralKey(ssl->ctx, ssl, keyAlgo, key, keySz);
  28236. }
  28237. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  28238. #if defined(OPENSSL_EXTRA)
  28239. /* wolfSSL_THREADID_current is provided as a compat API with
  28240. * CRYPTO_THREADID_current to register current thread id into given id object.
  28241. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  28242. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  28243. * like as existing wolfSSL_THREADID_set_numeric.
  28244. */
  28245. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  28246. {
  28247. (void)id;
  28248. return;
  28249. }
  28250. /* wolfSSL_THREADID_hash is provided as a compatible API with
  28251. * CRYPTO_THREADID_hash which returns a hash value calculated from the
  28252. * specified thread id. However, CRYPTO_THREADID_hash API has been
  28253. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  28254. * This API only works as a stub to returns 0. This behavior is
  28255. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  28256. */
  28257. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  28258. {
  28259. (void)id;
  28260. return 0UL;
  28261. }
  28262. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  28263. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  28264. * Since this functionality is enabled by default in wolfSSL,
  28265. * this API exists as a stub.
  28266. */
  28267. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  28268. {
  28269. (void)ctx;
  28270. (void)onoff;
  28271. return WOLFSSL_SUCCESS;
  28272. }
  28273. /**
  28274. * set security level (wolfSSL doesn't support security level)
  28275. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  28276. * @param level security level
  28277. */
  28278. void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
  28279. {
  28280. WOLFSSL_ENTER("wolfSSL_CTX_set_security_level");
  28281. (void)ctx;
  28282. (void)level;
  28283. }
  28284. /**
  28285. * get security level (wolfSSL doesn't support security level)
  28286. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  28287. * @return always 0(level 0)
  28288. */
  28289. int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
  28290. {
  28291. WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
  28292. (void)ctx;
  28293. return 0;
  28294. }
  28295. /**
  28296. * Determine whether a WOLFSSL_SESSION object can be used for resumption
  28297. * @param s a pointer to WOLFSSL_SESSION structure
  28298. * @return return 1 if session is resumable, otherwise 0.
  28299. */
  28300. int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s)
  28301. {
  28302. s = ClientSessionToSession(s);
  28303. if (s == NULL)
  28304. return 0;
  28305. #ifdef HAVE_SESSION_TICKET
  28306. if (s->ticketLen > 0)
  28307. return 1;
  28308. #endif
  28309. if (s->sessionIDSz > 0)
  28310. return 1;
  28311. return 0;
  28312. }
  28313. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  28314. /*
  28315. * This API accepts a user callback which puts key-log records into
  28316. * a KEY LOGFILE. The callback is stored into a CTX and propagated to
  28317. * each SSL object on its creation timing.
  28318. */
  28319. void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb)
  28320. {
  28321. WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
  28322. /* stores the callback into WOLFSSL_CTX */
  28323. if (ctx != NULL) {
  28324. ctx->keyLogCb = cb;
  28325. }
  28326. }
  28327. wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
  28328. const WOLFSSL_CTX* ctx)
  28329. {
  28330. WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
  28331. if (ctx != NULL)
  28332. return ctx->keyLogCb;
  28333. else
  28334. return NULL;
  28335. }
  28336. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  28337. #endif /* OPENSSL_EXTRA */
  28338. #ifndef NO_CERT
  28339. #define WOLFSSL_X509_INCLUDED
  28340. #include "src/x509.c"
  28341. #endif
  28342. /*******************************************************************************
  28343. * START OF standard C library wrapping APIs
  28344. ******************************************************************************/
  28345. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  28346. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  28347. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  28348. #ifndef NO_WOLFSSL_STUB
  28349. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  28350. void *(*r) (void *, size_t, const char *,
  28351. int), void (*f) (void *))
  28352. {
  28353. (void) m;
  28354. (void) r;
  28355. (void) f;
  28356. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  28357. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  28358. return WOLFSSL_FAILURE;
  28359. }
  28360. #endif
  28361. #endif
  28362. #if defined(OPENSSL_EXTRA)
  28363. /**
  28364. * free allocated memory resource
  28365. * @param str a pointer to resource to be freed
  28366. * @param file dummy argument
  28367. * @param line dummy argument
  28368. */
  28369. void wolfSSL_CRYPTO_free(void *str, const char *file, int line)
  28370. {
  28371. (void)file;
  28372. (void)line;
  28373. XFREE(str, 0, DYNAMIC_TYPE_TMP_BUFFER);
  28374. }
  28375. /**
  28376. * allocate memory with size of num
  28377. * @param num size of memory allocation to be malloced
  28378. * @param file dummy argument
  28379. * @param line dummy argument
  28380. * @return a pointer to allocated memory on succssesful, otherwise NULL
  28381. */
  28382. void *wolfSSL_CRYPTO_malloc(size_t num, const char *file, int line)
  28383. {
  28384. (void)file;
  28385. (void)line;
  28386. return XMALLOC(num, 0, DYNAMIC_TYPE_TMP_BUFFER);
  28387. }
  28388. #endif
  28389. /*******************************************************************************
  28390. * END OF standard C library wrapping APIs
  28391. ******************************************************************************/
  28392. /*******************************************************************************
  28393. * START OF EX_DATA APIs
  28394. ******************************************************************************/
  28395. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  28396. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  28397. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  28398. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  28399. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  28400. }
  28401. #endif
  28402. #ifdef HAVE_EX_DATA
  28403. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  28404. {
  28405. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  28406. #ifdef MAX_EX_DATA
  28407. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  28408. return ex_data->ex_data[idx];
  28409. }
  28410. #else
  28411. (void)ex_data;
  28412. (void)idx;
  28413. #endif
  28414. return NULL;
  28415. }
  28416. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  28417. {
  28418. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  28419. #ifdef MAX_EX_DATA
  28420. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  28421. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  28422. if (ex_data->ex_data_cleanup_routines[idx]) {
  28423. if (ex_data->ex_data[idx])
  28424. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  28425. ex_data->ex_data_cleanup_routines[idx] = NULL;
  28426. }
  28427. #endif
  28428. ex_data->ex_data[idx] = data;
  28429. return WOLFSSL_SUCCESS;
  28430. }
  28431. #else
  28432. (void)ex_data;
  28433. (void)idx;
  28434. (void)data;
  28435. #endif
  28436. return WOLFSSL_FAILURE;
  28437. }
  28438. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  28439. int wolfSSL_CRYPTO_set_ex_data_with_cleanup(
  28440. WOLFSSL_CRYPTO_EX_DATA* ex_data,
  28441. int idx,
  28442. void *data,
  28443. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  28444. {
  28445. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data_with_cleanup");
  28446. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  28447. if (ex_data->ex_data_cleanup_routines[idx] && ex_data->ex_data[idx])
  28448. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  28449. ex_data->ex_data[idx] = data;
  28450. ex_data->ex_data_cleanup_routines[idx] = cleanup_routine;
  28451. return WOLFSSL_SUCCESS;
  28452. }
  28453. return WOLFSSL_FAILURE;
  28454. }
  28455. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  28456. /**
  28457. * Issues unique index for the class specified by class_index.
  28458. * Other parameter except class_index are ignored.
  28459. * Currently, following class_index are accepted:
  28460. * - WOLF_CRYPTO_EX_INDEX_SSL
  28461. * - WOLF_CRYPTO_EX_INDEX_SSL_CTX
  28462. * - WOLF_CRYPTO_EX_INDEX_X509
  28463. * @param class_index index one of CRYPTO_EX_INDEX_xxx
  28464. * @param argp parameters to be saved
  28465. * @param argl parameters to be saved
  28466. * @param new_func a pointer to WOLFSSL_CRYPTO_EX_new
  28467. * @param dup_func a pointer to WOLFSSL_CRYPTO_EX_dup
  28468. * @param free_func a pointer to WOLFSSL_CRYPTO_EX_free
  28469. * @return index value grater or equal to zero on success, -1 on failure.
  28470. */
  28471. int wolfSSL_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
  28472. WOLFSSL_CRYPTO_EX_new* new_func,
  28473. WOLFSSL_CRYPTO_EX_dup* dup_func,
  28474. WOLFSSL_CRYPTO_EX_free* free_func)
  28475. {
  28476. WOLFSSL_ENTER("wolfSSL_CRYPTO_get_ex_new_index");
  28477. return wolfssl_get_ex_new_index(class_index, argl, argp, new_func,
  28478. dup_func, free_func);
  28479. }
  28480. #endif /* HAVE_EX_DATA */
  28481. /*******************************************************************************
  28482. * END OF EX_DATA APIs
  28483. ******************************************************************************/
  28484. /*******************************************************************************
  28485. * START OF BUF_MEM API
  28486. ******************************************************************************/
  28487. #if defined(OPENSSL_EXTRA)
  28488. /* Begin functions for openssl/buffer.h */
  28489. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  28490. {
  28491. WOLFSSL_BUF_MEM* buf;
  28492. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  28493. DYNAMIC_TYPE_OPENSSL);
  28494. if (buf) {
  28495. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  28496. }
  28497. return buf;
  28498. }
  28499. /* non-compat API returns length of buffer on success */
  28500. int wolfSSL_BUF_MEM_grow_ex(WOLFSSL_BUF_MEM* buf, size_t len,
  28501. char zeroFill)
  28502. {
  28503. int len_int = (int)len;
  28504. int mx;
  28505. char* tmp;
  28506. /* verify provided arguments */
  28507. if (buf == NULL || len_int < 0) {
  28508. return 0; /* BAD_FUNC_ARG; */
  28509. }
  28510. /* check to see if fits in existing length */
  28511. if (buf->length > len) {
  28512. buf->length = len;
  28513. return len_int;
  28514. }
  28515. /* check to see if fits in max buffer */
  28516. if (buf->max >= len) {
  28517. if (buf->data != NULL && zeroFill) {
  28518. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  28519. }
  28520. buf->length = len;
  28521. return len_int;
  28522. }
  28523. /* expand size, to handle growth */
  28524. mx = (len_int + 3) / 3 * 4;
  28525. /* use realloc */
  28526. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  28527. if (tmp == NULL) {
  28528. return 0; /* ERR_R_MALLOC_FAILURE; */
  28529. }
  28530. buf->data = tmp;
  28531. buf->max = mx;
  28532. if (zeroFill)
  28533. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  28534. buf->length = len;
  28535. return len_int;
  28536. }
  28537. /* returns length of buffer on success */
  28538. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  28539. {
  28540. return wolfSSL_BUF_MEM_grow_ex(buf, len, 1);
  28541. }
  28542. /* non-compat API returns length of buffer on success */
  28543. int wolfSSL_BUF_MEM_resize(WOLFSSL_BUF_MEM* buf, size_t len)
  28544. {
  28545. char* tmp;
  28546. int mx;
  28547. /* verify provided arguments */
  28548. if (buf == NULL || len == 0 || (int)len <= 0) {
  28549. return 0; /* BAD_FUNC_ARG; */
  28550. }
  28551. if (len == buf->length)
  28552. return (int)len;
  28553. if (len > buf->length)
  28554. return wolfSSL_BUF_MEM_grow_ex(buf, len, 0);
  28555. /* expand size, to handle growth */
  28556. mx = ((int)len + 3) / 3 * 4;
  28557. /* We want to shrink the internal buffer */
  28558. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  28559. if (tmp == NULL)
  28560. return 0;
  28561. buf->data = tmp;
  28562. buf->length = len;
  28563. buf->max = mx;
  28564. return (int)len;
  28565. }
  28566. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  28567. {
  28568. if (buf) {
  28569. if (buf->data) {
  28570. XFREE(buf->data, NULL, DYNAMIC_TYPE_OPENSSL);
  28571. buf->data = NULL;
  28572. }
  28573. buf->max = 0;
  28574. buf->length = 0;
  28575. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  28576. }
  28577. }
  28578. /* End Functions for openssl/buffer.h */
  28579. #endif /* OPENSSL_EXTRA */
  28580. /*******************************************************************************
  28581. * END OF BUF_MEM API
  28582. ******************************************************************************/
  28583. #define WOLFSSL_CONF_INCLUDED
  28584. #include <src/conf.c>
  28585. /*******************************************************************************
  28586. * START OF RAND API
  28587. ******************************************************************************/
  28588. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  28589. static int wolfSSL_RAND_InitMutex(void)
  28590. {
  28591. #ifndef WOLFSSL_MUTEX_INITIALIZER
  28592. if (gRandMethodsInit == 0) {
  28593. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  28594. WOLFSSL_MSG("Bad Init Mutex rand methods");
  28595. return BAD_MUTEX_E;
  28596. }
  28597. gRandMethodsInit = 1;
  28598. }
  28599. #endif
  28600. return 0;
  28601. }
  28602. #endif
  28603. #ifdef OPENSSL_EXTRA
  28604. /* Checks if the global RNG has been created. If not then one is created.
  28605. *
  28606. * Returns WOLFSSL_SUCCESS when no error is encountered.
  28607. */
  28608. int wolfSSL_RAND_Init(void)
  28609. {
  28610. int ret = WOLFSSL_FAILURE;
  28611. #ifdef HAVE_GLOBAL_RNG
  28612. if (wc_LockMutex(&globalRNGMutex) == 0) {
  28613. if (initGlobalRNG == 0) {
  28614. ret = wc_InitRng(&globalRNG);
  28615. if (ret == 0) {
  28616. initGlobalRNG = 1;
  28617. ret = WOLFSSL_SUCCESS;
  28618. }
  28619. }
  28620. else {
  28621. /* GlobalRNG is already initialized */
  28622. ret = WOLFSSL_SUCCESS;
  28623. }
  28624. wc_UnLockMutex(&globalRNGMutex);
  28625. }
  28626. #endif
  28627. return ret;
  28628. }
  28629. /* WOLFSSL_SUCCESS on ok */
  28630. int wolfSSL_RAND_seed(const void* seed, int len)
  28631. {
  28632. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28633. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28634. if (gRandMethods && gRandMethods->seed) {
  28635. int ret = gRandMethods->seed(seed, len);
  28636. wc_UnLockMutex(&gRandMethodMutex);
  28637. return ret;
  28638. }
  28639. wc_UnLockMutex(&gRandMethodMutex);
  28640. }
  28641. #else
  28642. (void)seed;
  28643. (void)len;
  28644. #endif
  28645. /* Make sure global shared RNG (globalRNG) is initialized */
  28646. return wolfSSL_RAND_Init();
  28647. }
  28648. /* Returns the path for reading seed data from.
  28649. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  28650. *
  28651. * Note uses stdlib by default unless XGETENV macro is overwritten
  28652. *
  28653. * fname buffer to hold path
  28654. * len length of fname buffer
  28655. *
  28656. * Returns a pointer to fname on success and NULL on failure
  28657. */
  28658. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  28659. {
  28660. #if !defined(NO_FILESYSTEM) && defined(XGETENV)
  28661. char* rt;
  28662. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  28663. if (fname == NULL) {
  28664. return NULL;
  28665. }
  28666. XMEMSET(fname, 0, len);
  28667. if ((rt = XGETENV("RANDFILE")) != NULL) {
  28668. if (len > XSTRLEN(rt)) {
  28669. XMEMCPY(fname, rt, XSTRLEN(rt));
  28670. }
  28671. else {
  28672. WOLFSSL_MSG("RANDFILE too large for buffer");
  28673. rt = NULL;
  28674. }
  28675. }
  28676. /* $RANDFILE was not set or is too large, check $HOME */
  28677. if (rt == NULL) {
  28678. const char ap[] = "/.rnd";
  28679. WOLFSSL_MSG("Environment variable RANDFILE not set");
  28680. if ((rt = XGETENV("HOME")) == NULL) {
  28681. WOLFSSL_MSG("Environment variable HOME not set");
  28682. return NULL;
  28683. }
  28684. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  28685. fname[0] = '\0';
  28686. XSTRNCAT(fname, rt, len);
  28687. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  28688. return fname;
  28689. }
  28690. else {
  28691. WOLFSSL_MSG("HOME too large for buffer");
  28692. return NULL;
  28693. }
  28694. }
  28695. return fname;
  28696. #else
  28697. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  28698. WOLFSSL_MSG("RAND_file_name requires filesystem and getenv support, "
  28699. "not compiled in");
  28700. (void)fname;
  28701. (void)len;
  28702. return NULL;
  28703. #endif
  28704. }
  28705. /* Writes 1024 bytes from the RNG to the given file name.
  28706. *
  28707. * fname name of file to write to
  28708. *
  28709. * Returns the number of bytes written
  28710. */
  28711. int wolfSSL_RAND_write_file(const char* fname)
  28712. {
  28713. int bytes = 0;
  28714. WOLFSSL_ENTER("wolfSSL_RAND_write_file");
  28715. if (fname == NULL) {
  28716. return WOLFSSL_FAILURE;
  28717. }
  28718. #ifndef NO_FILESYSTEM
  28719. {
  28720. #ifndef WOLFSSL_SMALL_STACK
  28721. unsigned char buf[1024];
  28722. #else
  28723. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  28724. DYNAMIC_TYPE_TMP_BUFFER);
  28725. if (buf == NULL) {
  28726. WOLFSSL_MSG("malloc failed");
  28727. return WOLFSSL_FAILURE;
  28728. }
  28729. #endif
  28730. bytes = 1024; /* default size of buf */
  28731. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  28732. WOLFSSL_MSG("No RNG to use");
  28733. #ifdef WOLFSSL_SMALL_STACK
  28734. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28735. #endif
  28736. return 0;
  28737. }
  28738. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  28739. WOLFSSL_MSG("Error generating random buffer");
  28740. bytes = 0;
  28741. }
  28742. else {
  28743. XFILE f;
  28744. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28745. wc_MemZero_Add("wolfSSL_RAND_write_file buf", buf, bytes);
  28746. #endif
  28747. f = XFOPEN(fname, "wb");
  28748. if (f == XBADFILE) {
  28749. WOLFSSL_MSG("Error opening the file");
  28750. bytes = 0;
  28751. }
  28752. else {
  28753. size_t bytes_written = XFWRITE(buf, 1, bytes, f);
  28754. bytes = (int)bytes_written;
  28755. XFCLOSE(f);
  28756. }
  28757. }
  28758. ForceZero(buf, bytes);
  28759. #ifdef WOLFSSL_SMALL_STACK
  28760. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28761. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  28762. wc_MemZero_Check(buf, sizeof(buf));
  28763. #endif
  28764. }
  28765. #endif
  28766. return bytes;
  28767. }
  28768. #ifndef FREERTOS_TCP
  28769. /* These constant values are protocol values made by egd */
  28770. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  28771. defined(HAVE_HASHDRBG) && !defined(NETOS) && defined(HAVE_SYS_UN_H)
  28772. #define WOLFSSL_EGD_NBLOCK 0x01
  28773. #include <sys/un.h>
  28774. #endif
  28775. /* This collects entropy from the path nm and seeds the global PRNG with it.
  28776. *
  28777. * nm is the file path to the egd server
  28778. *
  28779. * Returns the number of bytes read.
  28780. */
  28781. int wolfSSL_RAND_egd(const char* nm)
  28782. {
  28783. #ifdef WOLFSSL_EGD_NBLOCK
  28784. struct sockaddr_un rem;
  28785. int fd;
  28786. int ret = WOLFSSL_SUCCESS;
  28787. word32 bytes = 0;
  28788. word32 idx = 0;
  28789. #ifndef WOLFSSL_SMALL_STACK
  28790. unsigned char buf[256];
  28791. #else
  28792. unsigned char* buf;
  28793. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28794. if (buf == NULL) {
  28795. WOLFSSL_MSG("Not enough memory");
  28796. return WOLFSSL_FATAL_ERROR;
  28797. }
  28798. #endif
  28799. XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
  28800. if (nm == NULL) {
  28801. #ifdef WOLFSSL_SMALL_STACK
  28802. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28803. #endif
  28804. return WOLFSSL_FATAL_ERROR;
  28805. }
  28806. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  28807. if (fd < 0) {
  28808. WOLFSSL_MSG("Error creating socket");
  28809. #ifdef WOLFSSL_SMALL_STACK
  28810. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28811. #endif
  28812. return WOLFSSL_FATAL_ERROR;
  28813. }
  28814. rem.sun_family = AF_UNIX;
  28815. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  28816. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  28817. /* connect to egd server */
  28818. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un)) == -1) {
  28819. WOLFSSL_MSG("error connecting to egd server");
  28820. ret = WOLFSSL_FATAL_ERROR;
  28821. }
  28822. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28823. if (ret == WOLFSSL_SUCCESS) {
  28824. wc_MemZero_Add("wolfSSL_RAND_egd buf", buf, 256);
  28825. }
  28826. #endif
  28827. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  28828. buf[idx] = WOLFSSL_EGD_NBLOCK;
  28829. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  28830. ret = (int)write(fd, buf + idx, 2);
  28831. if (ret != 2) {
  28832. if (errno == EAGAIN) {
  28833. ret = WOLFSSL_SUCCESS;
  28834. continue;
  28835. }
  28836. WOLFSSL_MSG("error requesting entropy from egd server");
  28837. ret = WOLFSSL_FATAL_ERROR;
  28838. break;
  28839. }
  28840. /* attempting to read */
  28841. buf[idx] = 0;
  28842. ret = (int)read(fd, buf + idx, 256 - bytes);
  28843. if (ret == 0) {
  28844. WOLFSSL_MSG("error reading entropy from egd server");
  28845. ret = WOLFSSL_FATAL_ERROR;
  28846. break;
  28847. }
  28848. if (ret > 0 && buf[idx] > 0) {
  28849. bytes += buf[idx]; /* egd stores amount sent in first byte */
  28850. if (bytes + idx > 255 || buf[idx] > ret) {
  28851. WOLFSSL_MSG("Buffer error");
  28852. ret = WOLFSSL_FATAL_ERROR;
  28853. break;
  28854. }
  28855. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  28856. idx = bytes;
  28857. ret = WOLFSSL_SUCCESS;
  28858. if (bytes >= 255) {
  28859. break;
  28860. }
  28861. }
  28862. else {
  28863. if (errno == EAGAIN || errno == EINTR) {
  28864. WOLFSSL_MSG("EGD would read");
  28865. ret = WOLFSSL_SUCCESS; /* try again */
  28866. }
  28867. else if (buf[idx] == 0) {
  28868. /* if egd returned 0 then there is no more entropy to be had.
  28869. Do not try more reads. */
  28870. ret = WOLFSSL_SUCCESS;
  28871. break;
  28872. }
  28873. else {
  28874. WOLFSSL_MSG("Error with read");
  28875. ret = WOLFSSL_FATAL_ERROR;
  28876. }
  28877. }
  28878. }
  28879. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  28880. /* call to check global RNG is created */
  28881. if (wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  28882. WOLFSSL_MSG("Error with initializing global RNG structure");
  28883. ret = WOLFSSL_FATAL_ERROR;
  28884. }
  28885. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  28886. != 0) {
  28887. WOLFSSL_MSG("Error with reseeding DRBG structure");
  28888. ret = WOLFSSL_FATAL_ERROR;
  28889. }
  28890. #ifdef SHOW_SECRETS
  28891. else { /* print out entropy found only when no error occurred */
  28892. word32 i;
  28893. printf("EGD Entropy = ");
  28894. for (i = 0; i < bytes; i++) {
  28895. printf("%02X", buf[i]);
  28896. }
  28897. printf("\n");
  28898. }
  28899. #endif
  28900. }
  28901. ForceZero(buf, bytes);
  28902. #ifdef WOLFSSL_SMALL_STACK
  28903. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28904. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  28905. wc_MemZero_Check(buf, 256);
  28906. #endif
  28907. close(fd);
  28908. if (ret == WOLFSSL_SUCCESS) {
  28909. return bytes;
  28910. }
  28911. else {
  28912. return ret;
  28913. }
  28914. #else
  28915. WOLFSSL_MSG("Type of socket needed is not available");
  28916. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  28917. (void)nm;
  28918. return WOLFSSL_FATAL_ERROR;
  28919. #endif /* WOLFSSL_EGD_NBLOCK */
  28920. }
  28921. #endif /* !FREERTOS_TCP */
  28922. void wolfSSL_RAND_Cleanup(void)
  28923. {
  28924. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28925. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28926. if (gRandMethods && gRandMethods->cleanup)
  28927. gRandMethods->cleanup();
  28928. wc_UnLockMutex(&gRandMethodMutex);
  28929. }
  28930. #ifndef WOLFSSL_MUTEX_INITIALIZER
  28931. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  28932. gRandMethodsInit = 0;
  28933. #endif
  28934. #endif
  28935. #ifdef HAVE_GLOBAL_RNG
  28936. if (wc_LockMutex(&globalRNGMutex) == 0) {
  28937. if (initGlobalRNG) {
  28938. wc_FreeRng(&globalRNG);
  28939. initGlobalRNG = 0;
  28940. }
  28941. wc_UnLockMutex(&globalRNGMutex);
  28942. }
  28943. #endif
  28944. }
  28945. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  28946. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  28947. {
  28948. int ret;
  28949. int hash;
  28950. byte secret[DRBG_SEED_LEN]; /* secret length arbitrarily chosen */
  28951. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28952. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28953. if (gRandMethods && gRandMethods->pseudorand) {
  28954. ret = gRandMethods->pseudorand(buf, num);
  28955. wc_UnLockMutex(&gRandMethodMutex);
  28956. return ret;
  28957. }
  28958. wc_UnLockMutex(&gRandMethodMutex);
  28959. }
  28960. #endif
  28961. #ifdef WOLFSSL_HAVE_PRF
  28962. #ifndef NO_SHA256
  28963. hash = WC_SHA256;
  28964. #elif defined(WOLFSSL_SHA384)
  28965. hash = WC_SHA384;
  28966. #elif !defined(NO_SHA)
  28967. hash = WC_SHA;
  28968. #elif !defined(NO_MD5)
  28969. hash = WC_MD5;
  28970. #endif
  28971. /* get secret value from source of entropy */
  28972. ret = wolfSSL_RAND_bytes(secret, DRBG_SEED_LEN);
  28973. /* uses input buffer to seed for pseudo random number generation, each
  28974. * thread will potentially have different results this way */
  28975. if (ret == WOLFSSL_SUCCESS) {
  28976. PRIVATE_KEY_UNLOCK();
  28977. ret = wc_PRF(buf, num, secret, DRBG_SEED_LEN, (const byte*)buf, num,
  28978. hash, NULL, INVALID_DEVID);
  28979. PRIVATE_KEY_LOCK();
  28980. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  28981. }
  28982. #else
  28983. /* fall back to just doing wolfSSL_RAND_bytes if PRF not avialbale */
  28984. ret = wolfSSL_RAND_bytes(buf, num);
  28985. (void)hash;
  28986. (void)secret;
  28987. #endif
  28988. return ret;
  28989. }
  28990. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  28991. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  28992. {
  28993. int ret = 0;
  28994. WC_RNG* rng = NULL;
  28995. #ifdef WOLFSSL_SMALL_STACK
  28996. WC_RNG* tmpRNG = NULL;
  28997. #else
  28998. WC_RNG tmpRNG[1];
  28999. #endif
  29000. int initTmpRng = 0;
  29001. #ifdef HAVE_GLOBAL_RNG
  29002. int used_global = 0;
  29003. #endif
  29004. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  29005. /* sanity check */
  29006. if (buf == NULL || num < 0)
  29007. /* return code compliant with OpenSSL */
  29008. return 0;
  29009. /* if a RAND callback has been set try and use it */
  29010. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  29011. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  29012. if (gRandMethods && gRandMethods->bytes) {
  29013. ret = gRandMethods->bytes(buf, num);
  29014. wc_UnLockMutex(&gRandMethodMutex);
  29015. return ret;
  29016. }
  29017. wc_UnLockMutex(&gRandMethodMutex);
  29018. }
  29019. #endif
  29020. #ifdef HAVE_GLOBAL_RNG
  29021. if (initGlobalRNG) {
  29022. if (wc_LockMutex(&globalRNGMutex) != 0) {
  29023. WOLFSSL_MSG("Bad Lock Mutex rng");
  29024. return ret;
  29025. }
  29026. rng = &globalRNG;
  29027. used_global = 1;
  29028. }
  29029. else
  29030. #endif
  29031. {
  29032. #ifdef WOLFSSL_SMALL_STACK
  29033. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29034. if (tmpRNG == NULL)
  29035. return ret;
  29036. #endif
  29037. if (wc_InitRng(tmpRNG) == 0) {
  29038. rng = tmpRNG;
  29039. initTmpRng = 1;
  29040. }
  29041. }
  29042. if (rng) {
  29043. /* handles size greater than RNG_MAX_BLOCK_LEN */
  29044. int blockCount = num / RNG_MAX_BLOCK_LEN;
  29045. while (blockCount--) {
  29046. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  29047. if (ret != 0) {
  29048. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  29049. break;
  29050. }
  29051. num -= RNG_MAX_BLOCK_LEN;
  29052. buf += RNG_MAX_BLOCK_LEN;
  29053. }
  29054. if (ret == 0 && num)
  29055. ret = wc_RNG_GenerateBlock(rng, buf, num);
  29056. if (ret != 0)
  29057. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  29058. else
  29059. ret = WOLFSSL_SUCCESS;
  29060. }
  29061. #ifdef HAVE_GLOBAL_RNG
  29062. if (used_global == 1)
  29063. wc_UnLockMutex(&globalRNGMutex);
  29064. #endif
  29065. if (initTmpRng)
  29066. wc_FreeRng(tmpRNG);
  29067. #ifdef WOLFSSL_SMALL_STACK
  29068. if (tmpRNG)
  29069. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29070. #endif
  29071. return ret;
  29072. }
  29073. int wolfSSL_RAND_poll(void)
  29074. {
  29075. byte entropy[16];
  29076. int ret = 0;
  29077. word32 entropy_sz = 16;
  29078. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  29079. if (initGlobalRNG == 0){
  29080. WOLFSSL_MSG("Global RNG no Init");
  29081. return WOLFSSL_FAILURE;
  29082. }
  29083. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  29084. if (ret != 0){
  29085. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  29086. ret = WOLFSSL_FAILURE;
  29087. }else
  29088. ret = WOLFSSL_SUCCESS;
  29089. return ret;
  29090. }
  29091. /* If a valid struct is provided with function pointers, will override
  29092. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  29093. pointer is passed in, it will cancel any previous function overrides.
  29094. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  29095. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  29096. {
  29097. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  29098. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  29099. gRandMethods = methods;
  29100. wc_UnLockMutex(&gRandMethodMutex);
  29101. return WOLFSSL_SUCCESS;
  29102. }
  29103. #else
  29104. (void)methods;
  29105. #endif
  29106. return WOLFSSL_FAILURE;
  29107. }
  29108. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  29109. int wolfSSL_RAND_status(void)
  29110. {
  29111. int ret = WOLFSSL_SUCCESS;
  29112. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  29113. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  29114. if (gRandMethods && gRandMethods->status)
  29115. ret = gRandMethods->status();
  29116. wc_UnLockMutex(&gRandMethodMutex);
  29117. }
  29118. else {
  29119. ret = WOLFSSL_FAILURE;
  29120. }
  29121. #else
  29122. /* wolfCrypt provides enough seed internally, so return success */
  29123. #endif
  29124. return ret;
  29125. }
  29126. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  29127. {
  29128. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  29129. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  29130. if (gRandMethods && gRandMethods->add) {
  29131. /* callback has return code, but RAND_add does not */
  29132. (void)gRandMethods->add(add, len, entropy);
  29133. }
  29134. wc_UnLockMutex(&gRandMethodMutex);
  29135. }
  29136. #else
  29137. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  29138. to take control */
  29139. (void)add;
  29140. (void)len;
  29141. (void)entropy;
  29142. #endif
  29143. }
  29144. #endif /* OPENSSL_EXTRA */
  29145. /*******************************************************************************
  29146. * END OF RAND API
  29147. ******************************************************************************/
  29148. /*******************************************************************************
  29149. * START OF EVP_CIPHER API
  29150. ******************************************************************************/
  29151. #ifdef OPENSSL_EXTRA
  29152. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  29153. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  29154. {
  29155. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  29156. if (ctx == NULL) {
  29157. WOLFSSL_MSG("Bad function argument");
  29158. return WOLFSSL_FATAL_ERROR;
  29159. }
  29160. switch (ctx->cipherType) {
  29161. #ifndef NO_AES
  29162. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  29163. case AES_128_CBC_TYPE :
  29164. case AES_192_CBC_TYPE :
  29165. case AES_256_CBC_TYPE :
  29166. WOLFSSL_MSG("AES CBC");
  29167. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  29168. break;
  29169. #endif
  29170. #ifdef HAVE_AESGCM
  29171. case AES_128_GCM_TYPE :
  29172. case AES_192_GCM_TYPE :
  29173. case AES_256_GCM_TYPE :
  29174. WOLFSSL_MSG("AES GCM");
  29175. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  29176. break;
  29177. #endif /* HAVE_AESGCM */
  29178. #ifdef HAVE_AESCCM
  29179. case AES_128_CCM_TYPE :
  29180. case AES_192_CCM_TYPE :
  29181. case AES_256_CCM_TYPE :
  29182. WOLFSSL_MSG("AES CCM");
  29183. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  29184. break;
  29185. #endif /* HAVE_AESCCM */
  29186. #ifdef HAVE_AES_ECB
  29187. case AES_128_ECB_TYPE :
  29188. case AES_192_ECB_TYPE :
  29189. case AES_256_ECB_TYPE :
  29190. WOLFSSL_MSG("AES ECB");
  29191. break;
  29192. #endif
  29193. #ifdef WOLFSSL_AES_COUNTER
  29194. case AES_128_CTR_TYPE :
  29195. case AES_192_CTR_TYPE :
  29196. case AES_256_CTR_TYPE :
  29197. WOLFSSL_MSG("AES CTR");
  29198. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  29199. break;
  29200. #endif /* WOLFSSL_AES_COUNTER */
  29201. #ifdef WOLFSSL_AES_CFB
  29202. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  29203. case AES_128_CFB1_TYPE:
  29204. case AES_192_CFB1_TYPE:
  29205. case AES_256_CFB1_TYPE:
  29206. WOLFSSL_MSG("AES CFB1");
  29207. break;
  29208. case AES_128_CFB8_TYPE:
  29209. case AES_192_CFB8_TYPE:
  29210. case AES_256_CFB8_TYPE:
  29211. WOLFSSL_MSG("AES CFB8");
  29212. break;
  29213. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  29214. case AES_128_CFB128_TYPE:
  29215. case AES_192_CFB128_TYPE:
  29216. case AES_256_CFB128_TYPE:
  29217. WOLFSSL_MSG("AES CFB128");
  29218. break;
  29219. #endif /* WOLFSSL_AES_CFB */
  29220. #if defined(WOLFSSL_AES_OFB)
  29221. case AES_128_OFB_TYPE:
  29222. case AES_192_OFB_TYPE:
  29223. case AES_256_OFB_TYPE:
  29224. WOLFSSL_MSG("AES OFB");
  29225. break;
  29226. #endif /* WOLFSSL_AES_OFB */
  29227. #ifdef WOLFSSL_AES_XTS
  29228. case AES_128_XTS_TYPE:
  29229. case AES_256_XTS_TYPE:
  29230. WOLFSSL_MSG("AES XTS");
  29231. break;
  29232. #endif /* WOLFSSL_AES_XTS */
  29233. #endif /* NO_AES */
  29234. #ifdef HAVE_ARIA
  29235. case ARIA_128_GCM_TYPE :
  29236. case ARIA_192_GCM_TYPE :
  29237. case ARIA_256_GCM_TYPE :
  29238. WOLFSSL_MSG("ARIA GCM");
  29239. XMEMCPY(ctx->iv, &ctx->cipher.aria.nonce, ARIA_BLOCK_SIZE);
  29240. break;
  29241. #endif /* HAVE_ARIA */
  29242. #ifndef NO_DES3
  29243. case DES_CBC_TYPE :
  29244. WOLFSSL_MSG("DES CBC");
  29245. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  29246. break;
  29247. case DES_EDE3_CBC_TYPE :
  29248. WOLFSSL_MSG("DES EDE3 CBC");
  29249. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  29250. break;
  29251. #endif
  29252. #ifdef WOLFSSL_DES_ECB
  29253. case DES_ECB_TYPE :
  29254. WOLFSSL_MSG("DES ECB");
  29255. break;
  29256. case DES_EDE3_ECB_TYPE :
  29257. WOLFSSL_MSG("DES3 ECB");
  29258. break;
  29259. #endif
  29260. case ARC4_TYPE :
  29261. WOLFSSL_MSG("ARC4");
  29262. break;
  29263. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  29264. case CHACHA20_POLY1305_TYPE:
  29265. break;
  29266. #endif
  29267. #ifdef HAVE_CHACHA
  29268. case CHACHA20_TYPE:
  29269. break;
  29270. #endif
  29271. #ifdef WOLFSSL_SM4_ECB
  29272. case SM4_ECB_TYPE:
  29273. break;
  29274. #endif
  29275. #ifdef WOLFSSL_SM4_CBC
  29276. case SM4_CBC_TYPE:
  29277. WOLFSSL_MSG("SM4 CBC");
  29278. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  29279. break;
  29280. #endif
  29281. #ifdef WOLFSSL_SM4_CTR
  29282. case SM4_CTR_TYPE:
  29283. WOLFSSL_MSG("SM4 CTR");
  29284. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  29285. break;
  29286. #endif
  29287. #ifdef WOLFSSL_SM4_GCM
  29288. case SM4_GCM_TYPE:
  29289. WOLFSSL_MSG("SM4 GCM");
  29290. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  29291. break;
  29292. #endif
  29293. #ifdef WOLFSSL_SM4_CCM
  29294. case SM4_CCM_TYPE:
  29295. WOLFSSL_MSG("SM4 CCM");
  29296. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  29297. break;
  29298. #endif
  29299. case NULL_CIPHER_TYPE :
  29300. WOLFSSL_MSG("NULL");
  29301. break;
  29302. default: {
  29303. WOLFSSL_MSG("bad type");
  29304. return WOLFSSL_FATAL_ERROR;
  29305. }
  29306. }
  29307. return WOLFSSL_SUCCESS;
  29308. }
  29309. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  29310. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  29311. {
  29312. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  29313. if (ctx == NULL) {
  29314. WOLFSSL_MSG("Bad function argument");
  29315. return WOLFSSL_FATAL_ERROR;
  29316. }
  29317. switch (ctx->cipherType) {
  29318. #ifndef NO_AES
  29319. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  29320. case AES_128_CBC_TYPE :
  29321. case AES_192_CBC_TYPE :
  29322. case AES_256_CBC_TYPE :
  29323. WOLFSSL_MSG("AES CBC");
  29324. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  29325. break;
  29326. #endif
  29327. #ifdef HAVE_AESGCM
  29328. case AES_128_GCM_TYPE :
  29329. case AES_192_GCM_TYPE :
  29330. case AES_256_GCM_TYPE :
  29331. WOLFSSL_MSG("AES GCM");
  29332. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  29333. break;
  29334. #endif
  29335. #ifdef HAVE_AES_ECB
  29336. case AES_128_ECB_TYPE :
  29337. case AES_192_ECB_TYPE :
  29338. case AES_256_ECB_TYPE :
  29339. WOLFSSL_MSG("AES ECB");
  29340. break;
  29341. #endif
  29342. #ifdef WOLFSSL_AES_COUNTER
  29343. case AES_128_CTR_TYPE :
  29344. case AES_192_CTR_TYPE :
  29345. case AES_256_CTR_TYPE :
  29346. WOLFSSL_MSG("AES CTR");
  29347. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  29348. break;
  29349. #endif
  29350. #endif /* NO_AES */
  29351. #ifdef HAVE_ARIA
  29352. case ARIA_128_GCM_TYPE :
  29353. case ARIA_192_GCM_TYPE :
  29354. case ARIA_256_GCM_TYPE :
  29355. WOLFSSL_MSG("ARIA GCM");
  29356. XMEMCPY(&ctx->cipher.aria.nonce, ctx->iv, ARIA_BLOCK_SIZE);
  29357. break;
  29358. #endif /* HAVE_ARIA */
  29359. #ifndef NO_DES3
  29360. case DES_CBC_TYPE :
  29361. WOLFSSL_MSG("DES CBC");
  29362. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  29363. break;
  29364. case DES_EDE3_CBC_TYPE :
  29365. WOLFSSL_MSG("DES EDE3 CBC");
  29366. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  29367. break;
  29368. #endif
  29369. #ifdef WOLFSSL_DES_ECB
  29370. case DES_ECB_TYPE :
  29371. WOLFSSL_MSG("DES ECB");
  29372. break;
  29373. case DES_EDE3_ECB_TYPE :
  29374. WOLFSSL_MSG("DES3 ECB");
  29375. break;
  29376. #endif
  29377. case ARC4_TYPE :
  29378. WOLFSSL_MSG("ARC4");
  29379. break;
  29380. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  29381. case CHACHA20_POLY1305_TYPE:
  29382. break;
  29383. #endif
  29384. #ifdef HAVE_CHACHA
  29385. case CHACHA20_TYPE:
  29386. break;
  29387. #endif
  29388. #ifdef WOLFSSL_SM4_ECB
  29389. case SM4_ECB_TYPE:
  29390. break;
  29391. #endif
  29392. #ifdef WOLFSSL_SM4_CBC
  29393. case SM4_CBC_TYPE:
  29394. WOLFSSL_MSG("SM4 CBC");
  29395. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  29396. break;
  29397. #endif
  29398. #ifdef WOLFSSL_SM4_CTR
  29399. case SM4_CTR_TYPE:
  29400. WOLFSSL_MSG("SM4 CTR");
  29401. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  29402. break;
  29403. #endif
  29404. #ifdef WOLFSSL_SM4_GCM
  29405. case SM4_GCM_TYPE:
  29406. WOLFSSL_MSG("SM4 GCM");
  29407. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  29408. break;
  29409. #endif
  29410. #ifdef WOLFSSL_SM4_CCM
  29411. case SM4_CCM_TYPE:
  29412. WOLFSSL_MSG("SM4 CCM");
  29413. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  29414. break;
  29415. #endif
  29416. case NULL_CIPHER_TYPE :
  29417. WOLFSSL_MSG("NULL");
  29418. break;
  29419. default: {
  29420. WOLFSSL_MSG("bad type");
  29421. return WOLFSSL_FATAL_ERROR;
  29422. }
  29423. }
  29424. return WOLFSSL_SUCCESS;
  29425. }
  29426. #ifndef NO_DES3
  29427. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29428. unsigned char* iv, int len)
  29429. {
  29430. (void)len;
  29431. WOLFSSL_MSG("wolfSSL_3des_iv");
  29432. if (ctx == NULL || iv == NULL) {
  29433. WOLFSSL_MSG("Bad function argument");
  29434. return;
  29435. }
  29436. if (doset)
  29437. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  29438. else
  29439. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  29440. }
  29441. #endif /* NO_DES3 */
  29442. #ifndef NO_AES
  29443. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29444. unsigned char* iv, int len)
  29445. {
  29446. (void)len;
  29447. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  29448. if (ctx == NULL || iv == NULL) {
  29449. WOLFSSL_MSG("Bad function argument");
  29450. return;
  29451. }
  29452. if (doset)
  29453. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  29454. else
  29455. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  29456. }
  29457. #endif /* NO_AES */
  29458. #endif /* OPENSSL_EXTRA */
  29459. /*******************************************************************************
  29460. * END OF EVP_CIPHER API
  29461. ******************************************************************************/
  29462. #ifndef NO_CERTS
  29463. #define WOLFSSL_X509_STORE_INCLUDED
  29464. #include <src/x509_str.c>
  29465. /*******************************************************************************
  29466. * START OF PKCS7 APIs
  29467. ******************************************************************************/
  29468. #ifdef HAVE_PKCS7
  29469. #ifdef OPENSSL_ALL
  29470. PKCS7* wolfSSL_PKCS7_new(void)
  29471. {
  29472. WOLFSSL_PKCS7* pkcs7;
  29473. int ret = 0;
  29474. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL,
  29475. DYNAMIC_TYPE_PKCS7);
  29476. if (pkcs7 != NULL) {
  29477. XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7));
  29478. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  29479. }
  29480. if (ret != 0 && pkcs7 != NULL) {
  29481. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  29482. pkcs7 = NULL;
  29483. }
  29484. return (PKCS7*)pkcs7;
  29485. }
  29486. /******************************************************************************
  29487. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  29488. *
  29489. * RETURNS:
  29490. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  29491. */
  29492. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  29493. {
  29494. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  29495. PKCS7* pkcs7 = NULL;
  29496. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  29497. return NULL;
  29498. pkcs7->contentOID = SIGNED_DATA;
  29499. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  29500. if (pkcs7) {
  29501. wolfSSL_PKCS7_free(pkcs7);
  29502. return NULL;
  29503. }
  29504. }
  29505. return pkcs7;
  29506. }
  29507. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  29508. {
  29509. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29510. if (p7 != NULL) {
  29511. if (p7->data != NULL)
  29512. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  29513. wc_PKCS7_Free(&p7->pkcs7);
  29514. if (p7->certs)
  29515. wolfSSL_sk_pop_free(p7->certs, NULL);
  29516. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  29517. }
  29518. }
  29519. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  29520. {
  29521. wolfSSL_PKCS7_free(p7);
  29522. return;
  29523. }
  29524. /**
  29525. * Convert DER/ASN.1 encoded signedData structure to internal PKCS7
  29526. * structure. Note, does not support detached content.
  29527. *
  29528. * p7 - pointer to set to address of newly created PKCS7 structure on return
  29529. * in - pointer to pointer of DER/ASN.1 data
  29530. * len - length of input data, bytes
  29531. *
  29532. * Returns newly allocated and populated PKCS7 structure or NULL on error.
  29533. */
  29534. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  29535. {
  29536. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  29537. }
  29538. /* This internal function is only decoding and setting up the PKCS7 struct. It
  29539. * does not verify the PKCS7 signature.
  29540. *
  29541. * RETURNS:
  29542. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  29543. */
  29544. static PKCS7* wolfSSL_d2i_PKCS7_only(PKCS7** p7, const unsigned char** in,
  29545. int len, byte* content, word32 contentSz)
  29546. {
  29547. WOLFSSL_PKCS7* pkcs7 = NULL;
  29548. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  29549. if (in == NULL || *in == NULL || len < 0)
  29550. return NULL;
  29551. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  29552. return NULL;
  29553. pkcs7->len = len;
  29554. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  29555. if (pkcs7->data == NULL) {
  29556. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29557. return NULL;
  29558. }
  29559. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  29560. if (content != NULL) {
  29561. pkcs7->pkcs7.content = content;
  29562. pkcs7->pkcs7.contentSz = contentSz;
  29563. }
  29564. if (p7 != NULL)
  29565. *p7 = (PKCS7*)pkcs7;
  29566. *in += pkcs7->len;
  29567. return (PKCS7*)pkcs7;
  29568. }
  29569. /*****************************************************************************
  29570. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  29571. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  29572. * is stored as the PKCS7 object's content, to support detached signatures.
  29573. * @param content The content which is signed, in case the signature is
  29574. * detached. Ignored if NULL.
  29575. * @param contentSz The size of the passed in content.
  29576. *
  29577. * RETURNS:
  29578. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  29579. */
  29580. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  29581. byte* content, word32 contentSz)
  29582. {
  29583. WOLFSSL_PKCS7* pkcs7 = NULL;
  29584. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  29585. if (in == NULL || *in == NULL || len < 0)
  29586. return NULL;
  29587. pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_d2i_PKCS7_only(p7, in, len, content,
  29588. contentSz);
  29589. if (pkcs7 != NULL) {
  29590. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  29591. != 0) {
  29592. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  29593. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29594. if (p7 != NULL) {
  29595. *p7 = NULL;
  29596. }
  29597. return NULL;
  29598. }
  29599. }
  29600. return (PKCS7*)pkcs7;
  29601. }
  29602. /**
  29603. * This API was added as a helper function for libest. It
  29604. * extracts a stack of certificates from the pkcs7 object.
  29605. * @param pkcs7 PKCS7 parameter object
  29606. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  29607. */
  29608. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  29609. {
  29610. int i;
  29611. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29612. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  29613. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  29614. if (!p7) {
  29615. WOLFSSL_MSG("Bad parameter");
  29616. return NULL;
  29617. }
  29618. if (p7->certs)
  29619. return p7->certs;
  29620. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  29621. WOLFSSL_X509* x509 = wolfSSL_X509_d2i_ex(NULL, p7->pkcs7.cert[i],
  29622. p7->pkcs7.certSz[i], pkcs7->heap);
  29623. if (!ret)
  29624. ret = wolfSSL_sk_X509_new_null();
  29625. if (x509) {
  29626. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  29627. wolfSSL_X509_free(x509);
  29628. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  29629. goto error;
  29630. }
  29631. }
  29632. else {
  29633. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  29634. goto error;
  29635. }
  29636. }
  29637. /* Save stack to free later */
  29638. if (p7->certs)
  29639. wolfSSL_sk_pop_free(p7->certs, NULL);
  29640. p7->certs = ret;
  29641. return ret;
  29642. error:
  29643. if (ret) {
  29644. wolfSSL_sk_pop_free(ret, NULL);
  29645. }
  29646. return NULL;
  29647. }
  29648. /**
  29649. * Return stack of signers contained in PKCS7 cert.
  29650. * Notes:
  29651. * - Currently only PKCS#7 messages with a single signer cert is supported.
  29652. * - Returned WOLFSSL_STACK must be freed by caller.
  29653. *
  29654. * pkcs7 - PKCS7 struct to retrieve signer certs from.
  29655. * certs - currently unused
  29656. * flags - flags to control function behavior.
  29657. *
  29658. * Return WOLFSSL_STACK of signers on success, NULL on error.
  29659. */
  29660. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  29661. int flags)
  29662. {
  29663. WOLFSSL_X509* x509 = NULL;
  29664. WOLFSSL_STACK* signers = NULL;
  29665. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29666. if (p7 == NULL)
  29667. return NULL;
  29668. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  29669. * is supported.
  29670. */
  29671. if (flags & PKCS7_NOINTERN) {
  29672. WOLFSSL_MSG("PKCS7_NOINTERN flag not supported");
  29673. return NULL;
  29674. }
  29675. signers = wolfSSL_sk_X509_new_null();
  29676. if (signers == NULL)
  29677. return NULL;
  29678. if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert,
  29679. p7->pkcs7.singleCertSz) == NULL) {
  29680. wolfSSL_sk_X509_pop_free(signers, NULL);
  29681. return NULL;
  29682. }
  29683. if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) {
  29684. wolfSSL_sk_X509_pop_free(signers, NULL);
  29685. return NULL;
  29686. }
  29687. (void)certs;
  29688. return signers;
  29689. }
  29690. #ifndef NO_BIO
  29691. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  29692. {
  29693. WOLFSSL_PKCS7* pkcs7;
  29694. int ret;
  29695. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  29696. if (bio == NULL)
  29697. return NULL;
  29698. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  29699. return NULL;
  29700. pkcs7->len = wolfSSL_BIO_get_len(bio);
  29701. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  29702. if (pkcs7->data == NULL) {
  29703. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29704. return NULL;
  29705. }
  29706. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  29707. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29708. return NULL;
  29709. }
  29710. /* pkcs7->len may change if using b64 for example */
  29711. pkcs7->len = ret;
  29712. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  29713. != 0) {
  29714. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  29715. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29716. return NULL;
  29717. }
  29718. if (p7 != NULL)
  29719. *p7 = (PKCS7*)pkcs7;
  29720. return (PKCS7*)pkcs7;
  29721. }
  29722. int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out)
  29723. {
  29724. byte* output = NULL;
  29725. int localBuf = 0;
  29726. int len;
  29727. WC_RNG rng;
  29728. int ret = WOLFSSL_FAILURE;
  29729. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7");
  29730. if (!out || !p7) {
  29731. WOLFSSL_MSG("Bad parameter");
  29732. return WOLFSSL_FAILURE;
  29733. }
  29734. if (!p7->rng) {
  29735. if (wc_InitRng(&rng) != 0) {
  29736. WOLFSSL_MSG("wc_InitRng error");
  29737. return WOLFSSL_FAILURE;
  29738. }
  29739. p7->rng = &rng; /* cppcheck-suppress autoVariables
  29740. */
  29741. }
  29742. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  29743. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  29744. goto cleanup;
  29745. }
  29746. if (*out == NULL) {
  29747. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29748. if (!output) {
  29749. WOLFSSL_MSG("malloc error");
  29750. goto cleanup;
  29751. }
  29752. localBuf = 1;
  29753. }
  29754. else {
  29755. output = *out;
  29756. }
  29757. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  29758. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  29759. goto cleanup;
  29760. }
  29761. ret = len;
  29762. cleanup:
  29763. if (p7->rng == &rng) {
  29764. wc_FreeRng(&rng);
  29765. p7->rng = NULL;
  29766. }
  29767. if (ret == WOLFSSL_FAILURE && localBuf && output)
  29768. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29769. if (ret != WOLFSSL_FAILURE)
  29770. *out = output;
  29771. return ret;
  29772. }
  29773. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  29774. {
  29775. byte* output = NULL;
  29776. int len;
  29777. int ret = WOLFSSL_FAILURE;
  29778. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  29779. if (!bio || !p7) {
  29780. WOLFSSL_MSG("Bad parameter");
  29781. return WOLFSSL_FAILURE;
  29782. }
  29783. if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) {
  29784. WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error");
  29785. goto cleanup;
  29786. }
  29787. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  29788. WOLFSSL_MSG("wolfSSL_BIO_write error");
  29789. goto cleanup;
  29790. }
  29791. ret = WOLFSSL_SUCCESS;
  29792. cleanup:
  29793. if (output)
  29794. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29795. return ret;
  29796. }
  29797. /**
  29798. * Creates and returns a PKCS7 signedData structure.
  29799. *
  29800. * Inner content type is set to DATA to match OpenSSL behavior.
  29801. *
  29802. * signer - certificate to sign bundle with
  29803. * pkey - private key matching signer
  29804. * certs - optional additional set of certificates to include
  29805. * in - input data to be signed
  29806. * flags - optional set of flags to control sign behavior
  29807. *
  29808. * PKCS7_BINARY - Do not translate input data to MIME canonical
  29809. * format (\r\n line endings), thus preventing corruption of
  29810. * binary content.
  29811. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  29812. * PKCS7_DETACHED - Set signature detached, omit content from output bundle.
  29813. * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data.
  29814. *
  29815. * Flags not currently supported:
  29816. * PKCS7_NOCERTS - Do not include the signer cert in the output bundle.
  29817. * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up,
  29818. * then signers etc to be added separately before
  29819. * calling PKCS7_final().
  29820. *
  29821. * Returns valid PKCS7 structure pointer, or NULL if an error occurred.
  29822. */
  29823. PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey,
  29824. WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags)
  29825. {
  29826. int err = 0;
  29827. WOLFSSL_PKCS7* p7 = NULL;
  29828. WOLFSSL_STACK* cert = certs;
  29829. WOLFSSL_ENTER("wolfSSL_PKCS7_sign");
  29830. if (flags & PKCS7_NOCERTS) {
  29831. WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported");
  29832. err = 1;
  29833. }
  29834. if (flags & PKCS7_PARTIAL) {
  29835. WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported");
  29836. err = 1;
  29837. }
  29838. if ((err == 0) && (signer == NULL || signer->derCert == NULL ||
  29839. signer->derCert->length == 0)) {
  29840. WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete");
  29841. err = 1;
  29842. }
  29843. if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL ||
  29844. pkey->pkey_sz <= 0)) {
  29845. WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete");
  29846. err = 1;
  29847. }
  29848. if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) {
  29849. WOLFSSL_MSG("input data required unless PKCS7_STREAM used");
  29850. err = 1;
  29851. }
  29852. if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) {
  29853. WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7");
  29854. err = 1;
  29855. }
  29856. /* load signer certificate */
  29857. if (err == 0) {
  29858. if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer,
  29859. signer->derCert->length) != 0) {
  29860. WOLFSSL_MSG("Failed to load signer certificate");
  29861. err = 1;
  29862. }
  29863. }
  29864. /* set signer private key, data types, defaults */
  29865. if (err == 0) {
  29866. p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr;
  29867. p7->pkcs7.privateKeySz = pkey->pkey_sz;
  29868. p7->pkcs7.contentOID = DATA; /* inner content default is DATA */
  29869. p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */
  29870. p7->type = SIGNED_DATA; /* PKCS7_final switches on type */
  29871. }
  29872. /* add additional chain certs if provided */
  29873. while (cert && (err == 0)) {
  29874. if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) {
  29875. if (wc_PKCS7_AddCertificate(&p7->pkcs7,
  29876. cert->data.x509->derCert->buffer,
  29877. cert->data.x509->derCert->length) != 0) {
  29878. WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate");
  29879. err = 1;
  29880. }
  29881. }
  29882. cert = cert->next;
  29883. }
  29884. if ((err == 0) && (flags & PKCS7_DETACHED)) {
  29885. if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) {
  29886. WOLFSSL_MSG("Failed to set signature detached");
  29887. err = 1;
  29888. }
  29889. }
  29890. if ((err == 0) && (flags & PKCS7_STREAM)) {
  29891. /* if streaming, return before finalizing */
  29892. return (PKCS7*)p7;
  29893. }
  29894. if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) {
  29895. WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final");
  29896. err = 1;
  29897. }
  29898. if ((err != 0) && (p7 != NULL)) {
  29899. wolfSSL_PKCS7_free((PKCS7*)p7);
  29900. p7 = NULL;
  29901. }
  29902. return (PKCS7*)p7;
  29903. }
  29904. #ifdef HAVE_SMIME
  29905. #ifndef MAX_MIME_LINE_LEN
  29906. #define MAX_MIME_LINE_LEN 1024
  29907. #endif
  29908. /**
  29909. * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n),
  29910. * used by PKCS7_final().
  29911. *
  29912. * in - input WOLFSSL_BIO to be converted
  29913. * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted
  29914. *
  29915. * Return 0 on success, negative on error
  29916. */
  29917. static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out)
  29918. {
  29919. int ret = 0;
  29920. int lineLen = 0;
  29921. word32 canonLineLen = 0;
  29922. char* canonLine = NULL;
  29923. #ifdef WOLFSSL_SMALL_STACK
  29924. char* line = NULL;
  29925. #else
  29926. char line[MAX_MIME_LINE_LEN];
  29927. #endif
  29928. if (in == NULL || out == NULL) {
  29929. return BAD_FUNC_ARG;
  29930. }
  29931. #ifdef WOLFSSL_SMALL_STACK
  29932. line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap,
  29933. DYNAMIC_TYPE_TMP_BUFFER);
  29934. if (line == NULL) {
  29935. return MEMORY_E;
  29936. }
  29937. #endif
  29938. XMEMSET(line, 0, MAX_MIME_LINE_LEN);
  29939. while ((lineLen = wolfSSL_BIO_gets(in, line, MAX_MIME_LINE_LEN)) > 0) {
  29940. if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') {
  29941. canonLineLen = (word32)lineLen;
  29942. if ((canonLine = wc_MIME_single_canonicalize(
  29943. line, &canonLineLen)) == NULL) {
  29944. ret = -1;
  29945. break;
  29946. }
  29947. /* remove trailing null */
  29948. if (canonLineLen >= 1 && canonLine[canonLineLen-1] == '\0') {
  29949. canonLineLen--;
  29950. }
  29951. if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) {
  29952. ret = -1;
  29953. break;
  29954. }
  29955. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  29956. canonLine = NULL;
  29957. }
  29958. else {
  29959. /* no line ending in current line, write direct to out */
  29960. if (wolfSSL_BIO_write(out, line, lineLen) < 0) {
  29961. ret = -1;
  29962. break;
  29963. }
  29964. }
  29965. }
  29966. if (canonLine != NULL) {
  29967. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  29968. }
  29969. #ifdef WOLFSSL_SMALL_STACK
  29970. XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29971. #endif
  29972. return ret;
  29973. }
  29974. #endif /* HAVE_SMIME */
  29975. /* Used by both PKCS7_final() and PKCS7_verify() */
  29976. static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n";
  29977. /**
  29978. * Finalize PKCS7 structure, currently supports signedData only.
  29979. *
  29980. * Does not generate final bundle (ie: signedData), but finalizes
  29981. * the PKCS7 structure in preparation for a output function to be called next.
  29982. *
  29983. * pkcs7 - initialized PKCS7 structure, populated with signer, etc
  29984. * in - input data
  29985. * flags - flags to control PKCS7 behavior. Other flags except those noted
  29986. * below are ignored:
  29987. *
  29988. * PKCS7_BINARY - Do not translate input data to MIME canonical
  29989. * format (\r\n line endings), thus preventing corruption of
  29990. * binary content.
  29991. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  29992. *
  29993. * Returns 1 on success, 0 on error
  29994. */
  29995. int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags)
  29996. {
  29997. int ret = 1;
  29998. int memSz = 0;
  29999. unsigned char* mem = NULL;
  30000. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  30001. WOLFSSL_BIO* data = NULL;
  30002. WOLFSSL_ENTER("wolfSSL_PKCS7_final");
  30003. if (p7 == NULL || in == NULL) {
  30004. WOLFSSL_MSG("Bad input args to PKCS7_final");
  30005. ret = 0;
  30006. }
  30007. if (ret == 1) {
  30008. if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) {
  30009. WOLFSSL_MSG("Error in wolfSSL_BIO_new");
  30010. ret = 0;
  30011. }
  30012. }
  30013. /* prepend Content-Type header if PKCS7_TEXT */
  30014. if ((ret == 1) && (flags & PKCS7_TEXT)) {
  30015. if (wolfSSL_BIO_write(data, contTypeText,
  30016. (int)XSTR_SIZEOF(contTypeText)) < 0) {
  30017. WOLFSSL_MSG("Error prepending Content-Type header");
  30018. ret = 0;
  30019. }
  30020. }
  30021. /* convert line endings to CRLF if !PKCS7_BINARY */
  30022. if (ret == 1) {
  30023. if (flags & PKCS7_BINARY) {
  30024. /* no CRLF conversion, direct copy content */
  30025. if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) {
  30026. ret = 0;
  30027. }
  30028. if (ret == 1) {
  30029. mem = (unsigned char*)XMALLOC(memSz, in->heap,
  30030. DYNAMIC_TYPE_TMP_BUFFER);
  30031. if (mem == NULL) {
  30032. WOLFSSL_MSG("Failed to allocate memory for input data");
  30033. ret = 0;
  30034. }
  30035. }
  30036. if (ret == 1) {
  30037. if (wolfSSL_BIO_read(in, mem, memSz) != memSz) {
  30038. WOLFSSL_MSG("Error reading from input BIO");
  30039. ret = 0;
  30040. }
  30041. else if (wolfSSL_BIO_write(data, mem, memSz) < 0) {
  30042. ret = 0;
  30043. }
  30044. }
  30045. if (mem != NULL) {
  30046. XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30047. }
  30048. }
  30049. else {
  30050. #ifdef HAVE_SMIME
  30051. /* convert content line endings to CRLF */
  30052. if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) {
  30053. WOLFSSL_MSG("Error converting line endings to CRLF");
  30054. ret = 0;
  30055. }
  30056. else {
  30057. p7->pkcs7.contentCRLF = 1;
  30058. }
  30059. #else
  30060. WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built "
  30061. "with HAVE_SMIME");
  30062. ret = 0;
  30063. #endif
  30064. }
  30065. }
  30066. if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) {
  30067. WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data");
  30068. ret = 0;
  30069. }
  30070. if (ret == 1) {
  30071. if (p7->data != NULL) {
  30072. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  30073. }
  30074. p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7);
  30075. if (p7->data == NULL) {
  30076. ret = 0;
  30077. }
  30078. else {
  30079. XMEMCPY(p7->data, mem, memSz);
  30080. p7->len = memSz;
  30081. }
  30082. }
  30083. if (ret == 1) {
  30084. p7->pkcs7.content = p7->data;
  30085. p7->pkcs7.contentSz = p7->len;
  30086. }
  30087. if (data != NULL) {
  30088. wolfSSL_BIO_free(data);
  30089. }
  30090. return ret;
  30091. }
  30092. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  30093. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags)
  30094. {
  30095. int i, ret = 0;
  30096. unsigned char* mem = NULL;
  30097. int memSz = 0;
  30098. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  30099. int contTypeLen;
  30100. WOLFSSL_X509* signer = NULL;
  30101. WOLFSSL_STACK* signers = NULL;
  30102. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  30103. if (pkcs7 == NULL)
  30104. return WOLFSSL_FAILURE;
  30105. if (in != NULL) {
  30106. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  30107. return WOLFSSL_FAILURE;
  30108. p7->pkcs7.content = mem;
  30109. p7->pkcs7.contentSz = memSz;
  30110. }
  30111. /* certs is the list of certificates to find the cert with issuer/serial. */
  30112. (void)certs;
  30113. /* store is the certificate store to use to verify signer certificate
  30114. * associated with the signers.
  30115. */
  30116. (void)store;
  30117. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  30118. if (ret != 0)
  30119. return WOLFSSL_FAILURE;
  30120. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  30121. /* Verify signer certificates */
  30122. if (store == NULL || store->cm == NULL) {
  30123. WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set");
  30124. return WOLFSSL_FAILURE;
  30125. }
  30126. signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags);
  30127. if (signers == NULL) {
  30128. WOLFSSL_MSG("No signers found to verify");
  30129. return WOLFSSL_FAILURE;
  30130. }
  30131. for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) {
  30132. signer = wolfSSL_sk_X509_value(signers, i);
  30133. if (wolfSSL_CertManagerVerifyBuffer(store->cm,
  30134. signer->derCert->buffer,
  30135. signer->derCert->length,
  30136. WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
  30137. WOLFSSL_MSG("Failed to verify signer certificate");
  30138. wolfSSL_sk_X509_pop_free(signers, NULL);
  30139. return WOLFSSL_FAILURE;
  30140. }
  30141. }
  30142. wolfSSL_sk_X509_pop_free(signers, NULL);
  30143. }
  30144. if (flags & PKCS7_TEXT) {
  30145. /* strip MIME header for text/plain, otherwise error */
  30146. contTypeLen = XSTR_SIZEOF(contTypeText);
  30147. if ((p7->pkcs7.contentSz < (word32)contTypeLen) ||
  30148. (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) {
  30149. WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT");
  30150. return WOLFSSL_FAILURE;
  30151. }
  30152. p7->pkcs7.content += contTypeLen;
  30153. p7->pkcs7.contentSz -= contTypeLen;
  30154. }
  30155. if (out != NULL) {
  30156. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  30157. }
  30158. WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS);
  30159. return WOLFSSL_SUCCESS;
  30160. }
  30161. /**
  30162. * This API was added as a helper function for libest. It
  30163. * encodes a stack of certificates to pkcs7 format.
  30164. * @param pkcs7 PKCS7 parameter object
  30165. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  30166. * @param out Output bio
  30167. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  30168. */
  30169. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  30170. WOLFSSL_BIO* out)
  30171. {
  30172. int ret;
  30173. WOLFSSL_PKCS7* p7;
  30174. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  30175. if (!pkcs7 || !certs || !out) {
  30176. WOLFSSL_MSG("Bad parameter");
  30177. return WOLFSSL_FAILURE;
  30178. }
  30179. p7 = (WOLFSSL_PKCS7*)pkcs7;
  30180. /* take ownership of certs */
  30181. p7->certs = certs;
  30182. /* TODO: takes ownership even on failure below but not on above failure. */
  30183. if (pkcs7->certList) {
  30184. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  30185. "struct");
  30186. return WOLFSSL_FAILURE;
  30187. }
  30188. if (certs) {
  30189. /* Save some of the values */
  30190. int hashOID = pkcs7->hashOID;
  30191. byte version = pkcs7->version;
  30192. if (!certs->data.x509 || !certs->data.x509->derCert) {
  30193. WOLFSSL_MSG("Missing cert");
  30194. return WOLFSSL_FAILURE;
  30195. }
  30196. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  30197. certs->data.x509->derCert->length) != 0) {
  30198. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  30199. return WOLFSSL_FAILURE;
  30200. }
  30201. certs = certs->next;
  30202. pkcs7->hashOID = hashOID;
  30203. pkcs7->version = version;
  30204. }
  30205. /* Add the certs to the PKCS7 struct */
  30206. while (certs) {
  30207. if (!certs->data.x509 || !certs->data.x509->derCert) {
  30208. WOLFSSL_MSG("Missing cert");
  30209. return WOLFSSL_FAILURE;
  30210. }
  30211. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  30212. certs->data.x509->derCert->length) != 0) {
  30213. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  30214. return WOLFSSL_FAILURE;
  30215. }
  30216. certs = certs->next;
  30217. }
  30218. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  30219. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  30220. return WOLFSSL_FAILURE;
  30221. }
  30222. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  30223. return ret;
  30224. }
  30225. /******************************************************************************
  30226. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  30227. *
  30228. * RETURNS:
  30229. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  30230. */
  30231. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  30232. {
  30233. #ifdef WOLFSSL_SMALL_STACK
  30234. byte* outputHead;
  30235. byte* outputFoot;
  30236. #else
  30237. byte outputHead[2048];
  30238. byte outputFoot[2048];
  30239. #endif
  30240. word32 outputHeadSz = 2048;
  30241. word32 outputFootSz = 2048;
  30242. word32 outputSz = 0;
  30243. byte* output = NULL;
  30244. byte* pem = NULL;
  30245. int pemSz = -1;
  30246. enum wc_HashType hashType;
  30247. byte hashBuf[WC_MAX_DIGEST_SIZE];
  30248. word32 hashSz = -1;
  30249. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7");
  30250. if (bio == NULL || p7 == NULL)
  30251. return WOLFSSL_FAILURE;
  30252. #ifdef WOLFSSL_SMALL_STACK
  30253. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap,
  30254. DYNAMIC_TYPE_TMP_BUFFER);
  30255. if (outputHead == NULL)
  30256. return MEMORY_E;
  30257. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap,
  30258. DYNAMIC_TYPE_TMP_BUFFER);
  30259. if (outputFoot == NULL)
  30260. goto error;
  30261. #endif
  30262. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  30263. XMEMSET(outputHead, 0, outputHeadSz);
  30264. XMEMSET(outputFoot, 0, outputFootSz);
  30265. hashType = wc_OidGetHash(p7->hashOID);
  30266. hashSz = wc_HashGetDigestSize(hashType);
  30267. if (hashSz > WC_MAX_DIGEST_SIZE)
  30268. goto error;
  30269. /* only SIGNED_DATA is supported */
  30270. switch (p7->contentOID) {
  30271. case SIGNED_DATA:
  30272. break;
  30273. default:
  30274. WOLFSSL_MSG("Unknown PKCS#7 Type");
  30275. goto error;
  30276. };
  30277. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  30278. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  30279. goto error;
  30280. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  30281. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30282. if (!output)
  30283. goto error;
  30284. XMEMSET(output, 0, outputSz);
  30285. outputSz = 0;
  30286. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  30287. outputSz += outputHeadSz;
  30288. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  30289. outputSz += p7->contentSz;
  30290. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  30291. outputSz += outputFootSz;
  30292. /* get PEM size */
  30293. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  30294. if (pemSz < 0)
  30295. goto error;
  30296. pemSz++; /* for '\0'*/
  30297. /* create PEM buffer and convert from DER to PEM*/
  30298. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER))
  30299. == NULL)
  30300. goto error;
  30301. XMEMSET(pem, 0, pemSz);
  30302. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  30303. goto error;
  30304. }
  30305. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  30306. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30307. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30308. #ifdef WOLFSSL_SMALL_STACK
  30309. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30310. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30311. #endif
  30312. return WOLFSSL_SUCCESS;
  30313. }
  30314. error:
  30315. #ifdef WOLFSSL_SMALL_STACK
  30316. if (outputHead) {
  30317. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30318. }
  30319. if (outputFoot) {
  30320. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30321. }
  30322. #endif
  30323. if (output) {
  30324. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30325. }
  30326. if (pem) {
  30327. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30328. }
  30329. return WOLFSSL_FAILURE;
  30330. }
  30331. #ifdef HAVE_SMIME
  30332. /*****************************************************************************
  30333. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  30334. * a PKCS7 object. In case of a multipart message, stores the signed data in
  30335. * bcont.
  30336. *
  30337. * RETURNS:
  30338. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  30339. */
  30340. PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  30341. WOLFSSL_BIO** bcont)
  30342. {
  30343. MimeHdr* allHdrs = NULL;
  30344. MimeHdr* curHdr = NULL;
  30345. MimeParam* curParam = NULL;
  30346. int inLen = 0;
  30347. byte* bcontMem = NULL;
  30348. int bcontMemSz = 0;
  30349. int sectionLen = 0;
  30350. int ret = -1;
  30351. char* section = NULL;
  30352. char* canonLine = NULL;
  30353. char* canonSection = NULL;
  30354. PKCS7* pkcs7 = NULL;
  30355. word32 outLen = 0;
  30356. word32 canonLineLen = 0;
  30357. byte* out = NULL;
  30358. byte* outHead = NULL;
  30359. int canonPos = 0;
  30360. int lineLen = 0;
  30361. int remainLen = 0;
  30362. byte isEnd = 0;
  30363. size_t canonSize = 0;
  30364. size_t boundLen = 0;
  30365. char* boundary = NULL;
  30366. static const char kContType[] = "Content-Type";
  30367. static const char kCTE[] = "Content-Transfer-Encoding";
  30368. static const char kMultSigned[] = "multipart/signed";
  30369. static const char kAppPkcsSign[] = "application/pkcs7-signature";
  30370. static const char kAppXPkcsSign[] = "application/x-pkcs7-signature";
  30371. static const char kAppPkcs7Mime[] = "application/pkcs7-mime";
  30372. static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime";
  30373. WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7");
  30374. if (in == NULL || bcont == NULL) {
  30375. goto error;
  30376. }
  30377. inLen = wolfSSL_BIO_get_len(in);
  30378. if (inLen <= 0) {
  30379. goto error;
  30380. }
  30381. remainLen = wolfSSL_BIO_get_len(in);
  30382. if (remainLen <= 0) {
  30383. goto error;
  30384. }
  30385. section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  30386. if (section == NULL) {
  30387. goto error;
  30388. }
  30389. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30390. if (lineLen <= 0) {
  30391. goto error;
  30392. }
  30393. while (isEnd == 0 && remainLen > 0) {
  30394. sectionLen += lineLen;
  30395. remainLen -= lineLen;
  30396. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  30397. if (lineLen <= 0) {
  30398. goto error;
  30399. }
  30400. /* Line with just newline signals end of headers. */
  30401. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  30402. "\r\n", 2)) ||
  30403. (lineLen==1 && (section[sectionLen] == '\r' ||
  30404. section[sectionLen] == '\n'))) {
  30405. isEnd = 1;
  30406. }
  30407. }
  30408. section[sectionLen] = '\0';
  30409. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  30410. if (ret < 0) {
  30411. WOLFSSL_MSG("Parsing MIME headers failed.");
  30412. goto error;
  30413. }
  30414. isEnd = 0;
  30415. section[0] = '\0';
  30416. sectionLen = 0;
  30417. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  30418. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  30419. XSTR_SIZEOF(kMultSigned))) {
  30420. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  30421. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  30422. XSTR_SIZEOF(kAppPkcsSign)) ||
  30423. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  30424. XSTR_SIZEOF(kAppXPkcsSign)))) {
  30425. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  30426. if (curParam == NULL) {
  30427. goto error;
  30428. }
  30429. boundLen = XSTRLEN(curParam->value) + 2;
  30430. boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  30431. if (boundary == NULL) {
  30432. goto error;
  30433. }
  30434. XMEMSET(boundary, 0, (word32)(boundLen+1));
  30435. boundary[0] = boundary[1] = '-';
  30436. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  30437. /* Parse up to first boundary, ignore everything here. */
  30438. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30439. if (lineLen <= 0) {
  30440. goto error;
  30441. }
  30442. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  30443. remainLen > 0) {
  30444. sectionLen += lineLen;
  30445. remainLen -= lineLen;
  30446. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30447. remainLen);
  30448. if (lineLen <= 0) {
  30449. goto error;
  30450. }
  30451. }
  30452. section[0] = '\0';
  30453. sectionLen = 0;
  30454. canonSize = remainLen + 1;
  30455. canonSection = (char*)XMALLOC(canonSize, NULL,
  30456. DYNAMIC_TYPE_PKCS7);
  30457. if (canonSection == NULL) {
  30458. goto error;
  30459. }
  30460. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30461. if (lineLen < 0) {
  30462. goto error;
  30463. }
  30464. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  30465. remainLen > 0) {
  30466. canonLineLen = lineLen;
  30467. canonLine = wc_MIME_single_canonicalize(&section[sectionLen],
  30468. &canonLineLen);
  30469. if (canonLine == NULL) {
  30470. goto error;
  30471. }
  30472. /* If line endings were added, the initial length may be
  30473. * exceeded. */
  30474. if ((canonPos + canonLineLen) >= canonSize) {
  30475. canonSize = canonPos + canonLineLen;
  30476. canonSection = (char*)XREALLOC(canonSection, canonSize,
  30477. NULL, DYNAMIC_TYPE_PKCS7);
  30478. if (canonSection == NULL) {
  30479. goto error;
  30480. }
  30481. }
  30482. XMEMCPY(&canonSection[canonPos], canonLine,
  30483. (int)canonLineLen - 1);
  30484. canonPos += canonLineLen - 1;
  30485. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  30486. canonLine = NULL;
  30487. sectionLen += lineLen;
  30488. remainLen -= lineLen;
  30489. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30490. remainLen);
  30491. if (lineLen <= 0) {
  30492. goto error;
  30493. }
  30494. }
  30495. if (canonPos > 0) {
  30496. canonPos--;
  30497. }
  30498. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  30499. if (canonSection[canonPos] == '\n') {
  30500. if (canonPos > 0) {
  30501. canonPos--;
  30502. }
  30503. }
  30504. if (canonSection[canonPos] == '\r') {
  30505. if (canonPos > 0) {
  30506. canonPos--;
  30507. }
  30508. }
  30509. canonSection[canonPos+1] = '\0';
  30510. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  30511. ret = wolfSSL_BIO_write(*bcont, canonSection,
  30512. canonPos + 1);
  30513. if (ret != (canonPos+1)) {
  30514. goto error;
  30515. }
  30516. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem))
  30517. < 0) {
  30518. goto error;
  30519. }
  30520. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  30521. canonSection = NULL;
  30522. wc_MIME_free_hdrs(allHdrs);
  30523. allHdrs = NULL;
  30524. section[0] = '\0';
  30525. sectionLen = 0;
  30526. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30527. if (lineLen <= 0) {
  30528. goto error;
  30529. }
  30530. while (isEnd == 0 && remainLen > 0) {
  30531. sectionLen += lineLen;
  30532. remainLen -= lineLen;
  30533. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30534. remainLen);
  30535. if (lineLen <= 0) {
  30536. goto error;
  30537. }
  30538. /* Line with just newline signals end of headers. */
  30539. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  30540. "\r\n", 2)) ||
  30541. (lineLen==1 && (section[sectionLen] == '\r' ||
  30542. section[sectionLen] == '\n'))) {
  30543. isEnd = 1;
  30544. }
  30545. }
  30546. section[sectionLen] = '\0';
  30547. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  30548. if (ret < 0) {
  30549. WOLFSSL_MSG("Parsing MIME headers failed.");
  30550. goto error;
  30551. }
  30552. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  30553. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  30554. XSTR_SIZEOF(kAppPkcsSign)) &&
  30555. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  30556. XSTR_SIZEOF(kAppXPkcsSign)))) {
  30557. WOLFSSL_MSG("S/MIME headers not found inside "
  30558. "multipart message.\n");
  30559. goto error;
  30560. }
  30561. section[0] = '\0';
  30562. sectionLen = 0;
  30563. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30564. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  30565. remainLen > 0) {
  30566. sectionLen += lineLen;
  30567. remainLen -= lineLen;
  30568. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30569. remainLen);
  30570. if (lineLen <= 0) {
  30571. goto error;
  30572. }
  30573. }
  30574. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  30575. boundary = NULL;
  30576. }
  30577. }
  30578. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  30579. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  30580. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  30581. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  30582. sectionLen = wolfSSL_BIO_get_len(in);
  30583. if (sectionLen <= 0) {
  30584. goto error;
  30585. }
  30586. ret = wolfSSL_BIO_read(in, section, sectionLen);
  30587. if (ret < 0 || ret != sectionLen) {
  30588. WOLFSSL_MSG("Error reading input BIO.");
  30589. goto error;
  30590. }
  30591. }
  30592. else {
  30593. WOLFSSL_MSG("S/MIME headers not found.");
  30594. goto error;
  30595. }
  30596. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  30597. if (curHdr == NULL) {
  30598. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  30599. "assuming base64 encoding.");
  30600. }
  30601. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  30602. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  30603. "currently supported.\n");
  30604. goto error;
  30605. }
  30606. if (section == NULL || sectionLen <= 0) {
  30607. goto error;
  30608. }
  30609. outLen = ((sectionLen*3+3)/4)+1;
  30610. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  30611. outHead = out;
  30612. if (outHead == NULL) {
  30613. goto error;
  30614. }
  30615. /* Strip trailing newlines. */
  30616. while ((sectionLen > 0) &&
  30617. (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) {
  30618. sectionLen--;
  30619. }
  30620. section[sectionLen] = '\0';
  30621. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  30622. if (ret < 0) {
  30623. WOLFSSL_MSG("Error base64 decoding S/MIME message.");
  30624. goto error;
  30625. }
  30626. pkcs7 = wolfSSL_d2i_PKCS7_only(NULL, (const unsigned char**)&out, outLen,
  30627. bcontMem, bcontMemSz);
  30628. wc_MIME_free_hdrs(allHdrs);
  30629. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  30630. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  30631. return pkcs7;
  30632. error:
  30633. wc_MIME_free_hdrs(allHdrs);
  30634. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  30635. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  30636. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  30637. if (canonSection != NULL)
  30638. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  30639. if (canonLine != NULL)
  30640. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  30641. if (bcont) {
  30642. wolfSSL_BIO_free(*bcont);
  30643. *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */
  30644. }
  30645. return NULL;
  30646. }
  30647. /* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent.
  30648. * Returns hash algorithm string or "unknown" if not found */
  30649. static const char* wolfSSL_SMIME_HashOIDToString(int hashOID)
  30650. {
  30651. switch (hashOID) {
  30652. case MD5h:
  30653. return "md5";
  30654. case SHAh:
  30655. return "sha1";
  30656. case SHA224h:
  30657. return "sha-224";
  30658. case SHA256h:
  30659. return "sha-256";
  30660. case SHA384h:
  30661. return "sha-384";
  30662. case SHA512h:
  30663. return "sha-512";
  30664. case SHA3_224h:
  30665. return "sha3-224";
  30666. case SHA3_384h:
  30667. return "sha3-384";
  30668. case SHA3_512h:
  30669. return "sha3-512";
  30670. default:
  30671. break;
  30672. }
  30673. return "unknown";
  30674. }
  30675. /* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string.
  30676. * RFC2633 only defines signed-data, enveloped-data, certs-only.
  30677. * Returns string on success, NULL on unknown type. */
  30678. static const char* wolfSSL_SMIME_PKCS7TypeToString(int type)
  30679. {
  30680. switch (type) {
  30681. case SIGNED_DATA:
  30682. return "signed-data";
  30683. case ENVELOPED_DATA:
  30684. return "enveloped-data";
  30685. default:
  30686. break;
  30687. }
  30688. return NULL;
  30689. }
  30690. /**
  30691. * Convert PKCS7 structure to SMIME format, adding necessary headers.
  30692. *
  30693. * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure
  30694. * should be set up beforehand with PKCS7_sign/final/etc. Output is always
  30695. * Base64 encoded.
  30696. *
  30697. * out - output BIO for SMIME formatted data to be placed
  30698. * pkcs7 - input PKCS7 structure, initialized and set up
  30699. * in - input content to be encoded into PKCS7
  30700. * flags - flags to control behavior of PKCS7 generation
  30701. *
  30702. * Returns 1 on success, 0 or negative on failure
  30703. */
  30704. int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in,
  30705. int flags)
  30706. {
  30707. int i;
  30708. int ret = 1;
  30709. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  30710. byte* p7out = NULL;
  30711. int len = 0;
  30712. char boundary[33]; /* 32 chars + \0 */
  30713. byte* sigBase64 = NULL;
  30714. word32 sigBase64Len = 0;
  30715. const char* p7TypeString = NULL;
  30716. static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  30717. if (out == NULL || p7 == NULL) {
  30718. WOLFSSL_MSG("Bad function arguments");
  30719. return 0;
  30720. }
  30721. if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 ||
  30722. p7->pkcs7.contentCRLF == 0)) {
  30723. /* store and adjust content line endings for CRLF if needed */
  30724. if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) {
  30725. ret = 0;
  30726. }
  30727. }
  30728. if (ret > 0) {
  30729. /* Generate signedData bundle, DER in output (dynamic) */
  30730. if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) {
  30731. WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7");
  30732. ret = 0;
  30733. }
  30734. }
  30735. /* Base64 encode signedData bundle */
  30736. if (ret > 0) {
  30737. if (Base64_Encode(p7out, len, NULL, &sigBase64Len) != LENGTH_ONLY_E) {
  30738. ret = 0;
  30739. }
  30740. else {
  30741. sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL,
  30742. DYNAMIC_TYPE_TMP_BUFFER);
  30743. if (sigBase64 == NULL) {
  30744. ret = 0;
  30745. }
  30746. }
  30747. }
  30748. if (ret > 0) {
  30749. XMEMSET(sigBase64, 0, sigBase64Len);
  30750. if (Base64_Encode(p7out, len, sigBase64, &sigBase64Len) < 0) {
  30751. WOLFSSL_MSG("Error in Base64_Encode of signature");
  30752. ret = 0;
  30753. }
  30754. }
  30755. /* build up SMIME message */
  30756. if (ret > 0) {
  30757. if (flags & PKCS7_DETACHED) {
  30758. /* generate random boundary */
  30759. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  30760. WOLFSSL_MSG("No RNG to use");
  30761. ret = 0;
  30762. }
  30763. /* no need to generate random byte for null terminator (size-1) */
  30764. if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary,
  30765. sizeof(boundary) - 1 ) != 0)) {
  30766. WOLFSSL_MSG("Error in wc_RNG_GenerateBlock");
  30767. ret = 0;
  30768. }
  30769. if (ret > 0) {
  30770. for (i = 0; i < (int)sizeof(boundary) - 1; i++) {
  30771. boundary[i] =
  30772. alphanum[boundary[i] % XSTR_SIZEOF(alphanum)];
  30773. }
  30774. boundary[sizeof(boundary)-1] = 0;
  30775. }
  30776. if (ret > 0) {
  30777. /* S/MIME header beginning */
  30778. ret = wolfSSL_BIO_printf(out,
  30779. "MIME-Version: 1.0\n"
  30780. "Content-Type: multipart/signed; "
  30781. "protocol=\"application/x-pkcs7-signature\"; "
  30782. "micalg=\"%s\"; "
  30783. "boundary=\"----%s\"\n\n"
  30784. "This is an S/MIME signed message\n\n"
  30785. "------%s\n",
  30786. wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID),
  30787. boundary, boundary);
  30788. }
  30789. if (ret > 0) {
  30790. /* S/MIME content */
  30791. ret = wolfSSL_BIO_write(out,
  30792. p7->pkcs7.content, p7->pkcs7.contentSz);
  30793. }
  30794. if (ret > 0) {
  30795. /* S/SMIME header end boundary */
  30796. ret = wolfSSL_BIO_printf(out,
  30797. "\n------%s\n", boundary);
  30798. }
  30799. if (ret > 0) {
  30800. /* Signature and header */
  30801. ret = wolfSSL_BIO_printf(out,
  30802. "Content-Type: application/x-pkcs7-signature; "
  30803. "name=\"smime.p7s\"\n"
  30804. "Content-Transfer-Encoding: base64\n"
  30805. "Content-Disposition: attachment; "
  30806. "filename=\"smime.p7s\"\n\n"
  30807. "%.*s\n" /* Base64 encoded signature */
  30808. "------%s--\n\n",
  30809. sigBase64Len, sigBase64,
  30810. boundary);
  30811. }
  30812. }
  30813. else {
  30814. p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type);
  30815. if (p7TypeString == NULL) {
  30816. WOLFSSL_MSG("Unsupported PKCS7 SMIME type");
  30817. ret = 0;
  30818. }
  30819. if (ret > 0) {
  30820. /* not detached */
  30821. ret = wolfSSL_BIO_printf(out,
  30822. "MIME-Version: 1.0\n"
  30823. "Content-Disposition: attachment; "
  30824. "filename=\"smime.p7m\"\n"
  30825. "Content-Type: application/x-pkcs7-mime; "
  30826. "smime-type=%s; name=\"smime.p7m\"\n"
  30827. "Content-Transfer-Encoding: base64\n\n"
  30828. "%.*s\n" /* signature */,
  30829. p7TypeString, sigBase64Len, sigBase64);
  30830. }
  30831. }
  30832. }
  30833. if (p7out != NULL) {
  30834. XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30835. }
  30836. if (sigBase64 != NULL) {
  30837. XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30838. }
  30839. if (ret > 0) {
  30840. return WOLFSSL_SUCCESS;
  30841. }
  30842. return WOLFSSL_FAILURE;
  30843. }
  30844. #endif /* HAVE_SMIME */
  30845. #endif /* !NO_BIO */
  30846. #endif /* OPENSSL_ALL */
  30847. #endif /* HAVE_PKCS7 */
  30848. /*******************************************************************************
  30849. * END OF PKCS7 APIs
  30850. ******************************************************************************/
  30851. /*******************************************************************************
  30852. * START OF PKCS12 APIs
  30853. ******************************************************************************/
  30854. #ifdef OPENSSL_EXTRA
  30855. /* no-op function. Was initially used for adding encryption algorithms available
  30856. * for PKCS12 */
  30857. void wolfSSL_PKCS12_PBE_add(void)
  30858. {
  30859. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  30860. }
  30861. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  30862. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp,
  30863. WOLFSSL_X509_PKCS12 **pkcs12)
  30864. {
  30865. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  30866. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12,
  30867. PKCS12_TYPE);
  30868. }
  30869. #endif /* !NO_FILESYSTEM */
  30870. #endif /* OPENSSL_EXTRA */
  30871. #if defined(HAVE_PKCS12)
  30872. #ifdef OPENSSL_EXTRA
  30873. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  30874. #ifndef NO_BIO
  30875. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  30876. {
  30877. WC_PKCS12* localPkcs12 = NULL;
  30878. unsigned char* mem = NULL;
  30879. long memSz;
  30880. int ret = -1;
  30881. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  30882. if (bio == NULL) {
  30883. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  30884. return NULL;
  30885. }
  30886. memSz = wolfSSL_BIO_get_len(bio);
  30887. if (memSz <= 0) {
  30888. return NULL;
  30889. }
  30890. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30891. if (mem == NULL) {
  30892. return NULL;
  30893. }
  30894. if (mem != NULL) {
  30895. localPkcs12 = wc_PKCS12_new();
  30896. if (localPkcs12 == NULL) {
  30897. WOLFSSL_MSG("Memory error");
  30898. }
  30899. }
  30900. if (mem != NULL && localPkcs12 != NULL) {
  30901. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  30902. ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12);
  30903. if (ret < 0) {
  30904. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  30905. }
  30906. }
  30907. else {
  30908. WOLFSSL_MSG("Failed to get data from bio struct");
  30909. }
  30910. }
  30911. /* cleanup */
  30912. if (mem != NULL)
  30913. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30914. if (ret < 0 && localPkcs12 != NULL) {
  30915. wc_PKCS12_free(localPkcs12);
  30916. localPkcs12 = NULL;
  30917. }
  30918. if (pkcs12 != NULL)
  30919. *pkcs12 = localPkcs12;
  30920. return localPkcs12;
  30921. }
  30922. /* Converts the PKCS12 to DER format and outputs it into bio.
  30923. *
  30924. * bio is the structure to hold output DER
  30925. * pkcs12 structure to create DER from
  30926. *
  30927. * return 1 for success or 0 if an error occurs
  30928. */
  30929. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  30930. {
  30931. int ret = WOLFSSL_FAILURE;
  30932. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  30933. if ((bio != NULL) && (pkcs12 != NULL)) {
  30934. word32 certSz = 0;
  30935. byte *certDer = NULL;
  30936. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  30937. if ((certSz > 0) && (certDer != NULL)) {
  30938. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  30939. ret = WOLFSSL_SUCCESS;
  30940. }
  30941. }
  30942. if (certDer != NULL) {
  30943. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  30944. }
  30945. }
  30946. return ret;
  30947. }
  30948. #endif /* !NO_BIO */
  30949. /* Creates a new WC_PKCS12 structure
  30950. *
  30951. * pass password to use
  30952. * name friendlyName to use
  30953. * pkey private key to go into PKCS12 bundle
  30954. * cert certificate to go into PKCS12 bundle
  30955. * ca extra certificates that can be added to bundle. Can be NULL
  30956. * keyNID type of encryption to use on the key (-1 means no encryption)
  30957. * certNID type of encryption to use on the certificate
  30958. * itt number of iterations with encryption
  30959. * macItt number of iterations with mac creation
  30960. * keyType flag for signature and/or encryption key
  30961. *
  30962. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  30963. */
  30964. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey,
  30965. WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID,
  30966. int certNID, int itt, int macItt, int keyType)
  30967. {
  30968. WC_PKCS12* pkcs12;
  30969. WC_DerCertList* list = NULL;
  30970. word32 passSz;
  30971. byte* keyDer = NULL;
  30972. word32 keyDerSz;
  30973. byte* certDer;
  30974. int certDerSz;
  30975. WOLFSSL_ENTER("wolfSSL_PKCS12_create");
  30976. if (pass == NULL || pkey == NULL || cert == NULL) {
  30977. WOLFSSL_LEAVE("wolfSSL_PKCS12_create", BAD_FUNC_ARG);
  30978. return NULL;
  30979. }
  30980. passSz = (word32)XSTRLEN(pass);
  30981. keyDer = (byte*)pkey->pkey.ptr;
  30982. keyDerSz = pkey->pkey_sz;
  30983. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  30984. if (certDer == NULL) {
  30985. return NULL;
  30986. }
  30987. if (ca != NULL) {
  30988. unsigned long numCerts = ca->num;
  30989. WOLFSSL_STACK* sk = ca;
  30990. while (numCerts > 0 && sk != NULL) {
  30991. byte* curDer;
  30992. WC_DerCertList* cur;
  30993. int curDerSz = 0;
  30994. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  30995. DYNAMIC_TYPE_PKCS);
  30996. if (cur == NULL) {
  30997. wc_FreeCertList(list, NULL);
  30998. return NULL;
  30999. }
  31000. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  31001. if (curDer == NULL || curDerSz < 0) {
  31002. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  31003. wc_FreeCertList(list, NULL);
  31004. return NULL;
  31005. }
  31006. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  31007. if (cur->buffer == NULL) {
  31008. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  31009. wc_FreeCertList(list, NULL);
  31010. return NULL;
  31011. }
  31012. XMEMCPY(cur->buffer, curDer, curDerSz);
  31013. cur->bufferSz = curDerSz;
  31014. cur->next = list;
  31015. list = cur;
  31016. sk = sk->next;
  31017. numCerts--;
  31018. }
  31019. }
  31020. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  31021. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  31022. keyType, NULL);
  31023. if (ca != NULL) {
  31024. wc_FreeCertList(list, NULL);
  31025. }
  31026. return pkcs12;
  31027. }
  31028. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  31029. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  31030. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
  31031. WOLF_STACK_OF(WOLFSSL_X509)** ca)
  31032. {
  31033. void* heap = NULL;
  31034. int ret;
  31035. byte* certData = NULL;
  31036. word32 certDataSz;
  31037. byte* pk = NULL;
  31038. word32 pkSz;
  31039. WC_DerCertList* certList = NULL;
  31040. #ifdef WOLFSSL_SMALL_STACK
  31041. DecodedCert *DeCert;
  31042. #else
  31043. DecodedCert DeCert[1];
  31044. #endif
  31045. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  31046. /* make sure we init return args */
  31047. if (pkey) *pkey = NULL;
  31048. if (cert) *cert = NULL;
  31049. if (ca) *ca = NULL;
  31050. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  31051. WOLFSSL_MSG("Bad argument value");
  31052. return WOLFSSL_FAILURE;
  31053. }
  31054. heap = wc_PKCS12_GetHeap(pkcs12);
  31055. if (ca == NULL) {
  31056. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  31057. NULL);
  31058. }
  31059. else {
  31060. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  31061. &certList);
  31062. }
  31063. if (ret < 0) {
  31064. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  31065. return WOLFSSL_FAILURE;
  31066. }
  31067. #ifdef WOLFSSL_SMALL_STACK
  31068. DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap,
  31069. DYNAMIC_TYPE_DCERT);
  31070. if (DeCert == NULL) {
  31071. WOLFSSL_MSG("out of memory");
  31072. return WOLFSSL_FAILURE;
  31073. }
  31074. #endif
  31075. /* Decode cert and place in X509 stack struct */
  31076. if (certList != NULL) {
  31077. WC_DerCertList* current = certList;
  31078. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(
  31079. sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509);
  31080. if (*ca == NULL) {
  31081. if (pk != NULL) {
  31082. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31083. }
  31084. if (certData != NULL) {
  31085. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31086. }
  31087. /* Free up WC_DerCertList and move on */
  31088. while (current != NULL) {
  31089. WC_DerCertList* next = current->next;
  31090. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  31091. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  31092. current = next;
  31093. }
  31094. ret = WOLFSSL_FAILURE;
  31095. goto out;
  31096. }
  31097. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  31098. /* add list of DER certs as X509's to stack */
  31099. while (current != NULL) {
  31100. WC_DerCertList* toFree = current;
  31101. WOLFSSL_X509* x509;
  31102. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  31103. DYNAMIC_TYPE_X509);
  31104. InitX509(x509, 1, heap);
  31105. InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap);
  31106. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  31107. WOLFSSL_MSG("Issue with parsing certificate");
  31108. FreeDecodedCert(DeCert);
  31109. wolfSSL_X509_free(x509);
  31110. }
  31111. else {
  31112. if (CopyDecodedToX509(x509, DeCert) != 0) {
  31113. WOLFSSL_MSG("Failed to copy decoded cert");
  31114. FreeDecodedCert(DeCert);
  31115. wolfSSL_X509_free(x509);
  31116. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31117. if (pk != NULL) {
  31118. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31119. }
  31120. if (certData != NULL) {
  31121. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31122. }
  31123. /* Free up WC_DerCertList */
  31124. while (current != NULL) {
  31125. WC_DerCertList* next = current->next;
  31126. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  31127. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  31128. current = next;
  31129. }
  31130. ret = WOLFSSL_FAILURE;
  31131. goto out;
  31132. }
  31133. FreeDecodedCert(DeCert);
  31134. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  31135. WOLFSSL_MSG("Failed to push x509 onto stack");
  31136. wolfSSL_X509_free(x509);
  31137. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31138. if (pk != NULL) {
  31139. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31140. }
  31141. if (certData != NULL) {
  31142. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31143. }
  31144. /* Free up WC_DerCertList */
  31145. while (current != NULL) {
  31146. WC_DerCertList* next = current->next;
  31147. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  31148. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  31149. current = next;
  31150. }
  31151. ret = WOLFSSL_FAILURE;
  31152. goto out;
  31153. }
  31154. }
  31155. current = current->next;
  31156. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  31157. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  31158. }
  31159. }
  31160. /* Decode cert and place in X509 struct */
  31161. if (certData != NULL) {
  31162. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  31163. DYNAMIC_TYPE_X509);
  31164. if (*cert == NULL) {
  31165. if (pk != NULL) {
  31166. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31167. }
  31168. if (ca != NULL) {
  31169. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31170. }
  31171. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31172. ret = WOLFSSL_FAILURE;
  31173. goto out;
  31174. }
  31175. InitX509(*cert, 1, heap);
  31176. InitDecodedCert(DeCert, certData, certDataSz, heap);
  31177. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  31178. WOLFSSL_MSG("Issue with parsing certificate");
  31179. }
  31180. if (CopyDecodedToX509(*cert, DeCert) != 0) {
  31181. WOLFSSL_MSG("Failed to copy decoded cert");
  31182. FreeDecodedCert(DeCert);
  31183. if (pk != NULL) {
  31184. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31185. }
  31186. if (ca != NULL) {
  31187. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31188. }
  31189. wolfSSL_X509_free(*cert); *cert = NULL;
  31190. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31191. ret = WOLFSSL_FAILURE;
  31192. goto out;
  31193. }
  31194. FreeDecodedCert(DeCert);
  31195. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  31196. }
  31197. /* get key type */
  31198. ret = BAD_STATE_E;
  31199. if (pk != NULL) { /* decode key if present */
  31200. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  31201. if (*pkey == NULL) {
  31202. wolfSSL_X509_free(*cert); *cert = NULL;
  31203. if (ca != NULL) {
  31204. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31205. }
  31206. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  31207. ret = WOLFSSL_FAILURE;
  31208. goto out;
  31209. }
  31210. #ifndef NO_RSA
  31211. {
  31212. const unsigned char* pt = pk;
  31213. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) !=
  31214. NULL) {
  31215. ret = 0;
  31216. }
  31217. }
  31218. #endif /* NO_RSA */
  31219. #ifdef HAVE_ECC
  31220. if (ret != 0) { /* if is in fail state check if ECC key */
  31221. const unsigned char* pt = pk;
  31222. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) !=
  31223. NULL) {
  31224. ret = 0;
  31225. }
  31226. }
  31227. #endif /* HAVE_ECC */
  31228. if (pk != NULL)
  31229. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  31230. if (ret != 0) { /* if is in fail state and no PKEY then fail */
  31231. wolfSSL_X509_free(*cert); *cert = NULL;
  31232. if (ca != NULL) {
  31233. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  31234. }
  31235. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  31236. WOLFSSL_MSG("Bad PKCS12 key format");
  31237. ret = WOLFSSL_FAILURE;
  31238. goto out;
  31239. }
  31240. if (pkey != NULL && *pkey != NULL) {
  31241. (*pkey)->save_type = 0;
  31242. }
  31243. }
  31244. (void)ret;
  31245. (void)ca;
  31246. ret = WOLFSSL_SUCCESS;
  31247. out:
  31248. #ifdef WOLFSSL_SMALL_STACK
  31249. XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT);
  31250. #endif
  31251. return ret;
  31252. }
  31253. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  31254. int pswLen)
  31255. {
  31256. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  31257. if (!pkcs12) {
  31258. return WOLFSSL_FAILURE;
  31259. }
  31260. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  31261. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  31262. }
  31263. #endif /* !NO_ASN && !NO_PWDBASED */
  31264. #endif /* OPENSSL_EXTRA */
  31265. #endif /* HAVE_PKCS12 */
  31266. /*******************************************************************************
  31267. * END OF PKCS12 APIs
  31268. ******************************************************************************/
  31269. #endif /* !NO_CERTS */
  31270. /*******************************************************************************
  31271. * BEGIN OPENSSL FIPS DRBG APIs
  31272. ******************************************************************************/
  31273. #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG)
  31274. int wolfSSL_FIPS_drbg_init(WOLFSSL_DRBG_CTX *ctx, int type, unsigned int flags)
  31275. {
  31276. int ret = WOLFSSL_FAILURE;
  31277. if (ctx != NULL) {
  31278. XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX));
  31279. ctx->type = type;
  31280. ctx->xflags = flags;
  31281. ctx->status = DRBG_STATUS_UNINITIALISED;
  31282. ret = WOLFSSL_SUCCESS;
  31283. }
  31284. return ret;
  31285. }
  31286. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_drbg_new(int type, unsigned int flags)
  31287. {
  31288. int ret = WOLFSSL_FAILURE;
  31289. WOLFSSL_DRBG_CTX* ctx = (WOLFSSL_DRBG_CTX*)XMALLOC(sizeof(WOLFSSL_DRBG_CTX),
  31290. NULL, DYNAMIC_TYPE_OPENSSL);
  31291. ret = wolfSSL_FIPS_drbg_init(ctx, type, flags);
  31292. if (ret == WOLFSSL_SUCCESS && type != 0) {
  31293. ret = wolfSSL_FIPS_drbg_instantiate(ctx, NULL, 0);
  31294. }
  31295. if (ret != WOLFSSL_SUCCESS) {
  31296. WOLFSSL_ERROR(ret);
  31297. wolfSSL_FIPS_drbg_free(ctx);
  31298. ctx = NULL;
  31299. }
  31300. return ctx;
  31301. }
  31302. int wolfSSL_FIPS_drbg_instantiate(WOLFSSL_DRBG_CTX* ctx,
  31303. const unsigned char* pers, size_t perslen)
  31304. {
  31305. int ret = WOLFSSL_FAILURE;
  31306. if (ctx != NULL && ctx->rng == NULL) {
  31307. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  31308. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  31309. ctx->rng = wc_rng_new((byte*)pers, (word32)perslen, NULL);
  31310. #else
  31311. ctx->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31312. if (ctx->rng != NULL) {
  31313. #if defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)
  31314. ret = wc_InitRngNonce(ctx->rng, (byte*)pers, (word32)perslen);
  31315. #else
  31316. ret = wc_InitRng(ctx->rng);
  31317. (void)pers;
  31318. (void)perslen;
  31319. #endif
  31320. if (ret != 0) {
  31321. WOLFSSL_ERROR(ret);
  31322. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  31323. ctx->rng = NULL;
  31324. }
  31325. }
  31326. #endif
  31327. }
  31328. if (ctx != NULL && ctx->rng != NULL) {
  31329. ctx->status = DRBG_STATUS_READY;
  31330. ret = WOLFSSL_SUCCESS;
  31331. }
  31332. return ret;
  31333. }
  31334. int wolfSSL_FIPS_drbg_set_callbacks(WOLFSSL_DRBG_CTX* ctx,
  31335. drbg_entropy_get entropy_get, drbg_entropy_clean entropy_clean,
  31336. size_t entropy_blocklen,
  31337. drbg_nonce_get none_get, drbg_nonce_clean nonce_clean)
  31338. {
  31339. int ret = WOLFSSL_FAILURE;
  31340. if (ctx != NULL) {
  31341. ctx->entropy_get = entropy_get;
  31342. ctx->entropy_clean = entropy_clean;
  31343. ctx->entropy_blocklen = entropy_blocklen;
  31344. ctx->none_get = none_get;
  31345. ctx->nonce_clean = nonce_clean;
  31346. ret = WOLFSSL_SUCCESS;
  31347. }
  31348. return ret;
  31349. }
  31350. void wolfSSL_FIPS_rand_add(const void* buf, int num, double entropy)
  31351. {
  31352. /* not implemented */
  31353. (void)buf;
  31354. (void)num;
  31355. (void)entropy;
  31356. }
  31357. int wolfSSL_FIPS_drbg_reseed(WOLFSSL_DRBG_CTX* ctx, const unsigned char* adin,
  31358. size_t adinlen)
  31359. {
  31360. int ret = WOLFSSL_FAILURE;
  31361. if (ctx != NULL && ctx->rng != NULL) {
  31362. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  31363. (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)))
  31364. if (wc_RNG_DRBG_Reseed(ctx->rng, adin, (word32)adinlen) == 0) {
  31365. ret = WOLFSSL_SUCCESS;
  31366. }
  31367. #else
  31368. ret = WOLFSSL_SUCCESS;
  31369. (void)adin;
  31370. (void)adinlen;
  31371. #endif
  31372. }
  31373. return ret;
  31374. }
  31375. int wolfSSL_FIPS_drbg_generate(WOLFSSL_DRBG_CTX* ctx, unsigned char* out,
  31376. size_t outlen, int prediction_resistance, const unsigned char* adin,
  31377. size_t adinlen)
  31378. {
  31379. int ret = WOLFSSL_FAILURE;
  31380. if (ctx != NULL && ctx->rng != NULL) {
  31381. ret = wc_RNG_GenerateBlock(ctx->rng, out, (word32)outlen);
  31382. if (ret == 0) {
  31383. ret = WOLFSSL_SUCCESS;
  31384. }
  31385. }
  31386. (void)prediction_resistance;
  31387. (void)adin;
  31388. (void)adinlen;
  31389. return ret;
  31390. }
  31391. int wolfSSL_FIPS_drbg_uninstantiate(WOLFSSL_DRBG_CTX *ctx)
  31392. {
  31393. if (ctx != NULL && ctx->rng != NULL) {
  31394. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  31395. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  31396. wc_rng_free(ctx->rng);
  31397. #else
  31398. wc_FreeRng(ctx->rng);
  31399. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  31400. #endif
  31401. ctx->rng = NULL;
  31402. ctx->status = DRBG_STATUS_UNINITIALISED;
  31403. }
  31404. return WOLFSSL_SUCCESS;
  31405. }
  31406. void wolfSSL_FIPS_drbg_free(WOLFSSL_DRBG_CTX *ctx)
  31407. {
  31408. if (ctx != NULL) {
  31409. /* As safety check if free'ing the default drbg, then mark global NULL.
  31410. * Technically the user should not call free on the default drbg. */
  31411. if (ctx == gDrbgDefCtx) {
  31412. gDrbgDefCtx = NULL;
  31413. }
  31414. wolfSSL_FIPS_drbg_uninstantiate(ctx);
  31415. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  31416. }
  31417. }
  31418. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_get_default_drbg(void)
  31419. {
  31420. if (gDrbgDefCtx == NULL) {
  31421. gDrbgDefCtx = wolfSSL_FIPS_drbg_new(0, 0);
  31422. }
  31423. return gDrbgDefCtx;
  31424. }
  31425. void wolfSSL_FIPS_get_timevec(unsigned char* buf, unsigned long* pctr)
  31426. {
  31427. /* not implemented */
  31428. (void)buf;
  31429. (void)pctr;
  31430. }
  31431. void* wolfSSL_FIPS_drbg_get_app_data(WOLFSSL_DRBG_CTX *ctx)
  31432. {
  31433. if (ctx != NULL) {
  31434. return ctx->app_data;
  31435. }
  31436. return NULL;
  31437. }
  31438. void wolfSSL_FIPS_drbg_set_app_data(WOLFSSL_DRBG_CTX *ctx, void *app_data)
  31439. {
  31440. if (ctx != NULL) {
  31441. ctx->app_data = app_data;
  31442. }
  31443. }
  31444. #endif
  31445. /*******************************************************************************
  31446. * END OF OPENSSL FIPS DRBG APIs
  31447. ******************************************************************************/
  31448. #endif /* !WOLFCRYPT_ONLY */