ssl.c 1.0 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633
  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 wolfSSL_Mutex globalRNGMutex;
  278. static int globalRNGMutex_valid = 0;
  279. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  280. static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL;
  281. #endif
  282. WC_RNG* wolfssl_get_global_rng(void)
  283. {
  284. WC_RNG* ret = NULL;
  285. if (initGlobalRNG == 0)
  286. WOLFSSL_MSG("Global RNG no Init");
  287. else
  288. ret = &globalRNG;
  289. return ret;
  290. }
  291. /* Make a global RNG and return.
  292. *
  293. * @return Global RNG on success.
  294. * @return NULL on error.
  295. */
  296. WC_RNG* wolfssl_make_global_rng(void)
  297. {
  298. WC_RNG* ret;
  299. #ifdef HAVE_GLOBAL_RNG
  300. /* Get the global random number generator instead. */
  301. ret = wolfssl_get_global_rng();
  302. #ifdef OPENSSL_EXTRA
  303. if (ret == NULL) {
  304. /* Create a global random if possible. */
  305. (void)wolfSSL_RAND_Init();
  306. ret = wolfssl_get_global_rng();
  307. }
  308. #endif
  309. #else
  310. WOLFSSL_ERROR_MSG("Bad RNG Init");
  311. ret = NULL;
  312. #endif
  313. return ret;
  314. }
  315. /* Too many defines to check explicitly - prototype it and always include
  316. * for RSA, DH, ECC and DSA for BN. */
  317. WC_RNG* wolfssl_make_rng(WC_RNG* rng, int* local);
  318. /* Make a random number generator or get global if possible.
  319. *
  320. * Global may not be available and NULL will be returned.
  321. *
  322. * @param [in, out] rng Local random number generator.
  323. * @param [out] local Local random number generator returned.
  324. * @return NULL on failure.
  325. * @return A random number generator object.
  326. */
  327. WC_RNG* wolfssl_make_rng(WC_RNG* rng, int* local)
  328. {
  329. WC_RNG* ret = NULL;
  330. /* Assume not local until one created. */
  331. *local = 0;
  332. #ifdef WOLFSSL_SMALL_STACK
  333. /* Allocate RNG object . */
  334. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  335. #endif
  336. /* Check we have a local RNG object and initialize. */
  337. if ((rng != NULL) && (wc_InitRng(rng) == 0)) {
  338. ret = rng;
  339. *local = 1;
  340. }
  341. if (ret == NULL) {
  342. #ifdef HAVE_GLOBAL_RNG
  343. WOLFSSL_MSG("Bad RNG Init, trying global");
  344. #endif
  345. ret = wolfssl_make_global_rng();
  346. }
  347. if (ret != rng) {
  348. #ifdef WOLFSSL_SMALL_STACK
  349. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  350. #endif
  351. }
  352. return ret;
  353. }
  354. #endif
  355. #ifdef OPENSSL_EXTRA
  356. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  357. * OPENSSL_EXTRA where RAND callbacks are not used */
  358. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  359. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  360. static int gRandMethodsInit = 0;
  361. static wolfSSL_Mutex gRandMethodMutex;
  362. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  363. #endif /* OPENSSL_EXTRA */
  364. #define WOLFSSL_SSL_BN_INCLUDED
  365. #include "src/ssl_bn.c"
  366. #ifndef OPENSSL_EXTRA_NO_ASN1
  367. #define WOLFSSL_SSL_ASN1_INCLUDED
  368. #include "src/ssl_asn1.c"
  369. #endif /* OPENSSL_EXTRA_NO_ASN1 */
  370. #define WOLFSSL_PK_INCLUDED
  371. #include "src/pk.c"
  372. #include <wolfssl/wolfcrypt/hpke.h>
  373. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  374. const WOLF_EC_NIST_NAME kNistCurves[] = {
  375. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  376. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  377. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  378. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  379. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  380. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  381. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  382. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  383. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  384. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  385. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  386. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  387. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  388. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  389. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  390. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  391. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  392. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  393. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  394. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  395. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  396. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  397. #ifdef HAVE_PQC
  398. {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
  399. {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
  400. {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
  401. #ifdef HAVE_LIBOQS
  402. {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1},
  403. {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3},
  404. {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5},
  405. #endif
  406. #endif
  407. #ifdef WOLFSSL_SM2
  408. {XSTR_SIZEOF("SM2"), "SM2", NID_sm2},
  409. #endif
  410. {0, NULL, 0},
  411. };
  412. #endif
  413. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  414. /* create the hpke key and ech config to send to clients */
  415. int wolfSSL_CTX_GenerateEchConfig(WOLFSSL_CTX* ctx, const char* publicName,
  416. word16 kemId, word16 kdfId, word16 aeadId)
  417. {
  418. int ret = 0;
  419. word16 encLen = DHKEM_X25519_ENC_LEN;
  420. #ifdef WOLFSSL_SMALL_STACK
  421. Hpke* hpke = NULL;
  422. WC_RNG* rng;
  423. #else
  424. Hpke hpke[1];
  425. WC_RNG rng[1];
  426. #endif
  427. if (ctx == NULL || publicName == NULL)
  428. return BAD_FUNC_ARG;
  429. #ifdef WOLFSSL_SMALL_STACK
  430. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  431. if (rng == NULL)
  432. return MEMORY_E;
  433. #endif
  434. ret = wc_InitRng(rng);
  435. if (ret != 0) {
  436. #ifdef WOLFSSL_SMALL_STACK
  437. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  438. #endif
  439. return ret;
  440. }
  441. ctx->echConfigs = (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  442. ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  443. if (ctx->echConfigs == NULL)
  444. ret = MEMORY_E;
  445. else
  446. XMEMSET(ctx->echConfigs, 0, sizeof(WOLFSSL_EchConfig));
  447. /* set random config id */
  448. if (ret == 0)
  449. ret = wc_RNG_GenerateByte(rng, &ctx->echConfigs->configId);
  450. /* if 0 is selected for algorithms use default, may change with draft */
  451. if (kemId == 0)
  452. kemId = DHKEM_X25519_HKDF_SHA256;
  453. if (kdfId == 0)
  454. kdfId = HKDF_SHA256;
  455. if (aeadId == 0)
  456. aeadId = HPKE_AES_128_GCM;
  457. if (ret == 0) {
  458. /* set the kem id */
  459. ctx->echConfigs->kemId = kemId;
  460. /* set the cipher suite, only 1 for now */
  461. ctx->echConfigs->numCipherSuites = 1;
  462. ctx->echConfigs->cipherSuites = (EchCipherSuite*)XMALLOC(
  463. sizeof(EchCipherSuite), ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  464. if (ctx->echConfigs->cipherSuites == NULL) {
  465. ret = MEMORY_E;
  466. }
  467. else {
  468. ctx->echConfigs->cipherSuites[0].kdfId = kdfId;
  469. ctx->echConfigs->cipherSuites[0].aeadId = aeadId;
  470. }
  471. }
  472. #ifdef WOLFSSL_SMALL_STACK
  473. if (ret == 0) {
  474. hpke = (Hpke*)XMALLOC(sizeof(Hpke), ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  475. if (hpke == NULL)
  476. ret = MEMORY_E;
  477. }
  478. #endif
  479. if (ret == 0)
  480. ret = wc_HpkeInit(hpke, kemId, kdfId, aeadId, ctx->heap);
  481. /* generate the receiver private key */
  482. if (ret == 0)
  483. ret = wc_HpkeGenerateKeyPair(hpke, &ctx->echConfigs->receiverPrivkey,
  484. rng);
  485. /* done with RNG */
  486. wc_FreeRng(rng);
  487. /* serialize the receiver key */
  488. if (ret == 0)
  489. ret = wc_HpkeSerializePublicKey(hpke, ctx->echConfigs->receiverPrivkey,
  490. ctx->echConfigs->receiverPubkey, &encLen);
  491. if (ret == 0) {
  492. ctx->echConfigs->publicName = (char*)XMALLOC(XSTRLEN(publicName) + 1,
  493. ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  494. if (ctx->echConfigs->publicName == NULL) {
  495. ret = MEMORY_E;
  496. }
  497. else {
  498. XMEMCPY(ctx->echConfigs->publicName, publicName,
  499. XSTRLEN(publicName) + 1);
  500. }
  501. }
  502. if (ret != 0) {
  503. if (ctx->echConfigs) {
  504. XFREE(ctx->echConfigs->cipherSuites, ctx->heap,
  505. DYNAMIC_TYPE_TMP_BUFFER);
  506. XFREE(ctx->echConfigs->publicName, ctx->heap,
  507. DYNAMIC_TYPE_TMP_BUFFER);
  508. XFREE(ctx->echConfigs, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  509. /* set to null to avoid double free in cleanup */
  510. ctx->echConfigs = NULL;
  511. }
  512. }
  513. if (ret == 0)
  514. ret = WOLFSSL_SUCCESS;
  515. #ifdef WOLFSSL_SMALL_STACK
  516. XFREE(hpke, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  517. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  518. #endif
  519. return ret;
  520. }
  521. /* get the ech configs that the server context is using */
  522. int wolfSSL_CTX_GetEchConfigs(WOLFSSL_CTX* ctx, byte* output,
  523. word32* outputLen) {
  524. if (ctx == NULL || outputLen == NULL)
  525. return BAD_FUNC_ARG;
  526. /* if we don't have ech configs */
  527. if (ctx->echConfigs == NULL) {
  528. return WOLFSSL_FATAL_ERROR;
  529. }
  530. return GetEchConfigsEx(ctx->echConfigs, output, outputLen);
  531. }
  532. /* set the ech config from base64 for our client ssl object, base64 is the
  533. * format ech configs are sent using dns records */
  534. int wolfSSL_SetEchConfigsBase64(WOLFSSL* ssl, char* echConfigs64,
  535. word32 echConfigs64Len)
  536. {
  537. int ret = 0;
  538. word32 decodedLen = echConfigs64Len * 3 / 4 + 1;
  539. byte* decodedConfigs;
  540. if (ssl == NULL || echConfigs64 == NULL || echConfigs64Len == 0)
  541. return BAD_FUNC_ARG;
  542. /* already have ech configs */
  543. if (ssl->options.useEch == 1) {
  544. return WOLFSSL_FATAL_ERROR;
  545. }
  546. decodedConfigs = (byte*)XMALLOC(decodedLen, ssl->heap,
  547. DYNAMIC_TYPE_TMP_BUFFER);
  548. if (decodedConfigs == NULL)
  549. return MEMORY_E;
  550. decodedConfigs[decodedLen - 1] = 0;
  551. /* decode the echConfigs */
  552. ret = Base64_Decode((byte*)echConfigs64, echConfigs64Len,
  553. decodedConfigs, &decodedLen);
  554. if (ret != 0) {
  555. XFREE(decodedConfigs, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  556. return ret;
  557. }
  558. ret = wolfSSL_SetEchConfigs(ssl, decodedConfigs, decodedLen);
  559. XFREE(decodedConfigs, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  560. return ret;
  561. }
  562. /* set the ech config from a raw buffer, this is the format ech configs are
  563. * sent using retry_configs from the ech server */
  564. int wolfSSL_SetEchConfigs(WOLFSSL* ssl, const byte* echConfigs,
  565. word32 echConfigsLen)
  566. {
  567. int ret = 0;
  568. int i;
  569. int j;
  570. word16 totalLength;
  571. word16 version;
  572. word16 length;
  573. word16 hpkePubkeyLen;
  574. word16 cipherSuitesLen;
  575. word16 publicNameLen;
  576. WOLFSSL_EchConfig* configList = NULL;
  577. WOLFSSL_EchConfig* workingConfig = NULL;
  578. WOLFSSL_EchConfig* lastConfig = NULL;
  579. byte* echConfig = NULL;
  580. if (ssl == NULL || echConfigs == NULL || echConfigsLen == 0)
  581. return BAD_FUNC_ARG;
  582. /* already have ech configs */
  583. if (ssl->options.useEch == 1) {
  584. return WOLFSSL_FATAL_ERROR;
  585. }
  586. /* check that the total length is well formed */
  587. ato16(echConfigs, &totalLength);
  588. if (totalLength != echConfigsLen - 2) {
  589. return WOLFSSL_FATAL_ERROR;
  590. }
  591. /* skip the total length uint16_t */
  592. i = 2;
  593. do {
  594. echConfig = (byte*)echConfigs + i;
  595. ato16(echConfig, &version);
  596. ato16(echConfig + 2, &length);
  597. /* if the version does not match */
  598. if (version != TLSX_ECH) {
  599. /* we hit the end of the configs */
  600. if ( (word32)i + 2 >= echConfigsLen ) {
  601. break;
  602. }
  603. /* skip this config, +4 for version and length */
  604. i += length + 4;
  605. continue;
  606. }
  607. /* check if the length will overrun the buffer */
  608. if ((word32)i + length + 4 > echConfigsLen) {
  609. break;
  610. }
  611. if (workingConfig == NULL) {
  612. workingConfig =
  613. (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  614. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  615. configList = workingConfig;
  616. if (workingConfig != NULL) {
  617. workingConfig->next = NULL;
  618. }
  619. }
  620. else {
  621. lastConfig = workingConfig;
  622. workingConfig->next =
  623. (WOLFSSL_EchConfig*)XMALLOC(sizeof(WOLFSSL_EchConfig),
  624. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  625. workingConfig = workingConfig->next;
  626. }
  627. if (workingConfig == NULL) {
  628. ret = MEMORY_E;
  629. break;
  630. }
  631. XMEMSET(workingConfig, 0, sizeof(WOLFSSL_EchConfig));
  632. /* rawLen */
  633. workingConfig->rawLen = length + 4;
  634. /* raw body */
  635. workingConfig->raw = (byte*)XMALLOC(workingConfig->rawLen,
  636. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  637. if (workingConfig->raw == NULL) {
  638. ret = MEMORY_E;
  639. break;
  640. }
  641. XMEMCPY(workingConfig->raw, echConfig, workingConfig->rawLen);
  642. /* skip over version and length */
  643. echConfig += 4;
  644. /* configId, 1 byte */
  645. workingConfig->configId = *(echConfig);
  646. echConfig++;
  647. /* kemId, 2 bytes */
  648. ato16(echConfig, &workingConfig->kemId);
  649. echConfig += 2;
  650. /* hpke public_key length, 2 bytes */
  651. ato16(echConfig, &hpkePubkeyLen);
  652. echConfig += 2;
  653. /* hpke public_key */
  654. XMEMCPY(workingConfig->receiverPubkey, echConfig, hpkePubkeyLen);
  655. echConfig += hpkePubkeyLen;
  656. /* cipherSuitesLen */
  657. ato16(echConfig, &cipherSuitesLen);
  658. workingConfig->cipherSuites = (EchCipherSuite*)XMALLOC(cipherSuitesLen,
  659. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  660. if (workingConfig->cipherSuites == NULL) {
  661. ret = MEMORY_E;
  662. break;
  663. }
  664. echConfig += 2;
  665. workingConfig->numCipherSuites = cipherSuitesLen / 4;
  666. /* cipherSuites */
  667. for (j = 0; j < workingConfig->numCipherSuites; j++) {
  668. ato16(echConfig + j * 4, &workingConfig->cipherSuites[j].kdfId);
  669. ato16(echConfig + j * 4 + 2,
  670. &workingConfig->cipherSuites[j].aeadId);
  671. }
  672. echConfig += cipherSuitesLen;
  673. /* publicNameLen */
  674. ato16(echConfig, &publicNameLen);
  675. workingConfig->publicName = (char*)XMALLOC(publicNameLen + 1,
  676. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  677. if (workingConfig->publicName == NULL) {
  678. ret = MEMORY_E;
  679. break;
  680. }
  681. echConfig += 2;
  682. /* publicName */
  683. XMEMCPY(workingConfig->publicName, echConfig, publicNameLen);
  684. /* null terminated */
  685. workingConfig->publicName[publicNameLen] = 0;
  686. /* add length to go to next config, +4 for version and length */
  687. i += length + 4;
  688. /* check that we support this config */
  689. for (j = 0; j < HPKE_SUPPORTED_KEM_LEN; j++) {
  690. if (hpkeSupportedKem[j] == workingConfig->kemId)
  691. break;
  692. }
  693. /* if we don't support the kem or at least one cipher suite */
  694. if (j >= HPKE_SUPPORTED_KEM_LEN ||
  695. EchConfigGetSupportedCipherSuite(workingConfig) < 0)
  696. {
  697. XFREE(workingConfig->cipherSuites, ssl->heap,
  698. DYNAMIC_TYPE_TMP_BUFFER);
  699. XFREE(workingConfig->publicName, ssl->heap,
  700. DYNAMIC_TYPE_TMP_BUFFER);
  701. XFREE(workingConfig->raw, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  702. workingConfig = lastConfig;
  703. }
  704. } while ((word32)i < echConfigsLen);
  705. /* if we found valid configs */
  706. if (ret == 0 && configList != NULL) {
  707. ssl->options.useEch = 1;
  708. ssl->echConfigs = configList;
  709. return WOLFSSL_SUCCESS;
  710. }
  711. workingConfig = configList;
  712. while (workingConfig != NULL) {
  713. lastConfig = workingConfig;
  714. workingConfig = workingConfig->next;
  715. XFREE(lastConfig->cipherSuites, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  716. XFREE(lastConfig->publicName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  717. XFREE(lastConfig->raw, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  718. XFREE(lastConfig, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  719. }
  720. if (ret == 0)
  721. return WOLFSSL_FATAL_ERROR;
  722. return ret;
  723. }
  724. /* get the raw ech config from our struct */
  725. int GetEchConfig(WOLFSSL_EchConfig* config, byte* output, word32* outputLen)
  726. {
  727. int i;
  728. word16 totalLen = 0;
  729. if (config == NULL || (output == NULL && outputLen == NULL))
  730. return BAD_FUNC_ARG;
  731. /* 2 for version */
  732. totalLen += 2;
  733. /* 2 for length */
  734. totalLen += 2;
  735. /* 1 for configId */
  736. totalLen += 1;
  737. /* 2 for kemId */
  738. totalLen += 2;
  739. /* 2 for hpke_len */
  740. totalLen += 2;
  741. /* hpke_pub_key */
  742. switch (config->kemId) {
  743. case DHKEM_P256_HKDF_SHA256:
  744. totalLen += DHKEM_P256_ENC_LEN;
  745. break;
  746. case DHKEM_P384_HKDF_SHA384:
  747. totalLen += DHKEM_P384_ENC_LEN;
  748. break;
  749. case DHKEM_P521_HKDF_SHA512:
  750. totalLen += DHKEM_P521_ENC_LEN;
  751. break;
  752. case DHKEM_X25519_HKDF_SHA256:
  753. totalLen += DHKEM_X25519_ENC_LEN;
  754. break;
  755. case DHKEM_X448_HKDF_SHA512:
  756. totalLen += DHKEM_X448_ENC_LEN;
  757. break;
  758. }
  759. /* cipherSuitesLen */
  760. totalLen += 2;
  761. /* cipherSuites */
  762. totalLen += config->numCipherSuites * 4;
  763. /* public name len */
  764. totalLen += 2;
  765. /* public name */
  766. totalLen += XSTRLEN(config->publicName);
  767. /* trailing zeros */
  768. totalLen += 2;
  769. if (output == NULL) {
  770. *outputLen = totalLen;
  771. return LENGTH_ONLY_E;
  772. }
  773. if (totalLen > *outputLen) {
  774. *outputLen = totalLen;
  775. return INPUT_SIZE_E;
  776. }
  777. /* version */
  778. c16toa(TLSX_ECH, output);
  779. output += 2;
  780. /* length - 4 for version and length itself */
  781. c16toa(totalLen - 4, output);
  782. output += 2;
  783. /* configId */
  784. *output = config->configId;
  785. output++;
  786. /* kemId */
  787. c16toa(config->kemId, output);
  788. output += 2;
  789. /* length and key itself */
  790. switch (config->kemId) {
  791. case DHKEM_P256_HKDF_SHA256:
  792. c16toa(DHKEM_P256_ENC_LEN, output);
  793. output += 2;
  794. XMEMCPY(output, config->receiverPubkey, DHKEM_P256_ENC_LEN);
  795. output += DHKEM_P256_ENC_LEN;
  796. break;
  797. case DHKEM_P384_HKDF_SHA384:
  798. c16toa(DHKEM_P384_ENC_LEN, output);
  799. output += 2;
  800. XMEMCPY(output, config->receiverPubkey, DHKEM_P384_ENC_LEN);
  801. output += DHKEM_P384_ENC_LEN;
  802. break;
  803. case DHKEM_P521_HKDF_SHA512:
  804. c16toa(DHKEM_P521_ENC_LEN, output);
  805. output += 2;
  806. XMEMCPY(output, config->receiverPubkey, DHKEM_P521_ENC_LEN);
  807. output += DHKEM_P521_ENC_LEN;
  808. break;
  809. case DHKEM_X25519_HKDF_SHA256:
  810. c16toa(DHKEM_X25519_ENC_LEN, output);
  811. output += 2;
  812. XMEMCPY(output, config->receiverPubkey, DHKEM_X25519_ENC_LEN);
  813. output += DHKEM_X25519_ENC_LEN;
  814. break;
  815. case DHKEM_X448_HKDF_SHA512:
  816. c16toa(DHKEM_X448_ENC_LEN, output);
  817. output += 2;
  818. XMEMCPY(output, config->receiverPubkey, DHKEM_X448_ENC_LEN);
  819. output += DHKEM_X448_ENC_LEN;
  820. break;
  821. }
  822. /* cipherSuites len */
  823. c16toa(config->numCipherSuites * 4, output);
  824. output += 2;
  825. /* cipherSuites */
  826. for (i = 0; i < config->numCipherSuites; i++) {
  827. c16toa(config->cipherSuites[i].kdfId, output);
  828. output += 2;
  829. c16toa(config->cipherSuites[i].aeadId, output);
  830. output += 2;
  831. }
  832. /* publicName len */
  833. c16toa(XSTRLEN(config->publicName), output);
  834. output += 2;
  835. /* publicName */
  836. XMEMCPY(output, config->publicName,
  837. XSTRLEN(config->publicName));
  838. output += XSTRLEN(config->publicName);
  839. /* terminating zeros */
  840. c16toa(0, output);
  841. /* output += 2; */
  842. *outputLen = totalLen;
  843. return 0;
  844. }
  845. /* wrapper function to get ech configs from application code */
  846. int wolfSSL_GetEchConfigs(WOLFSSL* ssl, byte* output, word32* outputLen)
  847. {
  848. if (ssl == NULL || outputLen == NULL)
  849. return BAD_FUNC_ARG;
  850. /* if we don't have ech configs */
  851. if (ssl->options.useEch != 1) {
  852. return WOLFSSL_FATAL_ERROR;
  853. }
  854. return GetEchConfigsEx(ssl->echConfigs, output, outputLen);
  855. }
  856. /* get the raw ech configs from our linked list of ech config structs */
  857. int GetEchConfigsEx(WOLFSSL_EchConfig* configs, byte* output, word32* outputLen)
  858. {
  859. int ret = 0;
  860. WOLFSSL_EchConfig* workingConfig = NULL;
  861. byte* outputStart = output;
  862. word32 totalLen = 2;
  863. word32 workingOutputLen;
  864. if (configs == NULL || outputLen == NULL)
  865. return BAD_FUNC_ARG;
  866. workingOutputLen = *outputLen - totalLen;
  867. /* skip over total length which we fill in later */
  868. if (output != NULL)
  869. output += 2;
  870. workingConfig = configs;
  871. while (workingConfig != NULL) {
  872. /* get this config */
  873. ret = GetEchConfig(workingConfig, output, &workingOutputLen);
  874. if (output != NULL)
  875. output += workingOutputLen;
  876. /* add this config's length to the total length */
  877. totalLen += workingOutputLen;
  878. if (totalLen > *outputLen)
  879. workingOutputLen = 0;
  880. else
  881. workingOutputLen = *outputLen - totalLen;
  882. /* only error we break on, other 2 we need to keep finding length */
  883. if (ret == BAD_FUNC_ARG)
  884. return BAD_FUNC_ARG;
  885. workingConfig = workingConfig->next;
  886. }
  887. if (output == NULL) {
  888. *outputLen = totalLen;
  889. return LENGTH_ONLY_E;
  890. }
  891. if (totalLen > *outputLen) {
  892. *outputLen = totalLen;
  893. return INPUT_SIZE_E;
  894. }
  895. /* total size -2 for size itself */
  896. c16toa(totalLen - 2, outputStart);
  897. *outputLen = totalLen;
  898. return WOLFSSL_SUCCESS;
  899. }
  900. #endif /* WOLFSSL_TLS13 && HAVE_ECH */
  901. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  902. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  903. #endif
  904. #ifdef WOLFSSL_SESSION_EXPORT
  905. /* Used to import a serialized TLS session.
  906. * WARNING: buf contains sensitive information about the state and is best to be
  907. * encrypted before storing if stored.
  908. *
  909. * @param ssl WOLFSSL structure to import the session into
  910. * @param buf serialized session
  911. * @param sz size of buffer 'buf'
  912. * @return the number of bytes read from buffer 'buf'
  913. */
  914. int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  915. {
  916. if (ssl == NULL || buf == NULL) {
  917. return BAD_FUNC_ARG;
  918. }
  919. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  920. }
  921. /* Used to export a serialized TLS session.
  922. * WARNING: buf contains sensitive information about the state and is best to be
  923. * encrypted before storing if stored.
  924. *
  925. * @param ssl WOLFSSL structure to export the session from
  926. * @param buf output of serialized session
  927. * @param sz size in bytes set in 'buf'
  928. * @return the number of bytes written into buffer 'buf'
  929. */
  930. int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  931. {
  932. if (ssl == NULL || sz == NULL) {
  933. return BAD_FUNC_ARG;
  934. }
  935. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  936. }
  937. #ifdef WOLFSSL_DTLS
  938. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  939. {
  940. WOLFSSL_ENTER("wolfSSL_session_import");
  941. if (ssl == NULL || buf == NULL) {
  942. return BAD_FUNC_ARG;
  943. }
  944. /* sanity checks on buffer and protocol are done in internal function */
  945. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  946. }
  947. /* Sets the function to call for serializing the session. This function is
  948. * called right after the handshake is completed. */
  949. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  950. {
  951. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  952. /* purposefully allow func to be NULL */
  953. if (ctx == NULL) {
  954. return BAD_FUNC_ARG;
  955. }
  956. ctx->dtls_export = func;
  957. return WOLFSSL_SUCCESS;
  958. }
  959. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  960. * function is called right after the handshake is completed. */
  961. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  962. {
  963. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  964. /* purposefully allow func to be NULL */
  965. if (ssl == NULL) {
  966. return BAD_FUNC_ARG;
  967. }
  968. ssl->dtls_export = func;
  969. return WOLFSSL_SUCCESS;
  970. }
  971. /* This function allows for directly serializing a session rather than using
  972. * callbacks. It has less overhead by removing a temporary buffer and gives
  973. * control over when the session gets serialized. When using callbacks the
  974. * session is always serialized immediately after the handshake is finished.
  975. *
  976. * buf is the argument to contain the serialized session
  977. * sz is the size of the buffer passed in
  978. * ssl is the WOLFSSL struct to serialize
  979. * returns the size of serialized session on success, 0 on no action, and
  980. * negative value on error */
  981. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  982. {
  983. WOLFSSL_ENTER("wolfSSL_dtls_export");
  984. if (ssl == NULL || sz == NULL) {
  985. return BAD_FUNC_ARG;
  986. }
  987. if (buf == NULL) {
  988. *sz = MAX_EXPORT_BUFFER;
  989. return 0;
  990. }
  991. /* if not DTLS do nothing */
  992. if (!ssl->options.dtls) {
  993. WOLFSSL_MSG("Currently only DTLS export is supported");
  994. return 0;
  995. }
  996. /* copy over keys, options, and dtls state struct */
  997. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  998. }
  999. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  1000. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  1001. * sequence number, epoch, AEAD state etc.
  1002. *
  1003. * buf is the argument to contain the serialized state, if null then set "sz" to
  1004. * buffer size required
  1005. * sz is the size of the buffer passed in
  1006. * ssl is the WOLFSSL struct to serialize
  1007. * returns the size of serialized session on success, 0 on no action, and
  1008. * negative value on error */
  1009. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  1010. unsigned int* sz)
  1011. {
  1012. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  1013. if (ssl == NULL || sz == NULL) {
  1014. return BAD_FUNC_ARG;
  1015. }
  1016. if (buf == NULL) {
  1017. *sz = MAX_EXPORT_STATE_BUFFER;
  1018. return 0;
  1019. }
  1020. /* if not DTLS do nothing */
  1021. if (!ssl->options.dtls) {
  1022. WOLFSSL_MSG("Currently only DTLS export state is supported");
  1023. return 0;
  1024. }
  1025. /* copy over keys, options, and dtls state struct */
  1026. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  1027. }
  1028. /* returns 0 on success */
  1029. int wolfSSL_send_session(WOLFSSL* ssl)
  1030. {
  1031. int ret;
  1032. byte* buf;
  1033. word32 bufSz = MAX_EXPORT_BUFFER;
  1034. WOLFSSL_ENTER("wolfSSL_send_session");
  1035. if (ssl == NULL) {
  1036. return BAD_FUNC_ARG;
  1037. }
  1038. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1039. if (buf == NULL) {
  1040. return MEMORY_E;
  1041. }
  1042. /* if not DTLS do nothing */
  1043. if (!ssl->options.dtls) {
  1044. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1045. WOLFSSL_MSG("Currently only DTLS export is supported");
  1046. return 0;
  1047. }
  1048. /* copy over keys, options, and dtls state struct */
  1049. ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS);
  1050. if (ret < 0) {
  1051. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1052. return ret;
  1053. }
  1054. /* if no error ret has size of buffer */
  1055. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  1056. if (ret != WOLFSSL_SUCCESS) {
  1057. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1058. return ret;
  1059. }
  1060. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1061. return 0;
  1062. }
  1063. #endif /* WOLFSSL_DTLS */
  1064. #endif /* WOLFSSL_SESSION_EXPORT */
  1065. /* prevent multiple mutex initializations */
  1066. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  1067. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  1068. static WOLFSSL_GLOBAL int count_mutex_valid = 0;
  1069. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  1070. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  1071. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  1072. success is freed when ctx is freed.
  1073. */
  1074. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  1075. {
  1076. WOLFSSL_CTX* ctx = NULL;
  1077. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  1078. if (initRefCount == 0) {
  1079. /* user no longer forced to call Init themselves */
  1080. int ret = wolfSSL_Init();
  1081. if (ret != WOLFSSL_SUCCESS) {
  1082. WOLFSSL_MSG("wolfSSL_Init failed");
  1083. WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
  1084. if (method != NULL) {
  1085. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  1086. }
  1087. return NULL;
  1088. }
  1089. }
  1090. if (method == NULL)
  1091. return ctx;
  1092. ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  1093. if (ctx) {
  1094. int ret;
  1095. ret = InitSSL_Ctx(ctx, method, heap);
  1096. #ifdef WOLFSSL_STATIC_MEMORY
  1097. if (heap != NULL) {
  1098. ctx->onHeapHint = 1; /* free the memory back to heap when done */
  1099. }
  1100. #endif
  1101. if (ret < 0) {
  1102. WOLFSSL_MSG("Init CTX failed");
  1103. wolfSSL_CTX_free(ctx);
  1104. ctx = NULL;
  1105. }
  1106. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  1107. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  1108. else {
  1109. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  1110. if (ctx->srp == NULL){
  1111. WOLFSSL_MSG("Init CTX failed");
  1112. wolfSSL_CTX_free(ctx);
  1113. return NULL;
  1114. }
  1115. XMEMSET(ctx->srp, 0, sizeof(Srp));
  1116. }
  1117. #endif
  1118. }
  1119. else {
  1120. WOLFSSL_MSG("Alloc CTX failed, method freed");
  1121. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  1122. }
  1123. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  1124. if (ctx) {
  1125. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  1126. wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
  1127. if (wolfSSL_CTX_set_min_proto_version(ctx,
  1128. (method->version.major == DTLS_MAJOR) ?
  1129. DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS ||
  1130. #ifdef HAVE_ANON
  1131. wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS ||
  1132. #endif
  1133. wolfSSL_CTX_set_group_messages(ctx) != WOLFSSL_SUCCESS) {
  1134. WOLFSSL_MSG("Setting OpenSSL CTX defaults failed");
  1135. wolfSSL_CTX_free(ctx);
  1136. ctx = NULL;
  1137. }
  1138. }
  1139. #endif
  1140. WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
  1141. return ctx;
  1142. }
  1143. WOLFSSL_ABI
  1144. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  1145. {
  1146. #ifdef WOLFSSL_HEAP_TEST
  1147. /* if testing the heap hint then set top level CTX to have test value */
  1148. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  1149. #else
  1150. return wolfSSL_CTX_new_ex(method, NULL);
  1151. #endif
  1152. }
  1153. /* increases CTX reference count to track proper time to "free" */
  1154. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  1155. {
  1156. int ret;
  1157. wolfSSL_RefInc(&ctx->ref, &ret);
  1158. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  1159. return ((ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  1160. #else
  1161. (void)ret;
  1162. return WOLFSSL_SUCCESS;
  1163. #endif
  1164. }
  1165. WOLFSSL_ABI
  1166. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  1167. {
  1168. WOLFSSL_ENTER("wolfSSL_CTX_free");
  1169. if (ctx) {
  1170. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  1171. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  1172. if (ctx->srp != NULL) {
  1173. if (ctx->srp_password != NULL){
  1174. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  1175. ctx->srp_password = NULL;
  1176. }
  1177. wc_SrpTerm(ctx->srp);
  1178. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  1179. ctx->srp = NULL;
  1180. }
  1181. #endif
  1182. FreeSSL_Ctx(ctx);
  1183. }
  1184. WOLFSSL_LEAVE("wolfSSL_CTX_free", 0);
  1185. }
  1186. #ifdef HAVE_ENCRYPT_THEN_MAC
  1187. /**
  1188. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  1189. * The default value: enabled.
  1190. *
  1191. * ctx SSL/TLS context.
  1192. * set Whether to allow or not: 1 is allow and 0 is disallow.
  1193. * returns WOLFSSL_SUCCESS
  1194. */
  1195. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  1196. {
  1197. ctx->disallowEncThenMac = !set;
  1198. return WOLFSSL_SUCCESS;
  1199. }
  1200. /**
  1201. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  1202. * The default value comes from context.
  1203. *
  1204. * ctx SSL/TLS context.
  1205. * set Whether to allow or not: 1 is allow and 0 is disallow.
  1206. * returns WOLFSSL_SUCCESS
  1207. */
  1208. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  1209. {
  1210. ssl->options.disallowEncThenMac = !set;
  1211. return WOLFSSL_SUCCESS;
  1212. }
  1213. #endif
  1214. #ifdef SINGLE_THREADED
  1215. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  1216. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  1217. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  1218. {
  1219. WC_RNG* rng;
  1220. int ret;
  1221. if (ctx == NULL) {
  1222. return BAD_FUNC_ARG;
  1223. }
  1224. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  1225. if (rng == NULL) {
  1226. return MEMORY_E;
  1227. }
  1228. #ifndef HAVE_FIPS
  1229. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  1230. #else
  1231. ret = wc_InitRng(rng);
  1232. #endif
  1233. if (ret != 0) {
  1234. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1235. return ret;
  1236. }
  1237. ctx->rng = rng;
  1238. return WOLFSSL_SUCCESS;
  1239. }
  1240. #endif
  1241. WOLFSSL_ABI
  1242. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  1243. {
  1244. WOLFSSL* ssl = NULL;
  1245. int ret = 0;
  1246. WOLFSSL_ENTER("wolfSSL_new");
  1247. if (ctx == NULL)
  1248. return ssl;
  1249. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  1250. if (ssl)
  1251. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  1252. FreeSSL(ssl, ctx->heap);
  1253. ssl = 0;
  1254. }
  1255. WOLFSSL_LEAVE("wolfSSL_new", ret);
  1256. (void)ret;
  1257. return ssl;
  1258. }
  1259. WOLFSSL_ABI
  1260. void wolfSSL_free(WOLFSSL* ssl)
  1261. {
  1262. WOLFSSL_ENTER("wolfSSL_free");
  1263. if (ssl)
  1264. FreeSSL(ssl, ssl->ctx->heap);
  1265. WOLFSSL_LEAVE("wolfSSL_free", 0);
  1266. }
  1267. int wolfSSL_is_server(WOLFSSL* ssl)
  1268. {
  1269. if (ssl == NULL)
  1270. return BAD_FUNC_ARG;
  1271. return ssl->options.side == WOLFSSL_SERVER_END;
  1272. }
  1273. #ifdef HAVE_WRITE_DUP
  1274. /*
  1275. * Release resources around WriteDup object
  1276. *
  1277. * ssl WOLFSSL object
  1278. *
  1279. * no return, destruction so make best attempt
  1280. */
  1281. void FreeWriteDup(WOLFSSL* ssl)
  1282. {
  1283. int doFree = 0;
  1284. WOLFSSL_ENTER("FreeWriteDup");
  1285. if (ssl->dupWrite) {
  1286. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  1287. ssl->dupWrite->dupCount--;
  1288. if (ssl->dupWrite->dupCount == 0) {
  1289. doFree = 1;
  1290. } else {
  1291. WOLFSSL_MSG("WriteDup count not zero, no full free");
  1292. }
  1293. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1294. }
  1295. }
  1296. if (doFree) {
  1297. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  1298. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  1299. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  1300. }
  1301. }
  1302. /*
  1303. * duplicate existing ssl members into dup needed for writing
  1304. *
  1305. * dup write only WOLFSSL
  1306. * ssl existing WOLFSSL
  1307. *
  1308. * 0 on success
  1309. */
  1310. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  1311. {
  1312. word16 tmp_weOwnRng;
  1313. /* shared dupWrite setup */
  1314. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  1315. DYNAMIC_TYPE_WRITEDUP);
  1316. if (ssl->dupWrite == NULL) {
  1317. return MEMORY_E;
  1318. }
  1319. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  1320. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  1321. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  1322. ssl->dupWrite = NULL;
  1323. return BAD_MUTEX_E;
  1324. }
  1325. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  1326. dup->dupWrite = ssl->dupWrite; /* each side uses */
  1327. tmp_weOwnRng = dup->options.weOwnRng;
  1328. /* copy write parts over to dup writer */
  1329. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  1330. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  1331. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  1332. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  1333. XMEMCPY(&dup->version, &ssl->version, sizeof(ProtocolVersion));
  1334. XMEMCPY(&dup->chVersion, &ssl->chVersion, sizeof(ProtocolVersion));
  1335. /* dup side now owns encrypt/write ciphers */
  1336. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  1337. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  1338. dup->CBIOSend = ssl->CBIOSend;
  1339. #ifdef OPENSSL_EXTRA
  1340. dup->cbioFlag = ssl->cbioFlag;
  1341. #endif
  1342. dup->wfd = ssl->wfd;
  1343. dup->wflags = ssl->wflags;
  1344. #ifndef WOLFSSL_AEAD_ONLY
  1345. dup->hmac = ssl->hmac;
  1346. #endif
  1347. #ifdef HAVE_TRUNCATED_HMAC
  1348. dup->truncated_hmac = ssl->truncated_hmac;
  1349. #endif
  1350. /* Restore rng option */
  1351. dup->options.weOwnRng = tmp_weOwnRng;
  1352. /* unique side dup setup */
  1353. dup->dupSide = WRITE_DUP_SIDE;
  1354. ssl->dupSide = READ_DUP_SIDE;
  1355. return 0;
  1356. }
  1357. /*
  1358. * duplicate a WOLFSSL object post handshake for writing only
  1359. * turn existing object into read only. Allows concurrent access from two
  1360. * different threads.
  1361. *
  1362. * ssl existing WOLFSSL object
  1363. *
  1364. * return dup'd WOLFSSL object on success
  1365. */
  1366. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  1367. {
  1368. WOLFSSL* dup = NULL;
  1369. int ret = 0;
  1370. (void)ret;
  1371. WOLFSSL_ENTER("wolfSSL_write_dup");
  1372. if (ssl == NULL) {
  1373. return ssl;
  1374. }
  1375. if (ssl->options.handShakeDone == 0) {
  1376. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  1377. return NULL;
  1378. }
  1379. if (ssl->dupWrite) {
  1380. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  1381. return NULL;
  1382. }
  1383. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  1384. if (dup) {
  1385. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  1386. FreeSSL(dup, ssl->ctx->heap);
  1387. dup = NULL;
  1388. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  1389. FreeSSL(dup, ssl->ctx->heap);
  1390. dup = NULL;
  1391. }
  1392. }
  1393. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  1394. return dup;
  1395. }
  1396. /*
  1397. * Notify write dup side of fatal error or close notify
  1398. *
  1399. * ssl WOLFSSL object
  1400. * err Notify err
  1401. *
  1402. * 0 on success
  1403. */
  1404. int NotifyWriteSide(WOLFSSL* ssl, int err)
  1405. {
  1406. int ret;
  1407. WOLFSSL_ENTER("NotifyWriteSide");
  1408. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  1409. if (ret == 0) {
  1410. ssl->dupWrite->dupErr = err;
  1411. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1412. }
  1413. return ret;
  1414. }
  1415. #endif /* HAVE_WRITE_DUP */
  1416. #ifdef HAVE_POLY1305
  1417. /* set if to use old poly 1 for yes 0 to use new poly */
  1418. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  1419. {
  1420. (void)ssl;
  1421. (void)value;
  1422. #ifndef WOLFSSL_NO_TLS12
  1423. WOLFSSL_ENTER("wolfSSL_use_old_poly");
  1424. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  1425. "is depreciated");
  1426. ssl->options.oldPoly = (word16)value;
  1427. WOLFSSL_LEAVE("wolfSSL_use_old_poly", 0);
  1428. #endif
  1429. return 0;
  1430. }
  1431. #endif
  1432. WOLFSSL_ABI
  1433. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  1434. {
  1435. int ret;
  1436. WOLFSSL_ENTER("wolfSSL_set_fd");
  1437. if (ssl == NULL) {
  1438. return BAD_FUNC_ARG;
  1439. }
  1440. ret = wolfSSL_set_read_fd(ssl, fd);
  1441. if (ret == WOLFSSL_SUCCESS) {
  1442. ret = wolfSSL_set_write_fd(ssl, fd);
  1443. }
  1444. return ret;
  1445. }
  1446. #ifdef WOLFSSL_DTLS
  1447. int wolfSSL_set_dtls_fd_connected(WOLFSSL* ssl, int fd)
  1448. {
  1449. int ret;
  1450. WOLFSSL_ENTER("wolfSSL_set_dtls_fd_connected");
  1451. if (ssl == NULL) {
  1452. return BAD_FUNC_ARG;
  1453. }
  1454. ret = wolfSSL_set_fd(ssl, fd);
  1455. if (ret == WOLFSSL_SUCCESS)
  1456. ssl->buffers.dtlsCtx.connected = 1;
  1457. return ret;
  1458. }
  1459. #endif
  1460. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  1461. {
  1462. WOLFSSL_ENTER("wolfSSL_set_read_fd");
  1463. if (ssl == NULL) {
  1464. return BAD_FUNC_ARG;
  1465. }
  1466. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  1467. ssl->IOCB_ReadCtx = &ssl->rfd;
  1468. #ifdef WOLFSSL_DTLS
  1469. ssl->buffers.dtlsCtx.connected = 0;
  1470. if (ssl->options.dtls) {
  1471. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  1472. ssl->buffers.dtlsCtx.rfd = fd;
  1473. }
  1474. #endif
  1475. WOLFSSL_LEAVE("wolfSSL_set_read_fd", WOLFSSL_SUCCESS);
  1476. return WOLFSSL_SUCCESS;
  1477. }
  1478. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  1479. {
  1480. WOLFSSL_ENTER("wolfSSL_set_write_fd");
  1481. if (ssl == NULL) {
  1482. return BAD_FUNC_ARG;
  1483. }
  1484. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  1485. ssl->IOCB_WriteCtx = &ssl->wfd;
  1486. #ifdef WOLFSSL_DTLS
  1487. ssl->buffers.dtlsCtx.connected = 0;
  1488. if (ssl->options.dtls) {
  1489. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  1490. ssl->buffers.dtlsCtx.wfd = fd;
  1491. }
  1492. #endif
  1493. WOLFSSL_LEAVE("wolfSSL_set_write_fd", WOLFSSL_SUCCESS);
  1494. return WOLFSSL_SUCCESS;
  1495. }
  1496. /**
  1497. * Get the name of cipher at priority level passed in.
  1498. */
  1499. char* wolfSSL_get_cipher_list(int priority)
  1500. {
  1501. const CipherSuiteInfo* ciphers = GetCipherNames();
  1502. if (priority >= GetCipherNamesSize() || priority < 0) {
  1503. return 0;
  1504. }
  1505. return (char*)ciphers[priority].name;
  1506. }
  1507. /**
  1508. * Get the name of cipher at priority level passed in.
  1509. */
  1510. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  1511. {
  1512. if (ssl == NULL) {
  1513. return NULL;
  1514. }
  1515. else {
  1516. const char* cipher;
  1517. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  1518. if (priority == 0) {
  1519. return (char*)cipher;
  1520. }
  1521. else {
  1522. return NULL;
  1523. }
  1524. }
  1525. else {
  1526. return wolfSSL_get_cipher_list(priority);
  1527. }
  1528. }
  1529. }
  1530. int wolfSSL_get_ciphers(char* buf, int len)
  1531. {
  1532. const CipherSuiteInfo* ciphers = GetCipherNames();
  1533. int ciphersSz = GetCipherNamesSize();
  1534. int i;
  1535. if (buf == NULL || len <= 0)
  1536. return BAD_FUNC_ARG;
  1537. /* Add each member to the buffer delimited by a : */
  1538. for (i = 0; i < ciphersSz; i++) {
  1539. int cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  1540. if (cipherNameSz + 1 < len) {
  1541. XSTRNCPY(buf, ciphers[i].name, len);
  1542. buf += cipherNameSz;
  1543. if (i < ciphersSz - 1)
  1544. *buf++ = ':';
  1545. *buf = 0;
  1546. len -= cipherNameSz + 1;
  1547. }
  1548. else
  1549. return BUFFER_E;
  1550. }
  1551. return WOLFSSL_SUCCESS;
  1552. }
  1553. #ifndef NO_ERROR_STRINGS
  1554. /* places a list of all supported cipher suites in TLS_* format into "buf"
  1555. * return WOLFSSL_SUCCESS on success */
  1556. int wolfSSL_get_ciphers_iana(char* buf, int len)
  1557. {
  1558. const CipherSuiteInfo* ciphers = GetCipherNames();
  1559. int ciphersSz = GetCipherNamesSize();
  1560. int i;
  1561. int cipherNameSz;
  1562. if (buf == NULL || len <= 0)
  1563. return BAD_FUNC_ARG;
  1564. /* Add each member to the buffer delimited by a : */
  1565. for (i = 0; i < ciphersSz; i++) {
  1566. #ifndef NO_CIPHER_SUITE_ALIASES
  1567. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  1568. continue;
  1569. #endif
  1570. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  1571. if (cipherNameSz + 1 < len) {
  1572. XSTRNCPY(buf, ciphers[i].name_iana, len);
  1573. buf += cipherNameSz;
  1574. if (i < ciphersSz - 1)
  1575. *buf++ = ':';
  1576. *buf = 0;
  1577. len -= cipherNameSz + 1;
  1578. }
  1579. else
  1580. return BUFFER_E;
  1581. }
  1582. return WOLFSSL_SUCCESS;
  1583. }
  1584. #endif /* NO_ERROR_STRINGS */
  1585. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  1586. {
  1587. const char* cipher;
  1588. if (ssl == NULL)
  1589. return NULL;
  1590. cipher = wolfSSL_get_cipher_name_iana(ssl);
  1591. len = min(len, (int)(XSTRLEN(cipher) + 1));
  1592. XMEMCPY(buf, cipher, len);
  1593. return buf;
  1594. }
  1595. int wolfSSL_get_fd(const WOLFSSL* ssl)
  1596. {
  1597. int fd = -1;
  1598. WOLFSSL_ENTER("wolfSSL_get_fd");
  1599. if (ssl) {
  1600. fd = ssl->rfd;
  1601. }
  1602. WOLFSSL_LEAVE("wolfSSL_get_fd", fd);
  1603. return fd;
  1604. }
  1605. int wolfSSL_dtls(WOLFSSL* ssl)
  1606. {
  1607. int dtlsOpt = 0;
  1608. if (ssl)
  1609. dtlsOpt = ssl->options.dtls;
  1610. return dtlsOpt;
  1611. }
  1612. #if !defined(NO_CERTS)
  1613. /* Set whether mutual authentication is required for connections.
  1614. * Server side only.
  1615. *
  1616. * ctx The SSL/TLS CTX object.
  1617. * req 1 to indicate required and 0 when not.
  1618. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  1619. * 0 on success.
  1620. */
  1621. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  1622. {
  1623. if (ctx == NULL)
  1624. return BAD_FUNC_ARG;
  1625. if (ctx->method->side == WOLFSSL_CLIENT_END)
  1626. return SIDE_ERROR;
  1627. ctx->mutualAuth = (byte)req;
  1628. return 0;
  1629. }
  1630. /* Set whether mutual authentication is required for the connection.
  1631. * Server side only.
  1632. *
  1633. * ssl The SSL/TLS object.
  1634. * req 1 to indicate required and 0 when not.
  1635. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  1636. * SIDE_ERROR when not a client and 0 on success.
  1637. */
  1638. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  1639. {
  1640. if (ssl == NULL)
  1641. return BAD_FUNC_ARG;
  1642. if (ssl->options.side == WOLFSSL_SERVER_END)
  1643. return SIDE_ERROR;
  1644. ssl->options.mutualAuth = (word16)req;
  1645. return 0;
  1646. }
  1647. #endif /* NO_CERTS */
  1648. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  1649. int wolfSSL_CTX_set_AcceptFilter(
  1650. WOLFSSL_CTX *ctx,
  1651. NetworkFilterCallback_t AcceptFilter,
  1652. void *AcceptFilter_arg)
  1653. {
  1654. if (ctx == NULL)
  1655. return BAD_FUNC_ARG;
  1656. ctx->AcceptFilter = AcceptFilter;
  1657. ctx->AcceptFilter_arg = AcceptFilter_arg;
  1658. return 0;
  1659. }
  1660. int wolfSSL_set_AcceptFilter(
  1661. WOLFSSL *ssl,
  1662. NetworkFilterCallback_t AcceptFilter,
  1663. void *AcceptFilter_arg)
  1664. {
  1665. if (ssl == NULL)
  1666. return BAD_FUNC_ARG;
  1667. ssl->AcceptFilter = AcceptFilter;
  1668. ssl->AcceptFilter_arg = AcceptFilter_arg;
  1669. return 0;
  1670. }
  1671. int wolfSSL_CTX_set_ConnectFilter(
  1672. WOLFSSL_CTX *ctx,
  1673. NetworkFilterCallback_t ConnectFilter,
  1674. void *ConnectFilter_arg)
  1675. {
  1676. if (ctx == NULL)
  1677. return BAD_FUNC_ARG;
  1678. ctx->ConnectFilter = ConnectFilter;
  1679. ctx->ConnectFilter_arg = ConnectFilter_arg;
  1680. return 0;
  1681. }
  1682. int wolfSSL_set_ConnectFilter(
  1683. WOLFSSL *ssl,
  1684. NetworkFilterCallback_t ConnectFilter,
  1685. void *ConnectFilter_arg)
  1686. {
  1687. if (ssl == NULL)
  1688. return BAD_FUNC_ARG;
  1689. ssl->ConnectFilter = ConnectFilter;
  1690. ssl->ConnectFilter_arg = ConnectFilter_arg;
  1691. return 0;
  1692. }
  1693. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  1694. #ifndef WOLFSSL_LEANPSK
  1695. #if defined(WOLFSSL_DTLS) && defined(XINET_PTON) && \
  1696. !defined(WOLFSSL_NO_SOCK) && defined(HAVE_SOCKADDR)
  1697. void* wolfSSL_dtls_create_peer(int port, char* ip)
  1698. {
  1699. SOCKADDR_IN *addr;
  1700. addr = (SOCKADDR_IN*)XMALLOC(sizeof(*addr), NULL,
  1701. DYNAMIC_TYPE_SOCKADDR);
  1702. if (addr == NULL) {
  1703. return NULL;
  1704. }
  1705. addr->sin_family = AF_INET;
  1706. addr->sin_port = XHTONS((word16)port);
  1707. if (XINET_PTON(AF_INET, ip, &addr->sin_addr) < 1) {
  1708. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1709. return NULL;
  1710. }
  1711. return addr;
  1712. }
  1713. int wolfSSL_dtls_free_peer(void* addr)
  1714. {
  1715. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1716. return WOLFSSL_SUCCESS;
  1717. }
  1718. #endif
  1719. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  1720. {
  1721. #ifdef WOLFSSL_DTLS
  1722. void* sa;
  1723. if (ssl == NULL)
  1724. return WOLFSSL_FAILURE;
  1725. if (peer == NULL || peerSz == 0) {
  1726. if (ssl->buffers.dtlsCtx.peer.sa != NULL)
  1727. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1728. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1729. ssl->buffers.dtlsCtx.peer.sz = 0;
  1730. ssl->buffers.dtlsCtx.peer.bufSz = 0;
  1731. ssl->buffers.dtlsCtx.userSet = 0;
  1732. return WOLFSSL_SUCCESS;
  1733. }
  1734. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  1735. if (sa != NULL) {
  1736. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1737. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1738. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1739. }
  1740. XMEMCPY(sa, peer, peerSz);
  1741. ssl->buffers.dtlsCtx.peer.sa = sa;
  1742. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  1743. ssl->buffers.dtlsCtx.peer.bufSz = peerSz;
  1744. ssl->buffers.dtlsCtx.userSet = 1;
  1745. return WOLFSSL_SUCCESS;
  1746. }
  1747. return WOLFSSL_FAILURE;
  1748. #else
  1749. (void)ssl;
  1750. (void)peer;
  1751. (void)peerSz;
  1752. return WOLFSSL_NOT_IMPLEMENTED;
  1753. #endif
  1754. }
  1755. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  1756. {
  1757. #ifdef WOLFSSL_DTLS
  1758. if (ssl == NULL) {
  1759. return WOLFSSL_FAILURE;
  1760. }
  1761. if (peer != NULL && peerSz != NULL
  1762. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  1763. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1764. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  1765. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  1766. return WOLFSSL_SUCCESS;
  1767. }
  1768. return WOLFSSL_FAILURE;
  1769. #else
  1770. (void)ssl;
  1771. (void)peer;
  1772. (void)peerSz;
  1773. return WOLFSSL_NOT_IMPLEMENTED;
  1774. #endif
  1775. }
  1776. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  1777. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  1778. {
  1779. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp");
  1780. if (ctx == NULL)
  1781. return BAD_FUNC_ARG;
  1782. ctx->dtlsSctp = 1;
  1783. return WOLFSSL_SUCCESS;
  1784. }
  1785. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  1786. {
  1787. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp");
  1788. if (ssl == NULL)
  1789. return BAD_FUNC_ARG;
  1790. ssl->options.dtlsSctp = 1;
  1791. return WOLFSSL_SUCCESS;
  1792. }
  1793. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  1794. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  1795. defined(WOLFSSL_DTLS)
  1796. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  1797. {
  1798. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  1799. return BAD_FUNC_ARG;
  1800. ctx->dtlsMtuSz = newMtu;
  1801. return WOLFSSL_SUCCESS;
  1802. }
  1803. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  1804. {
  1805. if (ssl == NULL)
  1806. return BAD_FUNC_ARG;
  1807. if (newMtu > MAX_RECORD_SIZE) {
  1808. ssl->error = BAD_FUNC_ARG;
  1809. return WOLFSSL_FAILURE;
  1810. }
  1811. ssl->dtlsMtuSz = newMtu;
  1812. return WOLFSSL_SUCCESS;
  1813. }
  1814. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  1815. #ifdef WOLFSSL_SRTP
  1816. static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = {
  1817. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits
  1818. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1819. {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) },
  1820. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits
  1821. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1822. {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) },
  1823. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */
  1824. {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)},
  1825. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */
  1826. {"SRTP_NULL_SHA1_32", SRTP_NULL_SHA1_32, ((112 * 2) / 8)},
  1827. /* AES GCM 128, Salt: 96-bits, Auth GCM Tag 128-bits
  1828. * (master_key:128bits + master_salt:96bits) * 2 = 448 bits (56) */
  1829. {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM, (((128 + 96) * 2) / 8) },
  1830. /* AES GCM 256, Salt: 96-bits, Auth GCM Tag 128-bits
  1831. * (master_key:256bits + master_salt:96bits) * 2 = 704 bits (88) */
  1832. {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM, (((256 + 96) * 2) / 8) },
  1833. };
  1834. static const WOLFSSL_SRTP_PROTECTION_PROFILE* DtlsSrtpFindProfile(
  1835. const char* profile_str, word32 profile_str_len, unsigned long id)
  1836. {
  1837. int i;
  1838. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1839. for (i=0;
  1840. i<(int)(sizeof(gSrtpProfiles)/sizeof(WOLFSSL_SRTP_PROTECTION_PROFILE));
  1841. i++) {
  1842. if (profile_str != NULL) {
  1843. word32 srtp_profile_len = (word32)XSTRLEN(gSrtpProfiles[i].name);
  1844. if (srtp_profile_len == profile_str_len &&
  1845. XMEMCMP(gSrtpProfiles[i].name, profile_str, profile_str_len)
  1846. == 0) {
  1847. profile = &gSrtpProfiles[i];
  1848. break;
  1849. }
  1850. }
  1851. else if (id != 0 && gSrtpProfiles[i].id == id) {
  1852. profile = &gSrtpProfiles[i];
  1853. break;
  1854. }
  1855. }
  1856. return profile;
  1857. }
  1858. /* profile_str: accepts ":" colon separated list of SRTP profiles */
  1859. static int DtlsSrtpSelProfiles(word16* id, const char* profile_str)
  1860. {
  1861. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile;
  1862. const char *current, *next = NULL;
  1863. word32 length = 0, current_length;
  1864. *id = 0; /* reset destination ID's */
  1865. if (profile_str == NULL) {
  1866. return WOLFSSL_FAILURE;
  1867. }
  1868. /* loop on end of line or colon ":" */
  1869. next = profile_str;
  1870. length = (word32)XSTRLEN(profile_str);
  1871. do {
  1872. current = next;
  1873. next = XSTRSTR(current, ":");
  1874. current_length = (!next) ? (word32)XSTRLEN(current)
  1875. : (word32)(next - current);
  1876. if (current_length < length)
  1877. length = current_length;
  1878. profile = DtlsSrtpFindProfile(current, current_length, 0);
  1879. if (profile != NULL) {
  1880. *id |= (1 << profile->id); /* selected bit based on ID */
  1881. }
  1882. } while (next != NULL && next++); /* ++ needed to skip ':' */
  1883. return WOLFSSL_SUCCESS;
  1884. }
  1885. int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char* profile_str)
  1886. {
  1887. int ret = WOLFSSL_FAILURE;
  1888. if (ctx != NULL) {
  1889. ret = DtlsSrtpSelProfiles(&ctx->dtlsSrtpProfiles, profile_str);
  1890. }
  1891. return ret;
  1892. }
  1893. int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char* profile_str)
  1894. {
  1895. int ret = WOLFSSL_FAILURE;
  1896. if (ssl != NULL) {
  1897. ret = DtlsSrtpSelProfiles(&ssl->dtlsSrtpProfiles, profile_str);
  1898. }
  1899. return ret;
  1900. }
  1901. const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(
  1902. WOLFSSL* ssl)
  1903. {
  1904. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1905. if (ssl) {
  1906. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1907. }
  1908. return profile;
  1909. }
  1910. #ifndef NO_WOLFSSL_STUB
  1911. WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* wolfSSL_get_srtp_profiles(
  1912. WOLFSSL* ssl)
  1913. {
  1914. /* Not yet implemented - should return list of available SRTP profiles
  1915. * ssl->dtlsSrtpProfiles */
  1916. (void)ssl;
  1917. return NULL;
  1918. }
  1919. #endif
  1920. #define DTLS_SRTP_KEYING_MATERIAL_LABEL "EXTRACTOR-dtls_srtp"
  1921. int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl,
  1922. unsigned char* out, size_t* olen)
  1923. {
  1924. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1925. if (ssl == NULL || olen == NULL) {
  1926. return BAD_FUNC_ARG;
  1927. }
  1928. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1929. if (profile == NULL) {
  1930. WOLFSSL_MSG("Not using DTLS SRTP");
  1931. return EXT_MISSING;
  1932. }
  1933. if (out == NULL) {
  1934. *olen = profile->kdfBits;
  1935. return LENGTH_ONLY_E;
  1936. }
  1937. if (*olen < (size_t)profile->kdfBits) {
  1938. return BUFFER_E;
  1939. }
  1940. return wolfSSL_export_keying_material(ssl, out, profile->kdfBits,
  1941. DTLS_SRTP_KEYING_MATERIAL_LABEL,
  1942. XSTR_SIZEOF(DTLS_SRTP_KEYING_MATERIAL_LABEL), NULL, 0, 0);
  1943. }
  1944. #endif /* WOLFSSL_SRTP */
  1945. #ifdef WOLFSSL_DTLS_DROP_STATS
  1946. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  1947. word32* macDropCount, word32* replayDropCount)
  1948. {
  1949. int ret;
  1950. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats");
  1951. if (ssl == NULL)
  1952. ret = BAD_FUNC_ARG;
  1953. else {
  1954. ret = WOLFSSL_SUCCESS;
  1955. if (macDropCount != NULL)
  1956. *macDropCount = ssl->macDropCount;
  1957. if (replayDropCount != NULL)
  1958. *replayDropCount = ssl->replayDropCount;
  1959. }
  1960. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats", ret);
  1961. return ret;
  1962. }
  1963. #endif /* WOLFSSL_DTLS_DROP_STATS */
  1964. #if defined(WOLFSSL_MULTICAST)
  1965. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  1966. {
  1967. int ret = 0;
  1968. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id");
  1969. if (ctx == NULL || id > 255)
  1970. ret = BAD_FUNC_ARG;
  1971. if (ret == 0) {
  1972. ctx->haveEMS = 0;
  1973. ctx->haveMcast = 1;
  1974. ctx->mcastID = (byte)id;
  1975. #ifndef WOLFSSL_USER_IO
  1976. ctx->CBIORecv = EmbedReceiveFromMcast;
  1977. #endif /* WOLFSSL_USER_IO */
  1978. ret = WOLFSSL_SUCCESS;
  1979. }
  1980. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id", ret);
  1981. return ret;
  1982. }
  1983. int wolfSSL_mcast_get_max_peers(void)
  1984. {
  1985. return WOLFSSL_MULTICAST_PEERS;
  1986. }
  1987. #ifdef WOLFSSL_DTLS
  1988. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  1989. word32 second, word32 high)
  1990. {
  1991. word32 newCur = 0;
  1992. if (cur < first)
  1993. newCur = first;
  1994. else if (cur < second)
  1995. newCur = second;
  1996. else if (cur < high)
  1997. newCur = high;
  1998. return newCur;
  1999. }
  2000. #endif /* WOLFSSL_DTLS */
  2001. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  2002. const byte* preMasterSecret, word32 preMasterSz,
  2003. const byte* clientRandom, const byte* serverRandom,
  2004. const byte* suite)
  2005. {
  2006. int ret = 0;
  2007. WOLFSSL_ENTER("wolfSSL_set_secret");
  2008. if (ssl == NULL || preMasterSecret == NULL ||
  2009. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  2010. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  2011. ret = BAD_FUNC_ARG;
  2012. }
  2013. if (ret == 0 && ssl->arrays->preMasterSecret == NULL) {
  2014. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  2015. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  2016. DYNAMIC_TYPE_SECRET);
  2017. if (ssl->arrays->preMasterSecret == NULL) {
  2018. ret = MEMORY_E;
  2019. }
  2020. }
  2021. if (ret == 0) {
  2022. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  2023. XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz);
  2024. ssl->arrays->preMasterSz = preMasterSz;
  2025. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  2026. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  2027. ssl->options.cipherSuite0 = suite[0];
  2028. ssl->options.cipherSuite = suite[1];
  2029. ret = SetCipherSpecs(ssl);
  2030. }
  2031. if (ret == 0)
  2032. ret = MakeTlsMasterSecret(ssl);
  2033. if (ret == 0) {
  2034. ssl->keys.encryptionOn = 1;
  2035. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  2036. }
  2037. if (ret == 0) {
  2038. if (ssl->options.dtls) {
  2039. #ifdef WOLFSSL_DTLS
  2040. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  2041. int i;
  2042. ssl->keys.dtls_epoch = epoch;
  2043. for (i = 0, peerSeq = ssl->keys.peerSeq;
  2044. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  2045. i++, peerSeq++) {
  2046. peerSeq->nextEpoch = epoch;
  2047. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  2048. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  2049. peerSeq->nextSeq_lo = 0;
  2050. peerSeq->nextSeq_hi = 0;
  2051. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  2052. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  2053. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  2054. ssl->ctx->mcastFirstSeq,
  2055. ssl->ctx->mcastSecondSeq,
  2056. ssl->ctx->mcastMaxSeq);
  2057. }
  2058. #else
  2059. (void)epoch;
  2060. #endif
  2061. }
  2062. FreeHandshakeResources(ssl);
  2063. ret = WOLFSSL_SUCCESS;
  2064. }
  2065. else {
  2066. if (ssl)
  2067. ssl->error = ret;
  2068. ret = WOLFSSL_FATAL_ERROR;
  2069. }
  2070. WOLFSSL_LEAVE("wolfSSL_set_secret", ret);
  2071. return ret;
  2072. }
  2073. #ifdef WOLFSSL_DTLS
  2074. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int sub)
  2075. {
  2076. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  2077. int ret = WOLFSSL_SUCCESS;
  2078. int i;
  2079. WOLFSSL_ENTER("wolfSSL_mcast_peer_add");
  2080. if (ssl == NULL || peerId > 255)
  2081. return BAD_FUNC_ARG;
  2082. if (!sub) {
  2083. /* Make sure it isn't already present, while keeping the first
  2084. * open spot. */
  2085. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2086. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  2087. p = &ssl->keys.peerSeq[i];
  2088. if (ssl->keys.peerSeq[i].peerId == peerId) {
  2089. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  2090. p = NULL;
  2091. }
  2092. }
  2093. if (p != NULL) {
  2094. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  2095. p->peerId = peerId;
  2096. p->highwaterMark = UpdateHighwaterMark(0,
  2097. ssl->ctx->mcastFirstSeq,
  2098. ssl->ctx->mcastSecondSeq,
  2099. ssl->ctx->mcastMaxSeq);
  2100. }
  2101. else {
  2102. WOLFSSL_MSG("No room in peer list.");
  2103. ret = -1;
  2104. }
  2105. }
  2106. else {
  2107. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2108. if (ssl->keys.peerSeq[i].peerId == peerId)
  2109. p = &ssl->keys.peerSeq[i];
  2110. }
  2111. if (p != NULL) {
  2112. p->peerId = INVALID_PEER_ID;
  2113. }
  2114. else {
  2115. WOLFSSL_MSG("Peer not found in list.");
  2116. }
  2117. }
  2118. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add", ret);
  2119. return ret;
  2120. }
  2121. /* If peerId is in the list of peers and its last sequence number is non-zero,
  2122. * return 1, otherwise return 0. */
  2123. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  2124. {
  2125. int known = 0;
  2126. int i;
  2127. WOLFSSL_ENTER("wolfSSL_mcast_peer_known");
  2128. if (ssl == NULL || peerId > 255) {
  2129. return BAD_FUNC_ARG;
  2130. }
  2131. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  2132. if (ssl->keys.peerSeq[i].peerId == peerId) {
  2133. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  2134. ssl->keys.peerSeq[i].nextSeq_lo) {
  2135. known = 1;
  2136. }
  2137. break;
  2138. }
  2139. }
  2140. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known", known);
  2141. return known;
  2142. }
  2143. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  2144. word32 first, word32 second,
  2145. CallbackMcastHighwater cb)
  2146. {
  2147. if (ctx == NULL || (second && first > second) ||
  2148. first > maxSeq || second > maxSeq || cb == NULL) {
  2149. return BAD_FUNC_ARG;
  2150. }
  2151. ctx->mcastHwCb = cb;
  2152. ctx->mcastFirstSeq = first;
  2153. ctx->mcastSecondSeq = second;
  2154. ctx->mcastMaxSeq = maxSeq;
  2155. return WOLFSSL_SUCCESS;
  2156. }
  2157. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  2158. {
  2159. if (ssl == NULL || ctx == NULL)
  2160. return BAD_FUNC_ARG;
  2161. ssl->mcastHwCbCtx = ctx;
  2162. return WOLFSSL_SUCCESS;
  2163. }
  2164. #endif /* WOLFSSL_DTLS */
  2165. #endif /* WOLFSSL_MULTICAST */
  2166. #endif /* WOLFSSL_LEANPSK */
  2167. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  2168. int wolfSSL_negotiate(WOLFSSL* ssl)
  2169. {
  2170. int err = WOLFSSL_FATAL_ERROR;
  2171. WOLFSSL_ENTER("wolfSSL_negotiate");
  2172. if (ssl == NULL)
  2173. return WOLFSSL_FATAL_ERROR;
  2174. #ifndef NO_WOLFSSL_SERVER
  2175. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2176. #ifdef WOLFSSL_TLS13
  2177. if (IsAtLeastTLSv1_3(ssl->version))
  2178. err = wolfSSL_accept_TLSv13(ssl);
  2179. else
  2180. #endif
  2181. err = wolfSSL_accept(ssl);
  2182. }
  2183. #endif
  2184. #ifndef NO_WOLFSSL_CLIENT
  2185. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  2186. #ifdef WOLFSSL_TLS13
  2187. if (IsAtLeastTLSv1_3(ssl->version))
  2188. err = wolfSSL_connect_TLSv13(ssl);
  2189. else
  2190. #endif
  2191. err = wolfSSL_connect(ssl);
  2192. }
  2193. #endif
  2194. (void)ssl;
  2195. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  2196. return err;
  2197. }
  2198. WOLFSSL_ABI
  2199. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  2200. {
  2201. if (ssl) {
  2202. return ssl->rng;
  2203. }
  2204. return NULL;
  2205. }
  2206. #ifndef WOLFSSL_LEANPSK
  2207. /* object size based on build */
  2208. int wolfSSL_GetObjectSize(void)
  2209. {
  2210. #ifdef SHOW_SIZES
  2211. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  2212. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  2213. #ifndef NO_RC4
  2214. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  2215. #endif
  2216. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  2217. #ifndef NO_DES3
  2218. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  2219. #endif
  2220. #ifdef HAVE_CHACHA
  2221. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  2222. #endif
  2223. #ifdef WOLFSSL_SM4
  2224. printf("\tsizeof sm4 = %lu\n", (unsigned long)sizeof(Sm4));
  2225. #endif
  2226. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  2227. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  2228. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  2229. #ifndef NO_MD5
  2230. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  2231. #endif
  2232. #ifndef NO_SHA
  2233. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  2234. #endif
  2235. #ifdef WOLFSSL_SHA224
  2236. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  2237. #endif
  2238. #ifndef NO_SHA256
  2239. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  2240. #endif
  2241. #ifdef WOLFSSL_SHA384
  2242. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  2243. #endif
  2244. #ifdef WOLFSSL_SHA384
  2245. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  2246. #endif
  2247. #ifdef WOLFSSL_SM3
  2248. printf("\tsizeof sm3 = %lu\n", (unsigned long)sizeof(Sm3));
  2249. #endif
  2250. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  2251. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  2252. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  2253. #ifndef NO_RSA
  2254. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  2255. #endif
  2256. #ifdef HAVE_ECC
  2257. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  2258. #endif
  2259. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  2260. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  2261. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  2262. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  2263. #endif
  2264. return sizeof(WOLFSSL);
  2265. }
  2266. int wolfSSL_CTX_GetObjectSize(void)
  2267. {
  2268. return sizeof(WOLFSSL_CTX);
  2269. }
  2270. int wolfSSL_METHOD_GetObjectSize(void)
  2271. {
  2272. return sizeof(WOLFSSL_METHOD);
  2273. }
  2274. #endif
  2275. #ifdef WOLFSSL_STATIC_MEMORY
  2276. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  2277. unsigned char* buf, unsigned int sz,
  2278. int flag, int maxSz)
  2279. {
  2280. WOLFSSL_HEAP* heap;
  2281. WOLFSSL_HEAP_HINT* hint;
  2282. word32 idx = 0;
  2283. if (ctx == NULL || buf == NULL) {
  2284. return BAD_FUNC_ARG;
  2285. }
  2286. if (*ctx == NULL && method == NULL) {
  2287. return BAD_FUNC_ARG;
  2288. }
  2289. if (*ctx == NULL || (*ctx)->heap == NULL) {
  2290. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  2291. return BUFFER_E; /* not enough memory for structures */
  2292. }
  2293. heap = (WOLFSSL_HEAP*)buf;
  2294. idx += sizeof(WOLFSSL_HEAP);
  2295. if (wolfSSL_init_memory_heap(heap) != 0) {
  2296. return WOLFSSL_FAILURE;
  2297. }
  2298. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  2299. idx += sizeof(WOLFSSL_HEAP_HINT);
  2300. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  2301. hint->memory = heap;
  2302. if (*ctx && (*ctx)->heap == NULL) {
  2303. (*ctx)->heap = (void*)hint;
  2304. }
  2305. }
  2306. else {
  2307. #ifdef WOLFSSL_HEAP_TEST
  2308. /* do not load in memory if test has been set */
  2309. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  2310. return WOLFSSL_SUCCESS;
  2311. }
  2312. #endif
  2313. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  2314. heap = hint->memory;
  2315. }
  2316. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  2317. WOLFSSL_MSG("Error partitioning memory");
  2318. return WOLFSSL_FAILURE;
  2319. }
  2320. /* create ctx if needed */
  2321. if (*ctx == NULL) {
  2322. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  2323. if (*ctx == NULL) {
  2324. WOLFSSL_MSG("Error creating ctx");
  2325. return WOLFSSL_FAILURE;
  2326. }
  2327. }
  2328. /* determine what max applies too */
  2329. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  2330. heap->maxIO = maxSz;
  2331. }
  2332. else { /* general memory used in handshakes */
  2333. heap->maxHa = maxSz;
  2334. }
  2335. heap->flag |= flag;
  2336. (void)maxSz;
  2337. (void)method;
  2338. return WOLFSSL_SUCCESS;
  2339. }
  2340. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  2341. {
  2342. if (ssl == NULL) {
  2343. return BAD_FUNC_ARG;
  2344. }
  2345. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  2346. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  2347. if (mem_stats != NULL && ssl->heap != NULL) {
  2348. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  2349. WOLFSSL_HEAP* heap = hint->memory;
  2350. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  2351. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  2352. }
  2353. }
  2354. return (ssl->heap) ? 1 : 0;
  2355. }
  2356. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  2357. {
  2358. if (ctx == NULL) {
  2359. return BAD_FUNC_ARG;
  2360. }
  2361. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  2362. /* fill out statistics if wanted */
  2363. if (mem_stats != NULL && ctx->heap != NULL) {
  2364. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  2365. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  2366. return MEMORY_E;
  2367. }
  2368. }
  2369. return (ctx->heap) ? 1 : 0;
  2370. }
  2371. #endif /* WOLFSSL_STATIC_MEMORY */
  2372. /* return max record layer size plaintext input size */
  2373. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  2374. {
  2375. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  2376. if (ssl == NULL)
  2377. return BAD_FUNC_ARG;
  2378. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2379. WOLFSSL_MSG("Handshake not complete yet");
  2380. return BAD_FUNC_ARG;
  2381. }
  2382. return wolfSSL_GetMaxFragSize(ssl, OUTPUT_RECORD_SIZE);
  2383. }
  2384. /* return record layer size of plaintext input size */
  2385. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  2386. {
  2387. int maxSize;
  2388. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  2389. if (inSz < 0)
  2390. return BAD_FUNC_ARG;
  2391. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  2392. if (maxSize < 0)
  2393. return maxSize; /* error */
  2394. if (inSz > maxSize)
  2395. return INPUT_SIZE_E;
  2396. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  2397. }
  2398. #ifdef HAVE_ECC
  2399. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  2400. {
  2401. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  2402. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  2403. return BAD_FUNC_ARG;
  2404. }
  2405. ctx->minEccKeySz = keySz / 8;
  2406. #ifndef NO_CERTS
  2407. ctx->cm->minEccKeySz = keySz / 8;
  2408. #endif
  2409. return WOLFSSL_SUCCESS;
  2410. }
  2411. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  2412. {
  2413. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  2414. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  2415. return BAD_FUNC_ARG;
  2416. }
  2417. ssl->options.minEccKeySz = keySz / 8;
  2418. return WOLFSSL_SUCCESS;
  2419. }
  2420. #endif /* HAVE_ECC */
  2421. #ifndef NO_RSA
  2422. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  2423. {
  2424. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  2425. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  2426. return BAD_FUNC_ARG;
  2427. }
  2428. ctx->minRsaKeySz = keySz / 8;
  2429. ctx->cm->minRsaKeySz = keySz / 8;
  2430. return WOLFSSL_SUCCESS;
  2431. }
  2432. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  2433. {
  2434. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  2435. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  2436. return BAD_FUNC_ARG;
  2437. }
  2438. ssl->options.minRsaKeySz = keySz / 8;
  2439. return WOLFSSL_SUCCESS;
  2440. }
  2441. #endif /* !NO_RSA */
  2442. #ifndef NO_DH
  2443. #ifdef OPENSSL_EXTRA
  2444. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  2445. {
  2446. int pSz, gSz;
  2447. byte *p, *g;
  2448. int ret = 0;
  2449. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  2450. if (!ssl || !dh)
  2451. return BAD_FUNC_ARG;
  2452. /* Get needed size for p and g */
  2453. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  2454. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  2455. if (pSz <= 0 || gSz <= 0)
  2456. return -1;
  2457. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2458. if (!p)
  2459. return MEMORY_E;
  2460. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2461. if (!g) {
  2462. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2463. return MEMORY_E;
  2464. }
  2465. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  2466. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  2467. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  2468. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  2469. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2470. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2471. return pSz > 0 && gSz > 0 ? ret : -1;
  2472. }
  2473. #endif /* OPENSSL_EXTRA */
  2474. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  2475. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  2476. const unsigned char* g, int gSz)
  2477. {
  2478. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  2479. if (ssl == NULL || p == NULL || g == NULL)
  2480. return BAD_FUNC_ARG;
  2481. if ((word16)pSz < ssl->options.minDhKeySz)
  2482. return DH_KEY_SIZE_E;
  2483. if ((word16)pSz > ssl->options.maxDhKeySz)
  2484. return DH_KEY_SIZE_E;
  2485. /* this function is for server only */
  2486. if (ssl->options.side == WOLFSSL_CLIENT_END)
  2487. return SIDE_ERROR;
  2488. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2489. !defined(HAVE_SELFTEST)
  2490. ssl->options.dhKeyTested = 0;
  2491. ssl->options.dhDoKeyTest = 1;
  2492. #endif
  2493. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  2494. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2495. ssl->buffers.serverDH_P.buffer = NULL;
  2496. }
  2497. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  2498. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2499. ssl->buffers.serverDH_G.buffer = NULL;
  2500. }
  2501. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  2502. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  2503. DYNAMIC_TYPE_PUBLIC_KEY);
  2504. if (ssl->buffers.serverDH_P.buffer == NULL)
  2505. return MEMORY_E;
  2506. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  2507. DYNAMIC_TYPE_PUBLIC_KEY);
  2508. if (ssl->buffers.serverDH_G.buffer == NULL) {
  2509. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2510. ssl->buffers.serverDH_P.buffer = NULL;
  2511. return MEMORY_E;
  2512. }
  2513. ssl->buffers.serverDH_P.length = pSz;
  2514. ssl->buffers.serverDH_G.length = gSz;
  2515. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  2516. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  2517. ssl->options.haveDH = 1;
  2518. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  2519. word16 havePSK;
  2520. word16 haveRSA;
  2521. int keySz = 0;
  2522. int ret;
  2523. #ifndef NO_PSK
  2524. havePSK = ssl->options.havePSK;
  2525. #else
  2526. havePSK = 0;
  2527. #endif
  2528. #ifdef NO_RSA
  2529. haveRSA = 0;
  2530. #else
  2531. haveRSA = 1;
  2532. #endif
  2533. #ifndef NO_CERTS
  2534. keySz = ssl->buffers.keySz;
  2535. #endif
  2536. ret = AllocateSuites(ssl);
  2537. if (ret != 0)
  2538. return ret;
  2539. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  2540. ssl->options.haveDH, ssl->options.haveECDSAsig,
  2541. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  2542. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  2543. ssl->options.haveAnon, TRUE, ssl->options.side);
  2544. }
  2545. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  2546. return WOLFSSL_SUCCESS;
  2547. }
  2548. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2549. !defined(HAVE_SELFTEST)
  2550. /* Enables or disables the session's DH key prime test. */
  2551. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  2552. {
  2553. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  2554. if (ssl == NULL)
  2555. return BAD_FUNC_ARG;
  2556. if (!enable)
  2557. ssl->options.dhDoKeyTest = 0;
  2558. else
  2559. ssl->options.dhDoKeyTest = 1;
  2560. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  2561. return WOLFSSL_SUCCESS;
  2562. }
  2563. #endif
  2564. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  2565. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  2566. const unsigned char* g, int gSz)
  2567. {
  2568. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  2569. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  2570. if ((word16)pSz < ctx->minDhKeySz)
  2571. return DH_KEY_SIZE_E;
  2572. if ((word16)pSz > ctx->maxDhKeySz)
  2573. return DH_KEY_SIZE_E;
  2574. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  2575. !defined(HAVE_SELFTEST)
  2576. {
  2577. WC_RNG rng;
  2578. int error, freeKey = 0;
  2579. #ifdef WOLFSSL_SMALL_STACK
  2580. DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  2581. if (checkKey == NULL)
  2582. return MEMORY_E;
  2583. #else
  2584. DhKey checkKey[1];
  2585. #endif
  2586. error = wc_InitRng(&rng);
  2587. if (!error)
  2588. error = wc_InitDhKey(checkKey);
  2589. if (!error) {
  2590. freeKey = 1;
  2591. error = wc_DhSetCheckKey(checkKey,
  2592. p, pSz, g, gSz, NULL, 0, 0, &rng);
  2593. }
  2594. if (freeKey)
  2595. wc_FreeDhKey(checkKey);
  2596. #ifdef WOLFSSL_SMALL_STACK
  2597. XFREE(checkKey, NULL, DYNAMIC_TYPE_DH);
  2598. #endif
  2599. wc_FreeRng(&rng);
  2600. if (error)
  2601. return error;
  2602. ctx->dhKeyTested = 1;
  2603. }
  2604. #endif
  2605. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2606. ctx->serverDH_P.buffer = NULL;
  2607. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2608. ctx->serverDH_G.buffer = NULL;
  2609. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2610. if (ctx->serverDH_P.buffer == NULL)
  2611. return MEMORY_E;
  2612. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2613. if (ctx->serverDH_G.buffer == NULL) {
  2614. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2615. ctx->serverDH_P.buffer = NULL;
  2616. return MEMORY_E;
  2617. }
  2618. ctx->serverDH_P.length = pSz;
  2619. ctx->serverDH_G.length = gSz;
  2620. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  2621. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  2622. ctx->haveDH = 1;
  2623. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  2624. return WOLFSSL_SUCCESS;
  2625. }
  2626. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  2627. {
  2628. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2629. return BAD_FUNC_ARG;
  2630. ctx->minDhKeySz = keySz_bits / 8;
  2631. return WOLFSSL_SUCCESS;
  2632. }
  2633. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  2634. {
  2635. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2636. return BAD_FUNC_ARG;
  2637. ssl->options.minDhKeySz = keySz_bits / 8;
  2638. return WOLFSSL_SUCCESS;
  2639. }
  2640. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  2641. {
  2642. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2643. return BAD_FUNC_ARG;
  2644. ctx->maxDhKeySz = keySz_bits / 8;
  2645. return WOLFSSL_SUCCESS;
  2646. }
  2647. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  2648. {
  2649. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  2650. return BAD_FUNC_ARG;
  2651. ssl->options.maxDhKeySz = keySz_bits / 8;
  2652. return WOLFSSL_SUCCESS;
  2653. }
  2654. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  2655. {
  2656. if (ssl == NULL)
  2657. return BAD_FUNC_ARG;
  2658. return (ssl->options.dhKeySz * 8);
  2659. }
  2660. #endif /* !NO_DH */
  2661. WOLFSSL_ABI
  2662. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  2663. {
  2664. int ret;
  2665. WOLFSSL_ENTER("wolfSSL_write");
  2666. if (ssl == NULL || data == NULL || sz < 0)
  2667. return BAD_FUNC_ARG;
  2668. #ifdef WOLFSSL_QUIC
  2669. if (WOLFSSL_IS_QUIC(ssl)) {
  2670. WOLFSSL_MSG("SSL_write() on QUIC not allowed");
  2671. return BAD_FUNC_ARG;
  2672. }
  2673. #endif
  2674. #ifdef WOLFSSL_EARLY_DATA
  2675. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  2676. ssl->error = ret;
  2677. return WOLFSSL_FATAL_ERROR;
  2678. }
  2679. ssl->earlyData = no_early_data;
  2680. #endif
  2681. #ifdef HAVE_WRITE_DUP
  2682. { /* local variable scope */
  2683. int dupErr = 0; /* local copy */
  2684. ret = 0;
  2685. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  2686. WOLFSSL_MSG("Read dup side cannot write");
  2687. return WRITE_DUP_WRITE_E;
  2688. }
  2689. if (ssl->dupWrite) {
  2690. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  2691. return BAD_MUTEX_E;
  2692. }
  2693. dupErr = ssl->dupWrite->dupErr;
  2694. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  2695. }
  2696. if (ret != 0) {
  2697. ssl->error = ret; /* high priority fatal error */
  2698. return WOLFSSL_FATAL_ERROR;
  2699. }
  2700. if (dupErr != 0) {
  2701. WOLFSSL_MSG("Write dup error from other side");
  2702. ssl->error = dupErr;
  2703. return WOLFSSL_FATAL_ERROR;
  2704. }
  2705. }
  2706. #endif
  2707. #ifdef HAVE_ERRNO_H
  2708. errno = 0;
  2709. #endif
  2710. #ifdef OPENSSL_EXTRA
  2711. if (ssl->CBIS != NULL) {
  2712. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  2713. ssl->cbmode = SSL_CB_WRITE;
  2714. }
  2715. #endif
  2716. ret = SendData(ssl, data, sz);
  2717. WOLFSSL_LEAVE("wolfSSL_write", ret);
  2718. if (ret < 0)
  2719. return WOLFSSL_FATAL_ERROR;
  2720. else
  2721. return ret;
  2722. }
  2723. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  2724. {
  2725. int ret;
  2726. WOLFSSL_ENTER("wolfSSL_read_internal");
  2727. if (ssl == NULL || data == NULL || sz < 0)
  2728. return BAD_FUNC_ARG;
  2729. #ifdef WOLFSSL_QUIC
  2730. if (WOLFSSL_IS_QUIC(ssl)) {
  2731. WOLFSSL_MSG("SSL_read() on QUIC not allowed");
  2732. return BAD_FUNC_ARG;
  2733. }
  2734. #endif
  2735. #if defined(WOLFSSL_ERROR_CODE_OPENSSL) && defined(OPENSSL_EXTRA)
  2736. /* This additional logic is meant to simulate following openSSL behavior:
  2737. * After bidirectional SSL_shutdown complete, SSL_read returns 0 and
  2738. * SSL_get_error_code returns SSL_ERROR_ZERO_RETURN.
  2739. * This behavior is used to know the disconnect of the underlying
  2740. * transport layer.
  2741. *
  2742. * In this logic, CBIORecv is called with a read size of 0 to check the
  2743. * transport layer status. It also returns WOLFSSL_FAILURE so that
  2744. * SSL_read does not return a positive number on failure.
  2745. */
  2746. /* make sure bidirectional TLS shutdown completes */
  2747. if (ssl->error == WOLFSSL_ERROR_SYSCALL || ssl->options.shutdownDone) {
  2748. /* ask the underlying transport the connection is closed */
  2749. if (ssl->CBIORecv(ssl, (char*)data, 0, ssl->IOCB_ReadCtx) ==
  2750. WOLFSSL_CBIO_ERR_CONN_CLOSE) {
  2751. ssl->options.isClosed = 1;
  2752. ssl->error = WOLFSSL_ERROR_ZERO_RETURN;
  2753. }
  2754. return WOLFSSL_FAILURE;
  2755. }
  2756. #endif
  2757. #ifdef HAVE_WRITE_DUP
  2758. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  2759. WOLFSSL_MSG("Write dup side cannot read");
  2760. return WRITE_DUP_READ_E;
  2761. }
  2762. #endif
  2763. #ifdef HAVE_ERRNO_H
  2764. errno = 0;
  2765. #endif
  2766. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  2767. #ifdef HAVE_WRITE_DUP
  2768. if (ssl->dupWrite) {
  2769. if (ssl->error != 0 && ssl->error != WANT_READ
  2770. #ifdef WOLFSSL_ASYNC_CRYPT
  2771. && ssl->error != WC_PENDING_E
  2772. #endif
  2773. ) {
  2774. int notifyErr;
  2775. WOLFSSL_MSG("Notifying write side of fatal read error");
  2776. notifyErr = NotifyWriteSide(ssl, ssl->error);
  2777. if (notifyErr < 0) {
  2778. ret = ssl->error = notifyErr;
  2779. }
  2780. }
  2781. }
  2782. #endif
  2783. WOLFSSL_LEAVE("wolfSSL_read_internal", ret);
  2784. if (ret < 0)
  2785. return WOLFSSL_FATAL_ERROR;
  2786. else
  2787. return ret;
  2788. }
  2789. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  2790. {
  2791. WOLFSSL_ENTER("wolfSSL_peek");
  2792. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  2793. }
  2794. WOLFSSL_ABI
  2795. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  2796. {
  2797. WOLFSSL_ENTER("wolfSSL_read");
  2798. #ifdef OPENSSL_EXTRA
  2799. if (ssl == NULL) {
  2800. return BAD_FUNC_ARG;
  2801. }
  2802. if (ssl->CBIS != NULL) {
  2803. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  2804. ssl->cbmode = SSL_CB_READ;
  2805. }
  2806. #endif
  2807. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  2808. }
  2809. #ifdef WOLFSSL_MULTICAST
  2810. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  2811. {
  2812. int ret = 0;
  2813. WOLFSSL_ENTER("wolfSSL_mcast_read");
  2814. if (ssl == NULL)
  2815. return BAD_FUNC_ARG;
  2816. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  2817. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  2818. *id = ssl->keys.curPeerId;
  2819. return ret;
  2820. }
  2821. #endif /* WOLFSSL_MULTICAST */
  2822. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  2823. WOLFSSL_ABI
  2824. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  2825. {
  2826. if (ssl == NULL)
  2827. return BAD_FUNC_ARG;
  2828. ssl->devId = devId;
  2829. return WOLFSSL_SUCCESS;
  2830. }
  2831. WOLFSSL_ABI
  2832. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  2833. {
  2834. if (ctx == NULL)
  2835. return BAD_FUNC_ARG;
  2836. ctx->devId = devId;
  2837. return WOLFSSL_SUCCESS;
  2838. }
  2839. /* helpers to get device id and heap */
  2840. WOLFSSL_ABI
  2841. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2842. {
  2843. int devId = INVALID_DEVID;
  2844. if (ssl != NULL)
  2845. devId = ssl->devId;
  2846. if (ctx != NULL && devId == INVALID_DEVID)
  2847. devId = ctx->devId;
  2848. return devId;
  2849. }
  2850. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2851. {
  2852. void* heap = NULL;
  2853. if (ctx != NULL)
  2854. heap = ctx->heap;
  2855. else if (ssl != NULL)
  2856. heap = ssl->heap;
  2857. return heap;
  2858. }
  2859. #ifdef HAVE_SNI
  2860. WOLFSSL_ABI
  2861. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  2862. {
  2863. if (ssl == NULL)
  2864. return BAD_FUNC_ARG;
  2865. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  2866. }
  2867. WOLFSSL_ABI
  2868. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  2869. word16 size)
  2870. {
  2871. if (ctx == NULL)
  2872. return BAD_FUNC_ARG;
  2873. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  2874. }
  2875. #ifndef NO_WOLFSSL_SERVER
  2876. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  2877. {
  2878. if (ssl && ssl->extensions)
  2879. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  2880. }
  2881. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  2882. {
  2883. if (ctx && ctx->extensions)
  2884. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  2885. }
  2886. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  2887. {
  2888. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  2889. }
  2890. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  2891. {
  2892. if (data)
  2893. *data = NULL;
  2894. if (ssl && ssl->extensions)
  2895. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  2896. return 0;
  2897. }
  2898. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  2899. byte type, byte* sni, word32* inOutSz)
  2900. {
  2901. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  2902. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  2903. return BAD_FUNC_ARG;
  2904. }
  2905. #endif /* NO_WOLFSSL_SERVER */
  2906. #endif /* HAVE_SNI */
  2907. #ifdef HAVE_TRUSTED_CA
  2908. int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  2909. const byte* certId, word32 certIdSz)
  2910. {
  2911. if (ssl == NULL)
  2912. return BAD_FUNC_ARG;
  2913. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  2914. if (certId != NULL || certIdSz != 0)
  2915. return BAD_FUNC_ARG;
  2916. }
  2917. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  2918. if (certId == NULL || certIdSz == 0)
  2919. return BAD_FUNC_ARG;
  2920. }
  2921. #ifndef NO_SHA
  2922. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  2923. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  2924. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  2925. return BAD_FUNC_ARG;
  2926. }
  2927. #endif
  2928. else
  2929. return BAD_FUNC_ARG;
  2930. return TLSX_UseTrustedCA(&ssl->extensions,
  2931. type, certId, certIdSz, ssl->heap);
  2932. }
  2933. #endif /* HAVE_TRUSTED_CA */
  2934. #ifdef HAVE_MAX_FRAGMENT
  2935. #ifndef NO_WOLFSSL_CLIENT
  2936. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  2937. {
  2938. if (ssl == NULL)
  2939. return BAD_FUNC_ARG;
  2940. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  2941. /* The following is a non-standard way to reconfigure the max packet size
  2942. post-handshake for wolfSSL_write/wolfSSL_read */
  2943. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  2944. switch (mfl) {
  2945. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2946. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2947. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2948. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2949. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2950. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2951. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  2952. }
  2953. return WOLFSSL_SUCCESS;
  2954. }
  2955. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  2956. /* This call sets the max fragment TLS extension, which gets sent to server.
  2957. The server_hello response is what sets the `ssl->max_fragment` in
  2958. TLSX_MFL_Parse */
  2959. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  2960. }
  2961. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  2962. {
  2963. if (ctx == NULL)
  2964. return BAD_FUNC_ARG;
  2965. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  2966. }
  2967. #endif /* NO_WOLFSSL_CLIENT */
  2968. #endif /* HAVE_MAX_FRAGMENT */
  2969. #ifdef HAVE_TRUNCATED_HMAC
  2970. #ifndef NO_WOLFSSL_CLIENT
  2971. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  2972. {
  2973. if (ssl == NULL)
  2974. return BAD_FUNC_ARG;
  2975. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  2976. }
  2977. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  2978. {
  2979. if (ctx == NULL)
  2980. return BAD_FUNC_ARG;
  2981. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  2982. }
  2983. #endif /* NO_WOLFSSL_CLIENT */
  2984. #endif /* HAVE_TRUNCATED_HMAC */
  2985. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2986. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  2987. {
  2988. WOLFSSL_ENTER("wolfSSL_UseOCSPStapling");
  2989. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2990. return BAD_FUNC_ARG;
  2991. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  2992. options, NULL, ssl->heap, ssl->devId);
  2993. }
  2994. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  2995. byte options)
  2996. {
  2997. WOLFSSL_ENTER("wolfSSL_CTX_UseOCSPStapling");
  2998. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2999. return BAD_FUNC_ARG;
  3000. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  3001. options, NULL, ctx->heap, ctx->devId);
  3002. }
  3003. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  3004. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  3005. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  3006. {
  3007. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  3008. return BAD_FUNC_ARG;
  3009. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  3010. options, ssl->heap, ssl->devId);
  3011. }
  3012. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  3013. byte options)
  3014. {
  3015. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  3016. return BAD_FUNC_ARG;
  3017. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  3018. options, ctx->heap, ctx->devId);
  3019. }
  3020. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  3021. /* Elliptic Curves */
  3022. #if defined(HAVE_SUPPORTED_CURVES)
  3023. static int isValidCurveGroup(word16 name)
  3024. {
  3025. switch (name) {
  3026. case WOLFSSL_ECC_SECP160K1:
  3027. case WOLFSSL_ECC_SECP160R1:
  3028. case WOLFSSL_ECC_SECP160R2:
  3029. case WOLFSSL_ECC_SECP192K1:
  3030. case WOLFSSL_ECC_SECP192R1:
  3031. case WOLFSSL_ECC_SECP224K1:
  3032. case WOLFSSL_ECC_SECP224R1:
  3033. case WOLFSSL_ECC_SECP256K1:
  3034. case WOLFSSL_ECC_SECP256R1:
  3035. case WOLFSSL_ECC_SECP384R1:
  3036. case WOLFSSL_ECC_SECP521R1:
  3037. case WOLFSSL_ECC_BRAINPOOLP256R1:
  3038. case WOLFSSL_ECC_BRAINPOOLP384R1:
  3039. case WOLFSSL_ECC_BRAINPOOLP512R1:
  3040. case WOLFSSL_ECC_SM2P256V1:
  3041. case WOLFSSL_ECC_X25519:
  3042. case WOLFSSL_ECC_X448:
  3043. case WOLFSSL_FFDHE_2048:
  3044. case WOLFSSL_FFDHE_3072:
  3045. case WOLFSSL_FFDHE_4096:
  3046. case WOLFSSL_FFDHE_6144:
  3047. case WOLFSSL_FFDHE_8192:
  3048. #ifdef HAVE_PQC
  3049. case WOLFSSL_KYBER_LEVEL1:
  3050. case WOLFSSL_KYBER_LEVEL3:
  3051. case WOLFSSL_KYBER_LEVEL5:
  3052. #ifdef HAVE_LIBOQS
  3053. case WOLFSSL_P256_KYBER_LEVEL1:
  3054. case WOLFSSL_P384_KYBER_LEVEL3:
  3055. case WOLFSSL_P521_KYBER_LEVEL5:
  3056. #endif
  3057. #endif
  3058. return 1;
  3059. default:
  3060. return 0;
  3061. }
  3062. }
  3063. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  3064. {
  3065. if (ssl == NULL || !isValidCurveGroup(name))
  3066. return BAD_FUNC_ARG;
  3067. ssl->options.userCurves = 1;
  3068. #if defined(NO_TLS)
  3069. return WOLFSSL_FAILURE;
  3070. #else
  3071. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  3072. #endif /* NO_TLS */
  3073. }
  3074. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  3075. {
  3076. if (ctx == NULL || !isValidCurveGroup(name))
  3077. return BAD_FUNC_ARG;
  3078. ctx->userCurves = 1;
  3079. #if defined(NO_TLS)
  3080. return WOLFSSL_FAILURE;
  3081. #else
  3082. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  3083. #endif /* NO_TLS */
  3084. }
  3085. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  3086. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  3087. int count)
  3088. {
  3089. int i;
  3090. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  3091. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  3092. if (count == 0) {
  3093. WOLFSSL_MSG("Group count is zero");
  3094. return WOLFSSL_FAILURE;
  3095. }
  3096. for (i = 0; i < count; i++) {
  3097. if (isValidCurveGroup((word16)groups[i])) {
  3098. _groups[i] = groups[i];
  3099. }
  3100. #ifdef HAVE_ECC
  3101. else {
  3102. /* groups may be populated with curve NIDs */
  3103. int oid = nid2oid(groups[i], oidCurveType);
  3104. int name = (int)GetCurveByOID(oid);
  3105. if (name == 0) {
  3106. WOLFSSL_MSG("Invalid group name");
  3107. return WOLFSSL_FAILURE;
  3108. }
  3109. _groups[i] = name;
  3110. }
  3111. #else
  3112. else {
  3113. WOLFSSL_MSG("Invalid group name");
  3114. return WOLFSSL_FAILURE;
  3115. }
  3116. #endif
  3117. }
  3118. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  3119. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  3120. }
  3121. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  3122. {
  3123. int i;
  3124. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  3125. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  3126. if (count == 0) {
  3127. WOLFSSL_MSG("Group count is zero");
  3128. return WOLFSSL_FAILURE;
  3129. }
  3130. for (i = 0; i < count; i++) {
  3131. if (isValidCurveGroup((word16)groups[i])) {
  3132. _groups[i] = groups[i];
  3133. }
  3134. #ifdef HAVE_ECC
  3135. else {
  3136. /* groups may be populated with curve NIDs */
  3137. int oid = nid2oid(groups[i], oidCurveType);
  3138. int name = (int)GetCurveByOID(oid);
  3139. if (name == 0) {
  3140. WOLFSSL_MSG("Invalid group name");
  3141. return WOLFSSL_FAILURE;
  3142. }
  3143. _groups[i] = name;
  3144. }
  3145. #else
  3146. else {
  3147. WOLFSSL_MSG("Invalid group name");
  3148. return WOLFSSL_FAILURE;
  3149. }
  3150. #endif
  3151. }
  3152. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  3153. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  3154. }
  3155. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  3156. #endif /* HAVE_SUPPORTED_CURVES */
  3157. /* Application-Layer Protocol Negotiation */
  3158. #ifdef HAVE_ALPN
  3159. WOLFSSL_ABI
  3160. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  3161. word32 protocol_name_listSz, byte options)
  3162. {
  3163. char *list, *ptr, **token;
  3164. word16 len;
  3165. int idx = 0;
  3166. int ret = WOLFSSL_FAILURE;
  3167. WOLFSSL_ENTER("wolfSSL_UseALPN");
  3168. if (ssl == NULL || protocol_name_list == NULL)
  3169. return BAD_FUNC_ARG;
  3170. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  3171. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  3172. WOLFSSL_MAX_ALPN_NUMBER)) {
  3173. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  3174. return BAD_FUNC_ARG;
  3175. }
  3176. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  3177. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  3178. WOLFSSL_MSG("Invalid arguments, options not supported");
  3179. return BAD_FUNC_ARG;
  3180. }
  3181. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  3182. DYNAMIC_TYPE_ALPN);
  3183. if (list == NULL) {
  3184. WOLFSSL_MSG("Memory failure");
  3185. return MEMORY_ERROR;
  3186. }
  3187. token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN);
  3188. if (token == NULL) {
  3189. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  3190. WOLFSSL_MSG("Memory failure");
  3191. return MEMORY_ERROR;
  3192. }
  3193. XMEMSET(token, 0, sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1));
  3194. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  3195. list[protocol_name_listSz] = '\0';
  3196. /* read all protocol name from the list */
  3197. token[idx] = XSTRTOK(list, ",", &ptr);
  3198. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  3199. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  3200. /* add protocol name list in the TLS extension in reverse order */
  3201. while ((idx--) > 0) {
  3202. len = (word16)XSTRLEN(token[idx]);
  3203. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  3204. ssl->heap);
  3205. if (ret != WOLFSSL_SUCCESS) {
  3206. WOLFSSL_MSG("TLSX_UseALPN failure");
  3207. break;
  3208. }
  3209. }
  3210. XFREE(token, ssl->heap, DYNAMIC_TYPE_ALPN);
  3211. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  3212. return ret;
  3213. }
  3214. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  3215. {
  3216. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  3217. (void **)protocol_name, size);
  3218. }
  3219. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  3220. {
  3221. int i, len;
  3222. char *p;
  3223. byte *s;
  3224. if (ssl == NULL || list == NULL || listSz == NULL)
  3225. return BAD_FUNC_ARG;
  3226. if (ssl->alpn_peer_requested == NULL
  3227. || ssl->alpn_peer_requested_length == 0)
  3228. return BUFFER_ERROR;
  3229. /* ssl->alpn_peer_requested are the original bytes sent in a ClientHello,
  3230. * formatted as (len-byte chars+)+. To turn n protocols into a
  3231. * comma-separated C string, one needs (n-1) commas and a final 0 byte
  3232. * which has the same length as the original.
  3233. * The returned length is the strlen() of the C string, so -1 of that. */
  3234. *listSz = ssl->alpn_peer_requested_length-1;
  3235. *list = p = (char *)XMALLOC(ssl->alpn_peer_requested_length, ssl->heap,
  3236. DYNAMIC_TYPE_TLSX);
  3237. if (p == NULL)
  3238. return MEMORY_ERROR;
  3239. for (i = 0, s = ssl->alpn_peer_requested;
  3240. i < ssl->alpn_peer_requested_length;
  3241. p += len, i += len)
  3242. {
  3243. if (i)
  3244. *p++ = ',';
  3245. len = s[i++];
  3246. /* guard against bad length bytes. */
  3247. if (i + len > ssl->alpn_peer_requested_length) {
  3248. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  3249. *list = NULL;
  3250. return WOLFSSL_FAILURE;
  3251. }
  3252. XMEMCPY(p, s + i, len);
  3253. }
  3254. *p = 0;
  3255. return WOLFSSL_SUCCESS;
  3256. }
  3257. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  3258. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  3259. {
  3260. if (ssl == NULL) {
  3261. return BAD_FUNC_ARG;
  3262. }
  3263. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  3264. *list = NULL;
  3265. return WOLFSSL_SUCCESS;
  3266. }
  3267. #endif /* HAVE_ALPN */
  3268. /* Secure Renegotiation */
  3269. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  3270. /* user is forcing ability to use secure renegotiation, we discourage it */
  3271. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  3272. {
  3273. int ret = BAD_FUNC_ARG;
  3274. #if defined(NO_TLS)
  3275. (void)ssl;
  3276. #else
  3277. if (ssl)
  3278. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  3279. if (ret == WOLFSSL_SUCCESS) {
  3280. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  3281. if (extension)
  3282. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  3283. }
  3284. #endif /* !NO_TLS */
  3285. return ret;
  3286. }
  3287. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  3288. {
  3289. if (ctx == NULL)
  3290. return BAD_FUNC_ARG;
  3291. ctx->useSecureReneg = 1;
  3292. return WOLFSSL_SUCCESS;
  3293. }
  3294. #ifdef HAVE_SECURE_RENEGOTIATION
  3295. /* do a secure renegotiation handshake, user forced, we discourage */
  3296. static int _Rehandshake(WOLFSSL* ssl)
  3297. {
  3298. int ret;
  3299. if (ssl == NULL)
  3300. return BAD_FUNC_ARG;
  3301. if (IsAtLeastTLSv1_3(ssl->version)) {
  3302. WOLFSSL_MSG("Secure Renegotiation not supported in TLS 1.3");
  3303. return SECURE_RENEGOTIATION_E;
  3304. }
  3305. if (ssl->secure_renegotiation == NULL) {
  3306. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  3307. return SECURE_RENEGOTIATION_E;
  3308. }
  3309. if (ssl->secure_renegotiation->enabled == 0) {
  3310. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  3311. return SECURE_RENEGOTIATION_E;
  3312. }
  3313. #ifdef WOLFSSL_DTLS
  3314. if (ssl->options.dtls && ssl->keys.dtls_epoch == 0xFFFF) {
  3315. WOLFSSL_MSG("Secure Renegotiation not allowed. Epoch would wrap");
  3316. return SECURE_RENEGOTIATION_E;
  3317. }
  3318. #endif
  3319. /* If the client started the renegotiation, the server will already
  3320. * have processed the client's hello. */
  3321. if (ssl->options.side != WOLFSSL_SERVER_END ||
  3322. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  3323. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  3324. if (!ssl->options.handShakeDone) {
  3325. WOLFSSL_MSG("Can't renegotiate until initial "
  3326. "handshake complete");
  3327. return SECURE_RENEGOTIATION_E;
  3328. }
  3329. else {
  3330. WOLFSSL_MSG("Renegotiation already started. "
  3331. "Moving it forward.");
  3332. ret = wolfSSL_negotiate(ssl);
  3333. if (ret == WOLFSSL_SUCCESS)
  3334. ssl->secure_rene_count++;
  3335. return ret;
  3336. }
  3337. }
  3338. /* reset handshake states */
  3339. ssl->options.sendVerify = 0;
  3340. ssl->options.serverState = NULL_STATE;
  3341. ssl->options.clientState = NULL_STATE;
  3342. ssl->options.connectState = CONNECT_BEGIN;
  3343. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  3344. ssl->options.handShakeState = NULL_STATE;
  3345. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  3346. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  3347. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  3348. #if !defined(NO_WOLFSSL_SERVER)
  3349. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3350. ret = SendHelloRequest(ssl);
  3351. if (ret != 0) {
  3352. ssl->error = ret;
  3353. return WOLFSSL_FATAL_ERROR;
  3354. }
  3355. }
  3356. #endif /* !NO_WOLFSSL_SERVER */
  3357. ret = InitHandshakeHashes(ssl);
  3358. if (ret != 0) {
  3359. ssl->error = ret;
  3360. return WOLFSSL_FATAL_ERROR;
  3361. }
  3362. }
  3363. ret = wolfSSL_negotiate(ssl);
  3364. if (ret == WOLFSSL_SUCCESS)
  3365. ssl->secure_rene_count++;
  3366. return ret;
  3367. }
  3368. /* do a secure renegotiation handshake, user forced, we discourage */
  3369. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  3370. {
  3371. int ret;
  3372. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  3373. if (ssl == NULL)
  3374. return WOLFSSL_FAILURE;
  3375. #ifdef HAVE_SESSION_TICKET
  3376. ret = WOLFSSL_SUCCESS;
  3377. #endif
  3378. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3379. /* Reset option to send certificate verify. */
  3380. ssl->options.sendVerify = 0;
  3381. /* Reset resuming flag to do full secure handshake. */
  3382. ssl->options.resuming = 0;
  3383. }
  3384. else {
  3385. /* Reset resuming flag to do full secure handshake. */
  3386. ssl->options.resuming = 0;
  3387. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_CLIENT)
  3388. /* Clearing the ticket. */
  3389. ret = wolfSSL_UseSessionTicket(ssl);
  3390. #endif
  3391. }
  3392. /* CLIENT/SERVER: Reset peer authentication for full secure handshake. */
  3393. ssl->options.peerAuthGood = 0;
  3394. #ifdef HAVE_SESSION_TICKET
  3395. if (ret == WOLFSSL_SUCCESS)
  3396. #endif
  3397. ret = _Rehandshake(ssl);
  3398. return ret;
  3399. }
  3400. #ifndef NO_WOLFSSL_CLIENT
  3401. /* do a secure resumption handshake, user forced, we discourage */
  3402. int wolfSSL_SecureResume(WOLFSSL* ssl)
  3403. {
  3404. WOLFSSL_ENTER("wolfSSL_SecureResume");
  3405. if (ssl == NULL)
  3406. return BAD_FUNC_ARG;
  3407. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3408. ssl->error = SIDE_ERROR;
  3409. return WOLFSSL_FATAL_ERROR;
  3410. }
  3411. return _Rehandshake(ssl);
  3412. }
  3413. #endif /* NO_WOLFSSL_CLIENT */
  3414. #endif /* HAVE_SECURE_RENEGOTIATION */
  3415. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  3416. {
  3417. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  3418. if (!ssl || !ssl->secure_renegotiation)
  3419. return WOLFSSL_FAILURE;
  3420. return ssl->secure_renegotiation->enabled;
  3421. }
  3422. #endif /* HAVE_SECURE_RENEGOTIATION_INFO */
  3423. #if defined(HAVE_SESSION_TICKET)
  3424. /* Session Ticket */
  3425. #if !defined(NO_WOLFSSL_SERVER)
  3426. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  3427. {
  3428. if (ctx == NULL)
  3429. return BAD_FUNC_ARG;
  3430. ctx->noTicketTls12 = 1;
  3431. return WOLFSSL_SUCCESS;
  3432. }
  3433. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  3434. {
  3435. if (ssl == NULL)
  3436. return BAD_FUNC_ARG;
  3437. ssl->options.noTicketTls12 = 1;
  3438. return WOLFSSL_SUCCESS;
  3439. }
  3440. /* WOLFSSL_SUCCESS on ok */
  3441. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  3442. {
  3443. if (ctx == NULL)
  3444. return BAD_FUNC_ARG;
  3445. ctx->ticketEncCb = cb;
  3446. return WOLFSSL_SUCCESS;
  3447. }
  3448. /* set hint interval, WOLFSSL_SUCCESS on ok */
  3449. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  3450. {
  3451. if (ctx == NULL)
  3452. return BAD_FUNC_ARG;
  3453. ctx->ticketHint = hint;
  3454. return WOLFSSL_SUCCESS;
  3455. }
  3456. /* set user context, WOLFSSL_SUCCESS on ok */
  3457. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  3458. {
  3459. if (ctx == NULL)
  3460. return BAD_FUNC_ARG;
  3461. ctx->ticketEncCtx = userCtx;
  3462. return WOLFSSL_SUCCESS;
  3463. }
  3464. /* get user context - returns userCtx on success, NULL on failure */
  3465. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  3466. {
  3467. if (ctx == NULL)
  3468. return NULL;
  3469. return ctx->ticketEncCtx;
  3470. }
  3471. #ifdef WOLFSSL_TLS13
  3472. /* set the maximum number of tickets to send
  3473. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  3474. */
  3475. int wolfSSL_CTX_set_num_tickets(WOLFSSL_CTX* ctx, size_t mxTickets)
  3476. {
  3477. if (ctx == NULL)
  3478. return WOLFSSL_FAILURE;
  3479. ctx->maxTicketTls13 = (unsigned int)mxTickets;
  3480. return WOLFSSL_SUCCESS;
  3481. }
  3482. /* get the maximum number of tickets to send
  3483. * return number of tickets set to be sent
  3484. */
  3485. size_t wolfSSL_CTX_get_num_tickets(WOLFSSL_CTX* ctx)
  3486. {
  3487. if (ctx == NULL)
  3488. return 0;
  3489. return (size_t)ctx->maxTicketTls13;
  3490. }
  3491. #endif /* WOLFSSL_TLS13 */
  3492. #endif /* !NO_WOLFSSL_SERVER */
  3493. #if !defined(NO_WOLFSSL_CLIENT)
  3494. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  3495. {
  3496. if (ssl == NULL)
  3497. return BAD_FUNC_ARG;
  3498. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  3499. }
  3500. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  3501. {
  3502. if (ctx == NULL)
  3503. return BAD_FUNC_ARG;
  3504. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  3505. }
  3506. int wolfSSL_get_SessionTicket(WOLFSSL* ssl, byte* buf, word32* bufSz)
  3507. {
  3508. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  3509. return BAD_FUNC_ARG;
  3510. if (ssl->session->ticketLen <= *bufSz) {
  3511. XMEMCPY(buf, ssl->session->ticket, ssl->session->ticketLen);
  3512. *bufSz = ssl->session->ticketLen;
  3513. }
  3514. else
  3515. *bufSz = 0;
  3516. return WOLFSSL_SUCCESS;
  3517. }
  3518. int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  3519. word32 bufSz)
  3520. {
  3521. if (ssl == NULL || (buf == NULL && bufSz > 0))
  3522. return BAD_FUNC_ARG;
  3523. if (bufSz > 0) {
  3524. /* Ticket will fit into static ticket */
  3525. if (bufSz <= SESSION_TICKET_LEN) {
  3526. if (ssl->session->ticketLenAlloc > 0) {
  3527. XFREE(ssl->session->ticket, ssl->session->heap,
  3528. DYNAMIC_TYPE_SESSION_TICK);
  3529. ssl->session->ticketLenAlloc = 0;
  3530. ssl->session->ticket = ssl->session->staticTicket;
  3531. }
  3532. }
  3533. else { /* Ticket requires dynamic ticket storage */
  3534. if (ssl->session->ticketLen < bufSz) { /* is dyn buffer big enough */
  3535. if (ssl->session->ticketLenAlloc > 0) {
  3536. XFREE(ssl->session->ticket, ssl->session->heap,
  3537. DYNAMIC_TYPE_SESSION_TICK);
  3538. }
  3539. ssl->session->ticket = (byte*)XMALLOC(bufSz, ssl->session->heap,
  3540. DYNAMIC_TYPE_SESSION_TICK);
  3541. if(ssl->session->ticket == NULL) {
  3542. ssl->session->ticket = ssl->session->staticTicket;
  3543. ssl->session->ticketLenAlloc = 0;
  3544. return MEMORY_ERROR;
  3545. }
  3546. ssl->session->ticketLenAlloc = (word16)bufSz;
  3547. }
  3548. }
  3549. XMEMCPY(ssl->session->ticket, buf, bufSz);
  3550. }
  3551. ssl->session->ticketLen = (word16)bufSz;
  3552. return WOLFSSL_SUCCESS;
  3553. }
  3554. int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  3555. CallbackSessionTicket cb, void* ctx)
  3556. {
  3557. if (ssl == NULL)
  3558. return BAD_FUNC_ARG;
  3559. ssl->session_ticket_cb = cb;
  3560. ssl->session_ticket_ctx = ctx;
  3561. return WOLFSSL_SUCCESS;
  3562. }
  3563. #endif /* !NO_WOLFSSL_CLIENT */
  3564. #endif /* HAVE_SESSION_TICKET */
  3565. #ifdef HAVE_EXTENDED_MASTER
  3566. #ifndef NO_WOLFSSL_CLIENT
  3567. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  3568. {
  3569. if (ctx == NULL)
  3570. return BAD_FUNC_ARG;
  3571. ctx->haveEMS = 0;
  3572. return WOLFSSL_SUCCESS;
  3573. }
  3574. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  3575. {
  3576. if (ssl == NULL)
  3577. return BAD_FUNC_ARG;
  3578. ssl->options.haveEMS = 0;
  3579. return WOLFSSL_SUCCESS;
  3580. }
  3581. #endif
  3582. #endif
  3583. #ifndef WOLFSSL_LEANPSK
  3584. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  3585. {
  3586. int ret;
  3587. int oldFlags;
  3588. WOLFSSL_ENTER("wolfSSL_send");
  3589. if (ssl == NULL || data == NULL || sz < 0)
  3590. return BAD_FUNC_ARG;
  3591. oldFlags = ssl->wflags;
  3592. ssl->wflags = flags;
  3593. ret = wolfSSL_write(ssl, data, sz);
  3594. ssl->wflags = oldFlags;
  3595. WOLFSSL_LEAVE("wolfSSL_send", ret);
  3596. return ret;
  3597. }
  3598. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  3599. {
  3600. int ret;
  3601. int oldFlags;
  3602. WOLFSSL_ENTER("wolfSSL_recv");
  3603. if (ssl == NULL || data == NULL || sz < 0)
  3604. return BAD_FUNC_ARG;
  3605. oldFlags = ssl->rflags;
  3606. ssl->rflags = flags;
  3607. ret = wolfSSL_read(ssl, data, sz);
  3608. ssl->rflags = oldFlags;
  3609. WOLFSSL_LEAVE("wolfSSL_recv", ret);
  3610. return ret;
  3611. }
  3612. #endif
  3613. /* WOLFSSL_SUCCESS on ok */
  3614. WOLFSSL_ABI
  3615. int wolfSSL_shutdown(WOLFSSL* ssl)
  3616. {
  3617. int ret = WOLFSSL_FATAL_ERROR;
  3618. WOLFSSL_ENTER("wolfSSL_shutdown");
  3619. if (ssl == NULL)
  3620. return WOLFSSL_FATAL_ERROR;
  3621. if (ssl->options.quietShutdown) {
  3622. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  3623. ret = WOLFSSL_SUCCESS;
  3624. }
  3625. else {
  3626. /* try to send close notify, not an error if can't */
  3627. if (!ssl->options.isClosed && !ssl->options.connReset &&
  3628. !ssl->options.sentNotify) {
  3629. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  3630. if (ssl->error < 0) {
  3631. WOLFSSL_ERROR(ssl->error);
  3632. return WOLFSSL_FATAL_ERROR;
  3633. }
  3634. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  3635. if (ssl->options.closeNotify) {
  3636. ret = WOLFSSL_SUCCESS;
  3637. ssl->options.shutdownDone = 1;
  3638. }
  3639. else {
  3640. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3641. WOLFSSL_LEAVE("wolfSSL_shutdown", ret);
  3642. return ret;
  3643. }
  3644. }
  3645. #ifdef WOLFSSL_SHUTDOWNONCE
  3646. if (ssl->options.isClosed || ssl->options.connReset) {
  3647. /* Shutdown has already occurred.
  3648. * Caller is free to ignore this error. */
  3649. return SSL_SHUTDOWN_ALREADY_DONE_E;
  3650. }
  3651. #endif
  3652. /* call wolfSSL_shutdown again for bidirectional shutdown */
  3653. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  3654. ret = ProcessReply(ssl);
  3655. if ((ret == ZERO_RETURN) || (ret == SOCKET_ERROR_E)) {
  3656. /* simulate OpenSSL behavior */
  3657. ssl->options.shutdownDone = 1;
  3658. /* Clear error */
  3659. ssl->error = WOLFSSL_ERROR_NONE;
  3660. ret = WOLFSSL_SUCCESS;
  3661. } else if (ret == MEMORY_E) {
  3662. ret = WOLFSSL_FATAL_ERROR;
  3663. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  3664. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3665. } else {
  3666. WOLFSSL_ERROR(ssl->error);
  3667. ret = WOLFSSL_FATAL_ERROR;
  3668. }
  3669. }
  3670. }
  3671. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3672. /* reset WOLFSSL structure state for possible reuse */
  3673. if (ret == WOLFSSL_SUCCESS) {
  3674. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  3675. WOLFSSL_MSG("could not clear WOLFSSL");
  3676. ret = WOLFSSL_FATAL_ERROR;
  3677. }
  3678. }
  3679. #endif
  3680. WOLFSSL_LEAVE("wolfSSL_shutdown", ret);
  3681. return ret;
  3682. }
  3683. /* get current error state value */
  3684. int wolfSSL_state(WOLFSSL* ssl)
  3685. {
  3686. if (ssl == NULL) {
  3687. return BAD_FUNC_ARG;
  3688. }
  3689. return ssl->error;
  3690. }
  3691. WOLFSSL_ABI
  3692. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  3693. {
  3694. WOLFSSL_ENTER("wolfSSL_get_error");
  3695. if (ret > 0)
  3696. return WOLFSSL_ERROR_NONE;
  3697. if (ssl == NULL)
  3698. return BAD_FUNC_ARG;
  3699. WOLFSSL_LEAVE("wolfSSL_get_error", ssl->error);
  3700. /* make sure converted types are handled in SetErrorString() too */
  3701. if (ssl->error == WANT_READ)
  3702. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  3703. else if (ssl->error == WANT_WRITE)
  3704. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  3705. else if (ssl->error == ZERO_RETURN || ssl->options.shutdownDone)
  3706. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  3707. #ifdef OPENSSL_EXTRA
  3708. else if (ssl->error == SOCKET_PEER_CLOSED_E)
  3709. return WOLFSSL_ERROR_SYSCALL; /* convert to OpenSSL type */
  3710. #endif
  3711. #if defined(WOLFSSL_HAPROXY)
  3712. return GetX509Error(ssl->error);
  3713. #else
  3714. return (ssl->error);
  3715. #endif
  3716. }
  3717. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  3718. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  3719. {
  3720. if (ssl && h) {
  3721. *h = ssl->alert_history;
  3722. }
  3723. return WOLFSSL_SUCCESS;
  3724. }
  3725. #ifdef OPENSSL_EXTRA
  3726. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  3727. int wolfSSL_want(WOLFSSL* ssl)
  3728. {
  3729. int rw_state = SSL_NOTHING;
  3730. if (ssl) {
  3731. if (ssl->error == WANT_READ)
  3732. rw_state = SSL_READING;
  3733. else if (ssl->error == WANT_WRITE)
  3734. rw_state = SSL_WRITING;
  3735. }
  3736. return rw_state;
  3737. }
  3738. #endif
  3739. /* return TRUE if current error is want read */
  3740. int wolfSSL_want_read(WOLFSSL* ssl)
  3741. {
  3742. WOLFSSL_ENTER("wolfSSL_want_read");
  3743. if (ssl->error == WANT_READ)
  3744. return 1;
  3745. return 0;
  3746. }
  3747. /* return TRUE if current error is want write */
  3748. int wolfSSL_want_write(WOLFSSL* ssl)
  3749. {
  3750. WOLFSSL_ENTER("wolfSSL_want_write");
  3751. if (ssl->error == WANT_WRITE)
  3752. return 1;
  3753. return 0;
  3754. }
  3755. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  3756. {
  3757. WOLFSSL_ENTER("wolfSSL_ERR_error_string");
  3758. if (data) {
  3759. SetErrorString((int)errNumber, data);
  3760. return data;
  3761. }
  3762. else {
  3763. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  3764. SetErrorString((int)errNumber, tmp);
  3765. return tmp;
  3766. }
  3767. }
  3768. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  3769. {
  3770. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  3771. if (len >= WOLFSSL_MAX_ERROR_SZ)
  3772. wolfSSL_ERR_error_string(e, buf);
  3773. else {
  3774. WOLFSSL_MSG("Error buffer too short, truncating");
  3775. if (len) {
  3776. char tmp[WOLFSSL_MAX_ERROR_SZ];
  3777. wolfSSL_ERR_error_string(e, tmp);
  3778. XMEMCPY(buf, tmp, len-1);
  3779. buf[len-1] = '\0';
  3780. }
  3781. }
  3782. }
  3783. /* don't free temporary arrays at end of handshake */
  3784. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  3785. {
  3786. if (ssl)
  3787. ssl->options.saveArrays = 1;
  3788. }
  3789. /* user doesn't need temporary arrays anymore, Free */
  3790. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  3791. {
  3792. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  3793. ssl->options.saveArrays = 0;
  3794. FreeArrays(ssl, 1);
  3795. }
  3796. }
  3797. /* Set option to indicate that the resources are not to be freed after
  3798. * handshake.
  3799. *
  3800. * ssl The SSL/TLS object.
  3801. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3802. */
  3803. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  3804. {
  3805. if (ssl == NULL)
  3806. return BAD_FUNC_ARG;
  3807. ssl->options.keepResources = 1;
  3808. return 0;
  3809. }
  3810. /* Free the handshake resources after handshake.
  3811. *
  3812. * ssl The SSL/TLS object.
  3813. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3814. */
  3815. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  3816. {
  3817. if (ssl == NULL)
  3818. return BAD_FUNC_ARG;
  3819. FreeHandshakeResources(ssl);
  3820. return 0;
  3821. }
  3822. /* Use the client's order of preference when matching cipher suites.
  3823. *
  3824. * ssl The SSL/TLS context object.
  3825. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3826. */
  3827. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  3828. {
  3829. if (ctx == NULL)
  3830. return BAD_FUNC_ARG;
  3831. ctx->useClientOrder = 1;
  3832. return 0;
  3833. }
  3834. /* Use the client's order of preference when matching cipher suites.
  3835. *
  3836. * ssl The SSL/TLS object.
  3837. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3838. */
  3839. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  3840. {
  3841. if (ssl == NULL)
  3842. return BAD_FUNC_ARG;
  3843. ssl->options.useClientOrder = 1;
  3844. return 0;
  3845. }
  3846. #ifdef WOLFSSL_DTLS
  3847. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  3848. {
  3849. #ifndef WOLFSSL_AEAD_ONLY
  3850. Keys* keys = NULL;
  3851. (void)epochOrder;
  3852. if (ssl == NULL)
  3853. return NULL;
  3854. #ifdef HAVE_SECURE_RENEGOTIATION
  3855. switch (epochOrder) {
  3856. case PEER_ORDER:
  3857. if (IsDtlsMsgSCRKeys(ssl))
  3858. keys = &ssl->secure_renegotiation->tmp_keys;
  3859. else
  3860. keys = &ssl->keys;
  3861. break;
  3862. case PREV_ORDER:
  3863. keys = &ssl->keys;
  3864. break;
  3865. case CUR_ORDER:
  3866. if (DtlsUseSCRKeys(ssl))
  3867. keys = &ssl->secure_renegotiation->tmp_keys;
  3868. else
  3869. keys = &ssl->keys;
  3870. break;
  3871. default:
  3872. WOLFSSL_MSG("Unknown epoch order");
  3873. return NULL;
  3874. }
  3875. #else
  3876. keys = &ssl->keys;
  3877. #endif
  3878. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3879. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3880. return keys->client_write_MAC_secret;
  3881. else
  3882. return keys->server_write_MAC_secret;
  3883. #else
  3884. (void)ssl;
  3885. (void)verify;
  3886. (void)epochOrder;
  3887. return NULL;
  3888. #endif
  3889. }
  3890. #endif /* WOLFSSL_DTLS */
  3891. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  3892. {
  3893. #ifndef WOLFSSL_AEAD_ONLY
  3894. if (ssl == NULL)
  3895. return NULL;
  3896. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3897. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3898. return ssl->keys.client_write_MAC_secret;
  3899. else
  3900. return ssl->keys.server_write_MAC_secret;
  3901. #else
  3902. (void)ssl;
  3903. (void)verify;
  3904. return NULL;
  3905. #endif
  3906. }
  3907. int wolfSSL_GetSide(WOLFSSL* ssl)
  3908. {
  3909. if (ssl)
  3910. return ssl->options.side;
  3911. return BAD_FUNC_ARG;
  3912. }
  3913. #ifdef ATOMIC_USER
  3914. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  3915. {
  3916. if (ctx)
  3917. ctx->MacEncryptCb = cb;
  3918. }
  3919. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  3920. {
  3921. if (ssl)
  3922. ssl->MacEncryptCtx = ctx;
  3923. }
  3924. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  3925. {
  3926. if (ssl)
  3927. return ssl->MacEncryptCtx;
  3928. return NULL;
  3929. }
  3930. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  3931. {
  3932. if (ctx)
  3933. ctx->DecryptVerifyCb = cb;
  3934. }
  3935. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  3936. {
  3937. if (ssl)
  3938. ssl->DecryptVerifyCtx = ctx;
  3939. }
  3940. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  3941. {
  3942. if (ssl)
  3943. return ssl->DecryptVerifyCtx;
  3944. return NULL;
  3945. }
  3946. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3947. /**
  3948. * Set the callback, against the context, that encrypts then MACs.
  3949. *
  3950. * ctx SSL/TLS context.
  3951. * cb Callback function to use with Encrypt-Then-MAC.
  3952. */
  3953. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  3954. {
  3955. if (ctx)
  3956. ctx->EncryptMacCb = cb;
  3957. }
  3958. /**
  3959. * Set the context to use with callback that encrypts then MACs.
  3960. *
  3961. * ssl SSL/TLS object.
  3962. * ctx Callback function's context.
  3963. */
  3964. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  3965. {
  3966. if (ssl)
  3967. ssl->EncryptMacCtx = ctx;
  3968. }
  3969. /**
  3970. * Get the context being used with callback that encrypts then MACs.
  3971. *
  3972. * ssl SSL/TLS object.
  3973. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3974. */
  3975. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  3976. {
  3977. if (ssl)
  3978. return ssl->EncryptMacCtx;
  3979. return NULL;
  3980. }
  3981. /**
  3982. * Set the callback, against the context, that MAC verifies then decrypts.
  3983. *
  3984. * ctx SSL/TLS context.
  3985. * cb Callback function to use with Encrypt-Then-MAC.
  3986. */
  3987. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  3988. {
  3989. if (ctx)
  3990. ctx->VerifyDecryptCb = cb;
  3991. }
  3992. /**
  3993. * Set the context to use with callback that MAC verifies then decrypts.
  3994. *
  3995. * ssl SSL/TLS object.
  3996. * ctx Callback function's context.
  3997. */
  3998. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  3999. {
  4000. if (ssl)
  4001. ssl->VerifyDecryptCtx = ctx;
  4002. }
  4003. /**
  4004. * Get the context being used with callback that MAC verifies then decrypts.
  4005. *
  4006. * ssl SSL/TLS object.
  4007. * returns callback function's context or NULL if SSL/TLS object is NULL.
  4008. */
  4009. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  4010. {
  4011. if (ssl)
  4012. return ssl->VerifyDecryptCtx;
  4013. return NULL;
  4014. }
  4015. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  4016. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  4017. {
  4018. if (ssl)
  4019. return ssl->keys.client_write_key;
  4020. return NULL;
  4021. }
  4022. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  4023. {
  4024. if (ssl)
  4025. return ssl->keys.client_write_IV;
  4026. return NULL;
  4027. }
  4028. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  4029. {
  4030. if (ssl)
  4031. return ssl->keys.server_write_key;
  4032. return NULL;
  4033. }
  4034. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  4035. {
  4036. if (ssl)
  4037. return ssl->keys.server_write_IV;
  4038. return NULL;
  4039. }
  4040. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  4041. {
  4042. if (ssl)
  4043. return ssl->specs.key_size;
  4044. return BAD_FUNC_ARG;
  4045. }
  4046. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  4047. {
  4048. if (ssl)
  4049. return ssl->specs.iv_size;
  4050. return BAD_FUNC_ARG;
  4051. }
  4052. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  4053. {
  4054. if (ssl)
  4055. return ssl->specs.bulk_cipher_algorithm;
  4056. return BAD_FUNC_ARG;
  4057. }
  4058. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  4059. {
  4060. if (ssl == NULL)
  4061. return BAD_FUNC_ARG;
  4062. #ifndef WOLFSSL_AEAD_ONLY
  4063. if (ssl->specs.cipher_type == block)
  4064. return WOLFSSL_BLOCK_TYPE;
  4065. if (ssl->specs.cipher_type == stream)
  4066. return WOLFSSL_STREAM_TYPE;
  4067. #endif
  4068. if (ssl->specs.cipher_type == aead)
  4069. return WOLFSSL_AEAD_TYPE;
  4070. return -1;
  4071. }
  4072. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  4073. {
  4074. if (ssl == NULL)
  4075. return BAD_FUNC_ARG;
  4076. return ssl->specs.block_size;
  4077. }
  4078. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  4079. {
  4080. if (ssl == NULL)
  4081. return BAD_FUNC_ARG;
  4082. return ssl->specs.aead_mac_size;
  4083. }
  4084. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  4085. {
  4086. if (ssl == NULL)
  4087. return BAD_FUNC_ARG;
  4088. if (ssl->options.tls1_1)
  4089. return 1;
  4090. return 0;
  4091. }
  4092. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  4093. {
  4094. /* AEAD ciphers don't have HMAC keys */
  4095. if (ssl)
  4096. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  4097. return BAD_FUNC_ARG;
  4098. }
  4099. #ifdef WORD64_AVAILABLE
  4100. int wolfSSL_GetPeerSequenceNumber(WOLFSSL* ssl, word64 *seq)
  4101. {
  4102. if ((ssl == NULL) || (seq == NULL))
  4103. return BAD_FUNC_ARG;
  4104. *seq = ((word64)ssl->keys.peer_sequence_number_hi << 32) |
  4105. ssl->keys.peer_sequence_number_lo;
  4106. return !(*seq);
  4107. }
  4108. int wolfSSL_GetSequenceNumber(WOLFSSL* ssl, word64 *seq)
  4109. {
  4110. if ((ssl == NULL) || (seq == NULL))
  4111. return BAD_FUNC_ARG;
  4112. *seq = ((word64)ssl->keys.sequence_number_hi << 32) |
  4113. ssl->keys.sequence_number_lo;
  4114. return !(*seq);
  4115. }
  4116. #endif
  4117. #endif /* ATOMIC_USER */
  4118. #ifndef NO_CERTS
  4119. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  4120. {
  4121. WOLFSSL_CERT_MANAGER* cm = NULL;
  4122. if (ctx)
  4123. cm = ctx->cm;
  4124. return cm;
  4125. }
  4126. #endif /* NO_CERTS */
  4127. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) \
  4128. && defined(XFPRINTF)
  4129. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  4130. {
  4131. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  4132. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  4133. SetErrorString(err, data);
  4134. if (XFPRINTF(fp, "%s", data) < 0)
  4135. WOLFSSL_MSG("fprintf failed in wolfSSL_ERR_print_errors_fp");
  4136. }
  4137. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  4138. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  4139. {
  4140. wc_ERR_print_errors_fp(fp);
  4141. }
  4142. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  4143. void *u), void *u)
  4144. {
  4145. wc_ERR_print_errors_cb(cb, u);
  4146. }
  4147. #endif
  4148. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM && XFPRINTF */
  4149. /*
  4150. * TODO This ssl parameter needs to be changed to const once our ABI checker
  4151. * stops flagging qualifier additions as ABI breaking.
  4152. */
  4153. WOLFSSL_ABI
  4154. int wolfSSL_pending(WOLFSSL* ssl)
  4155. {
  4156. WOLFSSL_ENTER("wolfSSL_pending");
  4157. if (ssl == NULL)
  4158. return WOLFSSL_FAILURE;
  4159. return ssl->buffers.clearOutputBuffer.length;
  4160. }
  4161. int wolfSSL_has_pending(const WOLFSSL* ssl)
  4162. {
  4163. WOLFSSL_ENTER("wolfSSL_has_pending");
  4164. if (ssl == NULL)
  4165. return WOLFSSL_FAILURE;
  4166. return ssl->buffers.clearOutputBuffer.length > 0;
  4167. }
  4168. #ifndef WOLFSSL_LEANPSK
  4169. /* turn on handshake group messages for context */
  4170. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  4171. {
  4172. if (ctx == NULL)
  4173. return BAD_FUNC_ARG;
  4174. ctx->groupMessages = 1;
  4175. return WOLFSSL_SUCCESS;
  4176. }
  4177. #endif
  4178. #ifndef NO_WOLFSSL_CLIENT
  4179. /* connect enough to get peer cert chain */
  4180. int wolfSSL_connect_cert(WOLFSSL* ssl)
  4181. {
  4182. int ret;
  4183. if (ssl == NULL)
  4184. return WOLFSSL_FAILURE;
  4185. ssl->options.certOnly = 1;
  4186. ret = wolfSSL_connect(ssl);
  4187. ssl->options.certOnly = 0;
  4188. return ret;
  4189. }
  4190. #endif
  4191. #ifndef WOLFSSL_LEANPSK
  4192. /* turn on handshake group messages for ssl object */
  4193. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  4194. {
  4195. if (ssl == NULL)
  4196. return BAD_FUNC_ARG;
  4197. ssl->options.groupMessages = 1;
  4198. return WOLFSSL_SUCCESS;
  4199. }
  4200. /* make minVersion the internal equivalent SSL version */
  4201. static int SetMinVersionHelper(byte* minVersion, int version)
  4202. {
  4203. #ifdef NO_TLS
  4204. (void)minVersion;
  4205. #endif
  4206. switch (version) {
  4207. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  4208. case WOLFSSL_SSLV3:
  4209. *minVersion = SSLv3_MINOR;
  4210. break;
  4211. #endif
  4212. #ifndef NO_TLS
  4213. #ifndef NO_OLD_TLS
  4214. #ifdef WOLFSSL_ALLOW_TLSV10
  4215. case WOLFSSL_TLSV1:
  4216. *minVersion = TLSv1_MINOR;
  4217. break;
  4218. #endif
  4219. case WOLFSSL_TLSV1_1:
  4220. *minVersion = TLSv1_1_MINOR;
  4221. break;
  4222. #endif
  4223. #ifndef WOLFSSL_NO_TLS12
  4224. case WOLFSSL_TLSV1_2:
  4225. *minVersion = TLSv1_2_MINOR;
  4226. break;
  4227. #endif
  4228. #endif
  4229. #ifdef WOLFSSL_TLS13
  4230. case WOLFSSL_TLSV1_3:
  4231. *minVersion = TLSv1_3_MINOR;
  4232. break;
  4233. #endif
  4234. #ifdef WOLFSSL_DTLS
  4235. case WOLFSSL_DTLSV1:
  4236. *minVersion = DTLS_MINOR;
  4237. break;
  4238. case WOLFSSL_DTLSV1_2:
  4239. *minVersion = DTLSv1_2_MINOR;
  4240. break;
  4241. #ifdef WOLFSSL_DTLS13
  4242. case WOLFSSL_DTLSV1_3:
  4243. *minVersion = DTLSv1_3_MINOR;
  4244. break;
  4245. #endif /* WOLFSSL_DTLS13 */
  4246. #endif /* WOLFSSL_DTLS */
  4247. default:
  4248. WOLFSSL_MSG("Bad function argument");
  4249. return BAD_FUNC_ARG;
  4250. }
  4251. return WOLFSSL_SUCCESS;
  4252. }
  4253. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  4254. WOLFSSL_ABI
  4255. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  4256. {
  4257. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  4258. if (ctx == NULL) {
  4259. WOLFSSL_MSG("Bad function argument");
  4260. return BAD_FUNC_ARG;
  4261. }
  4262. return SetMinVersionHelper(&ctx->minDowngrade, version);
  4263. }
  4264. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  4265. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  4266. {
  4267. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  4268. if (ssl == NULL) {
  4269. WOLFSSL_MSG("Bad function argument");
  4270. return BAD_FUNC_ARG;
  4271. }
  4272. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  4273. }
  4274. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  4275. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  4276. {
  4277. if (ssl == NULL)
  4278. return BAD_FUNC_ARG;
  4279. if (ssl->version.major == SSLv3_MAJOR) {
  4280. switch (ssl->version.minor) {
  4281. case SSLv3_MINOR :
  4282. return WOLFSSL_SSLV3;
  4283. case TLSv1_MINOR :
  4284. return WOLFSSL_TLSV1;
  4285. case TLSv1_1_MINOR :
  4286. return WOLFSSL_TLSV1_1;
  4287. case TLSv1_2_MINOR :
  4288. return WOLFSSL_TLSV1_2;
  4289. case TLSv1_3_MINOR :
  4290. return WOLFSSL_TLSV1_3;
  4291. default:
  4292. break;
  4293. }
  4294. }
  4295. return VERSION_ERROR;
  4296. }
  4297. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  4298. {
  4299. word16 haveRSA = 1;
  4300. word16 havePSK = 0;
  4301. int keySz = 0;
  4302. WOLFSSL_ENTER("wolfSSL_SetVersion");
  4303. if (ssl == NULL) {
  4304. WOLFSSL_MSG("Bad function argument");
  4305. return BAD_FUNC_ARG;
  4306. }
  4307. switch (version) {
  4308. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  4309. case WOLFSSL_SSLV3:
  4310. ssl->version = MakeSSLv3();
  4311. break;
  4312. #endif
  4313. #ifndef NO_TLS
  4314. #ifndef NO_OLD_TLS
  4315. #ifdef WOLFSSL_ALLOW_TLSV10
  4316. case WOLFSSL_TLSV1:
  4317. ssl->version = MakeTLSv1();
  4318. break;
  4319. #endif
  4320. case WOLFSSL_TLSV1_1:
  4321. ssl->version = MakeTLSv1_1();
  4322. break;
  4323. #endif
  4324. #ifndef WOLFSSL_NO_TLS12
  4325. case WOLFSSL_TLSV1_2:
  4326. ssl->version = MakeTLSv1_2();
  4327. break;
  4328. #endif
  4329. #ifdef WOLFSSL_TLS13
  4330. case WOLFSSL_TLSV1_3:
  4331. ssl->version = MakeTLSv1_3();
  4332. break;
  4333. #endif /* WOLFSSL_TLS13 */
  4334. #endif
  4335. default:
  4336. WOLFSSL_MSG("Bad function argument");
  4337. return BAD_FUNC_ARG;
  4338. }
  4339. #ifdef NO_RSA
  4340. haveRSA = 0;
  4341. #endif
  4342. #ifndef NO_PSK
  4343. havePSK = ssl->options.havePSK;
  4344. #endif
  4345. #ifndef NO_CERTS
  4346. keySz = ssl->buffers.keySz;
  4347. #endif
  4348. if (AllocateSuites(ssl) != 0)
  4349. return WOLFSSL_FAILURE;
  4350. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4351. ssl->options.haveDH, ssl->options.haveECDSAsig,
  4352. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  4353. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  4354. ssl->options.haveAnon, TRUE, ssl->options.side);
  4355. return WOLFSSL_SUCCESS;
  4356. }
  4357. #endif /* !leanpsk */
  4358. #ifndef NO_CERTS
  4359. /* hash is the SHA digest of name, just use first 32 bits as hash */
  4360. static WC_INLINE word32 HashSigner(const byte* hash)
  4361. {
  4362. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  4363. }
  4364. /* does CA already exist on signer list */
  4365. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  4366. {
  4367. Signer* signers;
  4368. int ret = 0;
  4369. word32 row;
  4370. if (cm == NULL || hash == NULL) {
  4371. return ret;
  4372. }
  4373. row = HashSigner(hash);
  4374. if (wc_LockMutex(&cm->caLock) != 0) {
  4375. return ret;
  4376. }
  4377. signers = cm->caTable[row];
  4378. while (signers) {
  4379. byte* subjectHash;
  4380. #ifndef NO_SKID
  4381. subjectHash = signers->subjectKeyIdHash;
  4382. #else
  4383. subjectHash = signers->subjectNameHash;
  4384. #endif
  4385. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4386. ret = 1; /* success */
  4387. break;
  4388. }
  4389. signers = signers->next;
  4390. }
  4391. wc_UnLockMutex(&cm->caLock);
  4392. return ret;
  4393. }
  4394. #ifdef WOLFSSL_TRUST_PEER_CERT
  4395. /* hash is the SHA digest of name, just use first 32 bits as hash */
  4396. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  4397. {
  4398. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  4399. }
  4400. /* does trusted peer already exist on signer list */
  4401. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DecodedCert* cert)
  4402. {
  4403. TrustedPeerCert* tp;
  4404. int ret = 0;
  4405. word32 row = TrustedPeerHashSigner(cert->subjectHash);
  4406. if (wc_LockMutex(&cm->tpLock) != 0)
  4407. return ret;
  4408. tp = cm->tpTable[row];
  4409. while (tp) {
  4410. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4411. SIGNER_DIGEST_SIZE) == 0)
  4412. ret = 1;
  4413. #ifndef NO_SKID
  4414. if (cert->extSubjKeyIdSet) {
  4415. /* Compare SKID as well if available */
  4416. if (ret == 1 && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4417. SIGNER_DIGEST_SIZE) != 0)
  4418. ret = 0;
  4419. }
  4420. #endif
  4421. if (ret == 1)
  4422. break;
  4423. tp = tp->next;
  4424. }
  4425. wc_UnLockMutex(&cm->tpLock);
  4426. return ret;
  4427. }
  4428. /* return Trusted Peer if found, otherwise NULL
  4429. type is what to match on
  4430. */
  4431. TrustedPeerCert* GetTrustedPeer(void* vp, DecodedCert* cert)
  4432. {
  4433. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4434. TrustedPeerCert* ret = NULL;
  4435. TrustedPeerCert* tp = NULL;
  4436. word32 row;
  4437. if (cm == NULL || cert == NULL)
  4438. return NULL;
  4439. row = TrustedPeerHashSigner(cert->subjectHash);
  4440. if (wc_LockMutex(&cm->tpLock) != 0)
  4441. return ret;
  4442. tp = cm->tpTable[row];
  4443. while (tp) {
  4444. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4445. SIGNER_DIGEST_SIZE) == 0)
  4446. ret = tp;
  4447. #ifndef NO_SKID
  4448. if (cert->extSubjKeyIdSet) {
  4449. /* Compare SKID as well if available */
  4450. if (ret != NULL && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4451. SIGNER_DIGEST_SIZE) != 0)
  4452. ret = NULL;
  4453. }
  4454. #endif
  4455. if (ret != NULL)
  4456. break;
  4457. tp = tp->next;
  4458. }
  4459. wc_UnLockMutex(&cm->tpLock);
  4460. return ret;
  4461. }
  4462. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  4463. {
  4464. if (tp == NULL || cert == NULL)
  4465. return BAD_FUNC_ARG;
  4466. /* subject key id or subject hash has been compared when searching
  4467. tpTable for the cert from function GetTrustedPeer */
  4468. /* compare signatures */
  4469. if (tp->sigLen == cert->sigLength) {
  4470. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  4471. return WOLFSSL_FAILURE;
  4472. }
  4473. }
  4474. else {
  4475. return WOLFSSL_FAILURE;
  4476. }
  4477. return WOLFSSL_SUCCESS;
  4478. }
  4479. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4480. /* return CA if found, otherwise NULL */
  4481. Signer* GetCA(void* vp, byte* hash)
  4482. {
  4483. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4484. Signer* ret = NULL;
  4485. Signer* signers;
  4486. word32 row = 0;
  4487. if (cm == NULL || hash == NULL)
  4488. return NULL;
  4489. row = HashSigner(hash);
  4490. if (wc_LockMutex(&cm->caLock) != 0)
  4491. return ret;
  4492. signers = cm->caTable[row];
  4493. while (signers) {
  4494. byte* subjectHash;
  4495. #ifndef NO_SKID
  4496. subjectHash = signers->subjectKeyIdHash;
  4497. #else
  4498. subjectHash = signers->subjectNameHash;
  4499. #endif
  4500. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4501. ret = signers;
  4502. break;
  4503. }
  4504. signers = signers->next;
  4505. }
  4506. wc_UnLockMutex(&cm->caLock);
  4507. return ret;
  4508. }
  4509. #ifdef WOLFSSL_AKID_NAME
  4510. Signer* GetCAByAKID(void* vp, const byte* issuer, word32 issuerSz,
  4511. const byte* serial, word32 serialSz)
  4512. {
  4513. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4514. Signer* ret = NULL;
  4515. Signer* signers;
  4516. byte nameHash[SIGNER_DIGEST_SIZE];
  4517. byte serialHash[SIGNER_DIGEST_SIZE];
  4518. word32 row;
  4519. if (cm == NULL || issuer == NULL || issuerSz == 0 ||
  4520. serial == NULL || serialSz == 0)
  4521. return NULL;
  4522. if (CalcHashId(issuer, issuerSz, nameHash) != 0 ||
  4523. CalcHashId(serial, serialSz, serialHash) != 0)
  4524. return NULL;
  4525. if (wc_LockMutex(&cm->caLock) != 0)
  4526. return ret;
  4527. /* Unfortunately we need to look through the entire table */
  4528. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4529. for (signers = cm->caTable[row]; signers != NULL;
  4530. signers = signers->next) {
  4531. if (XMEMCMP(signers->subjectNameHash, nameHash, SIGNER_DIGEST_SIZE)
  4532. == 0 && XMEMCMP(signers->serialHash, serialHash,
  4533. SIGNER_DIGEST_SIZE) == 0) {
  4534. ret = signers;
  4535. break;
  4536. }
  4537. }
  4538. }
  4539. wc_UnLockMutex(&cm->caLock);
  4540. return ret;
  4541. }
  4542. #endif
  4543. #ifndef NO_SKID
  4544. /* return CA if found, otherwise NULL. Walk through hash table. */
  4545. Signer* GetCAByName(void* vp, byte* hash)
  4546. {
  4547. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4548. Signer* ret = NULL;
  4549. Signer* signers;
  4550. word32 row;
  4551. if (cm == NULL)
  4552. return NULL;
  4553. if (wc_LockMutex(&cm->caLock) != 0)
  4554. return ret;
  4555. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4556. signers = cm->caTable[row];
  4557. while (signers && ret == NULL) {
  4558. if (XMEMCMP(hash, signers->subjectNameHash,
  4559. SIGNER_DIGEST_SIZE) == 0) {
  4560. ret = signers;
  4561. }
  4562. signers = signers->next;
  4563. }
  4564. }
  4565. wc_UnLockMutex(&cm->caLock);
  4566. return ret;
  4567. }
  4568. #endif
  4569. #ifdef WOLFSSL_TRUST_PEER_CERT
  4570. /* add a trusted peer cert to linked list */
  4571. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  4572. {
  4573. int ret, row;
  4574. TrustedPeerCert* peerCert;
  4575. DecodedCert* cert;
  4576. DerBuffer* der = *pDer;
  4577. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  4578. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4579. DYNAMIC_TYPE_DCERT);
  4580. if (cert == NULL) {
  4581. FreeDer(&der);
  4582. return MEMORY_E;
  4583. }
  4584. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4585. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  4586. FreeDecodedCert(cert);
  4587. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4588. FreeDer(&der);
  4589. return ret;
  4590. }
  4591. WOLFSSL_MSG("\tParsed new trusted peer cert");
  4592. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  4593. DYNAMIC_TYPE_CERT);
  4594. if (peerCert == NULL) {
  4595. FreeDecodedCert(cert);
  4596. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4597. FreeDer(&der);
  4598. return MEMORY_E;
  4599. }
  4600. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  4601. #ifndef IGNORE_NAME_CONSTRAINTS
  4602. if (peerCert->permittedNames)
  4603. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  4604. if (peerCert->excludedNames)
  4605. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  4606. #endif
  4607. if (AlreadyTrustedPeer(cm, cert)) {
  4608. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4609. FreeTrustedPeer(peerCert, cm->heap);
  4610. (void)ret;
  4611. }
  4612. else {
  4613. /* add trusted peer signature */
  4614. peerCert->sigLen = cert->sigLength;
  4615. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  4616. DYNAMIC_TYPE_SIGNATURE);
  4617. if (peerCert->sig == NULL) {
  4618. FreeDecodedCert(cert);
  4619. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4620. FreeTrustedPeer(peerCert, cm->heap);
  4621. FreeDer(&der);
  4622. return MEMORY_E;
  4623. }
  4624. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  4625. /* add trusted peer name */
  4626. peerCert->nameLen = cert->subjectCNLen;
  4627. peerCert->name = cert->subjectCN;
  4628. #ifndef IGNORE_NAME_CONSTRAINTS
  4629. peerCert->permittedNames = cert->permittedNames;
  4630. peerCert->excludedNames = cert->excludedNames;
  4631. #endif
  4632. /* add SKID when available and hash of name */
  4633. #ifndef NO_SKID
  4634. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  4635. SIGNER_DIGEST_SIZE);
  4636. #endif
  4637. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  4638. SIGNER_DIGEST_SIZE);
  4639. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  4640. cert->subjectCN = 0;
  4641. #ifndef IGNORE_NAME_CONSTRAINTS
  4642. cert->permittedNames = NULL;
  4643. cert->excludedNames = NULL;
  4644. #endif
  4645. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4646. if (wc_LockMutex(&cm->tpLock) == 0) {
  4647. peerCert->next = cm->tpTable[row];
  4648. cm->tpTable[row] = peerCert; /* takes ownership */
  4649. wc_UnLockMutex(&cm->tpLock);
  4650. }
  4651. else {
  4652. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  4653. FreeDecodedCert(cert);
  4654. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4655. FreeTrustedPeer(peerCert, cm->heap);
  4656. FreeDer(&der);
  4657. return BAD_MUTEX_E;
  4658. }
  4659. }
  4660. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  4661. FreeDecodedCert(cert);
  4662. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4663. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  4664. FreeDer(&der);
  4665. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  4666. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  4667. return WOLFSSL_SUCCESS;
  4668. }
  4669. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4670. /* owns der, internal now uses too */
  4671. /* type flag ids from user or from chain received during verify
  4672. don't allow chain ones to be added w/o isCA extension */
  4673. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  4674. {
  4675. int ret;
  4676. Signer* signer = NULL;
  4677. word32 row;
  4678. byte* subjectHash;
  4679. #ifdef WOLFSSL_SMALL_STACK
  4680. DecodedCert* cert = NULL;
  4681. #else
  4682. DecodedCert cert[1];
  4683. #endif
  4684. DerBuffer* der = *pDer;
  4685. WOLFSSL_MSG("Adding a CA");
  4686. if (cm == NULL) {
  4687. FreeDer(pDer);
  4688. return BAD_FUNC_ARG;
  4689. }
  4690. #ifdef WOLFSSL_SMALL_STACK
  4691. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4692. DYNAMIC_TYPE_DCERT);
  4693. if (cert == NULL) {
  4694. FreeDer(pDer);
  4695. return MEMORY_E;
  4696. }
  4697. #endif
  4698. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4699. ret = ParseCert(cert, CA_TYPE, verify, cm);
  4700. WOLFSSL_MSG("\tParsed new CA");
  4701. #ifndef NO_SKID
  4702. subjectHash = cert->extSubjKeyId;
  4703. #else
  4704. subjectHash = cert->subjectHash;
  4705. #endif
  4706. /* check CA key size */
  4707. if (verify) {
  4708. switch (cert->keyOID) {
  4709. #ifndef NO_RSA
  4710. #ifdef WC_RSA_PSS
  4711. case RSAPSSk:
  4712. #endif
  4713. case RSAk:
  4714. if (cm->minRsaKeySz < 0 ||
  4715. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  4716. ret = RSA_KEY_SIZE_E;
  4717. WOLFSSL_MSG("\tCA RSA key size error");
  4718. }
  4719. break;
  4720. #endif /* !NO_RSA */
  4721. #ifdef HAVE_ECC
  4722. case ECDSAk:
  4723. if (cm->minEccKeySz < 0 ||
  4724. cert->pubKeySize < (word16)cm->minEccKeySz) {
  4725. ret = ECC_KEY_SIZE_E;
  4726. WOLFSSL_MSG("\tCA ECC key size error");
  4727. }
  4728. break;
  4729. #endif /* HAVE_ECC */
  4730. #ifdef HAVE_ED25519
  4731. case ED25519k:
  4732. if (cm->minEccKeySz < 0 ||
  4733. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  4734. ret = ECC_KEY_SIZE_E;
  4735. WOLFSSL_MSG("\tCA ECC key size error");
  4736. }
  4737. break;
  4738. #endif /* HAVE_ED25519 */
  4739. #ifdef HAVE_ED448
  4740. case ED448k:
  4741. if (cm->minEccKeySz < 0 ||
  4742. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  4743. ret = ECC_KEY_SIZE_E;
  4744. WOLFSSL_MSG("\tCA ECC key size error");
  4745. }
  4746. break;
  4747. #endif /* HAVE_ED448 */
  4748. #if defined(HAVE_PQC)
  4749. #if defined(HAVE_FALCON)
  4750. case FALCON_LEVEL1k:
  4751. if (cm->minFalconKeySz < 0 ||
  4752. FALCON_LEVEL1_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4753. ret = FALCON_KEY_SIZE_E;
  4754. WOLFSSL_MSG("\tCA Falcon level 1 key size error");
  4755. }
  4756. break;
  4757. case FALCON_LEVEL5k:
  4758. if (cm->minFalconKeySz < 0 ||
  4759. FALCON_LEVEL5_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4760. ret = FALCON_KEY_SIZE_E;
  4761. WOLFSSL_MSG("\tCA Falcon level 5 key size error");
  4762. }
  4763. break;
  4764. #endif /* HAVE_FALCON */
  4765. #if defined(HAVE_DILITHIUM)
  4766. case DILITHIUM_LEVEL2k:
  4767. if (cm->minDilithiumKeySz < 0 ||
  4768. DILITHIUM_LEVEL2_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4769. ret = DILITHIUM_KEY_SIZE_E;
  4770. WOLFSSL_MSG("\tCA Dilithium level 2 key size error");
  4771. }
  4772. break;
  4773. case DILITHIUM_LEVEL3k:
  4774. if (cm->minDilithiumKeySz < 0 ||
  4775. DILITHIUM_LEVEL3_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4776. ret = DILITHIUM_KEY_SIZE_E;
  4777. WOLFSSL_MSG("\tCA Dilithium level 3 key size error");
  4778. }
  4779. break;
  4780. case DILITHIUM_LEVEL5k:
  4781. if (cm->minDilithiumKeySz < 0 ||
  4782. DILITHIUM_LEVEL5_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4783. ret = DILITHIUM_KEY_SIZE_E;
  4784. WOLFSSL_MSG("\tCA Dilithium level 5 key size error");
  4785. }
  4786. break;
  4787. #endif /* HAVE_DILITHIUM */
  4788. #endif /* HAVE_PQC */
  4789. default:
  4790. WOLFSSL_MSG("\tNo key size check done on CA");
  4791. break; /* no size check if key type is not in switch */
  4792. }
  4793. }
  4794. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  4795. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  4796. ret = NOT_CA_ERROR;
  4797. }
  4798. #ifndef ALLOW_INVALID_CERTSIGN
  4799. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  4800. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  4801. /* Intermediate CA certs are required to have the keyCertSign
  4802. * extension set. User loaded root certs are not. */
  4803. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  4804. ret = NOT_CA_ERROR;
  4805. }
  4806. #endif
  4807. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  4808. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4809. (void)ret;
  4810. }
  4811. else if (ret == 0) {
  4812. /* take over signer parts */
  4813. signer = MakeSigner(cm->heap);
  4814. if (!signer)
  4815. ret = MEMORY_ERROR;
  4816. }
  4817. #if defined(WOLFSSL_AKID_NAME) || defined(HAVE_CRL)
  4818. if (ret == 0 && signer != NULL)
  4819. ret = CalcHashId(cert->serial, cert->serialSz, signer->serialHash);
  4820. #endif
  4821. if (ret == 0 && signer != NULL) {
  4822. #ifdef WOLFSSL_SIGNER_DER_CERT
  4823. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  4824. }
  4825. if (ret == 0 && signer != NULL) {
  4826. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  4827. #endif
  4828. signer->keyOID = cert->keyOID;
  4829. if (cert->pubKeyStored) {
  4830. signer->publicKey = cert->publicKey;
  4831. signer->pubKeySize = cert->pubKeySize;
  4832. }
  4833. if (cert->subjectCNStored) {
  4834. signer->nameLen = cert->subjectCNLen;
  4835. signer->name = cert->subjectCN;
  4836. }
  4837. signer->maxPathLen = cert->maxPathLen;
  4838. signer->selfSigned = cert->selfSigned;
  4839. #ifndef IGNORE_NAME_CONSTRAINTS
  4840. signer->permittedNames = cert->permittedNames;
  4841. signer->excludedNames = cert->excludedNames;
  4842. #endif
  4843. #ifndef NO_SKID
  4844. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  4845. SIGNER_DIGEST_SIZE);
  4846. #endif
  4847. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  4848. SIGNER_DIGEST_SIZE);
  4849. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  4850. XMEMCPY(signer->issuerNameHash, cert->issuerHash,
  4851. SIGNER_DIGEST_SIZE);
  4852. #endif
  4853. #ifdef HAVE_OCSP
  4854. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  4855. KEYID_SIZE);
  4856. #endif
  4857. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  4858. : 0xFFFF;
  4859. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  4860. cert->publicKey = 0; /* in case lock fails don't free here. */
  4861. cert->subjectCN = 0;
  4862. #ifndef IGNORE_NAME_CONSTRAINTS
  4863. cert->permittedNames = NULL;
  4864. cert->excludedNames = NULL;
  4865. #endif
  4866. #ifndef NO_SKID
  4867. row = HashSigner(signer->subjectKeyIdHash);
  4868. #else
  4869. row = HashSigner(signer->subjectNameHash);
  4870. #endif
  4871. if (wc_LockMutex(&cm->caLock) == 0) {
  4872. signer->next = cm->caTable[row];
  4873. cm->caTable[row] = signer; /* takes ownership */
  4874. wc_UnLockMutex(&cm->caLock);
  4875. if (cm->caCacheCallback)
  4876. cm->caCacheCallback(der->buffer, (int)der->length, type);
  4877. }
  4878. else {
  4879. WOLFSSL_MSG("\tCA Mutex Lock failed");
  4880. ret = BAD_MUTEX_E;
  4881. }
  4882. }
  4883. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  4884. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  4885. /* be used for peer's cert verification */
  4886. /* TSIP is only able to handle USER CA, and only one CA. */
  4887. /* Therefore, it doesn't need to call TSIP again if there is already */
  4888. /* verified CA. */
  4889. if ( ret == 0 && signer != NULL ) {
  4890. signer->cm_idx = row;
  4891. if (type == WOLFSSL_USER_CA) {
  4892. if ((ret = wc_Renesas_cmn_RootCertVerify(cert->source, cert->maxIdx,
  4893. cert->sigCtx.CertAtt.pubkey_n_start,
  4894. cert->sigCtx.CertAtt.pubkey_n_len - 1,
  4895. cert->sigCtx.CertAtt.pubkey_e_start,
  4896. cert->sigCtx.CertAtt.pubkey_e_len - 1,
  4897. row/* cm index */))
  4898. < 0)
  4899. WOLFSSL_MSG("Renesas_RootCertVerify() failed");
  4900. else
  4901. WOLFSSL_MSG("Renesas_RootCertVerify() succeed or skipped");
  4902. }
  4903. }
  4904. #endif /* TSIP or SCE */
  4905. WOLFSSL_MSG("\tFreeing Parsed CA");
  4906. FreeDecodedCert(cert);
  4907. if (ret != 0 && signer != NULL)
  4908. FreeSigner(signer, cm->heap);
  4909. #ifdef WOLFSSL_SMALL_STACK
  4910. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4911. #endif
  4912. WOLFSSL_MSG("\tFreeing der CA");
  4913. FreeDer(pDer);
  4914. WOLFSSL_MSG("\t\tOK Freeing der CA");
  4915. WOLFSSL_LEAVE("AddCA", ret);
  4916. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  4917. }
  4918. #endif /* !NO_CERTS */
  4919. #ifndef NO_SESSION_CACHE
  4920. /* basic config gives a cache with 33 sessions, adequate for clients and
  4921. embedded servers
  4922. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  4923. with titanic amounts of memory with long session ID timeouts and high
  4924. levels of traffic.
  4925. ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased
  4926. performance with large session caches
  4927. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  4928. allows over 13,000 new sessions per minute or over 200 new sessions per
  4929. second
  4930. BIG_SESSION_CACHE yields 20,027 sessions
  4931. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  4932. aren't under heavy load, basically allows 200 new sessions per minute
  4933. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  4934. or systems where the default of nearly 3kB is too much RAM, this define
  4935. uses less than 500 bytes RAM
  4936. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  4937. */
  4938. #if defined(TITAN_SESSION_CACHE)
  4939. #define SESSIONS_PER_ROW 31
  4940. #define SESSION_ROWS 64937
  4941. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  4942. #define ENABLE_SESSION_CACHE_ROW_LOCK
  4943. #endif
  4944. #elif defined(HUGE_SESSION_CACHE)
  4945. #define SESSIONS_PER_ROW 11
  4946. #define SESSION_ROWS 5981
  4947. #elif defined(BIG_SESSION_CACHE)
  4948. #define SESSIONS_PER_ROW 7
  4949. #define SESSION_ROWS 2861
  4950. #elif defined(MEDIUM_SESSION_CACHE)
  4951. #define SESSIONS_PER_ROW 5
  4952. #define SESSION_ROWS 211
  4953. #elif defined(SMALL_SESSION_CACHE)
  4954. #define SESSIONS_PER_ROW 2
  4955. #define SESSION_ROWS 3
  4956. #else
  4957. #define SESSIONS_PER_ROW 3
  4958. #define SESSION_ROWS 11
  4959. #endif
  4960. #define INVALID_SESSION_ROW (-1)
  4961. #ifdef NO_SESSION_CACHE_ROW_LOCK
  4962. #undef ENABLE_SESSION_CACHE_ROW_LOCK
  4963. #endif
  4964. typedef struct SessionRow {
  4965. int nextIdx; /* where to place next one */
  4966. int totalCount; /* sessions ever on this row */
  4967. #ifdef SESSION_CACHE_DYNAMIC_MEM
  4968. WOLFSSL_SESSION* Sessions[SESSIONS_PER_ROW];
  4969. void* heap;
  4970. #else
  4971. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  4972. #endif
  4973. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4974. /* not included in import/export */
  4975. wolfSSL_RwLock row_lock;
  4976. int lock_valid;
  4977. #endif
  4978. } SessionRow;
  4979. #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2))
  4980. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  4981. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  4982. static WOLFSSL_GLOBAL word32 PeakSessions;
  4983. #endif
  4984. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4985. #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&(row)->row_lock)
  4986. #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&(row)->row_lock)
  4987. #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&(row)->row_lock);
  4988. #else
  4989. static WOLFSSL_GLOBAL wolfSSL_RwLock session_lock; /* SessionCache lock */
  4990. static WOLFSSL_GLOBAL int session_lock_valid = 0;
  4991. #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&session_lock)
  4992. #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&session_lock)
  4993. #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&session_lock);
  4994. #endif
  4995. #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE)
  4996. #error ClientCache is required when not using NO_SESSION_CACHE_REF
  4997. #endif
  4998. #ifndef NO_CLIENT_CACHE
  4999. #ifndef CLIENT_SESSIONS_MULTIPLIER
  5000. #ifdef NO_SESSION_CACHE_REF
  5001. #define CLIENT_SESSIONS_MULTIPLIER 1
  5002. #else
  5003. /* ClientSession objects are lightweight (compared to
  5004. * WOLFSSL_SESSION) so to decrease chance that user will reuse
  5005. * the wrong session, increase the ClientCache size. This will
  5006. * make the entire ClientCache about the size of one
  5007. * WOLFSSL_SESSION object. */
  5008. #define CLIENT_SESSIONS_MULTIPLIER 8
  5009. #endif
  5010. #endif
  5011. #define CLIENT_SESSIONS_PER_ROW \
  5012. (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER)
  5013. #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER)
  5014. #if CLIENT_SESSIONS_PER_ROW > 65535
  5015. #error CLIENT_SESSIONS_PER_ROW too big
  5016. #endif
  5017. #if CLIENT_SESSION_ROWS > 65535
  5018. #error CLIENT_SESSION_ROWS too big
  5019. #endif
  5020. struct ClientSession {
  5021. word16 serverRow; /* SessionCache Row id */
  5022. word16 serverIdx; /* SessionCache Idx (column) */
  5023. word32 sessionIDHash;
  5024. };
  5025. #ifndef WOLFSSL_CLIENT_SESSION_DEFINED
  5026. typedef struct ClientSession ClientSession;
  5027. #define WOLFSSL_CLIENT_SESSION_DEFINED
  5028. #endif
  5029. typedef struct ClientRow {
  5030. int nextIdx; /* where to place next one */
  5031. int totalCount; /* sessions ever on this row */
  5032. ClientSession Clients[CLIENT_SESSIONS_PER_ROW];
  5033. } ClientRow;
  5034. static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS];
  5035. /* Client Cache */
  5036. /* uses session mutex */
  5037. static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex; /* ClientCache mutex */
  5038. static WOLFSSL_GLOBAL int clisession_mutex_valid = 0;
  5039. #endif /* !NO_CLIENT_CACHE */
  5040. void EvictSessionFromCache(WOLFSSL_SESSION* session)
  5041. {
  5042. #ifdef HAVE_EX_DATA
  5043. int save_ownExData = session->ownExData;
  5044. session->ownExData = 1; /* Make sure ex_data access doesn't lead back
  5045. * into the cache. */
  5046. #endif
  5047. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  5048. if (session->rem_sess_cb != NULL) {
  5049. session->rem_sess_cb(NULL, session);
  5050. session->rem_sess_cb = NULL;
  5051. }
  5052. #endif
  5053. ForceZero(session->masterSecret, SECRET_LEN);
  5054. XMEMSET(session->sessionID, 0, ID_LEN);
  5055. session->sessionIDSz = 0;
  5056. #ifdef HAVE_SESSION_TICKET
  5057. if (session->ticketLenAlloc > 0) {
  5058. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  5059. session->ticket = session->staticTicket;
  5060. session->ticketLen = 0;
  5061. session->ticketLenAlloc = 0;
  5062. }
  5063. #endif
  5064. #ifdef HAVE_EX_DATA
  5065. session->ownExData = save_ownExData;
  5066. #endif
  5067. }
  5068. #endif /* !NO_SESSION_CACHE */
  5069. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  5070. static int wolfSSL_RAND_InitMutex(void);
  5071. #endif
  5072. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  5073. static void AtExitCleanup(void)
  5074. {
  5075. if (initRefCount > 0) {
  5076. initRefCount = 1;
  5077. (void)wolfSSL_Cleanup();
  5078. }
  5079. }
  5080. #endif
  5081. WOLFSSL_ABI
  5082. int wolfSSL_Init(void)
  5083. {
  5084. int ret = WOLFSSL_SUCCESS;
  5085. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  5086. int i;
  5087. #endif
  5088. WOLFSSL_ENTER("wolfSSL_Init");
  5089. #if FIPS_VERSION_GE(5,1)
  5090. ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL);
  5091. if (ret != 0)
  5092. return ret;
  5093. else
  5094. ret = WOLFSSL_SUCCESS;
  5095. #endif
  5096. if (initRefCount == 0) {
  5097. /* Initialize crypto for use with TLS connection */
  5098. if (wolfCrypt_Init() != 0) {
  5099. WOLFSSL_MSG("Bad wolfCrypt Init");
  5100. ret = WC_INIT_E;
  5101. }
  5102. #ifdef HAVE_GLOBAL_RNG
  5103. if (ret == WOLFSSL_SUCCESS) {
  5104. if (wc_InitMutex(&globalRNGMutex) != 0) {
  5105. WOLFSSL_MSG("Bad Init Mutex rng");
  5106. ret = BAD_MUTEX_E;
  5107. }
  5108. else {
  5109. globalRNGMutex_valid = 1;
  5110. }
  5111. }
  5112. #endif
  5113. #ifdef WC_RNG_SEED_CB
  5114. wc_SetSeed_Cb(wc_GenerateSeed);
  5115. #endif
  5116. #ifdef OPENSSL_EXTRA
  5117. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  5118. if ((ret == WOLFSSL_SUCCESS) && (wolfSSL_RAND_InitMutex() != 0)) {
  5119. ret = BAD_MUTEX_E;
  5120. }
  5121. #endif
  5122. if ((ret == WOLFSSL_SUCCESS) &&
  5123. (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS)) {
  5124. WOLFSSL_MSG("wolfSSL_RAND_seed failed");
  5125. ret = WC_INIT_E;
  5126. }
  5127. #endif
  5128. #ifndef NO_SESSION_CACHE
  5129. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  5130. for (i = 0; i < SESSION_ROWS; ++i) {
  5131. SessionCache[i].lock_valid = 0;
  5132. }
  5133. for (i = 0; (ret == WOLFSSL_SUCCESS) && (i < SESSION_ROWS); ++i) {
  5134. if (wc_InitRwLock(&SessionCache[i].row_lock) != 0) {
  5135. WOLFSSL_MSG("Bad Init Mutex session");
  5136. ret = BAD_MUTEX_E;
  5137. }
  5138. else {
  5139. SessionCache[i].lock_valid = 1;
  5140. }
  5141. }
  5142. #else
  5143. if (ret == WOLFSSL_SUCCESS) {
  5144. if (wc_InitRwLock(&session_lock) != 0) {
  5145. WOLFSSL_MSG("Bad Init Mutex session");
  5146. ret = BAD_MUTEX_E;
  5147. }
  5148. else {
  5149. session_lock_valid = 1;
  5150. }
  5151. }
  5152. #endif
  5153. #ifndef NO_CLIENT_CACHE
  5154. if (ret == WOLFSSL_SUCCESS) {
  5155. if (wc_InitMutex(&clisession_mutex) != 0) {
  5156. WOLFSSL_MSG("Bad Init Mutex session");
  5157. ret = BAD_MUTEX_E;
  5158. }
  5159. else {
  5160. clisession_mutex_valid = 1;
  5161. }
  5162. }
  5163. #endif
  5164. #endif
  5165. if (ret == WOLFSSL_SUCCESS) {
  5166. if (wc_InitMutex(&count_mutex) != 0) {
  5167. WOLFSSL_MSG("Bad Init Mutex count");
  5168. ret = BAD_MUTEX_E;
  5169. }
  5170. else {
  5171. count_mutex_valid = 1;
  5172. }
  5173. }
  5174. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  5175. /* OpenSSL registers cleanup using atexit */
  5176. if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) {
  5177. WOLFSSL_MSG("Bad atexit registration");
  5178. ret = WC_INIT_E;
  5179. }
  5180. #endif
  5181. }
  5182. if (ret == WOLFSSL_SUCCESS) {
  5183. if (wc_LockMutex(&count_mutex) != 0) {
  5184. WOLFSSL_MSG("Bad Lock Mutex count");
  5185. ret = BAD_MUTEX_E;
  5186. }
  5187. else {
  5188. initRefCount++;
  5189. wc_UnLockMutex(&count_mutex);
  5190. }
  5191. }
  5192. if (ret != WOLFSSL_SUCCESS) {
  5193. initRefCount = 1; /* Force cleanup */
  5194. (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */
  5195. }
  5196. return ret;
  5197. }
  5198. #ifndef NO_CERTS
  5199. /* process user cert chain to pass during the handshake */
  5200. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5201. long sz, int format, int type, WOLFSSL* ssl,
  5202. long* used, EncryptedInfo* info, int verify)
  5203. {
  5204. int ret = 0;
  5205. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  5206. if ((type == CA_TYPE) && (ctx == NULL)) {
  5207. WOLFSSL_MSG("Need context for CA load");
  5208. return BAD_FUNC_ARG;
  5209. }
  5210. /* we may have a user cert chain, try to consume */
  5211. if ((type == CERT_TYPE || type == CHAIN_CERT_TYPE || type == CA_TYPE) &&
  5212. (info->consumed < sz)) {
  5213. #ifdef WOLFSSL_SMALL_STACK
  5214. byte staticBuffer[1]; /* force heap usage */
  5215. #else
  5216. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  5217. #endif
  5218. byte* chainBuffer = staticBuffer;
  5219. int dynamicBuffer = 0;
  5220. word32 bufferSz;
  5221. long consumed = info->consumed;
  5222. word32 idx = 0;
  5223. int gotOne = 0;
  5224. #ifdef WOLFSSL_TLS13
  5225. int cnt = 0;
  5226. #endif
  5227. /* Calculate max possible size, including max headers */
  5228. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  5229. if (bufferSz > sizeof(staticBuffer)) {
  5230. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  5231. /* will shrink to actual size */
  5232. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  5233. if (chainBuffer == NULL) {
  5234. return MEMORY_E;
  5235. }
  5236. dynamicBuffer = 1;
  5237. }
  5238. WOLFSSL_MSG("Processing Cert Chain");
  5239. while (consumed < sz) {
  5240. DerBuffer* part = NULL;
  5241. word32 remain = (word32)(sz - consumed);
  5242. info->consumed = 0;
  5243. if (format == WOLFSSL_FILETYPE_PEM) {
  5244. #ifdef WOLFSSL_PEM_TO_DER
  5245. ret = PemToDer(buff + consumed, remain, type, &part,
  5246. heap, info, NULL);
  5247. #else
  5248. ret = NOT_COMPILED_IN;
  5249. #endif
  5250. }
  5251. else {
  5252. int length = remain;
  5253. if (format == WOLFSSL_FILETYPE_ASN1) {
  5254. /* get length of der (read sequence) */
  5255. word32 inOutIdx = 0;
  5256. if (GetSequence(buff + consumed, &inOutIdx, &length,
  5257. remain) < 0) {
  5258. ret = ASN_NO_PEM_HEADER;
  5259. }
  5260. length += inOutIdx; /* include leading sequence */
  5261. }
  5262. info->consumed = length;
  5263. if (ret == 0) {
  5264. ret = AllocDer(&part, length, type, heap);
  5265. if (ret == 0) {
  5266. XMEMCPY(part->buffer, buff + consumed, length);
  5267. }
  5268. }
  5269. }
  5270. if (ret == 0) {
  5271. gotOne = 1;
  5272. #ifdef WOLFSSL_TLS13
  5273. cnt++;
  5274. #endif
  5275. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  5276. WOLFSSL_MSG(" Cert Chain bigger than buffer. "
  5277. "Consider increasing MAX_CHAIN_DEPTH");
  5278. ret = BUFFER_E;
  5279. }
  5280. else {
  5281. c32to24(part->length, &chainBuffer[idx]);
  5282. idx += CERT_HEADER_SZ;
  5283. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  5284. idx += part->length;
  5285. consumed += info->consumed;
  5286. if (used)
  5287. *used += info->consumed;
  5288. }
  5289. /* add CA's to certificate manager */
  5290. if (ret == 0 && type == CA_TYPE) {
  5291. /* verify CA unless user set to no verify */
  5292. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  5293. if (ret == WOLFSSL_SUCCESS) {
  5294. ret = 0; /* converted success case */
  5295. }
  5296. gotOne = 0; /* don't exit loop for CA type */
  5297. }
  5298. }
  5299. FreeDer(&part);
  5300. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  5301. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  5302. break;
  5303. }
  5304. if (ret < 0) {
  5305. WOLFSSL_MSG(" Error in Cert in Chain");
  5306. if (dynamicBuffer)
  5307. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  5308. return ret;
  5309. }
  5310. WOLFSSL_MSG(" Consumed another Cert in Chain");
  5311. }
  5312. WOLFSSL_MSG("Finished Processing Cert Chain");
  5313. /* only retain actual size used */
  5314. ret = 0;
  5315. if (idx > 0) {
  5316. if (ssl) {
  5317. if (ssl->buffers.weOwnCertChain) {
  5318. FreeDer(&ssl->buffers.certChain);
  5319. }
  5320. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  5321. if (ret == 0) {
  5322. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  5323. idx);
  5324. ssl->buffers.weOwnCertChain = 1;
  5325. }
  5326. #ifdef WOLFSSL_TLS13
  5327. ssl->buffers.certChainCnt = cnt;
  5328. #endif
  5329. } else if (ctx) {
  5330. FreeDer(&ctx->certChain);
  5331. ret = AllocDer(&ctx->certChain, idx, type, heap);
  5332. if (ret == 0) {
  5333. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  5334. }
  5335. #ifdef WOLFSSL_TLS13
  5336. ctx->certChainCnt = cnt;
  5337. #endif
  5338. }
  5339. }
  5340. if (dynamicBuffer)
  5341. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  5342. }
  5343. return ret;
  5344. }
  5345. #ifndef NO_RSA
  5346. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  5347. (HAVE_FIPS_VERSION > 2))
  5348. static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5349. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5350. int devId)
  5351. {
  5352. int ret;
  5353. (void)devId;
  5354. *idx = 0;
  5355. ret = wc_RsaPrivateKeyValidate(der->buffer, idx, keySz, der->length);
  5356. #ifdef WOLF_PRIVATE_KEY_ID
  5357. if ((ret != 0) && (devId != INVALID_DEVID
  5358. #ifdef HAVE_PK_CALLBACKS
  5359. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5360. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5361. #endif
  5362. )) {
  5363. word32 nSz;
  5364. /* if using crypto or PK callbacks, try public key decode */
  5365. *idx = 0;
  5366. ret = wc_RsaPublicKeyDecode_ex(der->buffer, idx, der->length, NULL,
  5367. &nSz, NULL, NULL);
  5368. if (ret == 0) {
  5369. *keySz = (int)nSz;
  5370. }
  5371. }
  5372. #endif
  5373. if (ret != 0) {
  5374. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  5375. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  5376. WOLFSSL_MSG("RSA decode failed and other algorithms "
  5377. "not enabled to try");
  5378. ret = WOLFSSL_BAD_FILE;
  5379. #else
  5380. ret = 0; /* continue trying other algorithms */
  5381. #endif
  5382. }
  5383. else {
  5384. /* check that the size of the RSA key is enough */
  5385. int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz;
  5386. if (*keySz < minRsaSz) {
  5387. ret = RSA_KEY_SIZE_E;
  5388. WOLFSSL_MSG("Private Key size too small");
  5389. }
  5390. if (ssl) {
  5391. ssl->buffers.keyType = rsa_sa_algo;
  5392. ssl->buffers.keySz = *keySz;
  5393. }
  5394. else {
  5395. ctx->privateKeyType = rsa_sa_algo;
  5396. ctx->privateKeySz = *keySz;
  5397. }
  5398. *keyFormat = RSAk;
  5399. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5400. ssl->options.haveStaticECC = 0;
  5401. *resetSuites = 1;
  5402. }
  5403. }
  5404. return ret;
  5405. }
  5406. #else
  5407. static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5408. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5409. void* heap, int devId)
  5410. {
  5411. int ret;
  5412. /* make sure RSA key can be used */
  5413. #ifdef WOLFSSL_SMALL_STACK
  5414. RsaKey* key;
  5415. #else
  5416. RsaKey key[1];
  5417. #endif
  5418. #ifdef WOLFSSL_SMALL_STACK
  5419. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  5420. if (key == NULL)
  5421. return MEMORY_E;
  5422. #endif
  5423. ret = wc_InitRsaKey_ex(key, heap, devId);
  5424. if (ret == 0) {
  5425. *idx = 0;
  5426. ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length);
  5427. #ifdef WOLF_PRIVATE_KEY_ID
  5428. if (ret != 0 && (devId != INVALID_DEVID
  5429. #ifdef HAVE_PK_CALLBACKS
  5430. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5431. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5432. #endif
  5433. )) {
  5434. /* if using crypto or PK callbacks, try public key decode */
  5435. *idx = 0;
  5436. ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length);
  5437. }
  5438. #endif
  5439. if (ret != 0) {
  5440. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  5441. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  5442. WOLFSSL_MSG("RSA decode failed and other algorithms "
  5443. "not enabled to try");
  5444. ret = WOLFSSL_BAD_FILE;
  5445. #else
  5446. ret = 0; /* continue trying other algorithms */
  5447. #endif
  5448. }
  5449. else {
  5450. /* check that the size of the RSA key is enough */
  5451. int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz;
  5452. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  5453. if (*keySz < minRsaSz) {
  5454. ret = RSA_KEY_SIZE_E;
  5455. WOLFSSL_MSG("Private Key size too small");
  5456. }
  5457. if (ssl) {
  5458. ssl->buffers.keyType = rsa_sa_algo;
  5459. ssl->buffers.keySz = *keySz;
  5460. }
  5461. else {
  5462. ctx->privateKeyType = rsa_sa_algo;
  5463. ctx->privateKeySz = *keySz;
  5464. }
  5465. *keyFormat = RSAk;
  5466. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5467. ssl->options.haveStaticECC = 0;
  5468. *resetSuites = 1;
  5469. }
  5470. }
  5471. wc_FreeRsaKey(key);
  5472. }
  5473. #ifdef WOLFSSL_SMALL_STACK
  5474. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  5475. #endif
  5476. return ret;
  5477. }
  5478. #endif
  5479. #endif /* !NO_RSA */
  5480. #ifdef HAVE_ECC
  5481. static int ProcessBufferTryDecodeEcc(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5482. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5483. void* heap, int devId)
  5484. {
  5485. int ret = 0;
  5486. /* make sure ECC key can be used */
  5487. #ifdef WOLFSSL_SMALL_STACK
  5488. ecc_key* key;
  5489. #else
  5490. ecc_key key[1];
  5491. #endif
  5492. #ifdef WOLFSSL_SMALL_STACK
  5493. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  5494. if (key == NULL)
  5495. return MEMORY_E;
  5496. #endif
  5497. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  5498. *idx = 0;
  5499. ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length);
  5500. #ifdef WOLF_PRIVATE_KEY_ID
  5501. if (ret != 0 && (devId != INVALID_DEVID
  5502. #ifdef HAVE_PK_CALLBACKS
  5503. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5504. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5505. #endif
  5506. )) {
  5507. /* if using crypto or PK callbacks, try public key decode */
  5508. *idx = 0;
  5509. ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length);
  5510. }
  5511. #endif
  5512. if (ret == 0) {
  5513. /* check for minimum ECC key size and then free */
  5514. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5515. *keySz = wc_ecc_size(key);
  5516. if (*keySz < minKeySz) {
  5517. WOLFSSL_MSG("ECC private key too small");
  5518. ret = ECC_KEY_SIZE_E;
  5519. }
  5520. *keyFormat = ECDSAk;
  5521. if (ssl) {
  5522. ssl->options.haveStaticECC = 1;
  5523. ssl->buffers.keyType = ecc_dsa_sa_algo;
  5524. #ifdef WOLFSSL_SM2
  5525. if (key->dp->id == ECC_SM2P256V1)
  5526. ssl->buffers.keyType = sm2_sa_algo;
  5527. else
  5528. #endif
  5529. ssl->buffers.keyType = ecc_dsa_sa_algo;
  5530. ssl->buffers.keySz = *keySz;
  5531. }
  5532. else {
  5533. ctx->haveStaticECC = 1;
  5534. ctx->privateKeyType = ecc_dsa_sa_algo;
  5535. #ifdef WOLFSSL_SM2
  5536. if (key->dp->id == ECC_SM2P256V1)
  5537. ctx->privateKeyType = sm2_sa_algo;
  5538. else
  5539. #endif
  5540. ctx->privateKeyType = ecc_dsa_sa_algo;
  5541. ctx->privateKeySz = *keySz;
  5542. }
  5543. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5544. *resetSuites = 1;
  5545. }
  5546. }
  5547. else {
  5548. ret = 0; /* continue trying other algorithms */
  5549. }
  5550. wc_ecc_free(key);
  5551. }
  5552. #ifdef WOLFSSL_SMALL_STACK
  5553. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5554. #endif
  5555. return ret;
  5556. }
  5557. #endif /* HAVE_ECC */
  5558. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  5559. static int ProcessBufferTryDecodeEd25519(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5560. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5561. void* heap, int devId)
  5562. {
  5563. int ret;
  5564. /* make sure Ed25519 key can be used */
  5565. #ifdef WOLFSSL_SMALL_STACK
  5566. ed25519_key* key;
  5567. #else
  5568. ed25519_key key[1];
  5569. #endif
  5570. #ifdef WOLFSSL_SMALL_STACK
  5571. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  5572. DYNAMIC_TYPE_ED25519);
  5573. if (key == NULL)
  5574. return MEMORY_E;
  5575. #endif
  5576. ret = wc_ed25519_init_ex(key, heap, devId);
  5577. if (ret == 0) {
  5578. *idx = 0;
  5579. ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length);
  5580. #ifdef WOLF_PRIVATE_KEY_ID
  5581. if (ret != 0 && (devId != INVALID_DEVID
  5582. #ifdef HAVE_PK_CALLBACKS
  5583. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5584. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5585. #endif
  5586. )) {
  5587. /* if using crypto or PK callbacks, try public key decode */
  5588. *idx = 0;
  5589. ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key, der->length);
  5590. }
  5591. #endif
  5592. if (ret == 0) {
  5593. /* check for minimum key size and then free */
  5594. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5595. *keySz = ED25519_KEY_SIZE;
  5596. if (*keySz < minKeySz) {
  5597. WOLFSSL_MSG("ED25519 private key too small");
  5598. ret = ECC_KEY_SIZE_E;
  5599. }
  5600. if (ret == 0) {
  5601. if (ssl) {
  5602. ssl->buffers.keyType = ed25519_sa_algo;
  5603. ssl->buffers.keySz = *keySz;
  5604. }
  5605. else if (ctx) {
  5606. ctx->privateKeyType = ed25519_sa_algo;
  5607. ctx->privateKeySz = *keySz;
  5608. }
  5609. *keyFormat = ED25519k;
  5610. if (ssl != NULL) {
  5611. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && !defined(NO_ED25519_CLIENT_AUTH)
  5612. /* ED25519 requires caching enabled for tracking message
  5613. * hash used in EdDSA_Update for signing */
  5614. ssl->options.cacheMessages = 1;
  5615. #endif
  5616. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5617. *resetSuites = 1;
  5618. }
  5619. }
  5620. }
  5621. }
  5622. else {
  5623. ret = 0; /* continue trying other algorithms */
  5624. }
  5625. wc_ed25519_free(key);
  5626. }
  5627. #ifdef WOLFSSL_SMALL_STACK
  5628. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  5629. #endif
  5630. return ret;
  5631. }
  5632. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  5633. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  5634. static int ProcessBufferTryDecodeEd448(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5635. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5636. void* heap, int devId)
  5637. {
  5638. int ret;
  5639. /* make sure Ed448 key can be used */
  5640. #ifdef WOLFSSL_SMALL_STACK
  5641. ed448_key* key = NULL;
  5642. #else
  5643. ed448_key key[1];
  5644. #endif
  5645. #ifdef WOLFSSL_SMALL_STACK
  5646. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  5647. if (key == NULL)
  5648. return MEMORY_E;
  5649. #endif
  5650. ret = wc_ed448_init_ex(key, heap, devId);
  5651. if (ret == 0) {
  5652. *idx = 0;
  5653. ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length);
  5654. #ifdef WOLF_PRIVATE_KEY_ID
  5655. if (ret != 0 && (devId != INVALID_DEVID
  5656. #ifdef HAVE_PK_CALLBACKS
  5657. || ((ssl == NULL) ? wolfSSL_CTX_IsPrivatePkSet(ctx) :
  5658. wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  5659. #endif
  5660. )) {
  5661. /* if using crypto or PK callbacks, try public key decode */
  5662. *idx = 0;
  5663. ret = wc_Ed448PublicKeyDecode(der->buffer, idx, key, der->length);
  5664. }
  5665. #endif
  5666. if (ret == 0) {
  5667. /* check for minimum key size and then free */
  5668. int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz;
  5669. *keySz = ED448_KEY_SIZE;
  5670. if (*keySz < minKeySz) {
  5671. WOLFSSL_MSG("ED448 private key too small");
  5672. ret = ECC_KEY_SIZE_E;
  5673. }
  5674. }
  5675. if (ret == 0) {
  5676. if (ssl) {
  5677. ssl->buffers.keyType = ed448_sa_algo;
  5678. ssl->buffers.keySz = *keySz;
  5679. }
  5680. else if (ctx) {
  5681. ctx->privateKeyType = ed448_sa_algo;
  5682. ctx->privateKeySz = *keySz;
  5683. }
  5684. *keyFormat = ED448k;
  5685. if (ssl != NULL) {
  5686. /* ED448 requires caching enabled for tracking message
  5687. * hash used in EdDSA_Update for signing */
  5688. ssl->options.cacheMessages = 1;
  5689. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5690. *resetSuites = 1;
  5691. }
  5692. }
  5693. }
  5694. wc_ed448_free(key);
  5695. }
  5696. #ifdef WOLFSSL_SMALL_STACK
  5697. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  5698. #endif
  5699. return ret;
  5700. }
  5701. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  5702. #if defined(HAVE_PQC)
  5703. #if defined(HAVE_FALCON)
  5704. static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5705. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5706. void* heap)
  5707. {
  5708. int ret;
  5709. /* make sure Falcon key can be used */
  5710. falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  5711. DYNAMIC_TYPE_FALCON);
  5712. if (key == NULL) {
  5713. return MEMORY_E;
  5714. }
  5715. ret = wc_falcon_init(key);
  5716. if (ret == 0) {
  5717. if (*keyFormat == FALCON_LEVEL1k) {
  5718. ret = wc_falcon_set_level(key, 1);
  5719. }
  5720. else if (*keyFormat == FALCON_LEVEL5k) {
  5721. ret = wc_falcon_set_level(key, 5);
  5722. }
  5723. else {
  5724. /* What if *keyformat is 0? We might want to do something more
  5725. * graceful here. */
  5726. wc_falcon_free(key);
  5727. ret = ALGO_ID_E;
  5728. }
  5729. }
  5730. if (ret == 0) {
  5731. *idx = 0;
  5732. ret = wc_falcon_import_private_only(der->buffer, der->length, key);
  5733. if (ret == 0) {
  5734. /* check for minimum key size and then free */
  5735. int minKeySz = ssl ? ssl->options.minFalconKeySz :
  5736. ctx->minFalconKeySz;
  5737. *keySz = FALCON_MAX_KEY_SIZE;
  5738. if (*keySz < minKeySz) {
  5739. WOLFSSL_MSG("Falcon private key too small");
  5740. ret = FALCON_KEY_SIZE_E;
  5741. }
  5742. if (ssl) {
  5743. if (*keyFormat == FALCON_LEVEL1k) {
  5744. ssl->buffers.keyType = falcon_level1_sa_algo;
  5745. }
  5746. else {
  5747. ssl->buffers.keyType = falcon_level5_sa_algo;
  5748. }
  5749. ssl->buffers.keySz = *keySz;
  5750. }
  5751. else {
  5752. if (*keyFormat == FALCON_LEVEL1k) {
  5753. ctx->privateKeyType = falcon_level1_sa_algo;
  5754. }
  5755. else {
  5756. ctx->privateKeyType = falcon_level5_sa_algo;
  5757. }
  5758. ctx->privateKeySz = *keySz;
  5759. }
  5760. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5761. *resetSuites = 1;
  5762. }
  5763. }
  5764. wc_falcon_free(key);
  5765. }
  5766. XFREE(key, heap, DYNAMIC_TYPE_FALCON);
  5767. return ret;
  5768. }
  5769. #endif
  5770. #if defined(HAVE_DILITHIUM)
  5771. static int ProcessBufferTryDecodeDilithium(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5772. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5773. void* heap)
  5774. {
  5775. int ret;
  5776. /* make sure Dilithium key can be used */
  5777. dilithium_key* key = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap,
  5778. DYNAMIC_TYPE_DILITHIUM);
  5779. if (key == NULL) {
  5780. return MEMORY_E;
  5781. }
  5782. ret = wc_dilithium_init(key);
  5783. if (ret == 0) {
  5784. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5785. ret = wc_dilithium_set_level(key, 2);
  5786. }
  5787. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5788. ret = wc_dilithium_set_level(key, 3);
  5789. }
  5790. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5791. ret = wc_dilithium_set_level(key, 5);
  5792. }
  5793. else {
  5794. /* What if *keyformat is 0? We might want to do something more
  5795. * graceful here. */
  5796. wc_dilithium_free(key);
  5797. ret = ALGO_ID_E;
  5798. }
  5799. }
  5800. if (ret == 0) {
  5801. *idx = 0;
  5802. ret = wc_dilithium_import_private_only(der->buffer, der->length, key);
  5803. if (ret == 0) {
  5804. /* check for minimum key size and then free */
  5805. int minKeySz = ssl ? ssl->options.minDilithiumKeySz :
  5806. ctx->minDilithiumKeySz;
  5807. *keySz = DILITHIUM_MAX_KEY_SIZE;
  5808. if (*keySz < minKeySz) {
  5809. WOLFSSL_MSG("Dilithium private key too small");
  5810. ret = DILITHIUM_KEY_SIZE_E;
  5811. }
  5812. if (ssl) {
  5813. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5814. ssl->buffers.keyType = dilithium_level2_sa_algo;
  5815. }
  5816. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5817. ssl->buffers.keyType = dilithium_level3_sa_algo;
  5818. }
  5819. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5820. ssl->buffers.keyType = dilithium_level5_sa_algo;
  5821. }
  5822. ssl->buffers.keySz = *keySz;
  5823. }
  5824. else {
  5825. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5826. ctx->privateKeyType = dilithium_level2_sa_algo;
  5827. }
  5828. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5829. ctx->privateKeyType = dilithium_level3_sa_algo;
  5830. }
  5831. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5832. ctx->privateKeyType = dilithium_level5_sa_algo;
  5833. }
  5834. ctx->privateKeySz = *keySz;
  5835. }
  5836. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5837. *resetSuites = 1;
  5838. }
  5839. }
  5840. wc_dilithium_free(key);
  5841. }
  5842. XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM);
  5843. return ret;
  5844. }
  5845. #endif /* HAVE_DILITHIUM */
  5846. #endif /* HAVE_PQC */
  5847. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5848. DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat,
  5849. void* heap, int devId)
  5850. {
  5851. int ret = 0;
  5852. (void)heap;
  5853. (void)devId;
  5854. if (ctx == NULL && ssl == NULL)
  5855. return BAD_FUNC_ARG;
  5856. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  5857. return BAD_FUNC_ARG;
  5858. #ifndef NO_RSA
  5859. if ((*keyFormat == 0 || *keyFormat == RSAk)) {
  5860. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  5861. (HAVE_FIPS_VERSION > 2))
  5862. ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites,
  5863. keyFormat, devId);
  5864. #else
  5865. ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites,
  5866. keyFormat, heap, devId);
  5867. #endif
  5868. if (ret != 0)
  5869. return ret;
  5870. }
  5871. #endif
  5872. #ifdef HAVE_ECC
  5873. if ((*keyFormat == 0) || (*keyFormat == ECDSAk)
  5874. #ifdef WOLFSSL_SM2
  5875. || (*keyFormat == SM2k)
  5876. #endif
  5877. ) {
  5878. ret = ProcessBufferTryDecodeEcc(ctx, ssl, der, keySz, idx, resetSuites,
  5879. keyFormat, heap, devId);
  5880. if (ret != 0)
  5881. return ret;
  5882. }
  5883. #endif /* HAVE_ECC */
  5884. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  5885. if ((*keyFormat == 0 || *keyFormat == ED25519k)) {
  5886. ret = ProcessBufferTryDecodeEd25519(ctx, ssl, der, keySz, idx,
  5887. resetSuites, keyFormat, heap, devId);
  5888. if (ret != 0)
  5889. return ret;
  5890. }
  5891. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  5892. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  5893. if ((*keyFormat == 0 || *keyFormat == ED448k)) {
  5894. ret = ProcessBufferTryDecodeEd448(ctx, ssl, der, keySz, idx,
  5895. resetSuites, keyFormat, heap, devId);
  5896. if (ret != 0)
  5897. return ret;
  5898. }
  5899. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  5900. #if defined(HAVE_PQC)
  5901. #if defined(HAVE_FALCON)
  5902. if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) ||
  5903. (*keyFormat == FALCON_LEVEL5k))) {
  5904. ret = ProcessBufferTryDecodeFalcon(ctx, ssl, der, keySz, idx,
  5905. resetSuites, keyFormat, heap);
  5906. if (ret != 0)
  5907. return ret;
  5908. }
  5909. #endif /* HAVE_FALCON */
  5910. #if defined(HAVE_DILITHIUM)
  5911. if ((*keyFormat == 0) ||
  5912. (*keyFormat == DILITHIUM_LEVEL2k) ||
  5913. (*keyFormat == DILITHIUM_LEVEL3k) ||
  5914. (*keyFormat == DILITHIUM_LEVEL5k)) {
  5915. ret = ProcessBufferTryDecodeDilithium(ctx, ssl, der, keySz, idx,
  5916. resetSuites, keyFormat, heap);
  5917. if (ret != 0) {
  5918. return ret;
  5919. }
  5920. }
  5921. #endif /* HAVE_DILITHIUM */
  5922. #endif /* HAVE_PQC */
  5923. return ret;
  5924. }
  5925. /* process the buffer buff, length sz, into ctx of format and type
  5926. used tracks bytes consumed, userChain specifies a user cert chain
  5927. to pass during the handshake */
  5928. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5929. long sz, int format, int type, WOLFSSL* ssl,
  5930. long* used, int userChain, int verify)
  5931. {
  5932. DerBuffer* der = NULL;
  5933. int ret = 0;
  5934. int done = 0;
  5935. int keyFormat = 0;
  5936. int resetSuites = 0;
  5937. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  5938. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  5939. word32 idx = 0;
  5940. int keySz = 0;
  5941. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  5942. defined(HAVE_PKCS8)
  5943. word32 algId = 0;
  5944. #endif
  5945. #ifdef WOLFSSL_SMALL_STACK
  5946. EncryptedInfo* info = NULL;
  5947. #else
  5948. EncryptedInfo info[1];
  5949. #endif
  5950. (void)devId;
  5951. (void)idx;
  5952. (void)keySz;
  5953. if (used)
  5954. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  5955. /* check args */
  5956. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  5957. return WOLFSSL_BAD_FILETYPE;
  5958. if (ctx == NULL && ssl == NULL)
  5959. return BAD_FUNC_ARG;
  5960. /* This API does not handle CHAIN_CERT_TYPE */
  5961. if (type == CHAIN_CERT_TYPE)
  5962. return BAD_FUNC_ARG;
  5963. #ifdef WOLFSSL_SMALL_STACK
  5964. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  5965. DYNAMIC_TYPE_ENCRYPTEDINFO);
  5966. if (info == NULL)
  5967. return MEMORY_E;
  5968. #endif
  5969. XMEMSET(info, 0, sizeof(EncryptedInfo));
  5970. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5971. if (ctx) {
  5972. info->passwd_cb = ctx->passwd_cb;
  5973. info->passwd_userdata = ctx->passwd_userdata;
  5974. }
  5975. #endif
  5976. if (format == WOLFSSL_FILETYPE_PEM) {
  5977. #ifdef WOLFSSL_PEM_TO_DER
  5978. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  5979. #else
  5980. ret = NOT_COMPILED_IN;
  5981. #endif
  5982. }
  5983. else {
  5984. /* ASN1 (DER) */
  5985. int length = (int)sz;
  5986. word32 inOutIdx = 0;
  5987. /* get length of der (read sequence or octet string) */
  5988. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5989. length += inOutIdx; /* include leading sequence */
  5990. }
  5991. /* get length using octet string (allowed for private key types) */
  5992. else if (type == PRIVATEKEY_TYPE &&
  5993. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5994. length += inOutIdx; /* include leading oct string */
  5995. }
  5996. else {
  5997. ret = ASN_PARSE_E;
  5998. }
  5999. info->consumed = length;
  6000. if (ret == 0) {
  6001. ret = AllocDer(&der, (word32)length, type, heap);
  6002. if (ret == 0) {
  6003. XMEMCPY(der->buffer, buff, length);
  6004. }
  6005. #ifdef HAVE_PKCS8
  6006. /* if private key try and remove PKCS8 header */
  6007. if (ret == 0 && type == PRIVATEKEY_TYPE) {
  6008. if ((ret = ToTraditional_ex(der->buffer, der->length,
  6009. &algId)) > 0) {
  6010. /* Found PKCS8 header */
  6011. /* ToTraditional_ex moves buff and returns adjusted length */
  6012. der->length = ret;
  6013. keyFormat = algId;
  6014. }
  6015. ret = 0; /* failures should be ignored */
  6016. }
  6017. #endif
  6018. }
  6019. }
  6020. if (used) {
  6021. *used = info->consumed;
  6022. }
  6023. /* process user chain */
  6024. if (ret >= 0) {
  6025. /* Chain should have server cert first, then intermediates, then root.
  6026. * First certificate in chain is processed below after ProcessUserChain
  6027. * and is loaded into ssl->buffers.certificate.
  6028. * Remainder are processed using ProcessUserChain and are loaded into
  6029. * ssl->buffers.certChain. */
  6030. if (userChain) {
  6031. ret = ProcessUserChain(ctx, buff, sz, format, CHAIN_CERT_TYPE, ssl,
  6032. used, info, verify);
  6033. if (ret == ASN_NO_PEM_HEADER) { /* Additional chain is optional */
  6034. unsigned long pemErr = 0;
  6035. CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr);
  6036. ret = 0;
  6037. }
  6038. }
  6039. }
  6040. /* info is only used for private key with DER or PEM, so free now */
  6041. if (ret < 0 || type != PRIVATEKEY_TYPE) {
  6042. #ifdef WOLFSSL_SMALL_STACK
  6043. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6044. #endif
  6045. }
  6046. /* check for error */
  6047. if (ret < 0) {
  6048. FreeDer(&der);
  6049. done = 1;
  6050. }
  6051. if (done == 1) {
  6052. /* No operation, just skip the next section */
  6053. }
  6054. /* Handle DER owner */
  6055. else if (type == CA_TYPE) {
  6056. if (ctx == NULL) {
  6057. WOLFSSL_MSG("Need context for CA load");
  6058. FreeDer(&der);
  6059. return BAD_FUNC_ARG;
  6060. }
  6061. /* verify CA unless user set to no verify */
  6062. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  6063. done = 1;
  6064. }
  6065. #ifdef WOLFSSL_TRUST_PEER_CERT
  6066. else if (type == TRUSTED_PEER_TYPE) {
  6067. /* add trusted peer cert. der is freed within */
  6068. if (ctx != NULL)
  6069. ret = AddTrustedPeer(ctx->cm, &der, verify);
  6070. else {
  6071. SSL_CM_WARNING(ssl);
  6072. ret = AddTrustedPeer(SSL_CM(ssl), &der, verify);
  6073. }
  6074. if (ret != WOLFSSL_SUCCESS) {
  6075. WOLFSSL_MSG("Error adding trusted peer");
  6076. }
  6077. done = 1;
  6078. }
  6079. #endif /* WOLFSSL_TRUST_PEER_CERT */
  6080. else if (type == CERT_TYPE) {
  6081. if (ssl != NULL) {
  6082. /* Make sure previous is free'd */
  6083. if (ssl->buffers.weOwnCert) {
  6084. FreeDer(&ssl->buffers.certificate);
  6085. #ifdef KEEP_OUR_CERT
  6086. wolfSSL_X509_free(ssl->ourCert);
  6087. ssl->ourCert = NULL;
  6088. #endif
  6089. }
  6090. ssl->buffers.certificate = der;
  6091. #ifdef KEEP_OUR_CERT
  6092. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  6093. #endif
  6094. ssl->buffers.weOwnCert = 1;
  6095. }
  6096. else if (ctx != NULL) {
  6097. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  6098. #ifdef KEEP_OUR_CERT
  6099. if (ctx->ourCert) {
  6100. if (ctx->ownOurCert)
  6101. wolfSSL_X509_free(ctx->ourCert);
  6102. ctx->ourCert = NULL;
  6103. }
  6104. #endif
  6105. ctx->certificate = der;
  6106. }
  6107. }
  6108. else if (type == PRIVATEKEY_TYPE) {
  6109. if (ssl != NULL) {
  6110. /* Make sure previous is free'd */
  6111. if (ssl->buffers.weOwnKey) {
  6112. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  6113. FreeDer(&ssl->buffers.key);
  6114. }
  6115. ssl->buffers.key = der;
  6116. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6117. wc_MemZero_Add("SSL Buffers key", der->buffer, der->length);
  6118. #endif
  6119. ssl->buffers.weOwnKey = 1;
  6120. }
  6121. else if (ctx != NULL) {
  6122. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  6123. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  6124. }
  6125. FreeDer(&ctx->privateKey);
  6126. ctx->privateKey = der;
  6127. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6128. wc_MemZero_Add("CTX private key", der->buffer, der->length);
  6129. #endif
  6130. }
  6131. }
  6132. else {
  6133. FreeDer(&der);
  6134. return WOLFSSL_BAD_CERTTYPE;
  6135. }
  6136. if (done == 1) {
  6137. /* No operation, just skip the next section */
  6138. }
  6139. else if (type == PRIVATEKEY_TYPE) {
  6140. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  6141. &keyFormat, heap, devId);
  6142. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  6143. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  6144. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  6145. if ((ret != 0 || keyFormat == 0)
  6146. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  6147. {
  6148. int passwordSz = NAME_SZ;
  6149. #ifndef WOLFSSL_SMALL_STACK
  6150. char password[NAME_SZ];
  6151. #else
  6152. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  6153. if (password == NULL) {
  6154. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6155. FreeDer(&der);
  6156. return MEMORY_E;
  6157. }
  6158. #endif
  6159. /* get password */
  6160. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  6161. info->passwd_userdata);
  6162. if (ret >= 0) {
  6163. passwordSz = ret;
  6164. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6165. wc_MemZero_Add("ProcessBuffer password", password, passwordSz);
  6166. #endif
  6167. /* PKCS8 decrypt */
  6168. ret = ToTraditionalEnc(der->buffer, der->length,
  6169. password, passwordSz, &algId);
  6170. if (ret >= 0) {
  6171. ForceZero(der->buffer + ret, der->length - ret);
  6172. der->length = ret;
  6173. }
  6174. /* ignore failures and try parsing as unencrypted */
  6175. ForceZero(password, passwordSz);
  6176. }
  6177. #ifdef WOLFSSL_SMALL_STACK
  6178. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  6179. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  6180. wc_MemZero_Check(password, NAME_SZ);
  6181. #endif
  6182. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  6183. &resetSuites, &keyFormat, heap, devId);
  6184. }
  6185. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  6186. if (ret != 0) {
  6187. #ifdef WOLFSSL_SMALL_STACK
  6188. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6189. #endif
  6190. return ret;
  6191. }
  6192. if (keyFormat == 0) {
  6193. #ifdef OPENSSL_EXTRA
  6194. /* Reaching this point probably means that the
  6195. * decryption password is wrong */
  6196. if (info->passwd_cb)
  6197. EVPerr(0, EVP_R_BAD_DECRYPT);
  6198. #endif
  6199. #ifdef WOLFSSL_SMALL_STACK
  6200. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6201. #endif
  6202. WOLFSSL_ERROR(WOLFSSL_BAD_FILE);
  6203. return WOLFSSL_BAD_FILE;
  6204. }
  6205. #ifdef WOLFSSL_SMALL_STACK
  6206. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  6207. #endif
  6208. (void)devId;
  6209. }
  6210. else if (type == CERT_TYPE) {
  6211. #ifdef WOLFSSL_SMALL_STACK
  6212. DecodedCert* cert;
  6213. #else
  6214. DecodedCert cert[1];
  6215. #endif
  6216. #ifdef WOLF_PRIVATE_KEY_ID
  6217. int keyType = 0;
  6218. #endif
  6219. #ifdef WOLFSSL_SMALL_STACK
  6220. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  6221. DYNAMIC_TYPE_DCERT);
  6222. if (cert == NULL)
  6223. return MEMORY_E;
  6224. #endif
  6225. WOLFSSL_MSG("Checking cert signature type");
  6226. InitDecodedCert_ex(cert, der->buffer, der->length, heap, devId);
  6227. if (DecodeToKey(cert, 0) < 0) {
  6228. WOLFSSL_MSG("Decode to key failed");
  6229. FreeDecodedCert(cert);
  6230. #ifdef WOLFSSL_SMALL_STACK
  6231. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  6232. #endif
  6233. return WOLFSSL_BAD_FILE;
  6234. }
  6235. #if defined(HAVE_RPK)
  6236. if (ssl) {
  6237. ssl->options.rpkState.isRPKLoaded = 0;
  6238. if (cert->isRPK) {
  6239. ssl->options.rpkState.isRPKLoaded = 1;
  6240. }
  6241. }
  6242. else if (ctx) {
  6243. ctx->rpkState.isRPKLoaded = 0;
  6244. if (cert->isRPK) {
  6245. ctx->rpkState.isRPKLoaded = 1;
  6246. }
  6247. }
  6248. #endif /* HAVE_RPK */
  6249. if (ssl) {
  6250. if (ssl->options.side == WOLFSSL_SERVER_END)
  6251. resetSuites = 1;
  6252. }
  6253. else if (ctx && ctx->method->side == WOLFSSL_SERVER_END) {
  6254. resetSuites = 1;
  6255. }
  6256. if (ssl && ssl->ctx->haveECDSAsig) {
  6257. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  6258. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  6259. }
  6260. switch (cert->signatureOID) {
  6261. case CTC_SHAwECDSA:
  6262. case CTC_SHA256wECDSA:
  6263. case CTC_SHA384wECDSA:
  6264. case CTC_SHA512wECDSA:
  6265. case CTC_ED25519:
  6266. case CTC_ED448:
  6267. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6268. case CTC_SM3wSM2:
  6269. #endif
  6270. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  6271. if (ssl)
  6272. ssl->options.haveECDSAsig = 1;
  6273. else if (ctx)
  6274. ctx->haveECDSAsig = 1;
  6275. break;
  6276. case CTC_FALCON_LEVEL1:
  6277. case CTC_FALCON_LEVEL5:
  6278. WOLFSSL_MSG("Falcon cert signature");
  6279. if (ssl)
  6280. ssl->options.haveFalconSig = 1;
  6281. else if (ctx)
  6282. ctx->haveFalconSig = 1;
  6283. break;
  6284. case CTC_DILITHIUM_LEVEL2:
  6285. case CTC_DILITHIUM_LEVEL3:
  6286. case CTC_DILITHIUM_LEVEL5:
  6287. WOLFSSL_MSG("Dilithium cert signature");
  6288. if (ssl)
  6289. ssl->options.haveDilithiumSig = 1;
  6290. else if (ctx)
  6291. ctx->haveDilithiumSig = 1;
  6292. break;
  6293. default:
  6294. WOLFSSL_MSG("Not ECDSA cert signature");
  6295. break;
  6296. }
  6297. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6298. (defined(HAVE_PQC) && defined(HAVE_LIBOQS)) || !defined(NO_RSA)
  6299. if (ssl) {
  6300. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6301. (defined(HAVE_CURVE448) && defined(HAVE_ED448))
  6302. ssl->pkCurveOID = cert->pkCurveOID;
  6303. #endif
  6304. #ifndef WC_STRICT_SIG
  6305. if (cert->keyOID == ECDSAk) {
  6306. ssl->options.haveECC = 1;
  6307. }
  6308. #ifndef NO_RSA
  6309. else if (cert->keyOID == RSAk) {
  6310. ssl->options.haveRSA = 1;
  6311. }
  6312. #ifdef WC_RSA_PSS
  6313. else if (cert->keyOID == RSAPSSk) {
  6314. ssl->options.haveRSA = 1;
  6315. }
  6316. #endif
  6317. #endif
  6318. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6319. else if (cert->keyOID == SM2k) {
  6320. ssl->options.haveECC = 1;
  6321. }
  6322. #endif
  6323. #ifdef HAVE_ED25519
  6324. else if (cert->keyOID == ED25519k) {
  6325. ssl->options.haveECC = 1;
  6326. }
  6327. #endif
  6328. #ifdef HAVE_ED448
  6329. else if (cert->keyOID == ED448k) {
  6330. ssl->options.haveECC = 1;
  6331. }
  6332. #endif
  6333. #ifdef HAVE_PQC
  6334. #ifdef HAVE_FALCON
  6335. else if (cert->keyOID == FALCON_LEVEL1k ||
  6336. cert->keyOID == FALCON_LEVEL5k) {
  6337. ssl->options.haveFalconSig = 1;
  6338. }
  6339. #endif /* HAVE_FALCON */
  6340. #ifdef HAVE_DILITHIUM
  6341. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  6342. cert->keyOID == DILITHIUM_LEVEL3k ||
  6343. cert->keyOID == DILITHIUM_LEVEL5k) {
  6344. ssl->options.haveDilithiumSig = 1;
  6345. }
  6346. #endif /* HAVE_DILITHIUM */
  6347. #endif /* HAVE_PQC */
  6348. #else
  6349. ssl->options.haveECC = ssl->options.haveECDSAsig;
  6350. #endif
  6351. }
  6352. else if (ctx) {
  6353. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  6354. ctx->pkCurveOID = cert->pkCurveOID;
  6355. #endif
  6356. #ifndef WC_STRICT_SIG
  6357. if (cert->keyOID == ECDSAk) {
  6358. ctx->haveECC = 1;
  6359. }
  6360. #ifndef NO_RSA
  6361. else if (cert->keyOID == RSAk) {
  6362. ctx->haveRSA = 1;
  6363. }
  6364. #ifdef WC_RSA_PSS
  6365. else if (cert->keyOID == RSAPSSk) {
  6366. ctx->haveRSA = 1;
  6367. }
  6368. #endif
  6369. #endif
  6370. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6371. else if (cert->keyOID == SM2k) {
  6372. ctx->haveECC = 1;
  6373. }
  6374. #endif
  6375. #ifdef HAVE_ED25519
  6376. else if (cert->keyOID == ED25519k) {
  6377. ctx->haveECC = 1;
  6378. }
  6379. #endif
  6380. #ifdef HAVE_ED448
  6381. else if (cert->keyOID == ED448k) {
  6382. ctx->haveECC = 1;
  6383. }
  6384. #endif
  6385. #ifdef HAVE_PQC
  6386. #ifdef HAVE_FALCON
  6387. else if (cert->keyOID == FALCON_LEVEL1k ||
  6388. cert->keyOID == FALCON_LEVEL5k) {
  6389. ctx->haveFalconSig = 1;
  6390. }
  6391. #endif /* HAVE_FALCON */
  6392. #ifdef HAVE_DILITHIUM
  6393. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  6394. cert->keyOID == DILITHIUM_LEVEL3k ||
  6395. cert->keyOID == DILITHIUM_LEVEL5k) {
  6396. ctx->haveDilithiumSig = 1;
  6397. }
  6398. #endif /* HAVE_DILITHIUM */
  6399. #endif /* HAVE_PQC */
  6400. #else
  6401. ctx->haveECC = ctx->haveECDSAsig;
  6402. #endif
  6403. }
  6404. #endif
  6405. /* check key size of cert unless specified not to */
  6406. switch (cert->keyOID) {
  6407. #ifndef NO_RSA
  6408. #ifdef WC_RSA_PSS
  6409. case RSAPSSk:
  6410. #endif
  6411. case RSAk:
  6412. #ifdef WOLF_PRIVATE_KEY_ID
  6413. keyType = rsa_sa_algo;
  6414. #endif
  6415. /* Determine RSA key size by parsing public key */
  6416. idx = 0;
  6417. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  6418. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  6419. if (ret < 0)
  6420. break;
  6421. if (ssl && !ssl->options.verifyNone) {
  6422. if (ssl->options.minRsaKeySz < 0 ||
  6423. keySz < (int)ssl->options.minRsaKeySz ||
  6424. keySz > (RSA_MAX_SIZE / 8)) {
  6425. ret = RSA_KEY_SIZE_E;
  6426. WOLFSSL_MSG("Certificate RSA key size too small");
  6427. }
  6428. }
  6429. else if (ctx && !ctx->verifyNone) {
  6430. if (ctx->minRsaKeySz < 0 ||
  6431. keySz < (int)ctx->minRsaKeySz ||
  6432. keySz > (RSA_MAX_SIZE / 8)) {
  6433. ret = RSA_KEY_SIZE_E;
  6434. WOLFSSL_MSG("Certificate RSA key size too small");
  6435. }
  6436. }
  6437. break;
  6438. #endif /* !NO_RSA */
  6439. #ifdef HAVE_ECC
  6440. case ECDSAk:
  6441. #ifdef WOLF_PRIVATE_KEY_ID
  6442. keyType = ecc_dsa_sa_algo;
  6443. #endif
  6444. /* Determine ECC key size based on curve */
  6445. #ifdef WOLFSSL_CUSTOM_CURVES
  6446. if (cert->pkCurveOID == 0 && cert->pkCurveSize != 0) {
  6447. keySz = cert->pkCurveSize * 8;
  6448. }
  6449. else
  6450. #endif
  6451. {
  6452. keySz = wc_ecc_get_curve_size_from_id(
  6453. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  6454. }
  6455. if (ssl && !ssl->options.verifyNone) {
  6456. if (ssl->options.minEccKeySz < 0 ||
  6457. keySz < (int)ssl->options.minEccKeySz) {
  6458. ret = ECC_KEY_SIZE_E;
  6459. WOLFSSL_MSG("Certificate ECC key size error");
  6460. }
  6461. }
  6462. else if (ctx && !ctx->verifyNone) {
  6463. if (ctx->minEccKeySz < 0 ||
  6464. keySz < (int)ctx->minEccKeySz) {
  6465. ret = ECC_KEY_SIZE_E;
  6466. WOLFSSL_MSG("Certificate ECC key size error");
  6467. }
  6468. }
  6469. break;
  6470. #endif /* HAVE_ECC */
  6471. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6472. case SM2k:
  6473. #ifdef WOLF_PRIVATE_KEY_ID
  6474. keyType = sm2_sa_algo;
  6475. #endif
  6476. /* Determine ECC key size based on curve */
  6477. keySz = wc_ecc_get_curve_size_from_id(
  6478. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  6479. if (ssl && !ssl->options.verifyNone) {
  6480. if (ssl->options.minEccKeySz < 0 ||
  6481. keySz < (int)ssl->options.minEccKeySz) {
  6482. ret = ECC_KEY_SIZE_E;
  6483. WOLFSSL_MSG("Certificate Ed key size error");
  6484. }
  6485. }
  6486. else if (ctx && !ctx->verifyNone) {
  6487. if (ctx->minEccKeySz < 0 ||
  6488. keySz < (int)ctx->minEccKeySz) {
  6489. ret = ECC_KEY_SIZE_E;
  6490. WOLFSSL_MSG("Certificate ECC key size error");
  6491. }
  6492. }
  6493. break;
  6494. #endif /* HAVE_ED25519 */
  6495. #ifdef HAVE_ED25519
  6496. case ED25519k:
  6497. #ifdef WOLF_PRIVATE_KEY_ID
  6498. keyType = ed25519_sa_algo;
  6499. #endif
  6500. /* ED25519 is fixed key size */
  6501. keySz = ED25519_KEY_SIZE;
  6502. if (ssl && !ssl->options.verifyNone) {
  6503. if (ssl->options.minEccKeySz < 0 ||
  6504. keySz < (int)ssl->options.minEccKeySz) {
  6505. ret = ECC_KEY_SIZE_E;
  6506. WOLFSSL_MSG("Certificate Ed key size error");
  6507. }
  6508. }
  6509. else if (ctx && !ctx->verifyNone) {
  6510. if (ctx->minEccKeySz < 0 ||
  6511. keySz < (int)ctx->minEccKeySz) {
  6512. ret = ECC_KEY_SIZE_E;
  6513. WOLFSSL_MSG("Certificate ECC key size error");
  6514. }
  6515. }
  6516. break;
  6517. #endif /* HAVE_ED25519 */
  6518. #ifdef HAVE_ED448
  6519. case ED448k:
  6520. #ifdef WOLF_PRIVATE_KEY_ID
  6521. keyType = ed448_sa_algo;
  6522. #endif
  6523. /* ED448 is fixed key size */
  6524. keySz = ED448_KEY_SIZE;
  6525. if (ssl && !ssl->options.verifyNone) {
  6526. if (ssl->options.minEccKeySz < 0 ||
  6527. keySz < (int)ssl->options.minEccKeySz) {
  6528. ret = ECC_KEY_SIZE_E;
  6529. WOLFSSL_MSG("Certificate Ed key size error");
  6530. }
  6531. }
  6532. else if (ctx && !ctx->verifyNone) {
  6533. if (ctx->minEccKeySz < 0 ||
  6534. keySz < (int)ctx->minEccKeySz) {
  6535. ret = ECC_KEY_SIZE_E;
  6536. WOLFSSL_MSG("Certificate ECC key size error");
  6537. }
  6538. }
  6539. break;
  6540. #endif /* HAVE_ED448 */
  6541. #if defined(HAVE_PQC)
  6542. #if defined(HAVE_FALCON)
  6543. case FALCON_LEVEL1k:
  6544. case FALCON_LEVEL5k:
  6545. /* Falcon is fixed key size */
  6546. keySz = FALCON_MAX_KEY_SIZE;
  6547. if (ssl && !ssl->options.verifyNone) {
  6548. if (ssl->options.minFalconKeySz < 0 ||
  6549. keySz < (int)ssl->options.minFalconKeySz) {
  6550. ret = FALCON_KEY_SIZE_E;
  6551. WOLFSSL_MSG("Certificate Falcon key size error");
  6552. }
  6553. }
  6554. else if (ctx && !ctx->verifyNone) {
  6555. if (ctx->minFalconKeySz < 0 ||
  6556. keySz < (int)ctx->minFalconKeySz) {
  6557. ret = FALCON_KEY_SIZE_E;
  6558. WOLFSSL_MSG("Certificate Falcon key size error");
  6559. }
  6560. }
  6561. break;
  6562. #endif /* HAVE_FALCON */
  6563. #if defined(HAVE_DILITHIUM)
  6564. case DILITHIUM_LEVEL2k:
  6565. case DILITHIUM_LEVEL3k:
  6566. case DILITHIUM_LEVEL5k:
  6567. /* Dilithium is fixed key size */
  6568. keySz = DILITHIUM_MAX_KEY_SIZE;
  6569. if (ssl && !ssl->options.verifyNone) {
  6570. if (ssl->options.minDilithiumKeySz < 0 ||
  6571. keySz < (int)ssl->options.minDilithiumKeySz) {
  6572. ret = DILITHIUM_KEY_SIZE_E;
  6573. WOLFSSL_MSG("Certificate Dilithium key size error");
  6574. }
  6575. }
  6576. else if (ctx && !ctx->verifyNone) {
  6577. if (ctx->minDilithiumKeySz < 0 ||
  6578. keySz < (int)ctx->minDilithiumKeySz) {
  6579. ret = DILITHIUM_KEY_SIZE_E;
  6580. WOLFSSL_MSG("Certificate Dilithium key size error");
  6581. }
  6582. }
  6583. break;
  6584. #endif /* HAVE_DILITHIUM */
  6585. #endif /* HAVE_PQC */
  6586. default:
  6587. WOLFSSL_MSG("No key size check done on certificate");
  6588. break; /* do no check if not a case for the key */
  6589. }
  6590. #ifdef WOLF_PRIVATE_KEY_ID
  6591. if (ssl != NULL) {
  6592. ssl->buffers.keyType = keyType;
  6593. ssl->buffers.keySz = keySz;
  6594. }
  6595. else if (ctx != NULL) {
  6596. ctx->privateKeyType = keyType;
  6597. ctx->privateKeySz = keySz;
  6598. }
  6599. #endif
  6600. FreeDecodedCert(cert);
  6601. #ifdef WOLFSSL_SMALL_STACK
  6602. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  6603. #endif
  6604. if (ret != 0) {
  6605. done = 1;
  6606. }
  6607. }
  6608. if (done == 1) {
  6609. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  6610. !defined(WOLFSSL_NO_CLIENT_AUTH))
  6611. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  6612. /* Call to over-ride status */
  6613. if ((ctx != NULL) && (ctx->cm != NULL) &&
  6614. (ctx->cm->verifyCallback != NULL)) {
  6615. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  6616. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  6617. }
  6618. }
  6619. #endif /* NO_WOLFSSL_CM_VERIFY */
  6620. return ret;
  6621. }
  6622. if (ssl && resetSuites) {
  6623. word16 havePSK = 0;
  6624. word16 haveRSA = 0;
  6625. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6626. if (ssl->options.havePSK) {
  6627. havePSK = 1;
  6628. }
  6629. #endif
  6630. #ifndef NO_RSA
  6631. haveRSA = 1;
  6632. #endif
  6633. keySz = ssl->buffers.keySz;
  6634. if (AllocateSuites(ssl) != 0)
  6635. return WOLFSSL_FAILURE;
  6636. /* let's reset suites */
  6637. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  6638. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  6639. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  6640. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  6641. ssl->options.haveAnon, TRUE, ssl->options.side);
  6642. }
  6643. else if (ctx && resetSuites) {
  6644. word16 havePSK = 0;
  6645. word16 haveRSA = 0;
  6646. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6647. if (ctx->havePSK) {
  6648. havePSK = 1;
  6649. }
  6650. #endif
  6651. #ifndef NO_RSA
  6652. haveRSA = 1;
  6653. #endif
  6654. keySz = ctx->privateKeySz;
  6655. if (AllocateCtxSuites(ctx) != 0)
  6656. return WOLFSSL_FAILURE;
  6657. /* let's reset suites */
  6658. InitSuites(ctx->suites, ctx->method->version, keySz, haveRSA,
  6659. havePSK, ctx->haveDH, ctx->haveECDSAsig,
  6660. ctx->haveECC, TRUE, ctx->haveStaticECC,
  6661. ctx->haveFalconSig, ctx->haveDilithiumSig,
  6662. #ifdef HAVE_ANON
  6663. ctx->haveAnon,
  6664. #else
  6665. FALSE,
  6666. #endif
  6667. TRUE, ctx->method->side);
  6668. }
  6669. return WOLFSSL_SUCCESS;
  6670. }
  6671. /* CA PEM file for verification, may have multiple/chain certs to process */
  6672. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6673. long sz, int format, int type, WOLFSSL* ssl, int verify)
  6674. {
  6675. long used = 0;
  6676. int ret = 0;
  6677. int gotOne = 0;
  6678. WOLFSSL_MSG("Processing CA PEM file");
  6679. while (used < sz) {
  6680. long consumed = 0;
  6681. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  6682. &consumed, 0, verify);
  6683. if (ret == MEMORY_E) {
  6684. return ret;
  6685. }
  6686. else if (ret < 0) {
  6687. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  6688. DerBuffer* der = NULL;
  6689. EncryptedInfo info;
  6690. WOLFSSL_MSG("Trying a CRL");
  6691. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  6692. NULL) == 0) {
  6693. WOLFSSL_MSG(" Processed a CRL");
  6694. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  6695. der->length, WOLFSSL_FILETYPE_ASN1);
  6696. FreeDer(&der);
  6697. used += info.consumed;
  6698. continue;
  6699. }
  6700. #endif
  6701. if (consumed > 0) { /* Made progress in file */
  6702. WOLFSSL_ERROR(ret);
  6703. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  6704. WOLFSSL_MSG("Search for other certs in file");
  6705. }
  6706. else {
  6707. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  6708. WOLFSSL_MSG("Do not continue search for other certs in file");
  6709. break;
  6710. }
  6711. }
  6712. else {
  6713. WOLFSSL_MSG(" Processed a CA");
  6714. gotOne = 1;
  6715. }
  6716. used += consumed;
  6717. }
  6718. if (gotOne) {
  6719. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  6720. return WOLFSSL_SUCCESS;
  6721. }
  6722. return ret;
  6723. }
  6724. #ifdef HAVE_CRL
  6725. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6726. long sz, int type)
  6727. {
  6728. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  6729. if (ctx == NULL)
  6730. return BAD_FUNC_ARG;
  6731. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  6732. }
  6733. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  6734. long sz, int type)
  6735. {
  6736. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  6737. if (ssl == NULL || ssl->ctx == NULL)
  6738. return BAD_FUNC_ARG;
  6739. SSL_CM_WARNING(ssl);
  6740. return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type);
  6741. }
  6742. #endif /* HAVE_CRL */
  6743. #ifdef HAVE_OCSP
  6744. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  6745. {
  6746. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  6747. if (ssl) {
  6748. SSL_CM_WARNING(ssl);
  6749. return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options);
  6750. }
  6751. else
  6752. return BAD_FUNC_ARG;
  6753. }
  6754. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  6755. {
  6756. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  6757. if (ssl) {
  6758. SSL_CM_WARNING(ssl);
  6759. return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl));
  6760. }
  6761. else
  6762. return BAD_FUNC_ARG;
  6763. }
  6764. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  6765. {
  6766. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  6767. if (ssl) {
  6768. SSL_CM_WARNING(ssl);
  6769. return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl));
  6770. }
  6771. else
  6772. return BAD_FUNC_ARG;
  6773. }
  6774. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  6775. {
  6776. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  6777. if (ssl) {
  6778. SSL_CM_WARNING(ssl);
  6779. return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl));
  6780. }
  6781. else
  6782. return BAD_FUNC_ARG;
  6783. }
  6784. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  6785. {
  6786. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6787. if (ssl) {
  6788. SSL_CM_WARNING(ssl);
  6789. return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url);
  6790. }
  6791. else
  6792. return BAD_FUNC_ARG;
  6793. }
  6794. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  6795. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6796. {
  6797. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  6798. if (ssl) {
  6799. SSL_CM_WARNING(ssl);
  6800. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  6801. return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl),
  6802. ioCb, respFreeCb, NULL);
  6803. }
  6804. else
  6805. return BAD_FUNC_ARG;
  6806. }
  6807. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  6808. {
  6809. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  6810. if (ctx)
  6811. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  6812. else
  6813. return BAD_FUNC_ARG;
  6814. }
  6815. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  6816. {
  6817. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  6818. if (ctx)
  6819. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  6820. else
  6821. return BAD_FUNC_ARG;
  6822. }
  6823. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  6824. {
  6825. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6826. if (ctx)
  6827. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  6828. else
  6829. return BAD_FUNC_ARG;
  6830. }
  6831. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  6832. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6833. {
  6834. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  6835. if (ctx)
  6836. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  6837. respFreeCb, ioCbCtx);
  6838. else
  6839. return BAD_FUNC_ARG;
  6840. }
  6841. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6842. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6843. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  6844. {
  6845. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  6846. if (ctx)
  6847. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  6848. else
  6849. return BAD_FUNC_ARG;
  6850. }
  6851. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  6852. {
  6853. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  6854. if (ctx)
  6855. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  6856. else
  6857. return BAD_FUNC_ARG;
  6858. }
  6859. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6860. {
  6861. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  6862. if (ctx)
  6863. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  6864. else
  6865. return BAD_FUNC_ARG;
  6866. }
  6867. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6868. {
  6869. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  6870. if (ctx)
  6871. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  6872. else
  6873. return BAD_FUNC_ARG;
  6874. }
  6875. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  6876. #endif /* HAVE_OCSP */
  6877. /* macro to get verify settings for AddCA */
  6878. #define GET_VERIFY_SETTING_CTX(ctx) \
  6879. ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY)
  6880. #define GET_VERIFY_SETTING_SSL(ssl) \
  6881. ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY)
  6882. #ifndef NO_FILESYSTEM
  6883. /* process a file with name fname into ctx of format and type
  6884. userChain specifies a user certificate chain to pass during handshake */
  6885. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  6886. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  6887. {
  6888. #ifdef WOLFSSL_SMALL_STACK
  6889. byte staticBuffer[1]; /* force heap usage */
  6890. #else
  6891. byte staticBuffer[FILE_BUFFER_SIZE];
  6892. #endif
  6893. byte* myBuffer = staticBuffer;
  6894. int dynamic = 0;
  6895. int ret;
  6896. long sz = 0;
  6897. XFILE file;
  6898. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  6899. #ifndef NO_CODING
  6900. const char* header = NULL;
  6901. const char* footer = NULL;
  6902. #endif
  6903. (void)crl;
  6904. (void)heapHint;
  6905. if (fname == NULL) return WOLFSSL_BAD_FILE;
  6906. file = XFOPEN(fname, "rb");
  6907. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6908. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  6909. XFCLOSE(file);
  6910. return WOLFSSL_BAD_FILE;
  6911. }
  6912. sz = XFTELL(file);
  6913. if (XFSEEK(file, 0, XSEEK_SET) != 0) {
  6914. XFCLOSE(file);
  6915. return WOLFSSL_BAD_FILE;
  6916. }
  6917. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6918. WOLFSSL_MSG("ProcessFile file size error");
  6919. XFCLOSE(file);
  6920. return WOLFSSL_BAD_FILE;
  6921. }
  6922. if (sz > (long)sizeof(staticBuffer)) {
  6923. WOLFSSL_MSG("Getting dynamic buffer");
  6924. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  6925. if (myBuffer == NULL) {
  6926. XFCLOSE(file);
  6927. return WOLFSSL_BAD_FILE;
  6928. }
  6929. dynamic = 1;
  6930. }
  6931. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6932. ret = WOLFSSL_BAD_FILE;
  6933. else {
  6934. /* Try to detect type by parsing cert header and footer */
  6935. if (type == DETECT_CERT_TYPE) {
  6936. #ifndef NO_CODING
  6937. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  6938. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6939. type = CA_TYPE;
  6940. }
  6941. #ifdef HAVE_CRL
  6942. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  6943. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6944. type = CRL_TYPE;
  6945. }
  6946. #endif
  6947. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  6948. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6949. type = CERT_TYPE;
  6950. }
  6951. else
  6952. #endif
  6953. {
  6954. WOLFSSL_MSG("Failed to detect certificate type");
  6955. if (dynamic)
  6956. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6957. XFCLOSE(file);
  6958. return WOLFSSL_BAD_CERTTYPE;
  6959. }
  6960. }
  6961. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  6962. && format == WOLFSSL_FILETYPE_PEM) {
  6963. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  6964. verify);
  6965. }
  6966. #ifdef HAVE_CRL
  6967. else if (type == CRL_TYPE)
  6968. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  6969. #endif
  6970. else
  6971. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  6972. userChain, verify);
  6973. }
  6974. XFCLOSE(file);
  6975. if (dynamic)
  6976. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6977. return ret;
  6978. }
  6979. /* loads file then loads each file in path, no c_rehash */
  6980. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  6981. const char* path, word32 flags)
  6982. {
  6983. int ret = WOLFSSL_SUCCESS;
  6984. #ifndef NO_WOLFSSL_DIR
  6985. int successCount = 0;
  6986. #endif
  6987. int verify;
  6988. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  6989. if (ctx == NULL || (file == NULL && path == NULL)) {
  6990. return WOLFSSL_FAILURE;
  6991. }
  6992. verify = GET_VERIFY_SETTING_CTX(ctx);
  6993. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  6994. verify = VERIFY_SKIP_DATE;
  6995. if (file) {
  6996. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  6997. NULL, verify);
  6998. #ifndef NO_WOLFSSL_DIR
  6999. if (ret == WOLFSSL_SUCCESS)
  7000. successCount++;
  7001. #endif
  7002. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  7003. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  7004. if (ret != WOLFSSL_SUCCESS) {
  7005. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error");
  7006. }
  7007. #endif
  7008. }
  7009. if (ret == WOLFSSL_SUCCESS && path) {
  7010. #ifndef NO_WOLFSSL_DIR
  7011. char* name = NULL;
  7012. int fileRet;
  7013. int failCount = 0;
  7014. #ifdef WOLFSSL_SMALL_STACK
  7015. ReadDirCtx* readCtx;
  7016. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  7017. DYNAMIC_TYPE_DIRCTX);
  7018. if (readCtx == NULL)
  7019. return MEMORY_E;
  7020. #else
  7021. ReadDirCtx readCtx[1];
  7022. #endif
  7023. /* try to load each regular file in path */
  7024. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  7025. while (fileRet == 0 && name) {
  7026. WOLFSSL_MSG(name); /* log file name */
  7027. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  7028. NULL, 0, NULL, verify);
  7029. if (ret != WOLFSSL_SUCCESS) {
  7030. /* handle flags for ignoring errors, skipping expired certs or
  7031. by PEM certificate header error */
  7032. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  7033. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  7034. (ret == ASN_NO_PEM_HEADER))) {
  7035. /* Do not fail here if a certificate fails to load,
  7036. continue to next file */
  7037. unsigned long err = 0;
  7038. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  7039. #if defined(WOLFSSL_QT)
  7040. ret = WOLFSSL_SUCCESS;
  7041. #endif
  7042. }
  7043. else {
  7044. WOLFSSL_ERROR(ret);
  7045. WOLFSSL_MSG("Load CA file failed, continuing");
  7046. failCount++;
  7047. }
  7048. }
  7049. else {
  7050. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  7051. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  7052. if (ret != WOLFSSL_SUCCESS) {
  7053. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. Ignoring"
  7054. "this error.");
  7055. }
  7056. #endif
  7057. successCount++;
  7058. }
  7059. fileRet = wc_ReadDirNext(readCtx, path, &name);
  7060. }
  7061. wc_ReadDirClose(readCtx);
  7062. /* pass directory read failure to response code */
  7063. if (fileRet != WC_READDIR_NOFILE) {
  7064. ret = fileRet;
  7065. #if defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH)
  7066. if (ret == BAD_PATH_ERROR &&
  7067. flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) {
  7068. /* QSslSocket always loads certs in system folder
  7069. * when it is initialized.
  7070. * Compliant with OpenSSL when flag sets.
  7071. */
  7072. ret = WOLFSSL_SUCCESS;
  7073. }
  7074. else {
  7075. /* qssl socket wants to know errors. */
  7076. WOLFSSL_ERROR(ret);
  7077. }
  7078. #endif
  7079. }
  7080. /* report failure if no files were loaded or there were failures */
  7081. else if (successCount == 0 || failCount > 0) {
  7082. /* use existing error code if exists */
  7083. #if defined(WOLFSSL_QT)
  7084. /* compliant with OpenSSL when flag sets*/
  7085. if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE))
  7086. #endif
  7087. {
  7088. ret = WOLFSSL_FAILURE;
  7089. }
  7090. }
  7091. else {
  7092. ret = WOLFSSL_SUCCESS;
  7093. }
  7094. #ifdef WOLFSSL_SMALL_STACK
  7095. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  7096. #endif
  7097. #else
  7098. ret = NOT_COMPILED_IN;
  7099. (void)flags;
  7100. #endif
  7101. }
  7102. return ret;
  7103. }
  7104. WOLFSSL_ABI
  7105. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7106. const char* path)
  7107. {
  7108. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  7109. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  7110. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  7111. }
  7112. #ifdef WOLFSSL_SYS_CA_CERTS
  7113. #ifdef USE_WINDOWS_API
  7114. static int LoadSystemCaCertsWindows(WOLFSSL_CTX* ctx, byte* loaded)
  7115. {
  7116. int ret = WOLFSSL_SUCCESS;
  7117. word32 i;
  7118. HANDLE handle = NULL;
  7119. PCCERT_CONTEXT certCtx = NULL;
  7120. LPCSTR storeNames[2] = {"ROOT", "CA"};
  7121. HCRYPTPROV_LEGACY hProv = (HCRYPTPROV_LEGACY)NULL;
  7122. if (ctx == NULL || loaded == NULL) {
  7123. ret = WOLFSSL_FAILURE;
  7124. }
  7125. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7126. i < sizeof(storeNames)/sizeof(*storeNames); ++i) {
  7127. handle = CertOpenSystemStoreA(hProv, storeNames[i]);
  7128. if (handle != NULL) {
  7129. while ((certCtx = CertEnumCertificatesInStore(handle, certCtx))
  7130. != NULL) {
  7131. if (certCtx->dwCertEncodingType == X509_ASN_ENCODING) {
  7132. if (ProcessBuffer(ctx, certCtx->pbCertEncoded,
  7133. certCtx->cbCertEncoded, WOLFSSL_FILETYPE_ASN1,
  7134. CA_TYPE, NULL, NULL, 0,
  7135. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7136. /*
  7137. * Set "loaded" as long as we've loaded one CA
  7138. * cert.
  7139. */
  7140. *loaded = 1;
  7141. }
  7142. }
  7143. }
  7144. }
  7145. else {
  7146. WOLFSSL_MSG_EX("Failed to open cert store %s.", storeNames[i]);
  7147. }
  7148. if (handle != NULL && !CertCloseStore(handle, 0)) {
  7149. WOLFSSL_MSG_EX("Failed to close cert store %s.", storeNames[i]);
  7150. ret = WOLFSSL_FAILURE;
  7151. }
  7152. }
  7153. return ret;
  7154. }
  7155. #elif defined(__APPLE__)
  7156. #if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \
  7157. && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7158. /*
  7159. * Manually obtains certificates from the system trust store and loads them
  7160. * directly into wolfSSL "the old way".
  7161. *
  7162. * As of MacOS 14.0 we are still able to use this method to access system
  7163. * certificates. Accessibility of this API is indicated by the presence of the
  7164. * Security/SecTrustSettings.h header. In the likely event that Apple removes
  7165. * access to this API on Macs, this function should be removed and the
  7166. * DoAppleNativeCertValidation() routine should be used for all devices.
  7167. */
  7168. static int LoadSystemCaCertsMac(WOLFSSL_CTX* ctx, byte* loaded)
  7169. {
  7170. int ret = WOLFSSL_SUCCESS;
  7171. word32 i;
  7172. const unsigned int trustDomains[] = {
  7173. kSecTrustSettingsDomainUser,
  7174. kSecTrustSettingsDomainAdmin,
  7175. kSecTrustSettingsDomainSystem
  7176. };
  7177. CFArrayRef certs;
  7178. OSStatus stat;
  7179. CFIndex numCerts;
  7180. CFDataRef der;
  7181. CFIndex j;
  7182. if (ctx == NULL || loaded == NULL) {
  7183. ret = WOLFSSL_FAILURE;
  7184. }
  7185. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7186. i < sizeof(trustDomains)/sizeof(*trustDomains); ++i) {
  7187. stat = SecTrustSettingsCopyCertificates(
  7188. (SecTrustSettingsDomain)trustDomains[i], &certs);
  7189. if (stat == errSecSuccess) {
  7190. numCerts = CFArrayGetCount(certs);
  7191. for (j = 0; j < numCerts; ++j) {
  7192. der = SecCertificateCopyData((SecCertificateRef)
  7193. CFArrayGetValueAtIndex(certs, j));
  7194. if (der != NULL) {
  7195. if (ProcessBuffer(ctx, CFDataGetBytePtr(der),
  7196. CFDataGetLength(der), WOLFSSL_FILETYPE_ASN1,
  7197. CA_TYPE, NULL, NULL, 0,
  7198. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7199. /*
  7200. * Set "loaded" as long as we've loaded one CA
  7201. * cert.
  7202. */
  7203. *loaded = 1;
  7204. }
  7205. CFRelease(der);
  7206. }
  7207. }
  7208. CFRelease(certs);
  7209. }
  7210. else if (stat == errSecNoTrustSettings) {
  7211. WOLFSSL_MSG_EX("No trust settings for domain %d, moving to next "
  7212. "domain.", trustDomains[i]);
  7213. }
  7214. else {
  7215. WOLFSSL_MSG_EX("SecTrustSettingsCopyCertificates failed with"
  7216. " status %d.", stat);
  7217. ret = WOLFSSL_FAILURE;
  7218. break;
  7219. }
  7220. }
  7221. return ret;
  7222. }
  7223. #endif /* defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) */
  7224. #else
  7225. /* Potential system CA certs directories on Linux/Unix distros. */
  7226. static const char* systemCaDirs[] = {
  7227. #if defined(__ANDROID__) || defined(ANDROID)
  7228. "/system/etc/security/cacerts" /* Android */
  7229. #else
  7230. "/etc/ssl/certs", /* Debian, Ubuntu, Gentoo, others */
  7231. "/etc/pki/ca-trust/source/anchors", /* Fedora, RHEL */
  7232. "/etc/pki/tls/certs" /* Older RHEL */
  7233. #endif
  7234. };
  7235. const char** wolfSSL_get_system_CA_dirs(word32* num)
  7236. {
  7237. const char** ret;
  7238. if (num == NULL) {
  7239. ret = NULL;
  7240. }
  7241. else {
  7242. ret = systemCaDirs;
  7243. *num = sizeof(systemCaDirs)/sizeof(*systemCaDirs);
  7244. }
  7245. return ret;
  7246. }
  7247. static int LoadSystemCaCertsNix(WOLFSSL_CTX* ctx, byte* loaded) {
  7248. int ret = WOLFSSL_SUCCESS;
  7249. word32 i;
  7250. if (ctx == NULL || loaded == NULL) {
  7251. ret = WOLFSSL_FAILURE;
  7252. }
  7253. for (i = 0; ret == WOLFSSL_SUCCESS &&
  7254. i < sizeof(systemCaDirs)/sizeof(*systemCaDirs); ++i) {
  7255. WOLFSSL_MSG_EX("Attempting to load system CA certs from %s.",
  7256. systemCaDirs[i]);
  7257. /*
  7258. * We want to keep trying to load more CAs even if one cert in
  7259. * the directory is bad and can't be used (e.g. if one is expired),
  7260. * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR.
  7261. */
  7262. if (wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, systemCaDirs[i],
  7263. WOLFSSL_LOAD_FLAG_IGNORE_ERR) != WOLFSSL_SUCCESS) {
  7264. WOLFSSL_MSG_EX("Failed to load CA certs from %s, trying "
  7265. "next possible location.", systemCaDirs[i]);
  7266. }
  7267. else {
  7268. WOLFSSL_MSG_EX("Loaded CA certs from %s.",
  7269. systemCaDirs[i]);
  7270. *loaded = 1;
  7271. /* Stop searching after we've loaded one directory. */
  7272. break;
  7273. }
  7274. }
  7275. return ret;
  7276. }
  7277. #endif
  7278. int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx)
  7279. {
  7280. int ret;
  7281. byte loaded = 0;
  7282. WOLFSSL_ENTER("wolfSSL_CTX_load_system_CA_certs");
  7283. #ifdef USE_WINDOWS_API
  7284. ret = LoadSystemCaCertsWindows(ctx, &loaded);
  7285. #elif defined(__APPLE__)
  7286. #if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \
  7287. && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7288. /* As of MacOS 14.0 we are still able to access system certificates and
  7289. * load them manually into wolfSSL "the old way". Accessibility of this API
  7290. * is indicated by the presence of the Security/SecTrustSettings.h header */
  7291. ret = LoadSystemCaCertsMac(ctx, &loaded);
  7292. #elif defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION)
  7293. /* For other Apple devices, Apple has removed the ability to obtain
  7294. * certificates from the trust store, so we can't use wolfSSL's built-in
  7295. * certificate validation mechanisms anymore. We instead must call into the
  7296. * Security Framework APIs to authenticate peer certificates when received.
  7297. * (see src/internal.c:DoAppleNativeCertValidation()).
  7298. * Thus, there is no CA "loading" required, but to keep behavior consistent
  7299. * with the current API (not using system CA certs unless this function has
  7300. * been called), we simply set a flag indicating that the new apple trust
  7301. * verification routine should be used later */
  7302. ctx->doAppleNativeCertValidationFlag = 1;
  7303. ret = WOLFSSL_SUCCESS;
  7304. loaded = 1;
  7305. #if FIPS_VERSION_GE(2,0) /* Gate back to cert 3389 FIPS modules */
  7306. #warning "Cryptographic operations may occur outside the FIPS module boundary" \
  7307. "Please review FIPS claims for cryptography on this Apple device"
  7308. #endif /* FIPS_VERSION_GE(2,0) */
  7309. #else
  7310. /* HAVE_SECURITY_SECXXX_H macros are set by autotools or CMake when searching
  7311. * system for the required SDK headers. If building with user_settings.h, you
  7312. * will need to manually define WOLFSSL_APPLE_NATIVE_CERT_VALIDATION
  7313. * and ensure the appropriate Security.framework headers and libraries are
  7314. * visible to your compiler */
  7315. #error "WOLFSSL_SYS_CA_CERTS on Apple devices requires Security.framework" \
  7316. " header files to be detected, or a manual override with" \
  7317. " WOLFSSL_APPLE_NATIVE_CERT_VALIDATION"
  7318. #endif
  7319. #else
  7320. ret = LoadSystemCaCertsNix(ctx, &loaded);
  7321. #endif
  7322. if (ret == WOLFSSL_SUCCESS && !loaded) {
  7323. ret = WOLFSSL_BAD_PATH;
  7324. }
  7325. WOLFSSL_LEAVE("wolfSSL_CTX_load_system_CA_certs", ret);
  7326. return ret;
  7327. }
  7328. #endif /* WOLFSSL_SYS_CA_CERTS */
  7329. #ifdef WOLFSSL_TRUST_PEER_CERT
  7330. /* Used to specify a peer cert to match when connecting
  7331. ctx : the ctx structure to load in peer cert
  7332. file: the string name of cert file
  7333. type: type of format such as PEM/DER
  7334. */
  7335. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  7336. {
  7337. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  7338. if (ctx == NULL || file == NULL) {
  7339. return WOLFSSL_FAILURE;
  7340. }
  7341. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  7342. GET_VERIFY_SETTING_CTX(ctx));
  7343. }
  7344. int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int type)
  7345. {
  7346. WOLFSSL_ENTER("wolfSSL_trust_peer_cert");
  7347. if (ssl == NULL || file == NULL) {
  7348. return WOLFSSL_FAILURE;
  7349. }
  7350. return ProcessFile(NULL, file, type, TRUSTED_PEER_TYPE, ssl, 0, NULL,
  7351. GET_VERIFY_SETTING_SSL(ssl));
  7352. }
  7353. #endif /* WOLFSSL_TRUST_PEER_CERT */
  7354. #endif /* NO_FILESYSTEM */
  7355. #ifdef HAVE_CRL
  7356. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  7357. {
  7358. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  7359. if (ssl) {
  7360. SSL_CM_WARNING(ssl);
  7361. return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options);
  7362. }
  7363. else
  7364. return BAD_FUNC_ARG;
  7365. }
  7366. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  7367. {
  7368. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  7369. if (ssl) {
  7370. SSL_CM_WARNING(ssl);
  7371. return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl));
  7372. }
  7373. else
  7374. return BAD_FUNC_ARG;
  7375. }
  7376. #ifndef NO_FILESYSTEM
  7377. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  7378. {
  7379. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  7380. if (ssl) {
  7381. SSL_CM_WARNING(ssl);
  7382. return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor);
  7383. }
  7384. else
  7385. return BAD_FUNC_ARG;
  7386. }
  7387. int wolfSSL_LoadCRLFile(WOLFSSL* ssl, const char* file, int type)
  7388. {
  7389. WOLFSSL_ENTER("wolfSSL_LoadCRLFile");
  7390. if (ssl) {
  7391. SSL_CM_WARNING(ssl);
  7392. return wolfSSL_CertManagerLoadCRLFile(SSL_CM(ssl), file, type);
  7393. }
  7394. else
  7395. return BAD_FUNC_ARG;
  7396. }
  7397. #endif
  7398. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  7399. {
  7400. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7401. if (ssl) {
  7402. SSL_CM_WARNING(ssl);
  7403. return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb);
  7404. }
  7405. else
  7406. return BAD_FUNC_ARG;
  7407. }
  7408. #ifdef HAVE_CRL_IO
  7409. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  7410. {
  7411. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7412. if (ssl) {
  7413. SSL_CM_WARNING(ssl);
  7414. return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb);
  7415. }
  7416. else
  7417. return BAD_FUNC_ARG;
  7418. }
  7419. #endif
  7420. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  7421. {
  7422. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  7423. if (ctx)
  7424. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  7425. else
  7426. return BAD_FUNC_ARG;
  7427. }
  7428. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  7429. {
  7430. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  7431. if (ctx)
  7432. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  7433. else
  7434. return BAD_FUNC_ARG;
  7435. }
  7436. #ifndef NO_FILESYSTEM
  7437. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  7438. int type, int monitor)
  7439. {
  7440. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7441. if (ctx)
  7442. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  7443. else
  7444. return BAD_FUNC_ARG;
  7445. }
  7446. int wolfSSL_CTX_LoadCRLFile(WOLFSSL_CTX* ctx, const char* file,
  7447. int type)
  7448. {
  7449. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7450. if (ctx)
  7451. return wolfSSL_CertManagerLoadCRLFile(ctx->cm, file, type);
  7452. else
  7453. return BAD_FUNC_ARG;
  7454. }
  7455. #endif
  7456. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  7457. {
  7458. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  7459. if (ctx)
  7460. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  7461. else
  7462. return BAD_FUNC_ARG;
  7463. }
  7464. #ifdef HAVE_CRL_IO
  7465. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  7466. {
  7467. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  7468. if (ctx)
  7469. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  7470. else
  7471. return BAD_FUNC_ARG;
  7472. }
  7473. #endif
  7474. #endif /* HAVE_CRL */
  7475. #ifndef NO_FILESYSTEM
  7476. #ifdef WOLFSSL_DER_LOAD
  7477. /* Add format parameter to allow DER load of CA files */
  7478. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7479. int format)
  7480. {
  7481. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  7482. if (ctx == NULL || file == NULL)
  7483. return WOLFSSL_FAILURE;
  7484. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  7485. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7486. return WOLFSSL_SUCCESS;
  7487. }
  7488. return WOLFSSL_FAILURE;
  7489. }
  7490. #endif /* WOLFSSL_DER_LOAD */
  7491. WOLFSSL_ABI
  7492. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  7493. int format)
  7494. {
  7495. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  7496. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  7497. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7498. return WOLFSSL_SUCCESS;
  7499. }
  7500. return WOLFSSL_FAILURE;
  7501. }
  7502. WOLFSSL_ABI
  7503. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  7504. int format)
  7505. {
  7506. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  7507. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  7508. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7509. return WOLFSSL_SUCCESS;
  7510. }
  7511. return WOLFSSL_FAILURE;
  7512. }
  7513. #endif /* NO_FILESYSTEM */
  7514. /* Sets the max chain depth when verifying a certificate chain. Default depth
  7515. * is set to MAX_CHAIN_DEPTH.
  7516. *
  7517. * ctx WOLFSSL_CTX structure to set depth in
  7518. * depth max depth
  7519. */
  7520. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  7521. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  7522. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  7523. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  7524. return;
  7525. }
  7526. ctx->verifyDepth = (byte)depth;
  7527. }
  7528. /* get cert chaining depth using ssl struct */
  7529. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  7530. {
  7531. if(ssl == NULL) {
  7532. return BAD_FUNC_ARG;
  7533. }
  7534. #ifndef OPENSSL_EXTRA
  7535. return MAX_CHAIN_DEPTH;
  7536. #else
  7537. return ssl->options.verifyDepth;
  7538. #endif
  7539. }
  7540. /* get cert chaining depth using ctx struct */
  7541. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  7542. {
  7543. if (ctx == NULL) {
  7544. return BAD_FUNC_ARG;
  7545. }
  7546. #ifndef OPENSSL_EXTRA
  7547. return MAX_CHAIN_DEPTH;
  7548. #else
  7549. return ctx->verifyDepth;
  7550. #endif
  7551. }
  7552. #ifndef NO_FILESYSTEM
  7553. WOLFSSL_ABI
  7554. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  7555. {
  7556. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7557. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  7558. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  7559. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7560. return WOLFSSL_SUCCESS;
  7561. }
  7562. return WOLFSSL_FAILURE;
  7563. }
  7564. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  7565. const char* file, int format)
  7566. {
  7567. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7568. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  7569. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  7570. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7571. return WOLFSSL_SUCCESS;
  7572. }
  7573. return WOLFSSL_FAILURE;
  7574. }
  7575. #ifndef NO_DH
  7576. /* server Diffie-Hellman parameters */
  7577. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  7578. const char* fname, int format)
  7579. {
  7580. #ifdef WOLFSSL_SMALL_STACK
  7581. byte staticBuffer[1]; /* force heap usage */
  7582. #else
  7583. byte staticBuffer[FILE_BUFFER_SIZE];
  7584. #endif
  7585. byte* myBuffer = staticBuffer;
  7586. int dynamic = 0;
  7587. int ret;
  7588. long sz = 0;
  7589. XFILE file;
  7590. if (ctx == NULL || fname == NULL)
  7591. return BAD_FUNC_ARG;
  7592. file = XFOPEN(fname, "rb");
  7593. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7594. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  7595. XFCLOSE(file);
  7596. return WOLFSSL_BAD_FILE;
  7597. }
  7598. sz = XFTELL(file);
  7599. if(XFSEEK(file, 0, XSEEK_SET) != 0) {
  7600. XFCLOSE(file);
  7601. return WOLFSSL_BAD_FILE;
  7602. }
  7603. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7604. WOLFSSL_MSG("SetTmpDH file size error");
  7605. XFCLOSE(file);
  7606. return WOLFSSL_BAD_FILE;
  7607. }
  7608. if (sz > (long)sizeof(staticBuffer)) {
  7609. WOLFSSL_MSG("Getting dynamic buffer");
  7610. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  7611. if (myBuffer == NULL) {
  7612. XFCLOSE(file);
  7613. return WOLFSSL_BAD_FILE;
  7614. }
  7615. dynamic = 1;
  7616. }
  7617. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7618. ret = WOLFSSL_BAD_FILE;
  7619. else {
  7620. if (ssl)
  7621. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  7622. else
  7623. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  7624. }
  7625. XFCLOSE(file);
  7626. if (dynamic)
  7627. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  7628. return ret;
  7629. }
  7630. /* server Diffie-Hellman parameters */
  7631. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  7632. {
  7633. if (ssl == NULL)
  7634. return BAD_FUNC_ARG;
  7635. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  7636. }
  7637. /* server Diffie-Hellman parameters */
  7638. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  7639. {
  7640. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  7641. }
  7642. #endif /* NO_DH */
  7643. #endif /* NO_FILESYSTEM */
  7644. #ifndef NO_CHECK_PRIVATE_KEY
  7645. /* Check private against public in certificate for match
  7646. *
  7647. * Returns WOLFSSL_SUCCESS on good private key
  7648. * WOLFSSL_FAILURE if mismatched */
  7649. static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
  7650. int devId, int isKeyLabel, int isKeyId)
  7651. {
  7652. #ifdef WOLFSSL_SMALL_STACK
  7653. DecodedCert* der = NULL;
  7654. #else
  7655. DecodedCert der[1];
  7656. #endif
  7657. word32 size;
  7658. byte* buff;
  7659. int ret = WOLFSSL_FAILURE;
  7660. WOLFSSL_ENTER("check_cert_key");
  7661. if (cert == NULL || key == NULL) {
  7662. return WOLFSSL_FAILURE;
  7663. }
  7664. #ifdef WOLFSSL_SMALL_STACK
  7665. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  7666. if (der == NULL)
  7667. return MEMORY_E;
  7668. #endif
  7669. size = cert->length;
  7670. buff = cert->buffer;
  7671. InitDecodedCert_ex(der, buff, size, heap, devId);
  7672. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  7673. FreeDecodedCert(der);
  7674. #ifdef WOLFSSL_SMALL_STACK
  7675. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7676. #endif
  7677. return WOLFSSL_FAILURE;
  7678. }
  7679. size = key->length;
  7680. buff = key->buffer;
  7681. #ifdef WOLF_PRIVATE_KEY_ID
  7682. if (devId != INVALID_DEVID) {
  7683. int type = 0;
  7684. void *pkey = NULL;
  7685. #ifndef NO_RSA
  7686. if (der->keyOID == RSAk) {
  7687. type = DYNAMIC_TYPE_RSA;
  7688. }
  7689. #ifdef WC_RSA_PSS
  7690. if (der->keyOID == RSAPSSk) {
  7691. type = DYNAMIC_TYPE_RSA;
  7692. }
  7693. #endif
  7694. #endif
  7695. #ifdef HAVE_ECC
  7696. if (der->keyOID == ECDSAk) {
  7697. type = DYNAMIC_TYPE_ECC;
  7698. }
  7699. #endif
  7700. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  7701. isKeyLabel, isKeyId, heap, devId);
  7702. #ifdef WOLF_CRYPTO_CB
  7703. if (ret == 0) {
  7704. #ifndef NO_RSA
  7705. if (der->keyOID == RSAk
  7706. #ifdef WC_RSA_PSS
  7707. || der->keyOID == RSAPSSk
  7708. #endif
  7709. ) {
  7710. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey,
  7711. der->publicKey, der->pubKeySize);
  7712. }
  7713. #endif
  7714. #ifdef HAVE_ECC
  7715. if (der->keyOID == ECDSAk) {
  7716. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey,
  7717. der->publicKey, der->pubKeySize);
  7718. }
  7719. #endif
  7720. }
  7721. #else
  7722. /* devId was set, don't check, for now */
  7723. /* TODO: Add callback for private key check? */
  7724. #endif
  7725. if (pkey != NULL) {
  7726. #ifndef NO_RSA
  7727. if (der->keyOID == RSAk
  7728. #ifdef WC_RSA_PSS
  7729. || der->keyOID == RSAPSSk
  7730. #endif
  7731. ) {
  7732. wc_FreeRsaKey((RsaKey*)pkey);
  7733. }
  7734. #endif
  7735. #ifdef HAVE_ECC
  7736. if (der->keyOID == ECDSAk) {
  7737. wc_ecc_free((ecc_key*)pkey);
  7738. }
  7739. #endif
  7740. XFREE(pkey, heap, type);
  7741. }
  7742. if (ret != CRYPTOCB_UNAVAILABLE) {
  7743. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7744. }
  7745. }
  7746. else {
  7747. /* fall through if unavailable */
  7748. ret = CRYPTOCB_UNAVAILABLE;
  7749. }
  7750. if (ret == CRYPTOCB_UNAVAILABLE)
  7751. #endif /* WOLF_PRIVATE_KEY_ID */
  7752. {
  7753. ret = wc_CheckPrivateKeyCert(buff, size, der);
  7754. ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7755. }
  7756. FreeDecodedCert(der);
  7757. #ifdef WOLFSSL_SMALL_STACK
  7758. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7759. #endif
  7760. (void)devId;
  7761. (void)isKeyLabel;
  7762. (void)isKeyId;
  7763. return ret;
  7764. }
  7765. /* Check private against public in certificate for match
  7766. *
  7767. * ctx WOLFSSL_CTX structure to check private key in
  7768. *
  7769. * Returns WOLFSSL_SUCCESS on good private key
  7770. * WOLFSSL_FAILURE if mismatched. */
  7771. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  7772. {
  7773. if (ctx == NULL) {
  7774. return WOLFSSL_FAILURE;
  7775. }
  7776. return check_cert_key(ctx->certificate, ctx->privateKey, ctx->heap,
  7777. ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId);
  7778. }
  7779. #endif /* !NO_CHECK_PRIVATE_KEY */
  7780. #ifdef OPENSSL_ALL
  7781. /**
  7782. * Return the private key of the WOLFSSL_CTX struct
  7783. * @return WOLFSSL_EVP_PKEY* The caller doesn *NOT*` free the returned object.
  7784. */
  7785. WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx)
  7786. {
  7787. const unsigned char *key;
  7788. int type;
  7789. WOLFSSL_ENTER("wolfSSL_CTX_get0_privatekey");
  7790. if (ctx == NULL || ctx->privateKey == NULL ||
  7791. ctx->privateKey->buffer == NULL) {
  7792. WOLFSSL_MSG("Bad parameter or key not set");
  7793. return NULL;
  7794. }
  7795. switch (ctx->privateKeyType) {
  7796. #ifndef NO_RSA
  7797. case rsa_sa_algo:
  7798. type = EVP_PKEY_RSA;
  7799. break;
  7800. #endif
  7801. #ifdef HAVE_ECC
  7802. case ecc_dsa_sa_algo:
  7803. type = EVP_PKEY_EC;
  7804. break;
  7805. #endif
  7806. #ifdef WOLFSSL_SM2
  7807. case sm2_sa_algo:
  7808. type = EVP_PKEY_EC;
  7809. break;
  7810. #endif
  7811. default:
  7812. /* Other key types not supported either as ssl private keys
  7813. * or in the EVP layer */
  7814. WOLFSSL_MSG("Unsupported key type");
  7815. return NULL;
  7816. }
  7817. key = ctx->privateKey->buffer;
  7818. if (ctx->privateKeyPKey != NULL)
  7819. return ctx->privateKeyPKey;
  7820. else
  7821. return wolfSSL_d2i_PrivateKey(type,
  7822. (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key,
  7823. (long)ctx->privateKey->length);
  7824. }
  7825. #endif
  7826. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7827. static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out,
  7828. const unsigned char** in, long inSz, int priv)
  7829. {
  7830. WOLFSSL_EVP_PKEY* pkey = NULL;
  7831. const unsigned char* mem;
  7832. long memSz = inSz;
  7833. WOLFSSL_ENTER("d2iGenericKey");
  7834. if (in == NULL || *in == NULL || inSz < 0) {
  7835. WOLFSSL_MSG("Bad argument");
  7836. return NULL;
  7837. }
  7838. mem = *in;
  7839. #if !defined(NO_RSA)
  7840. {
  7841. word32 keyIdx = 0;
  7842. int isRsaKey;
  7843. #ifdef WOLFSSL_SMALL_STACK
  7844. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  7845. if (rsa == NULL)
  7846. return NULL;
  7847. #else
  7848. RsaKey rsa[1];
  7849. #endif
  7850. XMEMSET(rsa, 0, sizeof(RsaKey));
  7851. /* test if RSA key */
  7852. if (priv)
  7853. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7854. wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7855. else
  7856. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7857. wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7858. wc_FreeRsaKey(rsa);
  7859. #ifdef WOLFSSL_SMALL_STACK
  7860. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  7861. #endif
  7862. if (isRsaKey) {
  7863. pkey = wolfSSL_EVP_PKEY_new();
  7864. if (pkey != NULL) {
  7865. pkey->pkey_sz = keyIdx;
  7866. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7867. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7868. DYNAMIC_TYPE_PUBLIC_KEY);
  7869. if (pkey->pkey.ptr == NULL) {
  7870. wolfSSL_EVP_PKEY_free(pkey);
  7871. return NULL;
  7872. }
  7873. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7874. pkey->type = EVP_PKEY_RSA;
  7875. if (out != NULL) {
  7876. *out = pkey;
  7877. }
  7878. pkey->ownRsa = 1;
  7879. pkey->rsa = wolfssl_rsa_d2i(NULL, mem, inSz,
  7880. priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC);
  7881. if (pkey->rsa == NULL) {
  7882. wolfSSL_EVP_PKEY_free(pkey);
  7883. return NULL;
  7884. }
  7885. return pkey;
  7886. }
  7887. else {
  7888. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  7889. }
  7890. }
  7891. }
  7892. #endif /* NO_RSA */
  7893. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  7894. {
  7895. word32 keyIdx = 0;
  7896. int isEccKey;
  7897. #ifdef WOLFSSL_SMALL_STACK
  7898. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  7899. if (ecc == NULL)
  7900. return NULL;
  7901. #else
  7902. ecc_key ecc[1];
  7903. #endif
  7904. XMEMSET(ecc, 0, sizeof(ecc_key));
  7905. if (priv)
  7906. isEccKey = wc_ecc_init(ecc) == 0 &&
  7907. wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7908. else
  7909. isEccKey = wc_ecc_init(ecc) == 0 &&
  7910. wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7911. wc_ecc_free(ecc);
  7912. #ifdef WOLFSSL_SMALL_STACK
  7913. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  7914. #endif
  7915. if (isEccKey) {
  7916. pkey = wolfSSL_EVP_PKEY_new();
  7917. if (pkey != NULL) {
  7918. pkey->pkey_sz = keyIdx;
  7919. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  7920. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7921. DYNAMIC_TYPE_PUBLIC_KEY);
  7922. if (pkey->pkey.ptr == NULL) {
  7923. wolfSSL_EVP_PKEY_free(pkey);
  7924. return NULL;
  7925. }
  7926. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7927. pkey->type = EVP_PKEY_EC;
  7928. if (out != NULL) {
  7929. *out = pkey;
  7930. }
  7931. pkey->ownEcc = 1;
  7932. pkey->ecc = wolfSSL_EC_KEY_new();
  7933. if (pkey->ecc == NULL) {
  7934. wolfSSL_EVP_PKEY_free(pkey);
  7935. return NULL;
  7936. }
  7937. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  7938. (const unsigned char*)pkey->pkey.ptr,
  7939. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7940. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7941. wolfSSL_EVP_PKEY_free(pkey);
  7942. return NULL;
  7943. }
  7944. return pkey;
  7945. }
  7946. else {
  7947. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  7948. }
  7949. }
  7950. }
  7951. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  7952. #if !defined(NO_DSA)
  7953. {
  7954. word32 keyIdx = 0;
  7955. int isDsaKey;
  7956. #ifdef WOLFSSL_SMALL_STACK
  7957. DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  7958. if (dsa == NULL)
  7959. return NULL;
  7960. #else
  7961. DsaKey dsa[1];
  7962. #endif
  7963. XMEMSET(dsa, 0, sizeof(DsaKey));
  7964. if (priv)
  7965. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7966. wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7967. else
  7968. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7969. wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7970. wc_FreeDsaKey(dsa);
  7971. #ifdef WOLFSSL_SMALL_STACK
  7972. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  7973. #endif
  7974. /* test if DSA key */
  7975. if (isDsaKey) {
  7976. pkey = wolfSSL_EVP_PKEY_new();
  7977. if (pkey != NULL) {
  7978. pkey->pkey_sz = keyIdx;
  7979. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7980. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7981. DYNAMIC_TYPE_PUBLIC_KEY);
  7982. if (pkey->pkey.ptr == NULL) {
  7983. wolfSSL_EVP_PKEY_free(pkey);
  7984. return NULL;
  7985. }
  7986. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7987. pkey->type = EVP_PKEY_DSA;
  7988. if (out != NULL) {
  7989. *out = pkey;
  7990. }
  7991. pkey->ownDsa = 1;
  7992. pkey->dsa = wolfSSL_DSA_new();
  7993. if (pkey->dsa == NULL) {
  7994. wolfSSL_EVP_PKEY_free(pkey);
  7995. return NULL;
  7996. }
  7997. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  7998. (const unsigned char*)pkey->pkey.ptr,
  7999. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  8000. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  8001. wolfSSL_EVP_PKEY_free(pkey);
  8002. return NULL;
  8003. }
  8004. return pkey;
  8005. }
  8006. else {
  8007. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  8008. }
  8009. }
  8010. }
  8011. #endif /* NO_DSA */
  8012. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  8013. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  8014. (HAVE_FIPS_VERSION > 2))
  8015. {
  8016. int isDhKey;
  8017. word32 keyIdx = 0;
  8018. #ifdef WOLFSSL_SMALL_STACK
  8019. DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  8020. if (dh == NULL)
  8021. return NULL;
  8022. #else
  8023. DhKey dh[1];
  8024. #endif
  8025. XMEMSET(dh, 0, sizeof(DhKey));
  8026. isDhKey = wc_InitDhKey(dh) == 0 &&
  8027. wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0;
  8028. wc_FreeDhKey(dh);
  8029. #ifdef WOLFSSL_SMALL_STACK
  8030. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  8031. #endif
  8032. /* test if DH key */
  8033. if (isDhKey) {
  8034. pkey = wolfSSL_EVP_PKEY_new();
  8035. if (pkey != NULL) {
  8036. pkey->pkey_sz = (int)memSz;
  8037. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8038. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8039. DYNAMIC_TYPE_PUBLIC_KEY);
  8040. if (pkey->pkey.ptr == NULL) {
  8041. wolfSSL_EVP_PKEY_free(pkey);
  8042. return NULL;
  8043. }
  8044. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  8045. pkey->type = EVP_PKEY_DH;
  8046. if (out != NULL) {
  8047. *out = pkey;
  8048. }
  8049. pkey->ownDh = 1;
  8050. pkey->dh = wolfSSL_DH_new();
  8051. if (pkey->dh == NULL) {
  8052. wolfSSL_EVP_PKEY_free(pkey);
  8053. return NULL;
  8054. }
  8055. if (wolfSSL_DH_LoadDer(pkey->dh,
  8056. (const unsigned char*)pkey->pkey.ptr,
  8057. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  8058. wolfSSL_EVP_PKEY_free(pkey);
  8059. return NULL;
  8060. }
  8061. return pkey;
  8062. }
  8063. else {
  8064. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  8065. }
  8066. }
  8067. }
  8068. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8069. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  8070. #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
  8071. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  8072. (HAVE_FIPS_VERSION > 2))
  8073. {
  8074. word32 keyIdx = 0;
  8075. DhKey* key = NULL;
  8076. int ret;
  8077. #ifdef WOLFSSL_SMALL_STACK
  8078. DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  8079. if (dh == NULL)
  8080. return NULL;
  8081. #else
  8082. DhKey dh[1];
  8083. #endif
  8084. XMEMSET(dh, 0, sizeof(DhKey));
  8085. /* test if DH-public key */
  8086. if (wc_InitDhKey(dh) != 0)
  8087. return NULL;
  8088. ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz);
  8089. wc_FreeDhKey(dh);
  8090. #ifdef WOLFSSL_SMALL_STACK
  8091. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  8092. #endif
  8093. if (ret == 0) {
  8094. pkey = wolfSSL_EVP_PKEY_new();
  8095. if (pkey != NULL) {
  8096. pkey->type = EVP_PKEY_DH;
  8097. pkey->pkey_sz = (int)memSz;
  8098. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  8099. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  8100. DYNAMIC_TYPE_PUBLIC_KEY);
  8101. if (pkey->pkey.ptr == NULL) {
  8102. wolfSSL_EVP_PKEY_free(pkey);
  8103. return NULL;
  8104. }
  8105. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  8106. if (out != NULL) {
  8107. *out = pkey;
  8108. }
  8109. pkey->ownDh = 1;
  8110. pkey->dh = wolfSSL_DH_new();
  8111. if (pkey->dh == NULL) {
  8112. wolfSSL_EVP_PKEY_free(pkey);
  8113. return NULL;
  8114. }
  8115. key = (DhKey*)pkey->dh->internal;
  8116. keyIdx = 0;
  8117. if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0)
  8118. {
  8119. int elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q |
  8120. ELEMENT_PUB;
  8121. if (priv)
  8122. elements |= ELEMENT_PRV;
  8123. if(SetDhExternal_ex(pkey->dh, elements)
  8124. == WOLFSSL_SUCCESS ) {
  8125. return pkey;
  8126. }
  8127. }
  8128. else {
  8129. wolfSSL_EVP_PKEY_free(pkey);
  8130. return NULL;
  8131. }
  8132. }
  8133. }
  8134. }
  8135. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8136. #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */
  8137. #ifdef HAVE_PQC
  8138. #ifdef HAVE_FALCON
  8139. {
  8140. int isFalcon = 0;
  8141. #ifdef WOLFSSL_SMALL_STACK
  8142. falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL,
  8143. DYNAMIC_TYPE_FALCON);
  8144. if (falcon == NULL) {
  8145. return NULL;
  8146. }
  8147. #else
  8148. falcon_key falcon[1];
  8149. #endif
  8150. if (wc_falcon_init(falcon) == 0) {
  8151. /* test if Falcon key */
  8152. if (priv) {
  8153. /* Try level 1 */
  8154. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  8155. wc_falcon_import_private_only(mem, (word32)memSz,
  8156. falcon) == 0;
  8157. if (!isFalcon) {
  8158. /* Try level 5 */
  8159. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  8160. wc_falcon_import_private_only(mem, (word32)memSz,
  8161. falcon) == 0;
  8162. }
  8163. } else {
  8164. /* Try level 1 */
  8165. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  8166. wc_falcon_import_public(mem, (word32)memSz, falcon)
  8167. == 0;
  8168. if (!isFalcon) {
  8169. /* Try level 5 */
  8170. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  8171. wc_falcon_import_public(mem, (word32)memSz,
  8172. falcon) == 0;
  8173. }
  8174. }
  8175. wc_falcon_free(falcon);
  8176. }
  8177. #ifdef WOLFSSL_SMALL_STACK
  8178. XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON);
  8179. #endif
  8180. if (isFalcon) {
  8181. /* Create a fake Falcon EVP_PKEY. In the future, we might integrate
  8182. * Falcon into the compatibility layer. */
  8183. pkey = wolfSSL_EVP_PKEY_new();
  8184. if (pkey == NULL) {
  8185. WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error");
  8186. return NULL;
  8187. }
  8188. pkey->type = EVP_PKEY_FALCON;
  8189. pkey->pkey.ptr = NULL;
  8190. pkey->pkey_sz = 0;
  8191. return pkey;
  8192. }
  8193. }
  8194. #endif /* HAVE_FALCON */
  8195. #ifdef HAVE_DILITHIUM
  8196. {
  8197. int isDilithium = 0;
  8198. #ifdef WOLFSSL_SMALL_STACK
  8199. dilithium_key *dilithium = (dilithium_key *)
  8200. XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM);
  8201. if (dilithium == NULL) {
  8202. return NULL;
  8203. }
  8204. #else
  8205. dilithium_key dilithium[1];
  8206. #endif
  8207. if (wc_dilithium_init(dilithium) == 0) {
  8208. /* Test if Dilithium key. Try all levels. */
  8209. if (priv) {
  8210. isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 &&
  8211. wc_dilithium_import_private_only(mem,
  8212. (word32)memSz, dilithium) == 0;
  8213. if (!isDilithium) {
  8214. isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 &&
  8215. wc_dilithium_import_private_only(mem,
  8216. (word32)memSz, dilithium) == 0;
  8217. }
  8218. if (!isDilithium) {
  8219. isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 &&
  8220. wc_dilithium_import_private_only(mem,
  8221. (word32)memSz, dilithium) == 0;
  8222. }
  8223. } else {
  8224. isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 &&
  8225. wc_dilithium_import_public(mem, (word32)memSz,
  8226. dilithium) == 0;
  8227. if (!isDilithium) {
  8228. isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 &&
  8229. wc_dilithium_import_public(mem, (word32)memSz,
  8230. dilithium) == 0;
  8231. }
  8232. if (!isDilithium) {
  8233. isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 &&
  8234. wc_dilithium_import_public(mem, (word32)memSz,
  8235. dilithium) == 0;
  8236. }
  8237. }
  8238. wc_dilithium_free(dilithium);
  8239. }
  8240. #ifdef WOLFSSL_SMALL_STACK
  8241. XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM);
  8242. #endif
  8243. if (isDilithium) {
  8244. /* Create a fake Dilithium EVP_PKEY. In the future, we might
  8245. * integrate Dilithium into the compatibility layer. */
  8246. pkey = wolfSSL_EVP_PKEY_new();
  8247. if (pkey == NULL) {
  8248. WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error");
  8249. return NULL;
  8250. }
  8251. pkey->type = EVP_PKEY_DILITHIUM;
  8252. pkey->pkey.ptr = NULL;
  8253. pkey->pkey_sz = 0;
  8254. return pkey;
  8255. }
  8256. }
  8257. #endif /* HAVE_DILITHIUM */
  8258. #endif /* HAVE_PQC */
  8259. if (pkey == NULL) {
  8260. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  8261. }
  8262. return pkey;
  8263. }
  8264. #endif /* OPENSSL_EXTRA || WPA_SMALL */
  8265. #ifdef OPENSSL_EXTRA
  8266. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY(
  8267. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen)
  8268. {
  8269. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8270. #ifdef WOLFSSL_PEM_TO_DER
  8271. int ret;
  8272. DerBuffer* der = NULL;
  8273. if (keyBuf == NULL || *keyBuf == NULL || keyLen <= 0) {
  8274. WOLFSSL_MSG("Bad key PEM/DER args");
  8275. return NULL;
  8276. }
  8277. ret = PemToDer(*keyBuf, keyLen, PRIVATEKEY_TYPE, &der, NULL, NULL, NULL);
  8278. if (ret < 0) {
  8279. WOLFSSL_MSG("Not PEM format");
  8280. ret = AllocDer(&der, (word32)keyLen, PRIVATEKEY_TYPE, NULL);
  8281. if (ret == 0) {
  8282. XMEMCPY(der->buffer, *keyBuf, keyLen);
  8283. }
  8284. }
  8285. if (ret == 0) {
  8286. /* Verify this is PKCS8 Key */
  8287. word32 inOutIdx = 0;
  8288. word32 algId;
  8289. ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId);
  8290. if (ret >= 0) {
  8291. ret = 0; /* good DER */
  8292. }
  8293. }
  8294. if (ret == 0) {
  8295. pkcs8 = wolfSSL_EVP_PKEY_new();
  8296. if (pkcs8 == NULL)
  8297. ret = MEMORY_E;
  8298. }
  8299. if (ret == 0) {
  8300. pkcs8->pkey.ptr = (char*)XMALLOC(der->length, NULL,
  8301. DYNAMIC_TYPE_PUBLIC_KEY);
  8302. if (pkcs8->pkey.ptr == NULL)
  8303. ret = MEMORY_E;
  8304. }
  8305. if (ret == 0) {
  8306. XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length);
  8307. pkcs8->pkey_sz = der->length;
  8308. }
  8309. FreeDer(&der);
  8310. if (ret != 0) {
  8311. wolfSSL_EVP_PKEY_free(pkcs8);
  8312. pkcs8 = NULL;
  8313. }
  8314. if (pkey != NULL) {
  8315. *pkey = pkcs8;
  8316. }
  8317. #else
  8318. (void)bio;
  8319. (void)pkey;
  8320. #endif /* WOLFSSL_PEM_TO_DER */
  8321. return pkcs8;
  8322. }
  8323. #ifndef NO_BIO
  8324. /* put SSL type in extra for now, not very common */
  8325. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  8326. *
  8327. * bio input bio to read DER from
  8328. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  8329. * structure.
  8330. *
  8331. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  8332. * case.
  8333. */
  8334. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  8335. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  8336. {
  8337. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8338. #ifdef WOLFSSL_PEM_TO_DER
  8339. unsigned char* mem = NULL;
  8340. int memSz;
  8341. WOLFSSL_ENTER("wolfSSL_d2i_PKCS8_PKEY_bio");
  8342. if (bio == NULL) {
  8343. return NULL;
  8344. }
  8345. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  8346. return NULL;
  8347. }
  8348. pkcs8 = wolfSSL_d2i_PKCS8_PKEY(pkey, (const unsigned char**)&mem, memSz);
  8349. #else
  8350. (void)bio;
  8351. (void)pkey;
  8352. #endif /* WOLFSSL_PEM_TO_DER */
  8353. return pkcs8;
  8354. }
  8355. /* expecting DER format public key
  8356. *
  8357. * bio input bio to read DER from
  8358. * out If not NULL then this pointer will be overwritten with a new
  8359. * WOLFSSL_EVP_PKEY pointer
  8360. *
  8361. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  8362. */
  8363. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  8364. WOLFSSL_EVP_PKEY** out)
  8365. {
  8366. unsigned char* mem;
  8367. long memSz;
  8368. WOLFSSL_EVP_PKEY* pkey = NULL;
  8369. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio");
  8370. if (bio == NULL) {
  8371. return NULL;
  8372. }
  8373. (void)out;
  8374. memSz = wolfSSL_BIO_get_len(bio);
  8375. if (memSz <= 0) {
  8376. return NULL;
  8377. }
  8378. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8379. if (mem == NULL) {
  8380. return NULL;
  8381. }
  8382. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  8383. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  8384. if (out != NULL && pkey != NULL) {
  8385. *out = pkey;
  8386. }
  8387. }
  8388. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8389. return pkey;
  8390. }
  8391. #endif /* !NO_BIO */
  8392. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  8393. *
  8394. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  8395. * in DER buffer to convert
  8396. * inSz size of in buffer
  8397. *
  8398. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  8399. * on fail
  8400. */
  8401. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  8402. const unsigned char** in, long inSz)
  8403. {
  8404. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  8405. return d2iGenericKey(out, in, inSz, 0);
  8406. }
  8407. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_ASN) && \
  8408. !defined(NO_PWDBASED)
  8409. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  8410. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  8411. {
  8412. int sz;
  8413. word16 pkcs8HeaderSz;
  8414. if (!key || !key->pkey_sz)
  8415. return WOLFSSL_FATAL_ERROR;
  8416. /* return the key without PKCS8 for compatibility */
  8417. /* if pkcs8HeaderSz is invalid, use 0 and return all of pkey */
  8418. pkcs8HeaderSz = 0;
  8419. if (key->pkey_sz > key->pkcs8HeaderSz)
  8420. pkcs8HeaderSz = key->pkcs8HeaderSz;
  8421. sz = key->pkey_sz - pkcs8HeaderSz;
  8422. if (der) {
  8423. unsigned char* pt = (unsigned char*)key->pkey.ptr;
  8424. if (*der) {
  8425. /* since this function signature has no size value passed in it is
  8426. * assumed that the user has allocated a large enough buffer */
  8427. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8428. *der += sz;
  8429. }
  8430. else {
  8431. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  8432. if (*der == NULL) {
  8433. return WOLFSSL_FATAL_ERROR;
  8434. }
  8435. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8436. }
  8437. }
  8438. return sz;
  8439. }
  8440. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  8441. {
  8442. return wolfSSL_i2d_PublicKey(key, der);
  8443. }
  8444. #endif /* OPENSSL_EXTRA && !NO_CERTS && !NO_ASN && !NO_PWDBASED */
  8445. static WOLFSSL_EVP_PKEY* _d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8446. const unsigned char **in, long inSz, int priv)
  8447. {
  8448. int ret = 0;
  8449. word32 idx = 0, algId;
  8450. word16 pkcs8HeaderSz = 0;
  8451. WOLFSSL_EVP_PKEY* local;
  8452. int opt;
  8453. (void)opt;
  8454. if (in == NULL || inSz < 0) {
  8455. WOLFSSL_MSG("Bad argument");
  8456. return NULL;
  8457. }
  8458. if (priv == 1) {
  8459. /* Check if input buffer has PKCS8 header. In the case that it does not
  8460. * have a PKCS8 header then do not error out. */
  8461. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx,
  8462. (word32)inSz, &algId)) > 0) {
  8463. WOLFSSL_MSG("Found PKCS8 header");
  8464. pkcs8HeaderSz = (word16)idx;
  8465. if ((type == EVP_PKEY_RSA && algId != RSAk
  8466. #ifdef WC_RSA_PSS
  8467. && algId != RSAPSSk
  8468. #endif
  8469. ) ||
  8470. (type == EVP_PKEY_EC && algId != ECDSAk) ||
  8471. (type == EVP_PKEY_DSA && algId != DSAk) ||
  8472. (type == EVP_PKEY_DH && algId != DHk)) {
  8473. WOLFSSL_MSG("PKCS8 does not match EVP key type");
  8474. return NULL;
  8475. }
  8476. (void)idx; /* not used */
  8477. }
  8478. else {
  8479. if (ret != ASN_PARSE_E) {
  8480. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 "
  8481. "header");
  8482. return NULL;
  8483. }
  8484. }
  8485. }
  8486. if (out != NULL && *out != NULL) {
  8487. wolfSSL_EVP_PKEY_free(*out);
  8488. *out = NULL;
  8489. }
  8490. local = wolfSSL_EVP_PKEY_new();
  8491. if (local == NULL) {
  8492. return NULL;
  8493. }
  8494. local->type = type;
  8495. local->pkey_sz = (int)inSz;
  8496. local->pkcs8HeaderSz = pkcs8HeaderSz;
  8497. local->pkey.ptr = (char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  8498. if (local->pkey.ptr == NULL) {
  8499. wolfSSL_EVP_PKEY_free(local);
  8500. local = NULL;
  8501. return NULL;
  8502. }
  8503. else {
  8504. XMEMCPY(local->pkey.ptr, *in, inSz);
  8505. }
  8506. switch (type) {
  8507. #ifndef NO_RSA
  8508. case EVP_PKEY_RSA:
  8509. opt = priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC;
  8510. local->ownRsa = 1;
  8511. local->rsa = wolfssl_rsa_d2i(NULL,
  8512. (const unsigned char*)local->pkey.ptr, local->pkey_sz, opt);
  8513. if (local->rsa == NULL) {
  8514. wolfSSL_EVP_PKEY_free(local);
  8515. return NULL;
  8516. }
  8517. break;
  8518. #endif /* NO_RSA */
  8519. #ifdef HAVE_ECC
  8520. case EVP_PKEY_EC:
  8521. local->ownEcc = 1;
  8522. local->ecc = wolfSSL_EC_KEY_new();
  8523. if (local->ecc == NULL) {
  8524. wolfSSL_EVP_PKEY_free(local);
  8525. return NULL;
  8526. }
  8527. opt = priv ? WOLFSSL_EC_KEY_LOAD_PRIVATE :
  8528. WOLFSSL_EC_KEY_LOAD_PUBLIC;
  8529. if (wolfSSL_EC_KEY_LoadDer_ex(local->ecc,
  8530. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8531. opt)
  8532. != WOLFSSL_SUCCESS) {
  8533. wolfSSL_EVP_PKEY_free(local);
  8534. return NULL;
  8535. }
  8536. break;
  8537. #endif /* HAVE_ECC */
  8538. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  8539. #ifndef NO_DSA
  8540. case EVP_PKEY_DSA:
  8541. local->ownDsa = 1;
  8542. local->dsa = wolfSSL_DSA_new();
  8543. if (local->dsa == NULL) {
  8544. wolfSSL_EVP_PKEY_free(local);
  8545. return NULL;
  8546. }
  8547. opt = priv ? WOLFSSL_DSA_LOAD_PRIVATE : WOLFSSL_DSA_LOAD_PUBLIC;
  8548. if (wolfSSL_DSA_LoadDer_ex(local->dsa,
  8549. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8550. opt)
  8551. != WOLFSSL_SUCCESS) {
  8552. wolfSSL_EVP_PKEY_free(local);
  8553. return NULL;
  8554. }
  8555. break;
  8556. #endif /* NO_DSA */
  8557. #ifndef NO_DH
  8558. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  8559. case EVP_PKEY_DH:
  8560. local->ownDh = 1;
  8561. local->dh = wolfSSL_DH_new();
  8562. if (local->dh == NULL) {
  8563. wolfSSL_EVP_PKEY_free(local);
  8564. return NULL;
  8565. }
  8566. if (wolfSSL_DH_LoadDer(local->dh,
  8567. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  8568. != WOLFSSL_SUCCESS) {
  8569. wolfSSL_EVP_PKEY_free(local);
  8570. return NULL;
  8571. }
  8572. break;
  8573. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8574. #endif /* HAVE_DH */
  8575. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  8576. default:
  8577. WOLFSSL_MSG("Unsupported key type");
  8578. wolfSSL_EVP_PKEY_free(local);
  8579. return NULL;
  8580. }
  8581. /* advance pointer with success */
  8582. if (local != NULL) {
  8583. if (local->pkey_sz <= (int)inSz) {
  8584. *in += local->pkey_sz;
  8585. }
  8586. if (out != NULL) {
  8587. *out = local;
  8588. }
  8589. }
  8590. return local;
  8591. }
  8592. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8593. const unsigned char **in, long inSz)
  8594. {
  8595. WOLFSSL_ENTER("wolfSSL_d2i_PublicKey");
  8596. return _d2i_PublicKey(type, out, in, inSz, 0);
  8597. }
  8598. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  8599. *
  8600. * type type of key
  8601. * out newly created WOLFSSL_EVP_PKEY structure
  8602. * in pointer to input key DER
  8603. * inSz size of in buffer
  8604. *
  8605. * On success a non null pointer is returned and the pointer in is advanced the
  8606. * same number of bytes read.
  8607. */
  8608. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  8609. const unsigned char **in, long inSz)
  8610. {
  8611. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  8612. return _d2i_PublicKey(type, out, in, inSz, 1);
  8613. }
  8614. #ifdef WOLF_PRIVATE_KEY_ID
  8615. /* Create an EVP structure for use with crypto callbacks */
  8616. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_id(int type, WOLFSSL_EVP_PKEY** out,
  8617. void* heap, int devId)
  8618. {
  8619. WOLFSSL_EVP_PKEY* local;
  8620. if (out != NULL && *out != NULL) {
  8621. wolfSSL_EVP_PKEY_free(*out);
  8622. *out = NULL;
  8623. }
  8624. local = wolfSSL_EVP_PKEY_new_ex(heap);
  8625. if (local == NULL) {
  8626. return NULL;
  8627. }
  8628. local->type = type;
  8629. local->pkey_sz = 0;
  8630. local->pkcs8HeaderSz = 0;
  8631. switch (type) {
  8632. #ifndef NO_RSA
  8633. case EVP_PKEY_RSA:
  8634. {
  8635. RsaKey* key;
  8636. local->ownRsa = 1;
  8637. local->rsa = wolfSSL_RSA_new_ex(heap, devId);
  8638. if (local->rsa == NULL) {
  8639. wolfSSL_EVP_PKEY_free(local);
  8640. return NULL;
  8641. }
  8642. key = (RsaKey*)local->rsa->internal;
  8643. #ifdef WOLF_CRYPTO_CB
  8644. key->devId = devId;
  8645. #endif
  8646. (void)key;
  8647. local->rsa->inSet = 1;
  8648. break;
  8649. }
  8650. #endif /* !NO_RSA */
  8651. #ifdef HAVE_ECC
  8652. case EVP_PKEY_EC:
  8653. {
  8654. ecc_key* key;
  8655. local->ownEcc = 1;
  8656. local->ecc = wolfSSL_EC_KEY_new_ex(heap, devId);
  8657. if (local->ecc == NULL) {
  8658. wolfSSL_EVP_PKEY_free(local);
  8659. return NULL;
  8660. }
  8661. key = (ecc_key*)local->ecc->internal;
  8662. #ifdef WOLF_CRYPTO_CB
  8663. key->devId = devId;
  8664. #endif
  8665. key->type = ECC_PRIVATEKEY;
  8666. /* key is required to have a key size / curve set, although
  8667. * actual one used is determined by devId callback function */
  8668. wc_ecc_set_curve(key, ECDHE_SIZE, ECC_CURVE_DEF);
  8669. local->ecc->inSet = 1;
  8670. break;
  8671. }
  8672. #endif /* HAVE_ECC */
  8673. default:
  8674. WOLFSSL_MSG("Unsupported private key id type");
  8675. wolfSSL_EVP_PKEY_free(local);
  8676. return NULL;
  8677. }
  8678. if (local != NULL && out != NULL) {
  8679. *out = local;
  8680. }
  8681. return local;
  8682. }
  8683. #endif /* WOLF_PRIVATE_KEY_ID */
  8684. #ifndef NO_CERTS /* // NOLINT(readability-redundant-preprocessor) */
  8685. #ifndef NO_CHECK_PRIVATE_KEY
  8686. /* Check private against public in certificate for match
  8687. *
  8688. * ssl WOLFSSL structure to check private key in
  8689. *
  8690. * Returns WOLFSSL_SUCCESS on good private key
  8691. * WOLFSSL_FAILURE if mismatched. */
  8692. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  8693. {
  8694. if (ssl == NULL) {
  8695. return WOLFSSL_FAILURE;
  8696. }
  8697. return check_cert_key(ssl->buffers.certificate, ssl->buffers.key, ssl->heap,
  8698. ssl->buffers.keyDevId, ssl->buffers.keyLabel, ssl->buffers.keyId);
  8699. }
  8700. #endif /* !NO_CHECK_PRIVATE_KEY */
  8701. #endif /* !NO_CERTS */
  8702. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8703. {
  8704. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8705. if (ssl == NULL || pkey == NULL ) {
  8706. return WOLFSSL_FAILURE;
  8707. }
  8708. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8709. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8710. }
  8711. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8712. long derSz)
  8713. {
  8714. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8715. if (ssl == NULL || der == NULL ) {
  8716. return WOLFSSL_FAILURE;
  8717. }
  8718. (void)pri; /* type of private key */
  8719. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8720. }
  8721. /******************************************************************************
  8722. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8723. *
  8724. * RETURNS:
  8725. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8726. */
  8727. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8728. unsigned char* der, long derSz)
  8729. {
  8730. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8731. if (ctx == NULL || der == NULL ) {
  8732. return WOLFSSL_FAILURE;
  8733. }
  8734. (void)pri; /* type of private key */
  8735. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8736. }
  8737. #ifndef NO_RSA
  8738. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8739. {
  8740. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8741. if (ssl == NULL || der == NULL ) {
  8742. return WOLFSSL_FAILURE;
  8743. }
  8744. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8745. }
  8746. #endif
  8747. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8748. {
  8749. long idx;
  8750. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8751. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8752. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8753. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8754. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8755. return WOLFSSL_SUCCESS;
  8756. }
  8757. }
  8758. (void)idx;
  8759. return WOLFSSL_FAILURE;
  8760. }
  8761. #endif /* OPENSSL_EXTRA */
  8762. #if defined(HAVE_RPK)
  8763. /* Confirm that all the byte data in the buffer is unique.
  8764. * return 1 if all the byte data in the buffer is unique, otherwise 0.
  8765. */
  8766. static int isArrayUnique(const char* buf, size_t len)
  8767. {
  8768. size_t i, j;
  8769. /* check the array is unique */
  8770. for (i = 0; i < len -1; ++i) {
  8771. for (j = i+ 1; j < len; ++j) {
  8772. if (buf[i] == buf[j]) {
  8773. return 0;
  8774. }
  8775. }
  8776. }
  8777. return 1;
  8778. }
  8779. /* Set user preference for the client_cert_type exetnsion.
  8780. * Takes byte array containing cert types the caller can provide to its peer.
  8781. * Cert types are in preferred order in the array.
  8782. */
  8783. WOLFSSL_API int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx,
  8784. const char* buf, int bufLen)
  8785. {
  8786. int i;
  8787. if (ctx == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) {
  8788. return BAD_FUNC_ARG;
  8789. }
  8790. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  8791. if (buf == NULL || bufLen == 0) {
  8792. ctx->rpkConfig.preferred_ClientCertTypeCnt = 1;
  8793. ctx->rpkConfig.preferred_ClientCertTypes[0]= WOLFSSL_CERT_TYPE_X509;
  8794. ctx->rpkConfig.preferred_ClientCertTypes[1]= WOLFSSL_CERT_TYPE_X509;
  8795. return WOLFSSL_SUCCESS;
  8796. }
  8797. if (!isArrayUnique(buf, bufLen))
  8798. return BAD_FUNC_ARG;
  8799. for (i = 0; i < bufLen; i++){
  8800. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  8801. return BAD_FUNC_ARG;
  8802. ctx->rpkConfig.preferred_ClientCertTypes[i] = buf[i];
  8803. }
  8804. ctx->rpkConfig.preferred_ClientCertTypeCnt = bufLen;
  8805. return WOLFSSL_SUCCESS;
  8806. }
  8807. /* Set user preference for the server_cert_type exetnsion.
  8808. * Takes byte array containing cert types the caller can provide to its peer.
  8809. * Cert types are in preferred order in the array.
  8810. */
  8811. WOLFSSL_API int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx,
  8812. const char* buf, int bufLen)
  8813. {
  8814. int i;
  8815. if (ctx == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) {
  8816. return BAD_FUNC_ARG;
  8817. }
  8818. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  8819. if (buf == NULL || bufLen == 0) {
  8820. ctx->rpkConfig.preferred_ServerCertTypeCnt = 1;
  8821. ctx->rpkConfig.preferred_ServerCertTypes[0]= WOLFSSL_CERT_TYPE_X509;
  8822. ctx->rpkConfig.preferred_ServerCertTypes[1]= WOLFSSL_CERT_TYPE_X509;
  8823. return WOLFSSL_SUCCESS;
  8824. }
  8825. if (!isArrayUnique(buf, bufLen))
  8826. return BAD_FUNC_ARG;
  8827. for (i = 0; i < bufLen; i++){
  8828. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  8829. return BAD_FUNC_ARG;
  8830. ctx->rpkConfig.preferred_ServerCertTypes[i] = buf[i];
  8831. }
  8832. ctx->rpkConfig.preferred_ServerCertTypeCnt = bufLen;
  8833. return WOLFSSL_SUCCESS;
  8834. }
  8835. /* Set user preference for the client_cert_type exetnsion.
  8836. * Takes byte array containing cert types the caller can provide to its peer.
  8837. * Cert types are in preferred order in the array.
  8838. */
  8839. WOLFSSL_API int wolfSSL_set_client_cert_type(WOLFSSL* ssl,
  8840. const char* buf, int bufLen)
  8841. {
  8842. int i;
  8843. if (ssl == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) {
  8844. return BAD_FUNC_ARG;
  8845. }
  8846. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  8847. if (buf == NULL || bufLen == 0) {
  8848. ssl->options.rpkConfig.preferred_ClientCertTypeCnt = 1;
  8849. ssl->options.rpkConfig.preferred_ClientCertTypes[0]
  8850. = WOLFSSL_CERT_TYPE_X509;
  8851. ssl->options.rpkConfig.preferred_ClientCertTypes[1]
  8852. = WOLFSSL_CERT_TYPE_X509;
  8853. return WOLFSSL_SUCCESS;
  8854. }
  8855. if (!isArrayUnique(buf, bufLen))
  8856. return BAD_FUNC_ARG;
  8857. for (i = 0; i < bufLen; i++){
  8858. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  8859. return BAD_FUNC_ARG;
  8860. ssl->options.rpkConfig.preferred_ClientCertTypes[i] = buf[i];
  8861. }
  8862. ssl->options.rpkConfig.preferred_ClientCertTypeCnt = bufLen;
  8863. return WOLFSSL_SUCCESS;
  8864. }
  8865. /* Set user preference for the server_cert_type exetnsion.
  8866. * Takes byte array containing cert types the caller can provide to its peer.
  8867. * Cert types are in preferred order in the array.
  8868. */
  8869. WOLFSSL_API int wolfSSL_set_server_cert_type(WOLFSSL* ssl,
  8870. const char* buf, int bufLen)
  8871. {
  8872. int i;
  8873. if (ssl == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) {
  8874. return BAD_FUNC_ARG;
  8875. }
  8876. /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/
  8877. if (buf == NULL || bufLen == 0) {
  8878. ssl->options.rpkConfig.preferred_ServerCertTypeCnt = 1;
  8879. ssl->options.rpkConfig.preferred_ServerCertTypes[0]
  8880. = WOLFSSL_CERT_TYPE_X509;
  8881. ssl->options.rpkConfig.preferred_ServerCertTypes[1]
  8882. = WOLFSSL_CERT_TYPE_X509;
  8883. return WOLFSSL_SUCCESS;
  8884. }
  8885. if (!isArrayUnique(buf, bufLen))
  8886. return BAD_FUNC_ARG;
  8887. for (i = 0; i < bufLen; i++){
  8888. if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509)
  8889. return BAD_FUNC_ARG;
  8890. ssl->options.rpkConfig.preferred_ServerCertTypes[i] = buf[i];
  8891. }
  8892. ssl->options.rpkConfig.preferred_ServerCertTypeCnt = bufLen;
  8893. return WOLFSSL_SUCCESS;
  8894. }
  8895. /* get negotiated certificate type value and return it to the second parameter.
  8896. * cert type value:
  8897. * -1: WOLFSSL_CERT_TYPE_UNKNOWN
  8898. * 0: WOLFSSL_CERT_TYPE_X509
  8899. * 2: WOLFSSL_CERT_TYPE_RPK
  8900. * return WOLFSSL_SUCCESS on success, otherwise negative value.
  8901. * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for
  8902. * cert type.
  8903. */
  8904. WOLFSSL_API int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp)
  8905. {
  8906. int ret = WOLFSSL_SUCCESS;
  8907. if (ssl == NULL || tp == NULL)
  8908. return BAD_FUNC_ARG;
  8909. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8910. if (ssl->options.rpkState.received_ClientCertTypeCnt == 1)
  8911. *tp = ssl->options.rpkState.received_ClientCertTypes[0];
  8912. else
  8913. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  8914. }
  8915. else {
  8916. if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1)
  8917. *tp = ssl->options.rpkState.sending_ClientCertTypes[0];
  8918. else
  8919. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  8920. }
  8921. return ret;
  8922. }
  8923. /* get negotiated certificate type value and return it to the second parameter.
  8924. * cert type value:
  8925. * -1: WOLFSSL_CERT_TYPE_UNKNOWN
  8926. * 0: WOLFSSL_CERT_TYPE_X509
  8927. * 2: WOLFSSL_CERT_TYPE_RPK
  8928. * return WOLFSSL_SUCCESS on success, otherwise negative value.
  8929. * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for
  8930. * cert type.
  8931. */
  8932. WOLFSSL_API int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp)
  8933. {
  8934. int ret = WOLFSSL_SUCCESS;
  8935. if (ssl == NULL || tp == NULL)
  8936. return BAD_FUNC_ARG;
  8937. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8938. if (ssl->options.rpkState.received_ServerCertTypeCnt == 1)
  8939. *tp = ssl->options.rpkState.received_ServerCertTypes[0];
  8940. else
  8941. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  8942. }
  8943. else {
  8944. if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1)
  8945. *tp = ssl->options.rpkState.sending_ServerCertTypes[0];
  8946. else
  8947. *tp = WOLFSSL_CERT_TYPE_UNKNOWN;
  8948. }
  8949. return ret;
  8950. }
  8951. #endif /* HAVE_RPK */
  8952. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8953. int derSz)
  8954. {
  8955. long idx;
  8956. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8957. if (der != NULL && ssl != NULL) {
  8958. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8959. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8960. return WOLFSSL_SUCCESS;
  8961. }
  8962. }
  8963. (void)idx;
  8964. return WOLFSSL_FAILURE;
  8965. }
  8966. #ifndef NO_FILESYSTEM
  8967. WOLFSSL_ABI
  8968. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8969. {
  8970. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8971. if (ssl == NULL) {
  8972. return BAD_FUNC_ARG;
  8973. }
  8974. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8975. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8976. return WOLFSSL_SUCCESS;
  8977. }
  8978. return WOLFSSL_FAILURE;
  8979. }
  8980. WOLFSSL_ABI
  8981. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8982. {
  8983. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8984. if (ssl == NULL) {
  8985. return BAD_FUNC_ARG;
  8986. }
  8987. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8988. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8989. return WOLFSSL_SUCCESS;
  8990. }
  8991. return WOLFSSL_FAILURE;
  8992. }
  8993. WOLFSSL_ABI
  8994. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8995. {
  8996. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8997. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8998. if (ssl == NULL) {
  8999. return BAD_FUNC_ARG;
  9000. }
  9001. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  9002. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9003. return WOLFSSL_SUCCESS;
  9004. }
  9005. return WOLFSSL_FAILURE;
  9006. }
  9007. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  9008. int format)
  9009. {
  9010. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  9011. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  9012. if (ssl == NULL) {
  9013. return BAD_FUNC_ARG;
  9014. }
  9015. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  9016. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  9017. return WOLFSSL_SUCCESS;
  9018. }
  9019. return WOLFSSL_FAILURE;
  9020. }
  9021. #endif /* !NO_FILESYSTEM */
  9022. #ifdef HAVE_ECC
  9023. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  9024. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  9025. {
  9026. if (ctx == NULL)
  9027. return BAD_FUNC_ARG;
  9028. /* if 0 then get from loaded private key */
  9029. if (sz == 0) {
  9030. /* applies only to ECDSA */
  9031. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  9032. return WOLFSSL_SUCCESS;
  9033. if (ctx->privateKeySz == 0) {
  9034. WOLFSSL_MSG("Must set private key/cert first");
  9035. return BAD_FUNC_ARG;
  9036. }
  9037. sz = (word16)ctx->privateKeySz;
  9038. }
  9039. /* check size */
  9040. #if ECC_MIN_KEY_SZ > 0
  9041. if (sz < ECC_MINSIZE)
  9042. return BAD_FUNC_ARG;
  9043. #endif
  9044. if (sz > ECC_MAXSIZE)
  9045. return BAD_FUNC_ARG;
  9046. ctx->eccTempKeySz = sz;
  9047. return WOLFSSL_SUCCESS;
  9048. }
  9049. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  9050. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  9051. {
  9052. if (ssl == NULL)
  9053. return BAD_FUNC_ARG;
  9054. /* check size */
  9055. #if ECC_MIN_KEY_SZ > 0
  9056. if (sz < ECC_MINSIZE)
  9057. return BAD_FUNC_ARG;
  9058. #endif
  9059. if (sz > ECC_MAXSIZE)
  9060. return BAD_FUNC_ARG;
  9061. ssl->eccTempKeySz = sz;
  9062. return WOLFSSL_SUCCESS;
  9063. }
  9064. #endif /* HAVE_ECC */
  9065. #ifdef OPENSSL_EXTRA
  9066. #ifndef NO_FILESYSTEM
  9067. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  9068. int format)
  9069. {
  9070. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey_file");
  9071. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  9072. }
  9073. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  9074. {
  9075. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  9076. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  9077. }
  9078. #endif /* NO_FILESYSTEM */
  9079. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  9080. * of master secret.
  9081. *
  9082. * ses : a session from completed TLS/SSL handshake
  9083. * out : buffer to hold copy of master secret
  9084. * outSz : size of out buffer
  9085. * returns : number of bytes copied into out buffer on success
  9086. * less then or equal to 0 is considered a failure case
  9087. */
  9088. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  9089. unsigned char* out, int outSz)
  9090. {
  9091. int size;
  9092. ses = ClientSessionToSession(ses);
  9093. if (outSz == 0) {
  9094. return SECRET_LEN;
  9095. }
  9096. if (ses == NULL || out == NULL || outSz < 0) {
  9097. return 0;
  9098. }
  9099. if (outSz > SECRET_LEN) {
  9100. size = SECRET_LEN;
  9101. }
  9102. else {
  9103. size = outSz;
  9104. }
  9105. XMEMCPY(out, ses->masterSecret, size);
  9106. return size;
  9107. }
  9108. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  9109. {
  9110. (void)ses;
  9111. return SECRET_LEN;
  9112. }
  9113. #ifdef WOLFSSL_EARLY_DATA
  9114. unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session)
  9115. {
  9116. return session->maxEarlyDataSz;
  9117. }
  9118. #endif /* WOLFSSL_EARLY_DATA */
  9119. #endif /* OPENSSL_EXTRA */
  9120. typedef struct {
  9121. byte verifyPeer:1;
  9122. byte verifyNone:1;
  9123. byte failNoCert:1;
  9124. byte failNoCertxPSK:1;
  9125. byte verifyPostHandshake:1;
  9126. } SetVerifyOptions;
  9127. static SetVerifyOptions ModeToVerifyOptions(int mode)
  9128. {
  9129. SetVerifyOptions opts;
  9130. XMEMSET(&opts, 0, sizeof(SetVerifyOptions));
  9131. if (mode != WOLFSSL_VERIFY_DEFAULT) {
  9132. opts.verifyNone = (mode == WOLFSSL_VERIFY_NONE);
  9133. if (!opts.verifyNone) {
  9134. opts.verifyPeer =
  9135. (mode & WOLFSSL_VERIFY_PEER) != 0;
  9136. opts.failNoCertxPSK =
  9137. (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) != 0;
  9138. opts.failNoCert =
  9139. (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) != 0;
  9140. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9141. opts.verifyPostHandshake =
  9142. (mode & WOLFSSL_VERIFY_POST_HANDSHAKE) != 0;
  9143. #endif
  9144. }
  9145. }
  9146. return opts;
  9147. }
  9148. WOLFSSL_ABI
  9149. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  9150. {
  9151. SetVerifyOptions opts;
  9152. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  9153. if (ctx == NULL)
  9154. return;
  9155. opts = ModeToVerifyOptions(mode);
  9156. ctx->verifyNone = opts.verifyNone;
  9157. ctx->verifyPeer = opts.verifyPeer;
  9158. ctx->failNoCert = opts.failNoCert;
  9159. ctx->failNoCertxPSK = opts.failNoCertxPSK;
  9160. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9161. ctx->verifyPostHandshake = opts.verifyPostHandshake;
  9162. #endif
  9163. ctx->verifyCallback = vc;
  9164. }
  9165. #ifdef OPENSSL_ALL
  9166. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  9167. CertVerifyCallback cb, void* arg)
  9168. {
  9169. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_verify_callback");
  9170. if (ctx == NULL)
  9171. return;
  9172. ctx->verifyCertCb = cb;
  9173. ctx->verifyCertCbArg = arg;
  9174. }
  9175. #endif
  9176. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  9177. {
  9178. SetVerifyOptions opts;
  9179. WOLFSSL_ENTER("wolfSSL_set_verify");
  9180. if (ssl == NULL)
  9181. return;
  9182. opts = ModeToVerifyOptions(mode);
  9183. ssl->options.verifyNone = opts.verifyNone;
  9184. ssl->options.verifyPeer = opts.verifyPeer;
  9185. ssl->options.failNoCert = opts.failNoCert;
  9186. ssl->options.failNoCertxPSK = opts.failNoCertxPSK;
  9187. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9188. ssl->options.verifyPostHandshake = opts.verifyPostHandshake;
  9189. #endif
  9190. ssl->verifyCallback = vc;
  9191. }
  9192. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  9193. {
  9194. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  9195. if (ssl == NULL)
  9196. return;
  9197. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  9198. defined(OPENSSL_ALL)
  9199. ssl->peerVerifyRet = v;
  9200. #else
  9201. (void)v;
  9202. WOLFSSL_STUB("wolfSSL_set_verify_result");
  9203. #endif
  9204. }
  9205. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  9206. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9207. /* For TLS v1.3 send handshake messages after handshake completes. */
  9208. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  9209. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  9210. {
  9211. int ret = wolfSSL_request_certificate(ssl);
  9212. if (ret != WOLFSSL_SUCCESS) {
  9213. if (!IsAtLeastTLSv1_3(ssl->version)) {
  9214. /* specific error of wrong version expected */
  9215. WOLFSSL_ERROR(UNSUPPORTED_PROTO_VERSION);
  9216. }
  9217. else {
  9218. WOLFSSL_ERROR(ret); /* log the error in the error queue */
  9219. }
  9220. }
  9221. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9222. }
  9223. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  9224. {
  9225. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  9226. if (ret == 0) {
  9227. ctx->postHandshakeAuth = (val != 0);
  9228. }
  9229. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9230. }
  9231. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  9232. {
  9233. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  9234. if (ret == 0) {
  9235. ssl->options.postHandshakeAuth = (val != 0);
  9236. }
  9237. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9238. }
  9239. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  9240. /* store user ctx for verify callback */
  9241. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  9242. {
  9243. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  9244. if (ssl)
  9245. ssl->verifyCbCtx = ctx;
  9246. }
  9247. /* store user ctx for verify callback */
  9248. void wolfSSL_CTX_SetCertCbCtx(WOLFSSL_CTX* ctx, void* userCtx)
  9249. {
  9250. WOLFSSL_ENTER("wolfSSL_CTX_SetCertCbCtx");
  9251. if (ctx)
  9252. ctx->verifyCbCtx = userCtx;
  9253. }
  9254. /* store context CA Cache addition callback */
  9255. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  9256. {
  9257. if (ctx && ctx->cm)
  9258. ctx->cm->caCacheCallback = cb;
  9259. }
  9260. #if defined(PERSIST_CERT_CACHE)
  9261. #if !defined(NO_FILESYSTEM)
  9262. /* Persist cert cache to file */
  9263. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9264. {
  9265. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  9266. if (ctx == NULL || fname == NULL)
  9267. return BAD_FUNC_ARG;
  9268. return CM_SaveCertCache(ctx->cm, fname);
  9269. }
  9270. /* Persist cert cache from file */
  9271. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9272. {
  9273. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  9274. if (ctx == NULL || fname == NULL)
  9275. return BAD_FUNC_ARG;
  9276. return CM_RestoreCertCache(ctx->cm, fname);
  9277. }
  9278. #endif /* NO_FILESYSTEM */
  9279. /* Persist cert cache to memory */
  9280. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  9281. int sz, int* used)
  9282. {
  9283. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  9284. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  9285. return BAD_FUNC_ARG;
  9286. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  9287. }
  9288. /* Restore cert cache from memory */
  9289. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  9290. {
  9291. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  9292. if (ctx == NULL || mem == NULL || sz <= 0)
  9293. return BAD_FUNC_ARG;
  9294. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  9295. }
  9296. /* get how big the the cert cache save buffer needs to be */
  9297. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  9298. {
  9299. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  9300. if (ctx == NULL)
  9301. return BAD_FUNC_ARG;
  9302. return CM_GetCertCacheMemSize(ctx->cm);
  9303. }
  9304. #endif /* PERSIST_CERT_CACHE */
  9305. #endif /* !NO_CERTS */
  9306. #ifndef NO_SESSION_CACHE
  9307. WOLFSSL_ABI
  9308. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  9309. {
  9310. WOLFSSL_ENTER("wolfSSL_get_session");
  9311. if (ssl) {
  9312. #ifdef NO_SESSION_CACHE_REF
  9313. return ssl->session;
  9314. #else
  9315. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9316. /* On the client side we want to return a persistent reference for
  9317. * backwards compatibility. */
  9318. #ifndef NO_CLIENT_CACHE
  9319. if (ssl->clientSession) {
  9320. return (WOLFSSL_SESSION*)ssl->clientSession;
  9321. }
  9322. else {
  9323. /* Try to add a ClientCache entry to associate with the current
  9324. * session. Ignore any session cache options. */
  9325. int err;
  9326. const byte* id = ssl->session->sessionID;
  9327. byte idSz = ssl->session->sessionIDSz;
  9328. if (ssl->session->haveAltSessionID) {
  9329. id = ssl->session->altSessionID;
  9330. idSz = ID_LEN;
  9331. }
  9332. err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz,
  9333. NULL, ssl->session->side,
  9334. #ifdef HAVE_SESSION_TICKET
  9335. ssl->session->ticketLen > 0,
  9336. #else
  9337. 0,
  9338. #endif
  9339. &ssl->clientSession);
  9340. if (err == 0) {
  9341. return (WOLFSSL_SESSION*)ssl->clientSession;
  9342. }
  9343. }
  9344. #endif
  9345. }
  9346. else {
  9347. return ssl->session;
  9348. }
  9349. #endif
  9350. }
  9351. return NULL;
  9352. }
  9353. /* The get1 version requires caller to call SSL_SESSION_free */
  9354. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  9355. {
  9356. WOLFSSL_SESSION* sess = NULL;
  9357. WOLFSSL_ENTER("wolfSSL_get1_session");
  9358. if (ssl != NULL) {
  9359. sess = ssl->session;
  9360. if (sess != NULL) {
  9361. /* increase reference count if allocated session */
  9362. if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) {
  9363. if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS)
  9364. sess = NULL;
  9365. }
  9366. }
  9367. }
  9368. return sess;
  9369. }
  9370. /*
  9371. * Sets the session object to use when establishing a TLS/SSL session using
  9372. * the ssl object. Therefore, this function must be called before
  9373. * wolfSSL_connect. The session object to use can be obtained in a previous
  9374. * TLS/SSL connection using wolfSSL_get_session.
  9375. *
  9376. * This function rejects the session if it has been expired when this function
  9377. * is called. Note that this expiration check is wolfSSL specific and differs
  9378. * from OpenSSL return code behavior.
  9379. *
  9380. * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully
  9381. * setting the session, WOLFSSL_FAILURE on failure due to the session cache
  9382. * being disabled, or the session has expired.
  9383. *
  9384. * To match OpenSSL return code behavior when session is expired, define
  9385. * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return
  9386. * WOLFSSL_SUCCESS even when the session is expired and rejected.
  9387. */
  9388. WOLFSSL_ABI
  9389. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  9390. {
  9391. WOLFSSL_ENTER("wolfSSL_set_session");
  9392. if (session)
  9393. return wolfSSL_SetSession(ssl, session);
  9394. return WOLFSSL_FAILURE;
  9395. }
  9396. #ifndef NO_CLIENT_CACHE
  9397. /* Associate client session with serverID, find existing or store for saving
  9398. if newSession flag on, don't reuse existing session
  9399. WOLFSSL_SUCCESS on ok */
  9400. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  9401. {
  9402. WOLFSSL_SESSION* session = NULL;
  9403. byte idHash[SERVER_ID_LEN];
  9404. WOLFSSL_ENTER("wolfSSL_SetServerID");
  9405. if (ssl == NULL || id == NULL || len <= 0)
  9406. return BAD_FUNC_ARG;
  9407. if (len > SERVER_ID_LEN) {
  9408. #if defined(NO_SHA) && !defined(NO_SHA256)
  9409. if (wc_Sha256Hash(id, len, idHash) != 0)
  9410. return WOLFSSL_FAILURE;
  9411. #else
  9412. if (wc_ShaHash(id, len, idHash) != 0)
  9413. return WOLFSSL_FAILURE;
  9414. #endif
  9415. id = idHash;
  9416. len = SERVER_ID_LEN;
  9417. }
  9418. if (newSession == 0) {
  9419. session = wolfSSL_GetSessionClient(ssl, id, len);
  9420. if (session) {
  9421. if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  9422. #ifdef HAVE_EXT_CACHE
  9423. wolfSSL_FreeSession(ssl->ctx, session);
  9424. #endif
  9425. WOLFSSL_MSG("wolfSSL_SetSession failed");
  9426. session = NULL;
  9427. }
  9428. }
  9429. }
  9430. if (session == NULL) {
  9431. WOLFSSL_MSG("Valid ServerID not cached already");
  9432. ssl->session->idLen = (word16)len;
  9433. XMEMCPY(ssl->session->serverID, id, len);
  9434. }
  9435. #ifdef HAVE_EXT_CACHE
  9436. else {
  9437. wolfSSL_FreeSession(ssl->ctx, session);
  9438. }
  9439. #endif
  9440. return WOLFSSL_SUCCESS;
  9441. }
  9442. #endif /* !NO_CLIENT_CACHE */
  9443. /* TODO: Add SESSION_CACHE_DYNAMIC_MEM support for PERSIST_SESSION_CACHE.
  9444. * Need a count of current sessions to get an accurate memsize (totalCount is
  9445. * not decremented when sessions are removed).
  9446. * Need to determine ideal layout for mem/filesave.
  9447. * Also need mem/filesave checking to ensure not restoring non DYNAMIC_MEM cache.
  9448. */
  9449. #if defined(PERSIST_SESSION_CACHE) && !defined(SESSION_CACHE_DYNAMIC_MEM)
  9450. /* for persistence, if changes to layout need to increment and modify
  9451. save_session_cache() and restore_session_cache and memory versions too */
  9452. #define WOLFSSL_CACHE_VERSION 2
  9453. /* Session Cache Header information */
  9454. typedef struct {
  9455. int version; /* cache layout version id */
  9456. int rows; /* session rows */
  9457. int columns; /* session columns */
  9458. int sessionSz; /* sizeof WOLFSSL_SESSION */
  9459. } cache_header_t;
  9460. /* current persistence layout is:
  9461. 1) cache_header_t
  9462. 2) SessionCache
  9463. 3) ClientCache
  9464. update WOLFSSL_CACHE_VERSION if change layout for the following
  9465. PERSISTENT_SESSION_CACHE functions
  9466. */
  9467. /* get how big the the session cache save buffer needs to be */
  9468. int wolfSSL_get_session_cache_memsize(void)
  9469. {
  9470. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  9471. #ifndef NO_CLIENT_CACHE
  9472. sz += (int)(sizeof(ClientCache));
  9473. #endif
  9474. return sz;
  9475. }
  9476. /* Persist session cache to memory */
  9477. int wolfSSL_memsave_session_cache(void* mem, int sz)
  9478. {
  9479. int i;
  9480. cache_header_t cache_header;
  9481. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9482. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  9483. if (sz < wolfSSL_get_session_cache_memsize()) {
  9484. WOLFSSL_MSG("Memory buffer too small");
  9485. return BUFFER_E;
  9486. }
  9487. cache_header.version = WOLFSSL_CACHE_VERSION;
  9488. cache_header.rows = SESSION_ROWS;
  9489. cache_header.columns = SESSIONS_PER_ROW;
  9490. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9491. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  9492. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9493. if (SESSION_ROW_RD_LOCK(row) != 0) {
  9494. WOLFSSL_MSG("Session cache mutex lock failed");
  9495. return BAD_MUTEX_E;
  9496. }
  9497. #endif
  9498. for (i = 0; i < cache_header.rows; ++i) {
  9499. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9500. if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) {
  9501. WOLFSSL_MSG("Session row cache mutex lock failed");
  9502. return BAD_MUTEX_E;
  9503. }
  9504. #endif
  9505. XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW);
  9506. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9507. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9508. #endif
  9509. }
  9510. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9511. SESSION_ROW_UNLOCK(row);
  9512. #endif
  9513. #ifndef NO_CLIENT_CACHE
  9514. if (wc_LockMutex(&clisession_mutex) != 0) {
  9515. WOLFSSL_MSG("Client cache mutex lock failed");
  9516. return BAD_MUTEX_E;
  9517. }
  9518. XMEMCPY(row, ClientCache, sizeof(ClientCache));
  9519. wc_UnLockMutex(&clisession_mutex);
  9520. #endif
  9521. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  9522. return WOLFSSL_SUCCESS;
  9523. }
  9524. /* Restore the persistent session cache from memory */
  9525. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  9526. {
  9527. int i;
  9528. cache_header_t cache_header;
  9529. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9530. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  9531. if (sz < wolfSSL_get_session_cache_memsize()) {
  9532. WOLFSSL_MSG("Memory buffer too small");
  9533. return BUFFER_E;
  9534. }
  9535. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  9536. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9537. cache_header.rows != SESSION_ROWS ||
  9538. cache_header.columns != SESSIONS_PER_ROW ||
  9539. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9540. WOLFSSL_MSG("Session cache header match failed");
  9541. return CACHE_MATCH_ERROR;
  9542. }
  9543. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9544. if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) {
  9545. WOLFSSL_MSG("Session cache mutex lock failed");
  9546. return BAD_MUTEX_E;
  9547. }
  9548. #endif
  9549. for (i = 0; i < cache_header.rows; ++i) {
  9550. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9551. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  9552. WOLFSSL_MSG("Session row cache mutex lock failed");
  9553. return BAD_MUTEX_E;
  9554. }
  9555. #endif
  9556. XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW);
  9557. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9558. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9559. #endif
  9560. }
  9561. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9562. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9563. #endif
  9564. #ifndef NO_CLIENT_CACHE
  9565. if (wc_LockMutex(&clisession_mutex) != 0) {
  9566. WOLFSSL_MSG("Client cache mutex lock failed");
  9567. return BAD_MUTEX_E;
  9568. }
  9569. XMEMCPY(ClientCache, row, sizeof(ClientCache));
  9570. wc_UnLockMutex(&clisession_mutex);
  9571. #endif
  9572. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9573. return WOLFSSL_SUCCESS;
  9574. }
  9575. #if !defined(NO_FILESYSTEM)
  9576. /* Persist session cache to file */
  9577. /* doesn't use memsave because of additional memory use */
  9578. int wolfSSL_save_session_cache(const char *fname)
  9579. {
  9580. XFILE file;
  9581. int ret;
  9582. int rc = WOLFSSL_SUCCESS;
  9583. int i;
  9584. cache_header_t cache_header;
  9585. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9586. file = XFOPEN(fname, "w+b");
  9587. if (file == XBADFILE) {
  9588. WOLFSSL_MSG("Couldn't open session cache save file");
  9589. return WOLFSSL_BAD_FILE;
  9590. }
  9591. cache_header.version = WOLFSSL_CACHE_VERSION;
  9592. cache_header.rows = SESSION_ROWS;
  9593. cache_header.columns = SESSIONS_PER_ROW;
  9594. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9595. /* cache header */
  9596. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9597. if (ret != 1) {
  9598. WOLFSSL_MSG("Session cache header file write failed");
  9599. XFCLOSE(file);
  9600. return FWRITE_ERROR;
  9601. }
  9602. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9603. if (SESSION_ROW_RD_LOCK(&SessionCache[0]) != 0) {
  9604. WOLFSSL_MSG("Session cache mutex lock failed");
  9605. XFCLOSE(file);
  9606. return BAD_MUTEX_E;
  9607. }
  9608. #endif
  9609. /* session cache */
  9610. for (i = 0; i < cache_header.rows; ++i) {
  9611. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9612. if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) {
  9613. WOLFSSL_MSG("Session row cache mutex lock failed");
  9614. XFCLOSE(file);
  9615. return BAD_MUTEX_E;
  9616. }
  9617. #endif
  9618. ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9619. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9620. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9621. #endif
  9622. if (ret != 1) {
  9623. WOLFSSL_MSG("Session cache member file write failed");
  9624. rc = FWRITE_ERROR;
  9625. break;
  9626. }
  9627. }
  9628. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9629. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9630. #endif
  9631. #ifndef NO_CLIENT_CACHE
  9632. /* client cache */
  9633. if (wc_LockMutex(&clisession_mutex) != 0) {
  9634. WOLFSSL_MSG("Client cache mutex lock failed");
  9635. XFCLOSE(file);
  9636. return BAD_MUTEX_E;
  9637. }
  9638. ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file);
  9639. if (ret != 1) {
  9640. WOLFSSL_MSG("Client cache member file write failed");
  9641. rc = FWRITE_ERROR;
  9642. }
  9643. wc_UnLockMutex(&clisession_mutex);
  9644. #endif /* !NO_CLIENT_CACHE */
  9645. XFCLOSE(file);
  9646. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9647. return rc;
  9648. }
  9649. /* Restore the persistent session cache from file */
  9650. /* doesn't use memstore because of additional memory use */
  9651. int wolfSSL_restore_session_cache(const char *fname)
  9652. {
  9653. XFILE file;
  9654. int rc = WOLFSSL_SUCCESS;
  9655. int ret;
  9656. int i;
  9657. cache_header_t cache_header;
  9658. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9659. file = XFOPEN(fname, "rb");
  9660. if (file == XBADFILE) {
  9661. WOLFSSL_MSG("Couldn't open session cache save file");
  9662. return WOLFSSL_BAD_FILE;
  9663. }
  9664. /* cache header */
  9665. ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file);
  9666. if (ret != 1) {
  9667. WOLFSSL_MSG("Session cache header file read failed");
  9668. XFCLOSE(file);
  9669. return FREAD_ERROR;
  9670. }
  9671. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9672. cache_header.rows != SESSION_ROWS ||
  9673. cache_header.columns != SESSIONS_PER_ROW ||
  9674. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9675. WOLFSSL_MSG("Session cache header match failed");
  9676. XFCLOSE(file);
  9677. return CACHE_MATCH_ERROR;
  9678. }
  9679. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9680. if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) {
  9681. WOLFSSL_MSG("Session cache mutex lock failed");
  9682. XFCLOSE(file);
  9683. return BAD_MUTEX_E;
  9684. }
  9685. #endif
  9686. /* session cache */
  9687. for (i = 0; i < cache_header.rows; ++i) {
  9688. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9689. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  9690. WOLFSSL_MSG("Session row cache mutex lock failed");
  9691. XFCLOSE(file);
  9692. return BAD_MUTEX_E;
  9693. }
  9694. #endif
  9695. ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9696. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9697. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9698. #endif
  9699. if (ret != 1) {
  9700. WOLFSSL_MSG("Session cache member file read failed");
  9701. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9702. rc = FREAD_ERROR;
  9703. break;
  9704. }
  9705. }
  9706. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9707. SESSION_ROW_UNLOCK(&SessionCache[0]);
  9708. #endif
  9709. #ifndef NO_CLIENT_CACHE
  9710. /* client cache */
  9711. if (wc_LockMutex(&clisession_mutex) != 0) {
  9712. WOLFSSL_MSG("Client cache mutex lock failed");
  9713. XFCLOSE(file);
  9714. return BAD_MUTEX_E;
  9715. }
  9716. ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file);
  9717. if (ret != 1) {
  9718. WOLFSSL_MSG("Client cache member file read failed");
  9719. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9720. rc = FREAD_ERROR;
  9721. }
  9722. wc_UnLockMutex(&clisession_mutex);
  9723. #endif /* !NO_CLIENT_CACHE */
  9724. XFCLOSE(file);
  9725. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9726. return rc;
  9727. }
  9728. #endif /* !NO_FILESYSTEM */
  9729. #endif /* PERSIST_SESSION_CACHE && !SESSION_CACHE_DYNAMIC_MEM */
  9730. #endif /* NO_SESSION_CACHE */
  9731. void wolfSSL_load_error_strings(void)
  9732. {
  9733. /* compatibility only */
  9734. }
  9735. int wolfSSL_library_init(void)
  9736. {
  9737. WOLFSSL_ENTER("wolfSSL_library_init");
  9738. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9739. return WOLFSSL_SUCCESS;
  9740. else
  9741. return WOLFSSL_FATAL_ERROR;
  9742. }
  9743. #ifdef HAVE_SECRET_CALLBACK
  9744. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9745. {
  9746. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9747. if (ssl == NULL)
  9748. return WOLFSSL_FATAL_ERROR;
  9749. ssl->sessionSecretCb = cb;
  9750. ssl->sessionSecretCtx = ctx;
  9751. if (cb != NULL) {
  9752. /* If using a pre-set key, assume session resumption. */
  9753. ssl->session->sessionIDSz = 0;
  9754. ssl->options.resuming = 1;
  9755. }
  9756. return WOLFSSL_SUCCESS;
  9757. }
  9758. #endif
  9759. #ifndef NO_SESSION_CACHE
  9760. /* on by default if built in but allow user to turn off */
  9761. WOLFSSL_ABI
  9762. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9763. {
  9764. WOLFSSL_ENTER("wolfSSL_CTX_set_session_cache_mode");
  9765. if (ctx == NULL)
  9766. return WOLFSSL_FAILURE;
  9767. if (mode == WOLFSSL_SESS_CACHE_OFF) {
  9768. ctx->sessionCacheOff = 1;
  9769. #ifdef HAVE_EXT_CACHE
  9770. ctx->internalCacheOff = 1;
  9771. ctx->internalCacheLookupOff = 1;
  9772. #endif
  9773. }
  9774. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  9775. ctx->sessionCacheFlushOff = 1;
  9776. #ifdef HAVE_EXT_CACHE
  9777. /* WOLFSSL_SESS_CACHE_NO_INTERNAL activates both if's */
  9778. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  9779. ctx->internalCacheOff = 1;
  9780. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0)
  9781. ctx->internalCacheLookupOff = 1;
  9782. #endif
  9783. return WOLFSSL_SUCCESS;
  9784. }
  9785. #ifdef OPENSSL_EXTRA
  9786. /* Get the session cache mode for CTX
  9787. *
  9788. * ctx WOLFSSL_CTX struct to get cache mode from
  9789. *
  9790. * Returns a bit mask that has the session cache mode */
  9791. long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  9792. {
  9793. long m = 0;
  9794. WOLFSSL_ENTER("wolfSSL_CTX_get_session_cache_mode");
  9795. if (ctx == NULL) {
  9796. return m;
  9797. }
  9798. if (ctx->sessionCacheOff != 1) {
  9799. m |= WOLFSSL_SESS_CACHE_SERVER;
  9800. }
  9801. if (ctx->sessionCacheFlushOff == 1) {
  9802. m |= WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR;
  9803. }
  9804. #ifdef HAVE_EXT_CACHE
  9805. if (ctx->internalCacheOff == 1) {
  9806. m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE;
  9807. }
  9808. if (ctx->internalCacheLookupOff == 1) {
  9809. m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP;
  9810. }
  9811. #endif
  9812. return m;
  9813. }
  9814. #endif /* OPENSSL_EXTRA */
  9815. #endif /* NO_SESSION_CACHE */
  9816. #ifdef OPENSSL_EXTRA
  9817. /*
  9818. * check if the list has TLS13 and pre-TLS13 suites
  9819. * @param list cipher suite list that user want to set
  9820. * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2
  9821. */
  9822. static int CheckcipherList(const char* list)
  9823. {
  9824. int ret;
  9825. int findTLSv13Suites = 0;
  9826. int findbeforeSuites = 0;
  9827. byte cipherSuite0;
  9828. byte cipherSuite1;
  9829. int flags;
  9830. char* next = (char*)list;
  9831. do {
  9832. char* current = next;
  9833. char name[MAX_SUITE_NAME + 1];
  9834. word32 length = MAX_SUITE_NAME;
  9835. word32 current_length;
  9836. next = XSTRSTR(next, ":");
  9837. current_length = (!next) ? (word32)XSTRLEN(current)
  9838. : (word32)(next - current);
  9839. if (current_length < length) {
  9840. length = current_length;
  9841. }
  9842. XMEMCPY(name, current, length);
  9843. name[length] = 0;
  9844. if (XSTRCMP(name, "ALL") == 0 || XSTRCMP(name, "DEFAULT") == 0 ||
  9845. XSTRCMP(name, "HIGH") == 0) {
  9846. findTLSv13Suites = 1;
  9847. findbeforeSuites = 1;
  9848. break;
  9849. }
  9850. ret = wolfSSL_get_cipher_suite_from_name(name, &cipherSuite0,
  9851. &cipherSuite1, &flags);
  9852. if (ret == 0) {
  9853. if (cipherSuite0 == TLS13_BYTE) {
  9854. /* TLSv13 suite */
  9855. findTLSv13Suites = 1;
  9856. }
  9857. else {
  9858. findbeforeSuites = 1;
  9859. }
  9860. }
  9861. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  9862. /* check if mixed due to names like RSA:ECDHE+AESGCM etc. */
  9863. if (ret != 0) {
  9864. char* subStr = name;
  9865. char* subStrNext;
  9866. do {
  9867. subStrNext = XSTRSTR(subStr, "+");
  9868. if ((XSTRCMP(subStr, "ECDHE") == 0) ||
  9869. (XSTRCMP(subStr, "RSA") == 0)) {
  9870. return 0;
  9871. }
  9872. if (subStrNext && (XSTRLEN(subStrNext) > 0)) {
  9873. subStr = subStrNext + 1; /* +1 to skip past '+' */
  9874. }
  9875. } while (subStrNext != NULL);
  9876. }
  9877. #endif
  9878. if (findTLSv13Suites == 1 && findbeforeSuites == 1) {
  9879. /* list has mixed suites */
  9880. return 0;
  9881. }
  9882. }
  9883. while (next++); /* ++ needed to skip ':' */
  9884. if (findTLSv13Suites == 0 && findbeforeSuites == 1) {
  9885. ret = 1;/* only before TLSv13 suites */
  9886. }
  9887. else if (findTLSv13Suites == 1 && findbeforeSuites == 0) {
  9888. ret = 2;/* only TLSv13 suties */
  9889. }
  9890. else {
  9891. ret = 0;/* handle as mixed */
  9892. }
  9893. return ret;
  9894. }
  9895. /* parse some bulk lists like !eNULL / !aNULL
  9896. *
  9897. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9898. */
  9899. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9900. const char* list)
  9901. {
  9902. int ret = 0;
  9903. int listattribute = 0;
  9904. int tls13Only = 0;
  9905. #ifndef WOLFSSL_SMALL_STACK
  9906. byte suitesCpy[WOLFSSL_MAX_SUITE_SZ];
  9907. #else
  9908. byte* suitesCpy = NULL;
  9909. #endif
  9910. word16 suitesCpySz = 0;
  9911. word16 i = 0;
  9912. word16 j = 0;
  9913. if (suites == NULL || list == NULL) {
  9914. WOLFSSL_MSG("NULL argument");
  9915. return WOLFSSL_FAILURE;
  9916. }
  9917. listattribute = CheckcipherList(list);
  9918. if (listattribute == 0) {
  9919. /* list has mixed(pre-TLSv13 and TLSv13) suites
  9920. * update cipher suites the same as before
  9921. */
  9922. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9923. WOLFSSL_FAILURE;
  9924. }
  9925. else if (listattribute == 1) {
  9926. /* list has only pre-TLSv13 suites.
  9927. * Only update before TLSv13 suites.
  9928. */
  9929. tls13Only = 0;
  9930. }
  9931. else if (listattribute == 2) {
  9932. /* list has only TLSv13 suites. Only update TLv13 suites
  9933. * simulate set_ciphersuites() compatibility layer API
  9934. */
  9935. tls13Only = 1;
  9936. if (!IsAtLeastTLSv1_3(ctx->method->version)) {
  9937. /* Silently ignore TLS 1.3 ciphers if we don't support it. */
  9938. return WOLFSSL_SUCCESS;
  9939. }
  9940. }
  9941. /* list contains ciphers either only for TLS 1.3 or <= TLS 1.2 */
  9942. #ifdef WOLFSSL_SMALL_STACK
  9943. if (suites->suiteSz > 0) {
  9944. suitesCpy = (byte*)XMALLOC(suites->suiteSz, NULL,
  9945. DYNAMIC_TYPE_TMP_BUFFER);
  9946. if (suitesCpy == NULL)
  9947. return WOLFSSL_FAILURE;
  9948. }
  9949. #endif
  9950. if (suites->suiteSz > 0)
  9951. XMEMCPY(suitesCpy, suites->suites, suites->suiteSz);
  9952. suitesCpySz = suites->suiteSz;
  9953. ret = SetCipherList(ctx, suites, list);
  9954. if (ret != 1) {
  9955. #ifdef WOLFSSL_SMALL_STACK
  9956. XFREE(suitesCpy, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9957. #endif
  9958. return WOLFSSL_FAILURE;
  9959. }
  9960. for (i = 0; i < suitesCpySz &&
  9961. suites->suiteSz <= (WOLFSSL_MAX_SUITE_SZ - SUITE_LEN); i += 2) {
  9962. /* Check for duplicates */
  9963. int duplicate = 0;
  9964. for (j = 0; j < suites->suiteSz; j += 2) {
  9965. if (suitesCpy[i] == suites->suites[j] &&
  9966. suitesCpy[i+1] == suites->suites[j+1]) {
  9967. duplicate = 1;
  9968. break;
  9969. }
  9970. }
  9971. if (!duplicate) {
  9972. if (tls13Only) {
  9973. /* Updating TLS 1.3 ciphers */
  9974. if (suitesCpy[i] != TLS13_BYTE) {
  9975. /* Only copy over <= TLS 1.2 ciphers */
  9976. /* TLS 1.3 ciphers take precedence */
  9977. suites->suites[suites->suiteSz++] = suitesCpy[i];
  9978. suites->suites[suites->suiteSz++] = suitesCpy[i+1];
  9979. }
  9980. }
  9981. else {
  9982. /* Updating <= TLS 1.2 ciphers */
  9983. if (suitesCpy[i] == TLS13_BYTE) {
  9984. /* Only copy over TLS 1.3 ciphers */
  9985. /* TLS 1.3 ciphers take precedence */
  9986. XMEMMOVE(suites->suites + SUITE_LEN, suites->suites,
  9987. suites->suiteSz);
  9988. suites->suites[0] = suitesCpy[i];
  9989. suites->suites[1] = suitesCpy[i+1];
  9990. suites->suiteSz += 2;
  9991. }
  9992. }
  9993. }
  9994. }
  9995. #ifdef WOLFSSL_SMALL_STACK
  9996. XFREE(suitesCpy, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9997. #endif
  9998. return ret;
  9999. }
  10000. #endif
  10001. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  10002. {
  10003. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  10004. if (ctx == NULL)
  10005. return WOLFSSL_FAILURE;
  10006. if (AllocateCtxSuites(ctx) != 0)
  10007. return WOLFSSL_FAILURE;
  10008. #ifdef OPENSSL_EXTRA
  10009. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  10010. #else
  10011. return (SetCipherList(ctx, ctx->suites, list)) ?
  10012. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10013. #endif
  10014. }
  10015. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10016. int wolfSSL_CTX_set_cipher_list_bytes(WOLFSSL_CTX* ctx, const byte* list,
  10017. const int listSz)
  10018. {
  10019. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list_bytes");
  10020. if (ctx == NULL)
  10021. return WOLFSSL_FAILURE;
  10022. if (AllocateCtxSuites(ctx) != 0)
  10023. return WOLFSSL_FAILURE;
  10024. return (SetCipherListFromBytes(ctx, ctx->suites, list, listSz)) ?
  10025. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10026. }
  10027. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10028. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  10029. {
  10030. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  10031. if (ssl == NULL || ssl->ctx == NULL) {
  10032. return WOLFSSL_FAILURE;
  10033. }
  10034. if (AllocateSuites(ssl) != 0)
  10035. return WOLFSSL_FAILURE;
  10036. #ifdef OPENSSL_EXTRA
  10037. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  10038. #else
  10039. return (SetCipherList(ssl->ctx, ssl->suites, list)) ?
  10040. WOLFSSL_SUCCESS :
  10041. WOLFSSL_FAILURE;
  10042. #endif
  10043. }
  10044. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10045. int wolfSSL_set_cipher_list_bytes(WOLFSSL* ssl, const byte* list,
  10046. const int listSz)
  10047. {
  10048. WOLFSSL_ENTER("wolfSSL_set_cipher_list_bytes");
  10049. if (ssl == NULL || ssl->ctx == NULL) {
  10050. return WOLFSSL_FAILURE;
  10051. }
  10052. if (AllocateSuites(ssl) != 0)
  10053. return WOLFSSL_FAILURE;
  10054. return (SetCipherListFromBytes(ssl->ctx, ssl->suites, list, listSz))
  10055. ? WOLFSSL_SUCCESS
  10056. : WOLFSSL_FAILURE;
  10057. }
  10058. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10059. #ifdef HAVE_KEYING_MATERIAL
  10060. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  10061. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  10062. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  10063. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  10064. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  10065. static const struct ForbiddenLabels {
  10066. const char* label;
  10067. size_t labelLen;
  10068. } forbiddenLabels[] = {
  10069. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  10070. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  10071. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  10072. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  10073. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  10074. {NULL, 0},
  10075. };
  10076. /**
  10077. * Implement RFC 5705
  10078. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  10079. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  10080. */
  10081. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  10082. unsigned char *out, size_t outLen,
  10083. const char *label, size_t labelLen,
  10084. const unsigned char *context, size_t contextLen,
  10085. int use_context)
  10086. {
  10087. byte* seed = NULL;
  10088. word32 seedLen;
  10089. const struct ForbiddenLabels* fl;
  10090. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  10091. if (ssl == NULL || out == NULL || label == NULL ||
  10092. (use_context && contextLen && context == NULL)) {
  10093. WOLFSSL_MSG("Bad argument");
  10094. return WOLFSSL_FAILURE;
  10095. }
  10096. /* clientRandom + serverRandom
  10097. * OR
  10098. * clientRandom + serverRandom + ctx len encoding + ctx */
  10099. seedLen = !use_context ? (word32)SEED_LEN :
  10100. (word32)SEED_LEN + 2 + (word32)contextLen;
  10101. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  10102. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  10103. "data. Call wolfSSL_KeepArrays before attempting to "
  10104. "export keyid material.");
  10105. return WOLFSSL_FAILURE;
  10106. }
  10107. /* check forbidden labels */
  10108. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  10109. if (labelLen >= fl->labelLen &&
  10110. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  10111. WOLFSSL_MSG("Forbidden label");
  10112. return WOLFSSL_FAILURE;
  10113. }
  10114. }
  10115. #ifdef WOLFSSL_TLS13
  10116. if (IsAtLeastTLSv1_3(ssl->version)) {
  10117. /* Path for TLS 1.3 */
  10118. if (!use_context) {
  10119. contextLen = 0;
  10120. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  10121. }
  10122. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  10123. context, contextLen) != 0) {
  10124. WOLFSSL_MSG("Tls13_Exporter error");
  10125. return WOLFSSL_FAILURE;
  10126. }
  10127. return WOLFSSL_SUCCESS;
  10128. }
  10129. #endif
  10130. /* Path for <=TLS 1.2 */
  10131. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10132. if (seed == NULL) {
  10133. WOLFSSL_MSG("malloc error");
  10134. return WOLFSSL_FAILURE;
  10135. }
  10136. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  10137. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  10138. if (use_context) {
  10139. /* Encode len in big endian */
  10140. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  10141. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  10142. if (contextLen) {
  10143. /* 0 length context is allowed */
  10144. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  10145. }
  10146. }
  10147. PRIVATE_KEY_UNLOCK();
  10148. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  10149. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  10150. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  10151. WOLFSSL_MSG("wc_PRF_TLS error");
  10152. PRIVATE_KEY_LOCK();
  10153. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10154. return WOLFSSL_FAILURE;
  10155. }
  10156. PRIVATE_KEY_LOCK();
  10157. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10158. return WOLFSSL_SUCCESS;
  10159. }
  10160. #endif /* HAVE_KEYING_MATERIAL */
  10161. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  10162. {
  10163. int useNb = 0;
  10164. if (ssl == NULL)
  10165. return WOLFSSL_FAILURE;
  10166. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  10167. if (ssl->options.dtls) {
  10168. #ifdef WOLFSSL_DTLS
  10169. useNb = ssl->options.dtlsUseNonblock;
  10170. #endif
  10171. }
  10172. else {
  10173. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  10174. "DEPRECATED for non-DTLS use.");
  10175. }
  10176. return useNb;
  10177. }
  10178. #ifndef WOLFSSL_LEANPSK
  10179. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  10180. {
  10181. (void)nonblock;
  10182. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  10183. if (ssl == NULL)
  10184. return;
  10185. if (ssl->options.dtls) {
  10186. #ifdef WOLFSSL_DTLS
  10187. ssl->options.dtlsUseNonblock = (nonblock != 0);
  10188. #endif
  10189. }
  10190. else {
  10191. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  10192. "DEPRECATED for non-DTLS use.");
  10193. }
  10194. }
  10195. #ifdef WOLFSSL_DTLS
  10196. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  10197. {
  10198. int timeout = 0;
  10199. if (ssl)
  10200. timeout = ssl->dtls_timeout;
  10201. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout", timeout);
  10202. return timeout;
  10203. }
  10204. #ifdef WOLFSSL_DTLS13
  10205. /*
  10206. * This API returns 1 when the user should set a short timeout for receiving
  10207. * data. It is recommended that it is at most 1/4 the value returned by
  10208. * wolfSSL_dtls_get_current_timeout().
  10209. */
  10210. int wolfSSL_dtls13_use_quick_timeout(WOLFSSL* ssl)
  10211. {
  10212. return ssl->dtls13FastTimeout;
  10213. }
  10214. /*
  10215. * When this is set, a DTLS 1.3 connection will send acks immediately when a
  10216. * disruption is detected to shortcut timeouts. This results in potentially
  10217. * more traffic but may make the handshake quicker.
  10218. */
  10219. void wolfSSL_dtls13_set_send_more_acks(WOLFSSL* ssl, int value)
  10220. {
  10221. if (ssl != NULL)
  10222. ssl->options.dtls13SendMoreAcks = !!value;
  10223. }
  10224. #endif /* WOLFSSL_DTLS13 */
  10225. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  10226. {
  10227. if (ssl && timeleft) {
  10228. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  10229. timeleft->tv_sec = ssl->dtls_timeout;
  10230. }
  10231. return 0;
  10232. }
  10233. #ifndef NO_WOLFSSL_STUB
  10234. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10235. {
  10236. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10237. (void)ssl;
  10238. return 0;
  10239. }
  10240. #endif
  10241. #ifndef NO_WOLFSSL_STUB
  10242. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10243. {
  10244. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10245. (void)ssl;
  10246. (void)duration_ms;
  10247. }
  10248. #endif
  10249. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10250. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10251. {
  10252. if (ssl == NULL || timeout < 0)
  10253. return BAD_FUNC_ARG;
  10254. if (timeout > ssl->dtls_timeout_max) {
  10255. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10256. return BAD_FUNC_ARG;
  10257. }
  10258. ssl->dtls_timeout_init = timeout;
  10259. ssl->dtls_timeout = timeout;
  10260. return WOLFSSL_SUCCESS;
  10261. }
  10262. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10263. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10264. {
  10265. if (ssl == NULL || timeout < 0)
  10266. return BAD_FUNC_ARG;
  10267. if (timeout < ssl->dtls_timeout_init) {
  10268. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10269. return BAD_FUNC_ARG;
  10270. }
  10271. ssl->dtls_timeout_max = timeout;
  10272. return WOLFSSL_SUCCESS;
  10273. }
  10274. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10275. {
  10276. int result = WOLFSSL_SUCCESS;
  10277. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout");
  10278. if (ssl == NULL)
  10279. return WOLFSSL_FATAL_ERROR;
  10280. #ifdef WOLFSSL_DTLS13
  10281. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  10282. result = Dtls13RtxTimeout(ssl);
  10283. if (result < 0) {
  10284. if (result == WANT_WRITE)
  10285. ssl->dtls13SendingAckOrRtx = 1;
  10286. ssl->error = result;
  10287. WOLFSSL_ERROR(result);
  10288. return WOLFSSL_FATAL_ERROR;
  10289. }
  10290. return WOLFSSL_SUCCESS;
  10291. }
  10292. #endif /* WOLFSSL_DTLS13 */
  10293. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  10294. if (DtlsMsgPoolTimeout(ssl) < 0){
  10295. ssl->error = SOCKET_ERROR_E;
  10296. WOLFSSL_ERROR(ssl->error);
  10297. result = WOLFSSL_FATAL_ERROR;
  10298. }
  10299. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  10300. ssl->error = result;
  10301. WOLFSSL_ERROR(result);
  10302. result = WOLFSSL_FATAL_ERROR;
  10303. }
  10304. else {
  10305. /* Reset return value to success */
  10306. result = WOLFSSL_SUCCESS;
  10307. }
  10308. }
  10309. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout", result);
  10310. return result;
  10311. }
  10312. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10313. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10314. {
  10315. WOLFSSL_ENTER("wolfSSL_dtls_retransmit");
  10316. if (ssl == NULL)
  10317. return WOLFSSL_FATAL_ERROR;
  10318. if (!ssl->options.handShakeDone) {
  10319. int result = DtlsMsgPoolSend(ssl, 0);
  10320. if (result < 0) {
  10321. ssl->error = result;
  10322. WOLFSSL_ERROR(result);
  10323. return WOLFSSL_FATAL_ERROR;
  10324. }
  10325. }
  10326. return 0;
  10327. }
  10328. #endif /* DTLS */
  10329. #endif /* LEANPSK */
  10330. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10331. /* Not an SSL function, return 0 for success, error code otherwise */
  10332. /* Prereq: ssl's RNG needs to be initialized. */
  10333. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10334. const byte* secret, word32 secretSz)
  10335. {
  10336. int ret = 0;
  10337. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10338. if (ssl == NULL) {
  10339. WOLFSSL_MSG("need a SSL object");
  10340. return BAD_FUNC_ARG;
  10341. }
  10342. if (secret != NULL && secretSz == 0) {
  10343. WOLFSSL_MSG("can't have a new secret without a size");
  10344. return BAD_FUNC_ARG;
  10345. }
  10346. /* If secretSz is 0, use the default size. */
  10347. if (secretSz == 0)
  10348. secretSz = COOKIE_SECRET_SZ;
  10349. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10350. byte* newSecret;
  10351. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10352. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10353. ssl->buffers.dtlsCookieSecret.length);
  10354. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10355. ssl->heap, DYNAMIC_TYPE_COOKIE_PWD);
  10356. }
  10357. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10358. if (newSecret == NULL) {
  10359. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10360. ssl->buffers.dtlsCookieSecret.length = 0;
  10361. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10362. return MEMORY_ERROR;
  10363. }
  10364. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10365. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10366. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10367. wc_MemZero_Add("wolfSSL_DTLS_SetCookieSecret secret",
  10368. ssl->buffers.dtlsCookieSecret.buffer,
  10369. ssl->buffers.dtlsCookieSecret.length);
  10370. #endif
  10371. }
  10372. /* If the supplied secret is NULL, randomly generate a new secret. */
  10373. if (secret == NULL) {
  10374. ret = wc_RNG_GenerateBlock(ssl->rng,
  10375. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10376. }
  10377. else
  10378. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10379. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10380. return ret;
  10381. }
  10382. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10383. /* EITHER SIDE METHODS */
  10384. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10385. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10386. {
  10387. return wolfSSLv23_method_ex(NULL);
  10388. }
  10389. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10390. {
  10391. WOLFSSL_METHOD* m = NULL;
  10392. WOLFSSL_ENTER("wolfSSLv23_method");
  10393. #if !defined(NO_WOLFSSL_CLIENT)
  10394. m = wolfSSLv23_client_method_ex(heap);
  10395. #elif !defined(NO_WOLFSSL_SERVER)
  10396. m = wolfSSLv23_server_method_ex(heap);
  10397. #else
  10398. (void)heap;
  10399. #endif
  10400. if (m != NULL) {
  10401. m->side = WOLFSSL_NEITHER_END;
  10402. }
  10403. return m;
  10404. }
  10405. #ifdef WOLFSSL_ALLOW_SSLV3
  10406. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10407. {
  10408. return wolfSSLv3_method_ex(NULL);
  10409. }
  10410. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10411. {
  10412. WOLFSSL_METHOD* m = NULL;
  10413. WOLFSSL_ENTER("wolfSSLv3_method_ex");
  10414. #if !defined(NO_WOLFSSL_CLIENT)
  10415. m = wolfSSLv3_client_method_ex(heap);
  10416. #elif !defined(NO_WOLFSSL_SERVER)
  10417. m = wolfSSLv3_server_method_ex(heap);
  10418. #endif
  10419. if (m != NULL) {
  10420. m->side = WOLFSSL_NEITHER_END;
  10421. }
  10422. return m;
  10423. }
  10424. #endif
  10425. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10426. /* client only parts */
  10427. #ifndef NO_WOLFSSL_CLIENT
  10428. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  10429. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10430. {
  10431. WOLFSSL_STUB("wolfSSLv2_client_method");
  10432. return NULL;
  10433. }
  10434. #endif
  10435. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10436. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10437. {
  10438. return wolfSSLv3_client_method_ex(NULL);
  10439. }
  10440. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10441. {
  10442. WOLFSSL_METHOD* method =
  10443. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10444. heap, DYNAMIC_TYPE_METHOD);
  10445. (void)heap;
  10446. WOLFSSL_ENTER("wolfSSLv3_client_method_ex");
  10447. if (method)
  10448. InitSSL_Method(method, MakeSSLv3());
  10449. return method;
  10450. }
  10451. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10452. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10453. {
  10454. return wolfSSLv23_client_method_ex(NULL);
  10455. }
  10456. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10457. {
  10458. WOLFSSL_METHOD* method =
  10459. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10460. heap, DYNAMIC_TYPE_METHOD);
  10461. (void)heap;
  10462. WOLFSSL_ENTER("wolfSSLv23_client_method_ex");
  10463. if (method) {
  10464. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10465. #if defined(WOLFSSL_TLS13)
  10466. InitSSL_Method(method, MakeTLSv1_3());
  10467. #elif !defined(WOLFSSL_NO_TLS12)
  10468. InitSSL_Method(method, MakeTLSv1_2());
  10469. #elif !defined(NO_OLD_TLS)
  10470. InitSSL_Method(method, MakeTLSv1_1());
  10471. #endif
  10472. #else
  10473. #ifndef NO_OLD_TLS
  10474. InitSSL_Method(method, MakeTLSv1_1());
  10475. #endif
  10476. #endif
  10477. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10478. method->downgrade = 1;
  10479. #endif
  10480. }
  10481. return method;
  10482. }
  10483. /* please see note at top of README if you get an error from connect */
  10484. WOLFSSL_ABI
  10485. int wolfSSL_connect(WOLFSSL* ssl)
  10486. {
  10487. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10488. int neededState;
  10489. byte advanceState;
  10490. #endif
  10491. int ret = 0;
  10492. (void)ret;
  10493. #ifdef HAVE_ERRNO_H
  10494. errno = 0;
  10495. #endif
  10496. if (ssl == NULL)
  10497. return BAD_FUNC_ARG;
  10498. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10499. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10500. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10501. if (ssl->error != WOLFSSL_SUCCESS) {
  10502. WOLFSSL_ERROR(ssl->error);
  10503. return WOLFSSL_FATAL_ERROR;
  10504. }
  10505. ssl->error = 0; /* expected to be zero here */
  10506. }
  10507. #ifdef OPENSSL_EXTRA
  10508. if (ssl->CBIS != NULL) {
  10509. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10510. ssl->cbmode = SSL_CB_WRITE;
  10511. }
  10512. #endif
  10513. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10514. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10515. return wolfSSL_connect_TLSv13(ssl);
  10516. #else
  10517. #ifdef WOLFSSL_TLS13
  10518. if (ssl->options.tls1_3)
  10519. return wolfSSL_connect_TLSv13(ssl);
  10520. #endif
  10521. WOLFSSL_ENTER("wolfSSL_connect");
  10522. /* make sure this wolfSSL object has arrays and rng setup. Protects
  10523. * case where the WOLFSSL object is reused via wolfSSL_clear() */
  10524. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  10525. return ret;
  10526. }
  10527. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10528. if ((ssl->ConnectFilter != NULL) &&
  10529. (ssl->options.connectState == CONNECT_BEGIN)) {
  10530. wolfSSL_netfilter_decision_t res;
  10531. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  10532. WOLFSSL_SUCCESS) &&
  10533. (res == WOLFSSL_NETFILTER_REJECT)) {
  10534. ssl->error = SOCKET_FILTERED_E;
  10535. WOLFSSL_ERROR(ssl->error);
  10536. return WOLFSSL_FATAL_ERROR;
  10537. }
  10538. }
  10539. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10540. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10541. ssl->error = SIDE_ERROR;
  10542. WOLFSSL_ERROR(ssl->error);
  10543. return WOLFSSL_FATAL_ERROR;
  10544. }
  10545. #ifdef WOLFSSL_DTLS
  10546. if (ssl->version.major == DTLS_MAJOR) {
  10547. ssl->options.dtls = 1;
  10548. ssl->options.tls = 1;
  10549. ssl->options.tls1_1 = 1;
  10550. ssl->options.dtlsStateful = 1;
  10551. }
  10552. #endif
  10553. /* fragOffset is non-zero when sending fragments. On the last
  10554. * fragment, fragOffset is zero again, and the state can be
  10555. * advanced. */
  10556. advanceState = ssl->fragOffset == 0 &&
  10557. (ssl->options.connectState == CONNECT_BEGIN ||
  10558. ssl->options.connectState == HELLO_AGAIN ||
  10559. (ssl->options.connectState >= FIRST_REPLY_DONE &&
  10560. ssl->options.connectState <= FIRST_REPLY_FOURTH));
  10561. #ifdef WOLFSSL_DTLS13
  10562. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
  10563. advanceState = advanceState && !ssl->dtls13SendingAckOrRtx;
  10564. #endif /* WOLFSSL_DTLS13 */
  10565. if (ssl->buffers.outputBuffer.length > 0
  10566. #ifdef WOLFSSL_ASYNC_CRYPT
  10567. /* do not send buffered or advance state if last error was an
  10568. async pending operation */
  10569. && ssl->error != WC_PENDING_E
  10570. #endif
  10571. ) {
  10572. ret = SendBuffered(ssl);
  10573. if (ret == 0) {
  10574. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  10575. if (advanceState) {
  10576. ssl->options.connectState++;
  10577. WOLFSSL_MSG("connect state: "
  10578. "Advanced from last buffered fragment send");
  10579. #ifdef WOLFSSL_ASYNC_IO
  10580. /* Cleanup async */
  10581. FreeAsyncCtx(ssl, 0);
  10582. #endif
  10583. }
  10584. }
  10585. else {
  10586. WOLFSSL_MSG("connect state: "
  10587. "Not advanced, more fragments to send");
  10588. }
  10589. }
  10590. else {
  10591. ssl->error = ret;
  10592. WOLFSSL_ERROR(ssl->error);
  10593. return WOLFSSL_FATAL_ERROR;
  10594. }
  10595. #ifdef WOLFSSL_DTLS13
  10596. if (ssl->options.dtls)
  10597. ssl->dtls13SendingAckOrRtx = 0;
  10598. #endif /* WOLFSSL_DTLS13 */
  10599. }
  10600. ret = RetrySendAlert(ssl);
  10601. if (ret != 0) {
  10602. ssl->error = ret;
  10603. WOLFSSL_ERROR(ssl->error);
  10604. return WOLFSSL_FATAL_ERROR;
  10605. }
  10606. switch (ssl->options.connectState) {
  10607. case CONNECT_BEGIN :
  10608. /* always send client hello first */
  10609. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10610. WOLFSSL_ERROR(ssl->error);
  10611. return WOLFSSL_FATAL_ERROR;
  10612. }
  10613. ssl->options.connectState = CLIENT_HELLO_SENT;
  10614. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10615. FALL_THROUGH;
  10616. case CLIENT_HELLO_SENT :
  10617. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10618. SERVER_HELLODONE_COMPLETE;
  10619. #ifdef WOLFSSL_DTLS
  10620. /* In DTLS, when resuming, we can go straight to FINISHED,
  10621. * or do a cookie exchange and then skip to FINISHED, assume
  10622. * we need the cookie exchange first. */
  10623. if (IsDtlsNotSctpMode(ssl))
  10624. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10625. #endif
  10626. /* get response */
  10627. while (ssl->options.serverState < neededState) {
  10628. #ifdef WOLFSSL_TLS13
  10629. if (ssl->options.tls1_3)
  10630. return wolfSSL_connect_TLSv13(ssl);
  10631. #endif
  10632. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10633. WOLFSSL_ERROR(ssl->error);
  10634. return WOLFSSL_FATAL_ERROR;
  10635. }
  10636. /* if resumption failed, reset needed state */
  10637. else if (neededState == SERVER_FINISHED_COMPLETE) {
  10638. if (!ssl->options.resuming) {
  10639. #ifdef WOLFSSL_DTLS
  10640. if (IsDtlsNotSctpMode(ssl))
  10641. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10642. else
  10643. #endif
  10644. neededState = SERVER_HELLODONE_COMPLETE;
  10645. }
  10646. }
  10647. #ifdef WOLFSSL_DTLS13
  10648. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)
  10649. && ssl->dtls13Rtx.sendAcks == 1
  10650. && ssl->options.seenUnifiedHdr) {
  10651. /* we aren't negotiated the version yet, so we aren't sure
  10652. * the other end can speak v1.3. On the other side we have
  10653. * received a unified records, assuming that the
  10654. * ServerHello got lost, we will send an empty ACK. In case
  10655. * the server is a DTLS with version less than 1.3, it
  10656. * should just ignore the message */
  10657. ssl->dtls13Rtx.sendAcks = 0;
  10658. if ((ssl->error = SendDtls13Ack(ssl)) < 0) {
  10659. if (ssl->error == WANT_WRITE)
  10660. ssl->dtls13SendingAckOrRtx = 1;
  10661. WOLFSSL_ERROR(ssl->error);
  10662. return WOLFSSL_FATAL_ERROR;
  10663. }
  10664. }
  10665. #endif /* WOLFSSL_DTLS13 */
  10666. }
  10667. ssl->options.connectState = HELLO_AGAIN;
  10668. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10669. FALL_THROUGH;
  10670. case HELLO_AGAIN :
  10671. #ifdef WOLFSSL_TLS13
  10672. if (ssl->options.tls1_3)
  10673. return wolfSSL_connect_TLSv13(ssl);
  10674. #endif
  10675. #ifdef WOLFSSL_DTLS
  10676. if (ssl->options.serverState ==
  10677. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10678. if (IsDtlsNotSctpMode(ssl)) {
  10679. /* re-init hashes, exclude first hello and verify request */
  10680. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10681. WOLFSSL_ERROR(ssl->error);
  10682. return WOLFSSL_FATAL_ERROR;
  10683. }
  10684. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10685. WOLFSSL_ERROR(ssl->error);
  10686. return WOLFSSL_FATAL_ERROR;
  10687. }
  10688. }
  10689. }
  10690. #endif
  10691. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10692. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10693. FALL_THROUGH;
  10694. case HELLO_AGAIN_REPLY :
  10695. #ifdef WOLFSSL_DTLS
  10696. if (IsDtlsNotSctpMode(ssl)) {
  10697. neededState = ssl->options.resuming ?
  10698. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10699. /* get response */
  10700. while (ssl->options.serverState < neededState) {
  10701. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10702. WOLFSSL_ERROR(ssl->error);
  10703. return WOLFSSL_FATAL_ERROR;
  10704. }
  10705. /* if resumption failed, reset needed state */
  10706. if (neededState == SERVER_FINISHED_COMPLETE) {
  10707. if (!ssl->options.resuming)
  10708. neededState = SERVER_HELLODONE_COMPLETE;
  10709. }
  10710. }
  10711. }
  10712. #endif
  10713. ssl->options.connectState = FIRST_REPLY_DONE;
  10714. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10715. FALL_THROUGH;
  10716. case FIRST_REPLY_DONE :
  10717. if (ssl->options.certOnly)
  10718. return WOLFSSL_SUCCESS;
  10719. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10720. #ifdef WOLFSSL_TLS13
  10721. if (ssl->options.tls1_3)
  10722. return wolfSSL_connect_TLSv13(ssl);
  10723. #endif
  10724. if (ssl->options.sendVerify) {
  10725. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10726. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10727. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10728. #endif
  10729. WOLFSSL_ERROR(ssl->error);
  10730. return WOLFSSL_FATAL_ERROR;
  10731. }
  10732. WOLFSSL_MSG("sent: certificate");
  10733. }
  10734. #endif
  10735. ssl->options.connectState = FIRST_REPLY_FIRST;
  10736. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10737. FALL_THROUGH;
  10738. case FIRST_REPLY_FIRST :
  10739. #ifdef WOLFSSL_TLS13
  10740. if (ssl->options.tls1_3)
  10741. return wolfSSL_connect_TLSv13(ssl);
  10742. #endif
  10743. if (!ssl->options.resuming) {
  10744. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10745. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10746. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10747. #endif
  10748. #ifdef WOLFSSL_EXTRA_ALERTS
  10749. if (ssl->error == NO_PEER_KEY ||
  10750. ssl->error == PSK_KEY_ERROR) {
  10751. SendAlert(ssl, alert_fatal, handshake_failure);
  10752. }
  10753. #endif
  10754. WOLFSSL_ERROR(ssl->error);
  10755. return WOLFSSL_FATAL_ERROR;
  10756. }
  10757. WOLFSSL_MSG("sent: client key exchange");
  10758. }
  10759. ssl->options.connectState = FIRST_REPLY_SECOND;
  10760. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  10761. FALL_THROUGH;
  10762. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  10763. case FIRST_REPLY_SECOND :
  10764. /* CLIENT: Fail-safe for Server Authentication. */
  10765. if (!ssl->options.peerAuthGood) {
  10766. WOLFSSL_MSG("Server authentication did not happen");
  10767. ssl->error = NO_PEER_VERIFY;
  10768. return WOLFSSL_FATAL_ERROR;
  10769. }
  10770. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10771. if (ssl->options.sendVerify) {
  10772. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  10773. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10774. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10775. #endif
  10776. WOLFSSL_ERROR(ssl->error);
  10777. return WOLFSSL_FATAL_ERROR;
  10778. }
  10779. WOLFSSL_MSG("sent: certificate verify");
  10780. }
  10781. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  10782. ssl->options.connectState = FIRST_REPLY_THIRD;
  10783. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  10784. FALL_THROUGH;
  10785. case FIRST_REPLY_THIRD :
  10786. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10787. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10788. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10789. #endif
  10790. WOLFSSL_ERROR(ssl->error);
  10791. return WOLFSSL_FATAL_ERROR;
  10792. }
  10793. WOLFSSL_MSG("sent: change cipher spec");
  10794. ssl->options.connectState = FIRST_REPLY_FOURTH;
  10795. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  10796. FALL_THROUGH;
  10797. case FIRST_REPLY_FOURTH :
  10798. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10799. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10800. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10801. #endif
  10802. WOLFSSL_ERROR(ssl->error);
  10803. return WOLFSSL_FATAL_ERROR;
  10804. }
  10805. WOLFSSL_MSG("sent: finished");
  10806. ssl->options.connectState = FINISHED_DONE;
  10807. WOLFSSL_MSG("connect state: FINISHED_DONE");
  10808. FALL_THROUGH;
  10809. #ifdef WOLFSSL_DTLS13
  10810. case WAIT_FINISHED_ACK:
  10811. ssl->options.connectState = FINISHED_DONE;
  10812. FALL_THROUGH;
  10813. #endif /* WOLFSSL_DTLS13 */
  10814. case FINISHED_DONE :
  10815. /* get response */
  10816. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  10817. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10818. WOLFSSL_ERROR(ssl->error);
  10819. return WOLFSSL_FATAL_ERROR;
  10820. }
  10821. ssl->options.connectState = SECOND_REPLY_DONE;
  10822. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  10823. FALL_THROUGH;
  10824. case SECOND_REPLY_DONE:
  10825. #ifndef NO_HANDSHAKE_DONE_CB
  10826. if (ssl->hsDoneCb) {
  10827. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10828. if (cbret < 0) {
  10829. ssl->error = cbret;
  10830. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10831. return WOLFSSL_FATAL_ERROR;
  10832. }
  10833. }
  10834. #endif /* NO_HANDSHAKE_DONE_CB */
  10835. if (!ssl->options.dtls) {
  10836. if (!ssl->options.keepResources) {
  10837. FreeHandshakeResources(ssl);
  10838. }
  10839. }
  10840. #ifdef WOLFSSL_DTLS
  10841. else {
  10842. ssl->options.dtlsHsRetain = 1;
  10843. }
  10844. #endif /* WOLFSSL_DTLS */
  10845. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10846. /* This may be necessary in async so that we don't try to
  10847. * renegotiate again */
  10848. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10849. ssl->secure_renegotiation->startScr = 0;
  10850. }
  10851. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10852. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  10853. /* Free the remaining async context if not using it for crypto */
  10854. FreeAsyncCtx(ssl, 1);
  10855. #endif
  10856. ssl->error = 0; /* clear the error */
  10857. WOLFSSL_LEAVE("wolfSSL_connect", WOLFSSL_SUCCESS);
  10858. return WOLFSSL_SUCCESS;
  10859. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10860. default:
  10861. WOLFSSL_MSG("Unknown connect state ERROR");
  10862. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  10863. }
  10864. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  10865. }
  10866. #endif /* NO_WOLFSSL_CLIENT */
  10867. /* server only parts */
  10868. #ifndef NO_WOLFSSL_SERVER
  10869. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  10870. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  10871. {
  10872. WOLFSSL_STUB("wolfSSLv2_server_method");
  10873. return 0;
  10874. }
  10875. #endif
  10876. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10877. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  10878. {
  10879. return wolfSSLv3_server_method_ex(NULL);
  10880. }
  10881. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  10882. {
  10883. WOLFSSL_METHOD* method =
  10884. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10885. heap, DYNAMIC_TYPE_METHOD);
  10886. (void)heap;
  10887. WOLFSSL_ENTER("wolfSSLv3_server_method_ex");
  10888. if (method) {
  10889. InitSSL_Method(method, MakeSSLv3());
  10890. method->side = WOLFSSL_SERVER_END;
  10891. }
  10892. return method;
  10893. }
  10894. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10895. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10896. {
  10897. return wolfSSLv23_server_method_ex(NULL);
  10898. }
  10899. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10900. {
  10901. WOLFSSL_METHOD* method =
  10902. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10903. heap, DYNAMIC_TYPE_METHOD);
  10904. (void)heap;
  10905. WOLFSSL_ENTER("wolfSSLv23_server_method_ex");
  10906. if (method) {
  10907. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10908. #ifdef WOLFSSL_TLS13
  10909. InitSSL_Method(method, MakeTLSv1_3());
  10910. #elif !defined(WOLFSSL_NO_TLS12)
  10911. InitSSL_Method(method, MakeTLSv1_2());
  10912. #elif !defined(NO_OLD_TLS)
  10913. InitSSL_Method(method, MakeTLSv1_1());
  10914. #endif
  10915. #else
  10916. #ifndef NO_OLD_TLS
  10917. InitSSL_Method(method, MakeTLSv1_1());
  10918. #else
  10919. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10920. #endif
  10921. #endif
  10922. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10923. method->downgrade = 1;
  10924. #endif
  10925. method->side = WOLFSSL_SERVER_END;
  10926. }
  10927. return method;
  10928. }
  10929. WOLFSSL_ABI
  10930. int wolfSSL_accept(WOLFSSL* ssl)
  10931. {
  10932. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10933. word16 havePSK = 0;
  10934. word16 haveAnon = 0;
  10935. word16 haveMcast = 0;
  10936. #endif
  10937. int ret = 0;
  10938. (void)ret;
  10939. if (ssl == NULL)
  10940. return WOLFSSL_FATAL_ERROR;
  10941. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10942. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10943. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  10944. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  10945. if (ssl->error != WOLFSSL_SUCCESS) {
  10946. WOLFSSL_ERROR(ssl->error);
  10947. return WOLFSSL_FATAL_ERROR;
  10948. }
  10949. ssl->error = 0; /* expected to be zero here */
  10950. }
  10951. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10952. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10953. return wolfSSL_accept_TLSv13(ssl);
  10954. #else
  10955. #ifdef WOLFSSL_TLS13
  10956. if (ssl->options.tls1_3)
  10957. return wolfSSL_accept_TLSv13(ssl);
  10958. #endif
  10959. WOLFSSL_ENTER("wolfSSL_accept");
  10960. /* make sure this wolfSSL object has arrays and rng setup. Protects
  10961. * case where the WOLFSSL object is reused via wolfSSL_clear() */
  10962. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  10963. return ret;
  10964. }
  10965. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10966. if ((ssl->AcceptFilter != NULL) &&
  10967. ((ssl->options.acceptState == ACCEPT_BEGIN)
  10968. #ifdef HAVE_SECURE_RENEGOTIATION
  10969. || (ssl->options.acceptState == ACCEPT_BEGIN_RENEG)
  10970. #endif
  10971. ))
  10972. {
  10973. wolfSSL_netfilter_decision_t res;
  10974. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  10975. WOLFSSL_SUCCESS) &&
  10976. (res == WOLFSSL_NETFILTER_REJECT)) {
  10977. ssl->error = SOCKET_FILTERED_E;
  10978. WOLFSSL_ERROR(ssl->error);
  10979. return WOLFSSL_FATAL_ERROR;
  10980. }
  10981. }
  10982. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10983. #ifdef HAVE_ERRNO_H
  10984. errno = 0;
  10985. #endif
  10986. #ifndef NO_PSK
  10987. havePSK = ssl->options.havePSK;
  10988. #endif
  10989. (void)havePSK;
  10990. #ifdef HAVE_ANON
  10991. haveAnon = ssl->options.haveAnon;
  10992. #endif
  10993. (void)haveAnon;
  10994. #ifdef WOLFSSL_MULTICAST
  10995. haveMcast = ssl->options.haveMcast;
  10996. #endif
  10997. (void)haveMcast;
  10998. if (ssl->options.side != WOLFSSL_SERVER_END) {
  10999. ssl->error = SIDE_ERROR;
  11000. WOLFSSL_ERROR(ssl->error);
  11001. return WOLFSSL_FATAL_ERROR;
  11002. }
  11003. #ifndef NO_CERTS
  11004. /* in case used set_accept_state after init */
  11005. if (!havePSK && !haveAnon && !haveMcast) {
  11006. #ifdef OPENSSL_EXTRA
  11007. if (ssl->ctx->certSetupCb != NULL) {
  11008. WOLFSSL_MSG("CertSetupCb set. server cert and "
  11009. "key not checked");
  11010. }
  11011. else
  11012. #endif
  11013. {
  11014. if (!ssl->buffers.certificate ||
  11015. !ssl->buffers.certificate->buffer) {
  11016. WOLFSSL_MSG("accept error: server cert required");
  11017. ssl->error = NO_PRIVATE_KEY;
  11018. WOLFSSL_ERROR(ssl->error);
  11019. return WOLFSSL_FATAL_ERROR;
  11020. }
  11021. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  11022. /* allow no private key if using existing key */
  11023. #ifdef WOLF_PRIVATE_KEY_ID
  11024. if (ssl->devId != INVALID_DEVID
  11025. #ifdef HAVE_PK_CALLBACKS
  11026. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  11027. #endif
  11028. ) {
  11029. WOLFSSL_MSG("Allowing no server private key "
  11030. "(external)");
  11031. }
  11032. else
  11033. #endif
  11034. {
  11035. WOLFSSL_MSG("accept error: server key required");
  11036. ssl->error = NO_PRIVATE_KEY;
  11037. WOLFSSL_ERROR(ssl->error);
  11038. return WOLFSSL_FATAL_ERROR;
  11039. }
  11040. }
  11041. }
  11042. }
  11043. #endif
  11044. #ifdef WOLFSSL_DTLS
  11045. if (ssl->version.major == DTLS_MAJOR) {
  11046. ssl->options.dtls = 1;
  11047. ssl->options.tls = 1;
  11048. ssl->options.tls1_1 = 1;
  11049. if (!IsDtlsNotSctpMode(ssl) || !IsDtlsNotSrtpMode(ssl) ||
  11050. IsSCR(ssl))
  11051. ssl->options.dtlsStateful = 1;
  11052. }
  11053. #endif
  11054. if (ssl->buffers.outputBuffer.length > 0
  11055. #ifdef WOLFSSL_ASYNC_CRYPT
  11056. /* do not send buffered or advance state if last error was an
  11057. async pending operation */
  11058. && ssl->error != WC_PENDING_E
  11059. #endif
  11060. ) {
  11061. ret = SendBuffered(ssl);
  11062. if (ret == 0) {
  11063. /* fragOffset is non-zero when sending fragments. On the last
  11064. * fragment, fragOffset is zero again, and the state can be
  11065. * advanced. */
  11066. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  11067. if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE ||
  11068. ssl->options.acceptState == SERVER_HELLO_SENT ||
  11069. ssl->options.acceptState == CERT_SENT ||
  11070. ssl->options.acceptState == CERT_STATUS_SENT ||
  11071. ssl->options.acceptState == KEY_EXCHANGE_SENT ||
  11072. ssl->options.acceptState == CERT_REQ_SENT ||
  11073. ssl->options.acceptState == ACCEPT_SECOND_REPLY_DONE ||
  11074. ssl->options.acceptState == TICKET_SENT ||
  11075. ssl->options.acceptState == CHANGE_CIPHER_SENT) {
  11076. ssl->options.acceptState++;
  11077. WOLFSSL_MSG("accept state: "
  11078. "Advanced from last buffered fragment send");
  11079. #ifdef WOLFSSL_ASYNC_IO
  11080. /* Cleanup async */
  11081. FreeAsyncCtx(ssl, 0);
  11082. #endif
  11083. }
  11084. }
  11085. else {
  11086. WOLFSSL_MSG("accept state: "
  11087. "Not advanced, more fragments to send");
  11088. }
  11089. }
  11090. else {
  11091. ssl->error = ret;
  11092. WOLFSSL_ERROR(ssl->error);
  11093. return WOLFSSL_FATAL_ERROR;
  11094. }
  11095. #ifdef WOLFSSL_DTLS13
  11096. if (ssl->options.dtls)
  11097. ssl->dtls13SendingAckOrRtx = 0;
  11098. #endif /* WOLFSSL_DTLS13 */
  11099. }
  11100. ret = RetrySendAlert(ssl);
  11101. if (ret != 0) {
  11102. ssl->error = ret;
  11103. WOLFSSL_ERROR(ssl->error);
  11104. return WOLFSSL_FATAL_ERROR;
  11105. }
  11106. switch (ssl->options.acceptState) {
  11107. case ACCEPT_BEGIN :
  11108. #ifdef HAVE_SECURE_RENEGOTIATION
  11109. case ACCEPT_BEGIN_RENEG:
  11110. #endif
  11111. /* get response */
  11112. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  11113. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11114. WOLFSSL_ERROR(ssl->error);
  11115. return WOLFSSL_FATAL_ERROR;
  11116. }
  11117. #ifdef WOLFSSL_TLS13
  11118. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  11119. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  11120. FALL_THROUGH;
  11121. case ACCEPT_CLIENT_HELLO_DONE :
  11122. if (ssl->options.tls1_3) {
  11123. return wolfSSL_accept_TLSv13(ssl);
  11124. }
  11125. #endif
  11126. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  11127. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  11128. FALL_THROUGH;
  11129. case ACCEPT_FIRST_REPLY_DONE :
  11130. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  11131. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11132. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11133. #endif
  11134. WOLFSSL_ERROR(ssl->error);
  11135. return WOLFSSL_FATAL_ERROR;
  11136. }
  11137. ssl->options.acceptState = SERVER_HELLO_SENT;
  11138. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  11139. FALL_THROUGH;
  11140. case SERVER_HELLO_SENT :
  11141. #ifdef WOLFSSL_TLS13
  11142. if (ssl->options.tls1_3) {
  11143. return wolfSSL_accept_TLSv13(ssl);
  11144. }
  11145. #endif
  11146. #ifndef NO_CERTS
  11147. if (!ssl->options.resuming)
  11148. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  11149. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11150. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11151. #endif
  11152. WOLFSSL_ERROR(ssl->error);
  11153. return WOLFSSL_FATAL_ERROR;
  11154. }
  11155. #endif
  11156. ssl->options.acceptState = CERT_SENT;
  11157. WOLFSSL_MSG("accept state CERT_SENT");
  11158. FALL_THROUGH;
  11159. case CERT_SENT :
  11160. #ifndef NO_CERTS
  11161. if (!ssl->options.resuming)
  11162. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  11163. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11164. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11165. #endif
  11166. WOLFSSL_ERROR(ssl->error);
  11167. return WOLFSSL_FATAL_ERROR;
  11168. }
  11169. #endif
  11170. ssl->options.acceptState = CERT_STATUS_SENT;
  11171. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  11172. FALL_THROUGH;
  11173. case CERT_STATUS_SENT :
  11174. #ifdef WOLFSSL_TLS13
  11175. if (ssl->options.tls1_3) {
  11176. return wolfSSL_accept_TLSv13(ssl);
  11177. }
  11178. #endif
  11179. if (!ssl->options.resuming)
  11180. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  11181. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11182. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11183. #endif
  11184. WOLFSSL_ERROR(ssl->error);
  11185. return WOLFSSL_FATAL_ERROR;
  11186. }
  11187. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  11188. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  11189. FALL_THROUGH;
  11190. case KEY_EXCHANGE_SENT :
  11191. #ifndef NO_CERTS
  11192. if (!ssl->options.resuming) {
  11193. if (ssl->options.verifyPeer) {
  11194. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  11195. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11196. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11197. #endif
  11198. WOLFSSL_ERROR(ssl->error);
  11199. return WOLFSSL_FATAL_ERROR;
  11200. }
  11201. }
  11202. else {
  11203. /* SERVER: Peer auth good if not verifying client. */
  11204. ssl->options.peerAuthGood = 1;
  11205. }
  11206. }
  11207. #endif
  11208. ssl->options.acceptState = CERT_REQ_SENT;
  11209. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  11210. FALL_THROUGH;
  11211. case CERT_REQ_SENT :
  11212. if (!ssl->options.resuming)
  11213. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  11214. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11215. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11216. #endif
  11217. WOLFSSL_ERROR(ssl->error);
  11218. return WOLFSSL_FATAL_ERROR;
  11219. }
  11220. ssl->options.acceptState = SERVER_HELLO_DONE;
  11221. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  11222. FALL_THROUGH;
  11223. case SERVER_HELLO_DONE :
  11224. if (!ssl->options.resuming) {
  11225. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  11226. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11227. WOLFSSL_ERROR(ssl->error);
  11228. return WOLFSSL_FATAL_ERROR;
  11229. }
  11230. }
  11231. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  11232. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  11233. FALL_THROUGH;
  11234. case ACCEPT_SECOND_REPLY_DONE :
  11235. #ifndef NO_CERTS
  11236. /* SERVER: When not resuming and verifying peer but no certificate
  11237. * received and not failing when not received then peer auth good.
  11238. */
  11239. if (!ssl->options.resuming && ssl->options.verifyPeer &&
  11240. !ssl->options.havePeerCert && !ssl->options.failNoCert) {
  11241. ssl->options.peerAuthGood = 1;
  11242. }
  11243. #endif /* !NO_CERTS */
  11244. #ifdef WOLFSSL_NO_CLIENT_AUTH
  11245. if (!ssl->options.resuming) {
  11246. ssl->options.peerAuthGood = 1;
  11247. }
  11248. #endif
  11249. #ifdef HAVE_SESSION_TICKET
  11250. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  11251. if ( (ssl->error = SendTicket(ssl)) != 0) {
  11252. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11253. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11254. #endif
  11255. WOLFSSL_MSG("Thought we need ticket but failed");
  11256. WOLFSSL_ERROR(ssl->error);
  11257. return WOLFSSL_FATAL_ERROR;
  11258. }
  11259. }
  11260. #endif /* HAVE_SESSION_TICKET */
  11261. ssl->options.acceptState = TICKET_SENT;
  11262. WOLFSSL_MSG("accept state TICKET_SENT");
  11263. FALL_THROUGH;
  11264. case TICKET_SENT:
  11265. /* SERVER: Fail-safe for CLient Authentication. */
  11266. if (!ssl->options.peerAuthGood) {
  11267. WOLFSSL_MSG("Client authentication did not happen");
  11268. return WOLFSSL_FATAL_ERROR;
  11269. }
  11270. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  11271. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11272. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11273. #endif
  11274. WOLFSSL_ERROR(ssl->error);
  11275. return WOLFSSL_FATAL_ERROR;
  11276. }
  11277. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  11278. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  11279. FALL_THROUGH;
  11280. case CHANGE_CIPHER_SENT :
  11281. if ( (ssl->error = SendFinished(ssl)) != 0) {
  11282. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11283. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11284. #endif
  11285. WOLFSSL_ERROR(ssl->error);
  11286. return WOLFSSL_FATAL_ERROR;
  11287. }
  11288. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  11289. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  11290. FALL_THROUGH;
  11291. case ACCEPT_FINISHED_DONE :
  11292. if (ssl->options.resuming) {
  11293. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  11294. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11295. WOLFSSL_ERROR(ssl->error);
  11296. return WOLFSSL_FATAL_ERROR;
  11297. }
  11298. }
  11299. }
  11300. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  11301. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  11302. FALL_THROUGH;
  11303. case ACCEPT_THIRD_REPLY_DONE :
  11304. #ifndef NO_HANDSHAKE_DONE_CB
  11305. if (ssl->hsDoneCb) {
  11306. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11307. if (cbret < 0) {
  11308. ssl->error = cbret;
  11309. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11310. return WOLFSSL_FATAL_ERROR;
  11311. }
  11312. }
  11313. #endif /* NO_HANDSHAKE_DONE_CB */
  11314. if (!ssl->options.dtls) {
  11315. if (!ssl->options.keepResources) {
  11316. FreeHandshakeResources(ssl);
  11317. }
  11318. }
  11319. #ifdef WOLFSSL_DTLS
  11320. else {
  11321. ssl->options.dtlsHsRetain = 1;
  11322. }
  11323. #endif /* WOLFSSL_DTLS */
  11324. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11325. /* This may be necessary in async so that we don't try to
  11326. * renegotiate again */
  11327. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11328. ssl->secure_renegotiation->startScr = 0;
  11329. }
  11330. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11331. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11332. /* Free the remaining async context if not using it for crypto */
  11333. FreeAsyncCtx(ssl, 1);
  11334. #endif
  11335. #if defined(WOLFSSL_SESSION_EXPORT) && defined(WOLFSSL_DTLS)
  11336. if (ssl->dtls_export) {
  11337. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  11338. WOLFSSL_MSG("Export DTLS session error");
  11339. WOLFSSL_ERROR(ssl->error);
  11340. return WOLFSSL_FATAL_ERROR;
  11341. }
  11342. }
  11343. #endif
  11344. ssl->error = 0; /* clear the error */
  11345. WOLFSSL_LEAVE("wolfSSL_accept", WOLFSSL_SUCCESS);
  11346. return WOLFSSL_SUCCESS;
  11347. default :
  11348. WOLFSSL_MSG("Unknown accept state ERROR");
  11349. return WOLFSSL_FATAL_ERROR;
  11350. }
  11351. #endif /* !WOLFSSL_NO_TLS12 */
  11352. }
  11353. #endif /* NO_WOLFSSL_SERVER */
  11354. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  11355. int wolfDTLS_SetChGoodCb(WOLFSSL* ssl, ClientHelloGoodCb cb, void* user_ctx)
  11356. {
  11357. WOLFSSL_ENTER("wolfDTLS_SetChGoodCb");
  11358. if (ssl == NULL)
  11359. return BAD_FUNC_ARG;
  11360. ssl->chGoodCb = cb;
  11361. ssl->chGoodCtx = user_ctx;
  11362. return WOLFSSL_SUCCESS;
  11363. }
  11364. #endif
  11365. #ifndef NO_HANDSHAKE_DONE_CB
  11366. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  11367. {
  11368. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  11369. if (ssl == NULL)
  11370. return BAD_FUNC_ARG;
  11371. ssl->hsDoneCb = cb;
  11372. ssl->hsDoneCtx = user_ctx;
  11373. return WOLFSSL_SUCCESS;
  11374. }
  11375. #endif /* NO_HANDSHAKE_DONE_CB */
  11376. WOLFSSL_ABI
  11377. int wolfSSL_Cleanup(void)
  11378. {
  11379. int ret = WOLFSSL_SUCCESS; /* Only the first error will be returned */
  11380. int release = 0;
  11381. #if !defined(NO_SESSION_CACHE)
  11382. int i;
  11383. int j;
  11384. #endif
  11385. WOLFSSL_ENTER("wolfSSL_Cleanup");
  11386. if (initRefCount == 0)
  11387. return ret; /* possibly no init yet, but not failure either way */
  11388. if ((count_mutex_valid == 1) && (wc_LockMutex(&count_mutex) != 0)) {
  11389. WOLFSSL_MSG("Bad Lock Mutex count");
  11390. ret = BAD_MUTEX_E;
  11391. }
  11392. release = initRefCount-- == 1;
  11393. if (initRefCount < 0)
  11394. initRefCount = 0;
  11395. if (count_mutex_valid == 1) {
  11396. wc_UnLockMutex(&count_mutex);
  11397. }
  11398. if (!release)
  11399. return ret;
  11400. #ifdef OPENSSL_EXTRA
  11401. wolfSSL_BN_free_one();
  11402. #endif
  11403. #ifndef NO_SESSION_CACHE
  11404. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  11405. for (i = 0; i < SESSION_ROWS; ++i) {
  11406. if ((SessionCache[i].lock_valid == 1) &&
  11407. (wc_FreeRwLock(&SessionCache[i].row_lock) != 0)) {
  11408. if (ret == WOLFSSL_SUCCESS)
  11409. ret = BAD_MUTEX_E;
  11410. }
  11411. SessionCache[i].lock_valid = 0;
  11412. }
  11413. #else
  11414. if ((session_lock_valid == 1) && (wc_FreeRwLock(&session_lock) != 0)) {
  11415. if (ret == WOLFSSL_SUCCESS)
  11416. ret = BAD_MUTEX_E;
  11417. }
  11418. session_lock_valid = 0;
  11419. #endif
  11420. for (i = 0; i < SESSION_ROWS; i++) {
  11421. for (j = 0; j < SESSIONS_PER_ROW; j++) {
  11422. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11423. if (SessionCache[i].Sessions[j]) {
  11424. EvictSessionFromCache(SessionCache[i].Sessions[j]);
  11425. XFREE(SessionCache[i].Sessions[j], SessionCache[i].heap,
  11426. DYNAMIC_TYPE_SESSION);
  11427. SessionCache[i].Sessions[j] = NULL;
  11428. }
  11429. #else
  11430. EvictSessionFromCache(&SessionCache[i].Sessions[j]);
  11431. #endif
  11432. }
  11433. }
  11434. #ifndef NO_CLIENT_CACHE
  11435. if ((clisession_mutex_valid == 1) &&
  11436. (wc_FreeMutex(&clisession_mutex) != 0)) {
  11437. if (ret == WOLFSSL_SUCCESS)
  11438. ret = BAD_MUTEX_E;
  11439. }
  11440. clisession_mutex_valid = 0;
  11441. #endif
  11442. #endif /* !NO_SESSION_CACHE */
  11443. if ((count_mutex_valid == 1) && (wc_FreeMutex(&count_mutex) != 0)) {
  11444. if (ret == WOLFSSL_SUCCESS)
  11445. ret = BAD_MUTEX_E;
  11446. }
  11447. count_mutex_valid = 0;
  11448. #ifdef OPENSSL_EXTRA
  11449. wolfSSL_RAND_Cleanup();
  11450. #endif
  11451. if (wolfCrypt_Cleanup() != 0) {
  11452. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11453. if (ret == WOLFSSL_SUCCESS)
  11454. ret = WC_CLEANUP_E;
  11455. }
  11456. #if FIPS_VERSION_GE(5,1)
  11457. if (wolfCrypt_SetPrivateKeyReadEnable_fips(0, WC_KEYTYPE_ALL) < 0) {
  11458. if (ret == WOLFSSL_SUCCESS)
  11459. ret = WC_CLEANUP_E;
  11460. }
  11461. #endif
  11462. #ifdef HAVE_GLOBAL_RNG
  11463. if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) {
  11464. if (ret == WOLFSSL_SUCCESS)
  11465. ret = BAD_MUTEX_E;
  11466. }
  11467. globalRNGMutex_valid = 0;
  11468. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  11469. wolfSSL_FIPS_drbg_free(gDrbgDefCtx);
  11470. gDrbgDefCtx = NULL;
  11471. #endif
  11472. #endif
  11473. #if defined(HAVE_EX_DATA) && \
  11474. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  11475. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  11476. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  11477. defined(WOLFSSL_WPAS_SMALL)
  11478. crypto_ex_cb_free(crypto_ex_cb_ctx_session);
  11479. crypto_ex_cb_ctx_session = NULL;
  11480. #endif
  11481. #ifdef WOLFSSL_MEM_FAIL_COUNT
  11482. wc_MemFailCount_Free();
  11483. #endif
  11484. return ret;
  11485. }
  11486. void SetupSession(WOLFSSL* ssl)
  11487. {
  11488. WOLFSSL_SESSION* session = ssl->session;
  11489. WOLFSSL_ENTER("SetupSession");
  11490. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  11491. /* Make sure the session ID is available when the user calls any
  11492. * get_session API */
  11493. if (!session->haveAltSessionID) {
  11494. XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN);
  11495. session->sessionIDSz = ssl->arrays->sessionIDSz;
  11496. }
  11497. else {
  11498. XMEMCPY(session->sessionID, session->altSessionID, ID_LEN);
  11499. session->sessionIDSz = ID_LEN;
  11500. }
  11501. }
  11502. session->side = (byte)ssl->options.side;
  11503. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  11504. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  11505. session->haveEMS = ssl->options.haveEMS;
  11506. #ifdef OPENSSL_EXTRA
  11507. /* If using compatibility layer then check for and copy over session context
  11508. * id. */
  11509. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  11510. XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  11511. session->sessionCtxSz = ssl->sessionCtxSz;
  11512. }
  11513. #endif
  11514. session->timeout = ssl->timeout;
  11515. #ifndef NO_ASN_TIME
  11516. session->bornOn = LowResTimer();
  11517. #endif
  11518. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11519. defined(HAVE_SESSION_TICKET))
  11520. session->version = ssl->version;
  11521. #endif
  11522. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11523. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11524. session->cipherSuite0 = ssl->options.cipherSuite0;
  11525. session->cipherSuite = ssl->options.cipherSuite;
  11526. #endif
  11527. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11528. session->peerVerifyRet = (byte)ssl->peerVerifyRet;
  11529. #endif
  11530. session->isSetup = 1;
  11531. }
  11532. #ifndef NO_SESSION_CACHE
  11533. WOLFSSL_ABI
  11534. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11535. {
  11536. /* static table now, no flushing needed */
  11537. (void)ctx;
  11538. (void)tm;
  11539. }
  11540. void wolfSSL_CTX_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11541. {
  11542. int i, j;
  11543. byte id[ID_LEN];
  11544. (void)ctx;
  11545. XMEMSET(id, 0, ID_LEN);
  11546. WOLFSSL_ENTER("wolfSSL_flush_sessions");
  11547. for (i = 0; i < SESSION_ROWS; ++i) {
  11548. if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) {
  11549. WOLFSSL_MSG("Session cache mutex lock failed");
  11550. return;
  11551. }
  11552. for (j = 0; j < SESSIONS_PER_ROW; j++) {
  11553. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11554. WOLFSSL_SESSION* s = SessionCache[i].Sessions[j];
  11555. #else
  11556. WOLFSSL_SESSION* s = &SessionCache[i].Sessions[j];
  11557. #endif
  11558. if (
  11559. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11560. s != NULL &&
  11561. #endif
  11562. XMEMCMP(s->sessionID, id, ID_LEN) != 0 &&
  11563. s->bornOn + s->timeout < (word32)tm
  11564. )
  11565. {
  11566. EvictSessionFromCache(s);
  11567. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11568. XFREE(s, s->heap, DYNAMIC_TYPE_SESSION);
  11569. SessionCache[i].Sessions[j] = NULL;
  11570. #endif
  11571. }
  11572. }
  11573. SESSION_ROW_UNLOCK(&SessionCache[i]);
  11574. }
  11575. }
  11576. /* set ssl session timeout in seconds */
  11577. WOLFSSL_ABI
  11578. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11579. {
  11580. if (ssl == NULL)
  11581. return BAD_FUNC_ARG;
  11582. if (to == 0)
  11583. to = WOLFSSL_SESSION_TIMEOUT;
  11584. ssl->timeout = to;
  11585. return WOLFSSL_SUCCESS;
  11586. }
  11587. /**
  11588. * Sets ctx session timeout in seconds.
  11589. * The timeout value set here should be reflected in the
  11590. * "session ticket lifetime hint" if this API works in the openssl compat-layer.
  11591. * Therefore wolfSSL_CTX_set_TicketHint is called internally.
  11592. * Arguments:
  11593. * - ctx WOLFSSL_CTX object which the timeout is set to
  11594. * - to timeout value in second
  11595. * Returns:
  11596. * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure.
  11597. * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value
  11598. * on success, BAD_FUNC_ARG on failure.
  11599. */
  11600. WOLFSSL_ABI
  11601. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11602. {
  11603. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11604. word32 prev_timeout = 0;
  11605. #endif
  11606. int ret = WOLFSSL_SUCCESS;
  11607. (void)ret;
  11608. if (ctx == NULL)
  11609. ret = BAD_FUNC_ARG;
  11610. if (ret == WOLFSSL_SUCCESS) {
  11611. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11612. prev_timeout = ctx->timeout;
  11613. #endif
  11614. if (to == 0) {
  11615. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  11616. }
  11617. else {
  11618. ctx->timeout = to;
  11619. }
  11620. }
  11621. #if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \
  11622. !defined(NO_WOLFSSL_SERVER)
  11623. if (ret == WOLFSSL_SUCCESS) {
  11624. if (to == 0) {
  11625. ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT);
  11626. }
  11627. else {
  11628. ret = wolfSSL_CTX_set_TicketHint(ctx, to);
  11629. }
  11630. }
  11631. #endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */
  11632. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11633. if (ret == WOLFSSL_SUCCESS) {
  11634. return prev_timeout;
  11635. }
  11636. else {
  11637. return ret;
  11638. }
  11639. #else
  11640. return ret;
  11641. #endif /* WOLFSSL_ERROR_CODE_OPENSSL */
  11642. }
  11643. #ifndef NO_CLIENT_CACHE
  11644. /* Get Session from Client cache based on id/len, return NULL on failure */
  11645. WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11646. {
  11647. WOLFSSL_SESSION* ret = NULL;
  11648. word32 row;
  11649. int idx;
  11650. int count;
  11651. int error = 0;
  11652. ClientSession* clSess;
  11653. WOLFSSL_ENTER("wolfSSL_GetSessionClient");
  11654. if (ssl->ctx->sessionCacheOff) {
  11655. WOLFSSL_MSG("Session Cache off");
  11656. return NULL;
  11657. }
  11658. if (ssl->options.side == WOLFSSL_SERVER_END)
  11659. return NULL;
  11660. len = min(SERVER_ID_LEN, (word32)len);
  11661. /* Do not access ssl->ctx->get_sess_cb from here. It is using a different
  11662. * set of ID's */
  11663. row = HashObject(id, len, &error) % CLIENT_SESSION_ROWS;
  11664. if (error != 0) {
  11665. WOLFSSL_MSG("Hash session failed");
  11666. return NULL;
  11667. }
  11668. if (wc_LockMutex(&clisession_mutex) != 0) {
  11669. WOLFSSL_MSG("Client cache mutex lock failed");
  11670. return NULL;
  11671. }
  11672. /* start from most recently used */
  11673. count = min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW);
  11674. idx = ClientCache[row].nextIdx - 1;
  11675. if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) {
  11676. idx = CLIENT_SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11677. }
  11678. clSess = ClientCache[row].Clients;
  11679. for (; count > 0; --count) {
  11680. WOLFSSL_SESSION* current;
  11681. SessionRow* sessRow;
  11682. if (clSess[idx].serverRow >= SESSION_ROWS) {
  11683. WOLFSSL_MSG("Client cache serverRow invalid");
  11684. break;
  11685. }
  11686. /* lock row */
  11687. sessRow = &SessionCache[clSess[idx].serverRow];
  11688. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  11689. WOLFSSL_MSG("Session cache row lock failure");
  11690. break;
  11691. }
  11692. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11693. current = sessRow->Sessions[clSess[idx].serverIdx];
  11694. #else
  11695. current = &sessRow->Sessions[clSess[idx].serverIdx];
  11696. #endif
  11697. if (current && XMEMCMP(current->serverID, id, len) == 0) {
  11698. WOLFSSL_MSG("Found a serverid match for client");
  11699. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11700. WOLFSSL_MSG("Session valid");
  11701. ret = current;
  11702. SESSION_ROW_UNLOCK(sessRow);
  11703. break;
  11704. } else {
  11705. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11706. }
  11707. } else {
  11708. WOLFSSL_MSG("ServerID not a match from client table");
  11709. }
  11710. SESSION_ROW_UNLOCK(sessRow);
  11711. idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1;
  11712. }
  11713. wc_UnLockMutex(&clisession_mutex);
  11714. return ret;
  11715. }
  11716. #endif /* !NO_CLIENT_CACHE */
  11717. static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session)
  11718. {
  11719. (void)session;
  11720. return ssl->options.sessionCacheOff
  11721. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET)
  11722. && session->ticketLen == 0
  11723. #endif
  11724. ;
  11725. }
  11726. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  11727. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11728. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11729. /**
  11730. * SessionTicketNoncePrealloc() - prealloc a buffer for ticket nonces
  11731. * @output: [in] pointer to WOLFSSL_SESSION object that will soon be a
  11732. * destination of a session duplication
  11733. * @buf: [out] address of the preallocated buf
  11734. * @len: [out] len of the preallocated buf
  11735. *
  11736. * prealloc a buffer that will likely suffice to contain a ticket nonce. It's
  11737. * used when copying session under lock, when syscalls need to be avoided. If
  11738. * output already has a dynamic buffer, it's reused.
  11739. */
  11740. static int SessionTicketNoncePrealloc(byte** buf, byte* len, void *heap)
  11741. {
  11742. (void)heap;
  11743. *buf = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_NONCE_LEN, heap,
  11744. DYNAMIC_TYPE_SESSION_TICK);
  11745. if (*buf == NULL) {
  11746. WOLFSSL_MSG("Failed to preallocate ticket nonce buffer");
  11747. *len = 0;
  11748. return 1;
  11749. }
  11750. *len = PREALLOC_SESSION_TICKET_NONCE_LEN;
  11751. return 0;
  11752. }
  11753. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
  11754. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  11755. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  11756. byte* ticketNonceLen, byte* preallocUsed);
  11757. void TlsSessionCacheUnlockRow(word32 row)
  11758. {
  11759. SessionRow* sessRow;
  11760. sessRow = &SessionCache[row];
  11761. (void)sessRow;
  11762. SESSION_ROW_UNLOCK(sessRow);
  11763. }
  11764. /* Don't use this function directly. Use TlsSessionCacheGetAndRdLock and
  11765. * TlsSessionCacheGetAndWrLock to fully utilize compiler const support. */
  11766. static int TlsSessionCacheGetAndLock(const byte *id,
  11767. const WOLFSSL_SESSION **sess, word32 *lockedRow, byte readOnly, byte side)
  11768. {
  11769. SessionRow *sessRow;
  11770. const WOLFSSL_SESSION *s;
  11771. word32 row;
  11772. int count;
  11773. int error;
  11774. int idx;
  11775. *sess = NULL;
  11776. row = HashObject(id, ID_LEN, &error) % SESSION_ROWS;
  11777. if (error != 0)
  11778. return error;
  11779. sessRow = &SessionCache[row];
  11780. if (readOnly)
  11781. error = SESSION_ROW_RD_LOCK(sessRow);
  11782. else
  11783. error = SESSION_ROW_WR_LOCK(sessRow);
  11784. if (error != 0)
  11785. return FATAL_ERROR;
  11786. /* start from most recently used */
  11787. count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW);
  11788. idx = sessRow->nextIdx - 1;
  11789. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  11790. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11791. }
  11792. for (; count > 0; --count) {
  11793. #ifdef SESSION_CACHE_DYNAMIC_MEM
  11794. s = sessRow->Sessions[idx];
  11795. #else
  11796. s = &sessRow->Sessions[idx];
  11797. #endif
  11798. if (s && XMEMCMP(s->sessionID, id, ID_LEN) == 0 && s->side == side) {
  11799. *sess = s;
  11800. break;
  11801. }
  11802. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  11803. }
  11804. if (*sess == NULL) {
  11805. SESSION_ROW_UNLOCK(sessRow);
  11806. }
  11807. else {
  11808. *lockedRow = row;
  11809. }
  11810. return 0;
  11811. }
  11812. static int CheckSessionMatch(const WOLFSSL* ssl, const WOLFSSL_SESSION* sess)
  11813. {
  11814. if (ssl == NULL || sess == NULL)
  11815. return 0;
  11816. #ifdef OPENSSL_EXTRA
  11817. if (ssl->sessionCtxSz > 0 && (ssl->sessionCtxSz != sess->sessionCtxSz ||
  11818. XMEMCMP(ssl->sessionCtx, sess->sessionCtx, sess->sessionCtxSz) != 0))
  11819. return 0;
  11820. #endif
  11821. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11822. if (IsAtLeastTLSv1_3(ssl->version) != IsAtLeastTLSv1_3(sess->version))
  11823. return 0;
  11824. #endif
  11825. return 1;
  11826. }
  11827. int TlsSessionCacheGetAndRdLock(const byte *id, const WOLFSSL_SESSION **sess,
  11828. word32 *lockedRow, byte side)
  11829. {
  11830. return TlsSessionCacheGetAndLock(id, sess, lockedRow, 1, side);
  11831. }
  11832. int TlsSessionCacheGetAndWrLock(const byte *id, WOLFSSL_SESSION **sess,
  11833. word32 *lockedRow, byte side)
  11834. {
  11835. return TlsSessionCacheGetAndLock(id, (const WOLFSSL_SESSION**)sess,
  11836. lockedRow, 0, side);
  11837. }
  11838. int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
  11839. {
  11840. const WOLFSSL_SESSION* sess = NULL;
  11841. const byte* id = NULL;
  11842. word32 row;
  11843. int error = 0;
  11844. #ifdef HAVE_SESSION_TICKET
  11845. #ifndef WOLFSSL_SMALL_STACK
  11846. byte tmpTicket[PREALLOC_SESSION_TICKET_LEN];
  11847. #else
  11848. byte* tmpTicket = NULL;
  11849. #endif
  11850. #ifdef WOLFSSL_TLS13
  11851. byte *preallocNonce = NULL;
  11852. byte preallocNonceLen = 0;
  11853. byte preallocNonceUsed = 0;
  11854. #endif /* WOLFSSL_TLS13 */
  11855. byte tmpBufSet = 0;
  11856. #endif
  11857. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11858. WOLFSSL_X509* peer = NULL;
  11859. #endif
  11860. byte bogusID[ID_LEN];
  11861. byte bogusIDSz = 0;
  11862. WOLFSSL_ENTER("wolfSSL_GetSessionFromCache");
  11863. if (output == NULL) {
  11864. WOLFSSL_MSG("NULL output");
  11865. return WOLFSSL_FAILURE;
  11866. }
  11867. if (SslSessionCacheOff(ssl, ssl->session))
  11868. return WOLFSSL_FAILURE;
  11869. if (ssl->options.haveSessionId == 0 && !ssl->session->haveAltSessionID)
  11870. return WOLFSSL_FAILURE;
  11871. #ifdef HAVE_SESSION_TICKET
  11872. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11873. return WOLFSSL_FAILURE;
  11874. #endif
  11875. XMEMSET(bogusID, 0, sizeof(bogusID));
  11876. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL
  11877. && !ssl->session->haveAltSessionID)
  11878. id = ssl->arrays->sessionID;
  11879. else if (ssl->session->haveAltSessionID) {
  11880. id = ssl->session->altSessionID;
  11881. /* We want to restore the bogus ID for TLS compatibility */
  11882. if (output == ssl->session) {
  11883. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  11884. bogusIDSz = ssl->session->sessionIDSz;
  11885. }
  11886. }
  11887. else
  11888. id = ssl->session->sessionID;
  11889. #ifdef HAVE_EXT_CACHE
  11890. if (ssl->ctx->get_sess_cb != NULL) {
  11891. int copy = 0;
  11892. int found = 0;
  11893. WOLFSSL_SESSION* extSess;
  11894. /* Attempt to retrieve the session from the external cache. */
  11895. WOLFSSL_MSG("Calling external session cache");
  11896. extSess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  11897. if ((extSess != NULL)
  11898. && CheckSessionMatch(ssl, extSess)
  11899. ) {
  11900. WOLFSSL_MSG("Session found in external cache");
  11901. found = 1;
  11902. error = wolfSSL_DupSession(extSess, output, 0);
  11903. #ifdef HAVE_EX_DATA
  11904. extSess->ownExData = 1;
  11905. output->ownExData = 0;
  11906. #endif
  11907. /* We want to restore the bogus ID for TLS compatibility */
  11908. if (ssl->session->haveAltSessionID &&
  11909. output == ssl->session) {
  11910. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  11911. ssl->session->sessionIDSz = bogusIDSz;
  11912. }
  11913. }
  11914. /* If copy not set then free immediately */
  11915. if (extSess != NULL && !copy)
  11916. wolfSSL_FreeSession(ssl->ctx, extSess);
  11917. if (found)
  11918. return error;
  11919. WOLFSSL_MSG("Session not found in external cache");
  11920. }
  11921. if (ssl->options.internalCacheLookupOff) {
  11922. WOLFSSL_MSG("Internal cache lookup turned off");
  11923. return WOLFSSL_FAILURE;
  11924. }
  11925. #endif
  11926. #ifdef HAVE_SESSION_TICKET
  11927. if (output->ticket == NULL ||
  11928. output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) {
  11929. #ifdef WOLFSSL_SMALL_STACK
  11930. tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap,
  11931. DYNAMIC_TYPE_TMP_BUFFER);
  11932. if (tmpTicket == NULL) {
  11933. WOLFSSL_MSG("tmpTicket malloc failed");
  11934. return WOLFSSL_FAILURE;
  11935. }
  11936. #endif
  11937. if (output->ticketLenAlloc)
  11938. XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11939. output->ticket = tmpTicket; /* cppcheck-suppress autoVariables
  11940. */
  11941. output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN;
  11942. output->ticketLen = 0;
  11943. tmpBufSet = 1;
  11944. }
  11945. #endif
  11946. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11947. if (output->peer != NULL) {
  11948. wolfSSL_X509_free(output->peer);
  11949. output->peer = NULL;
  11950. }
  11951. #endif
  11952. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \
  11953. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11954. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11955. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  11956. XFREE(output->ticketNonce.data, output->heap,
  11957. DYNAMIC_TYPE_SESSION_TICK);
  11958. output->ticketNonce.data = output->ticketNonce.dataStatic;
  11959. output->ticketNonce.len = 0;
  11960. }
  11961. error = SessionTicketNoncePrealloc(&preallocNonce, &preallocNonceLen,
  11962. output->heap);
  11963. if (error != 0) {
  11964. if (tmpBufSet) {
  11965. output->ticket = output->staticTicket;
  11966. output->ticketLenAlloc = 0;
  11967. }
  11968. #ifdef WOLFSSL_SMALL_STACK
  11969. if (tmpTicket != NULL)
  11970. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11971. #endif
  11972. return WOLFSSL_FAILURE;
  11973. }
  11974. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET*/
  11975. /* init to avoid clang static analyzer false positive */
  11976. row = 0;
  11977. error = TlsSessionCacheGetAndRdLock(id, &sess, &row, (byte)ssl->options.side);
  11978. error = (error == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  11979. if (error != WOLFSSL_SUCCESS || sess == NULL) {
  11980. WOLFSSL_MSG("Get Session from cache failed");
  11981. error = WOLFSSL_FAILURE;
  11982. #ifdef HAVE_SESSION_TICKET
  11983. if (tmpBufSet) {
  11984. output->ticket = output->staticTicket;
  11985. output->ticketLenAlloc = 0;
  11986. }
  11987. #ifdef WOLFSSL_TLS13
  11988. if (preallocNonce != NULL) {
  11989. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11990. preallocNonce = NULL;
  11991. }
  11992. #endif /* WOLFSSL_TLS13 */
  11993. #ifdef WOLFSSL_SMALL_STACK
  11994. if (tmpTicket != NULL) {
  11995. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11996. tmpTicket = NULL;
  11997. }
  11998. #endif
  11999. #endif
  12000. }
  12001. else {
  12002. if (!CheckSessionMatch(ssl, sess)) {
  12003. WOLFSSL_MSG("Invalid session: can't be used in this context");
  12004. TlsSessionCacheUnlockRow(row);
  12005. error = WOLFSSL_FAILURE;
  12006. }
  12007. else if (LowResTimer() >= (sess->bornOn + sess->timeout)) {
  12008. WOLFSSL_SESSION* wrSess = NULL;
  12009. WOLFSSL_MSG("Invalid session: timed out");
  12010. sess = NULL;
  12011. TlsSessionCacheUnlockRow(row);
  12012. /* Attempt to get a write lock */
  12013. error = TlsSessionCacheGetAndWrLock(id, &wrSess, &row,
  12014. (byte)ssl->options.side);
  12015. if (error == 0 && wrSess != NULL) {
  12016. EvictSessionFromCache(wrSess);
  12017. TlsSessionCacheUnlockRow(row);
  12018. }
  12019. error = WOLFSSL_FAILURE;
  12020. }
  12021. }
  12022. /* mollify confused cppcheck nullPointer warning. */
  12023. if (sess == NULL)
  12024. error = WOLFSSL_FAILURE;
  12025. if (error == WOLFSSL_SUCCESS) {
  12026. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13)
  12027. error = wolfSSL_DupSessionEx(sess, output, 1,
  12028. preallocNonce, &preallocNonceLen, &preallocNonceUsed);
  12029. #else
  12030. error = wolfSSL_DupSession(sess, output, 1);
  12031. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
  12032. #ifdef HAVE_EX_DATA
  12033. output->ownExData = !sess->ownExData; /* Session may own ex_data */
  12034. #endif
  12035. TlsSessionCacheUnlockRow(row);
  12036. }
  12037. /* We want to restore the bogus ID for TLS compatibility */
  12038. if (ssl->session->haveAltSessionID &&
  12039. output == ssl->session) {
  12040. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  12041. ssl->session->sessionIDSz = bogusIDSz;
  12042. }
  12043. #ifdef HAVE_SESSION_TICKET
  12044. if (tmpBufSet) {
  12045. if (error == WOLFSSL_SUCCESS) {
  12046. if (output->ticketLen > SESSION_TICKET_LEN) {
  12047. output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap,
  12048. DYNAMIC_TYPE_SESSION_TICK);
  12049. if (output->ticket == NULL) {
  12050. error = WOLFSSL_FAILURE;
  12051. output->ticket = output->staticTicket;
  12052. output->ticketLenAlloc = 0;
  12053. output->ticketLen = 0;
  12054. }
  12055. }
  12056. else {
  12057. output->ticket = output->staticTicket;
  12058. output->ticketLenAlloc = 0;
  12059. }
  12060. }
  12061. else {
  12062. output->ticket = output->staticTicket;
  12063. output->ticketLenAlloc = 0;
  12064. output->ticketLen = 0;
  12065. }
  12066. if (error == WOLFSSL_SUCCESS) {
  12067. XMEMCPY(output->ticket, tmpTicket, output->ticketLen);
  12068. }
  12069. }
  12070. #ifdef WOLFSSL_SMALL_STACK
  12071. if (tmpTicket != NULL)
  12072. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12073. #endif
  12074. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12075. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12076. if (error == WOLFSSL_SUCCESS && preallocNonceUsed) {
  12077. if (preallocNonceLen < PREALLOC_SESSION_TICKET_NONCE_LEN) {
  12078. /* buffer bigger than needed */
  12079. #ifndef XREALLOC
  12080. output->ticketNonce.data = (byte*)XMALLOC(preallocNonceLen,
  12081. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12082. if (output->ticketNonce.data != NULL)
  12083. XMEMCPY(output->ticketNonce.data, preallocNonce,
  12084. preallocNonceLen);
  12085. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12086. preallocNonce = NULL;
  12087. #else
  12088. output->ticketNonce.data = XREALLOC(preallocNonce,
  12089. preallocNonceLen, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12090. if (output->ticketNonce.data != NULL) {
  12091. /* don't free the reallocated pointer */
  12092. preallocNonce = NULL;
  12093. }
  12094. #endif /* !XREALLOC */
  12095. if (output->ticketNonce.data == NULL) {
  12096. output->ticketNonce.data = output->ticketNonce.dataStatic;
  12097. output->ticketNonce.len = 0;
  12098. error = WOLFSSL_FAILURE;
  12099. /* preallocNonce will be free'd after the if */
  12100. }
  12101. }
  12102. else {
  12103. output->ticketNonce.data = preallocNonce;
  12104. output->ticketNonce.len = preallocNonceLen;
  12105. preallocNonce = NULL;
  12106. }
  12107. }
  12108. if (preallocNonce != NULL)
  12109. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  12110. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12111. #endif
  12112. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12113. if (peer != NULL) {
  12114. wolfSSL_X509_free(peer);
  12115. }
  12116. #endif
  12117. return error;
  12118. }
  12119. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12120. byte restoreSessionCerts)
  12121. {
  12122. WOLFSSL_SESSION* ret = NULL;
  12123. (void)restoreSessionCerts; /* Kept for compatibility */
  12124. if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) {
  12125. ret = ssl->session;
  12126. }
  12127. else {
  12128. WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session");
  12129. }
  12130. if (ret != NULL && masterSecret != NULL)
  12131. XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN);
  12132. return ret;
  12133. }
  12134. int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  12135. {
  12136. SessionRow* sessRow = NULL;
  12137. int ret = WOLFSSL_SUCCESS;
  12138. session = ClientSessionToSession(session);
  12139. if (ssl == NULL || session == NULL || !session->isSetup) {
  12140. WOLFSSL_MSG("ssl or session NULL or not set up");
  12141. return WOLFSSL_FAILURE;
  12142. }
  12143. /* We need to lock the session as the first step if its in the cache */
  12144. if (session->type == WOLFSSL_SESSION_TYPE_CACHE) {
  12145. if (session->cacheRow < SESSION_ROWS) {
  12146. sessRow = &SessionCache[session->cacheRow];
  12147. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  12148. WOLFSSL_MSG("Session row lock failed");
  12149. return WOLFSSL_FAILURE;
  12150. }
  12151. }
  12152. }
  12153. if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END &&
  12154. (byte)ssl->options.side != session->side) {
  12155. WOLFSSL_MSG("Setting session for wrong role");
  12156. ret = WOLFSSL_FAILURE;
  12157. }
  12158. if (ret == WOLFSSL_SUCCESS) {
  12159. if (ssl->session == session) {
  12160. WOLFSSL_MSG("ssl->session and session same");
  12161. }
  12162. else if (session->type != WOLFSSL_SESSION_TYPE_CACHE) {
  12163. if (wolfSSL_SESSION_up_ref(session) == WOLFSSL_SUCCESS) {
  12164. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  12165. ssl->session = session;
  12166. }
  12167. else
  12168. ret = WOLFSSL_FAILURE;
  12169. }
  12170. else {
  12171. ret = wolfSSL_DupSession(session, ssl->session, 0);
  12172. if (ret != WOLFSSL_SUCCESS)
  12173. WOLFSSL_MSG("Session duplicate failed");
  12174. }
  12175. }
  12176. /* Let's copy over the altSessionID for local cache purposes */
  12177. if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID &&
  12178. ssl->session != session) {
  12179. ssl->session->haveAltSessionID = 1;
  12180. XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN);
  12181. }
  12182. if (sessRow != NULL) {
  12183. SESSION_ROW_UNLOCK(sessRow);
  12184. sessRow = NULL;
  12185. }
  12186. /* Note: the `session` variable cannot be used below, since the row is
  12187. * un-locked */
  12188. if (ret != WOLFSSL_SUCCESS)
  12189. return ret;
  12190. #ifdef OPENSSL_EXTRA
  12191. /* check for application context id */
  12192. if (ssl->sessionCtxSz > 0) {
  12193. if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, ssl->sessionCtxSz)) {
  12194. /* context id did not match! */
  12195. WOLFSSL_MSG("Session context did not match");
  12196. return WOLFSSL_FAILURE;
  12197. }
  12198. }
  12199. #endif /* OPENSSL_EXTRA */
  12200. if (LowResTimer() >= (ssl->session->bornOn + ssl->session->timeout)) {
  12201. #if !defined(OPENSSL_EXTRA) || !defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12202. return WOLFSSL_FAILURE; /* session timed out */
  12203. #else /* defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) */
  12204. WOLFSSL_MSG("Session is expired but return success for "
  12205. "OpenSSL compatibility");
  12206. #endif
  12207. }
  12208. ssl->options.resuming = 1;
  12209. ssl->options.haveEMS = ssl->session->haveEMS;
  12210. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  12211. defined(HAVE_SESSION_TICKET))
  12212. ssl->version = ssl->session->version;
  12213. if (IsAtLeastTLSv1_3(ssl->version))
  12214. ssl->options.tls1_3 = 1;
  12215. #endif
  12216. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  12217. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12218. ssl->options.cipherSuite0 = ssl->session->cipherSuite0;
  12219. ssl->options.cipherSuite = ssl->session->cipherSuite;
  12220. #endif
  12221. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12222. ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet;
  12223. #endif
  12224. return WOLFSSL_SUCCESS;
  12225. }
  12226. #ifdef WOLFSSL_SESSION_STATS
  12227. static int get_locked_session_stats(word32* active, word32* total,
  12228. word32* peak);
  12229. #endif
  12230. #ifndef NO_CLIENT_CACHE
  12231. ClientSession* AddSessionToClientCache(int side, int row, int idx, byte* serverID,
  12232. word16 idLen, const byte* sessionID,
  12233. word16 useTicket)
  12234. {
  12235. int error = -1;
  12236. word32 clientRow = 0, clientIdx = 0;
  12237. (void)useTicket;
  12238. if (side == WOLFSSL_CLIENT_END
  12239. && row != INVALID_SESSION_ROW
  12240. && (idLen
  12241. #ifdef HAVE_SESSION_TICKET
  12242. || useTicket == 1
  12243. #endif
  12244. || serverID != NULL
  12245. )) {
  12246. WOLFSSL_MSG("Trying to add client cache entry");
  12247. if (idLen) {
  12248. clientRow = HashObject(serverID,
  12249. idLen, &error) % CLIENT_SESSION_ROWS;
  12250. }
  12251. else if (serverID != NULL) {
  12252. clientRow = HashObject(sessionID,
  12253. ID_LEN, &error) % CLIENT_SESSION_ROWS;
  12254. }
  12255. else {
  12256. error = -1;
  12257. }
  12258. if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) {
  12259. clientIdx = ClientCache[clientRow].nextIdx;
  12260. if (clientIdx < CLIENT_SESSIONS_PER_ROW) {
  12261. ClientCache[clientRow].Clients[clientIdx].serverRow =
  12262. (word16)row;
  12263. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  12264. (word16)idx;
  12265. if (sessionID != NULL) {
  12266. word32 sessionIDHash = HashObject(sessionID, ID_LEN,
  12267. &error);
  12268. if (error == 0) {
  12269. ClientCache[clientRow].Clients[clientIdx].sessionIDHash
  12270. = sessionIDHash;
  12271. }
  12272. }
  12273. }
  12274. else {
  12275. error = -1;
  12276. ClientCache[clientRow].nextIdx = 0; /* reset index as safety */
  12277. WOLFSSL_MSG("Invalid client cache index! "
  12278. "Possible corrupted memory");
  12279. }
  12280. if (error == 0) {
  12281. WOLFSSL_MSG("Adding client cache entry");
  12282. if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW)
  12283. ClientCache[clientRow].totalCount++;
  12284. ClientCache[clientRow].nextIdx++;
  12285. ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW;
  12286. }
  12287. wc_UnLockMutex(&clisession_mutex);
  12288. }
  12289. else {
  12290. WOLFSSL_MSG("Hash session or lock failed");
  12291. error = -1;
  12292. }
  12293. }
  12294. else {
  12295. WOLFSSL_MSG("Skipping client cache");
  12296. }
  12297. if (error == 0)
  12298. return &ClientCache[clientRow].Clients[clientIdx];
  12299. else
  12300. return NULL;
  12301. }
  12302. #endif /* !NO_CLIENT_CACHE */
  12303. /**
  12304. * For backwards compatibility, this API needs to be used in *ALL* functions
  12305. * that access the WOLFSSL_SESSION members directly.
  12306. *
  12307. * This API checks if the passed in session is actually a ClientSession object
  12308. * and returns the matching session cache object. Otherwise just return the
  12309. * input. ClientSession objects only occur in the ClientCache. They are not
  12310. * allocated anywhere else.
  12311. */
  12312. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12313. {
  12314. WOLFSSL_ENTER("ClientSessionToSession");
  12315. #ifdef NO_SESSION_CACHE_REF
  12316. return (WOLFSSL_SESSION*)session;
  12317. #else
  12318. #ifndef NO_CLIENT_CACHE
  12319. if (session == NULL)
  12320. return NULL;
  12321. /* Check if session points into ClientCache */
  12322. if ((byte*)session >= (byte*)ClientCache &&
  12323. /* Cast to byte* to make pointer arithmetic work per byte */
  12324. (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) {
  12325. ClientSession* clientSession = (ClientSession*)session;
  12326. SessionRow* sessRow = NULL;
  12327. WOLFSSL_SESSION* cacheSession = NULL;
  12328. word32 sessionIDHash = 0;
  12329. int error = 0;
  12330. session = NULL; /* Default to NULL for failure case */
  12331. if (wc_LockMutex(&clisession_mutex) != 0) {
  12332. WOLFSSL_MSG("Client cache mutex lock failed");
  12333. return NULL;
  12334. }
  12335. if (clientSession->serverRow >= SESSION_ROWS ||
  12336. clientSession->serverIdx >= SESSIONS_PER_ROW) {
  12337. WOLFSSL_MSG("Client cache serverRow or serverIdx invalid");
  12338. error = -1;
  12339. }
  12340. if (error == 0) {
  12341. /* Lock row */
  12342. sessRow = &SessionCache[clientSession->serverRow];
  12343. error = SESSION_ROW_RD_LOCK(sessRow);
  12344. if (error != 0) {
  12345. WOLFSSL_MSG("Session cache row lock failure");
  12346. sessRow = NULL;
  12347. }
  12348. }
  12349. if (error == 0) {
  12350. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12351. cacheSession = sessRow->Sessions[clientSession->serverIdx];
  12352. #else
  12353. cacheSession = &sessRow->Sessions[clientSession->serverIdx];
  12354. #endif
  12355. if (cacheSession && cacheSession->sessionIDSz == 0) {
  12356. cacheSession = NULL;
  12357. WOLFSSL_MSG("Session cache entry not set");
  12358. error = -1;
  12359. }
  12360. }
  12361. if (error == 0) {
  12362. /* Calculate the hash of the session ID */
  12363. sessionIDHash = HashObject(cacheSession->sessionID, ID_LEN,
  12364. &error);
  12365. }
  12366. if (error == 0) {
  12367. /* Check the session ID hash matches */
  12368. error = clientSession->sessionIDHash != sessionIDHash;
  12369. if (error != 0)
  12370. WOLFSSL_MSG("session ID hash don't match");
  12371. }
  12372. if (error == 0) {
  12373. /* Hashes match */
  12374. session = cacheSession;
  12375. WOLFSSL_MSG("Found session cache matching client session object");
  12376. }
  12377. if (sessRow != NULL) {
  12378. SESSION_ROW_UNLOCK(sessRow);
  12379. }
  12380. wc_UnLockMutex(&clisession_mutex);
  12381. return (WOLFSSL_SESSION*)session;
  12382. }
  12383. else {
  12384. /* Plain WOLFSSL_SESSION object */
  12385. return (WOLFSSL_SESSION*)session;
  12386. }
  12387. #else
  12388. return (WOLFSSL_SESSION*)session;
  12389. #endif
  12390. #endif
  12391. }
  12392. int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession,
  12393. const byte* id, byte idSz, int* sessionIndex, int side,
  12394. word16 useTicket, ClientSession** clientCacheEntry)
  12395. {
  12396. WOLFSSL_SESSION* cacheSession = NULL;
  12397. SessionRow* sessRow = NULL;
  12398. word32 idx = 0;
  12399. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12400. WOLFSSL_X509* cachePeer = NULL;
  12401. WOLFSSL_X509* addPeer = NULL;
  12402. #endif
  12403. #ifdef HAVE_SESSION_TICKET
  12404. byte* cacheTicBuff = NULL;
  12405. byte ticBuffUsed = 0;
  12406. byte* ticBuff = NULL;
  12407. int ticLen = 0;
  12408. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12409. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12410. byte *preallocNonce = NULL;
  12411. byte preallocNonceLen = 0;
  12412. byte preallocNonceUsed = 0;
  12413. byte *toFree = NULL;
  12414. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC */
  12415. #endif /* HAVE_SESSION_TICKET */
  12416. int ret = 0;
  12417. int row;
  12418. int i;
  12419. int overwrite = 0;
  12420. (void)ctx;
  12421. (void)sessionIndex;
  12422. (void)useTicket;
  12423. (void)clientCacheEntry;
  12424. WOLFSSL_ENTER("AddSessionToCache");
  12425. if (idSz == 0) {
  12426. WOLFSSL_MSG("AddSessionToCache idSz == 0");
  12427. return BAD_FUNC_ARG;
  12428. }
  12429. addSession = ClientSessionToSession(addSession);
  12430. if (addSession == NULL) {
  12431. WOLFSSL_MSG("AddSessionToCache is NULL");
  12432. return MEMORY_E;
  12433. }
  12434. #ifdef HAVE_SESSION_TICKET
  12435. ticLen = addSession->ticketLen;
  12436. /* Alloc Memory here to avoid syscalls during lock */
  12437. if (ticLen > SESSION_TICKET_LEN) {
  12438. ticBuff = (byte*)XMALLOC(ticLen, NULL,
  12439. DYNAMIC_TYPE_SESSION_TICK);
  12440. if (ticBuff == NULL) {
  12441. return MEMORY_E;
  12442. }
  12443. }
  12444. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12445. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12446. if (addSession->ticketNonce.data != addSession->ticketNonce.dataStatic) {
  12447. /* use the AddSession->heap even if the buffer maybe saved in
  12448. * CachedSession objects. CachedSession heap and AddSession heap should
  12449. * be the same */
  12450. preallocNonce = (byte*)XMALLOC(addSession->ticketNonce.len,
  12451. addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12452. if (preallocNonce == NULL) {
  12453. if (ticBuff != NULL)
  12454. XFREE(ticBuff, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12455. return MEMORY_E;
  12456. }
  12457. preallocNonceLen = addSession->ticketNonce.len;
  12458. }
  12459. #endif /* WOLFSSL_TLS13 && WOLFSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
  12460. #endif /* HAVE_SESSION_TICKET */
  12461. /* Find a position for the new session in cache and use that */
  12462. /* Use the session object in the cache for external cache if required */
  12463. row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS);
  12464. if (ret != 0) {
  12465. WOLFSSL_MSG("Hash session failed");
  12466. #ifdef HAVE_SESSION_TICKET
  12467. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12468. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12469. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12470. #endif
  12471. #endif
  12472. return ret;
  12473. }
  12474. sessRow = &SessionCache[row];
  12475. if (SESSION_ROW_WR_LOCK(sessRow) != 0) {
  12476. #ifdef HAVE_SESSION_TICKET
  12477. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12478. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12479. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12480. #endif
  12481. #endif
  12482. WOLFSSL_MSG("Session row lock failed");
  12483. return BAD_MUTEX_E;
  12484. }
  12485. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  12486. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12487. cacheSession = sessRow->Sessions[i];
  12488. #else
  12489. cacheSession = &sessRow->Sessions[i];
  12490. #endif
  12491. if (cacheSession && XMEMCMP(id,
  12492. cacheSession->sessionID, ID_LEN) == 0 &&
  12493. cacheSession->side == side) {
  12494. WOLFSSL_MSG("Session already exists. Overwriting.");
  12495. overwrite = 1;
  12496. idx = i;
  12497. break;
  12498. }
  12499. }
  12500. if (!overwrite)
  12501. idx = sessRow->nextIdx;
  12502. #ifdef SESSION_INDEX
  12503. if (sessionIndex != NULL)
  12504. *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  12505. #endif
  12506. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12507. cacheSession = sessRow->Sessions[idx];
  12508. if (cacheSession == NULL) {
  12509. cacheSession = (WOLFSSL_SESSION*) XMALLOC(sizeof(WOLFSSL_SESSION),
  12510. sessRow->heap, DYNAMIC_TYPE_SESSION);
  12511. if (cacheSession == NULL) {
  12512. #ifdef HAVE_SESSION_TICKET
  12513. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12514. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC)
  12515. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12516. #endif
  12517. #endif
  12518. SESSION_ROW_UNLOCK(sessRow);
  12519. return MEMORY_E;
  12520. }
  12521. XMEMSET(cacheSession, 0, sizeof(WOLFSSL_SESSION));
  12522. sessRow->Sessions[idx] = cacheSession;
  12523. }
  12524. #else
  12525. cacheSession = &sessRow->Sessions[idx];
  12526. #endif
  12527. #ifdef HAVE_EX_DATA
  12528. if (overwrite) {
  12529. /* Figure out who owns the ex_data */
  12530. if (cacheSession->ownExData) {
  12531. /* Prioritize cacheSession copy */
  12532. XMEMCPY(&addSession->ex_data, &cacheSession->ex_data,
  12533. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  12534. }
  12535. /* else will be copied in wolfSSL_DupSession call */
  12536. }
  12537. else if (cacheSession->ownExData) {
  12538. crypto_ex_cb_free_data(cacheSession, crypto_ex_cb_ctx_session,
  12539. &cacheSession->ex_data);
  12540. cacheSession->ownExData = 0;
  12541. }
  12542. #endif
  12543. if (!overwrite)
  12544. EvictSessionFromCache(cacheSession);
  12545. cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE;
  12546. cacheSession->cacheRow = row;
  12547. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12548. /* Save the peer field to free after unlocking the row */
  12549. if (cacheSession->peer != NULL)
  12550. cachePeer = cacheSession->peer;
  12551. cacheSession->peer = NULL;
  12552. #endif
  12553. #ifdef HAVE_SESSION_TICKET
  12554. /* If we can reuse the existing buffer in cacheSession then we won't touch
  12555. * ticBuff at all making it a very cheap malloc/free. The page on a modern
  12556. * OS will most likely not even be allocated to the process. */
  12557. if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) {
  12558. /* Save pointer only if separately allocated */
  12559. if (cacheSession->ticket != cacheSession->staticTicket)
  12560. cacheTicBuff = cacheSession->ticket;
  12561. ticBuffUsed = 1;
  12562. cacheSession->ticket = ticBuff;
  12563. cacheSession->ticketLenAlloc = (word16) ticLen;
  12564. }
  12565. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12566. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12567. /* cache entry never used */
  12568. if (cacheSession->ticketNonce.data == NULL)
  12569. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12570. if (cacheSession->ticketNonce.data !=
  12571. cacheSession->ticketNonce.dataStatic) {
  12572. toFree = cacheSession->ticketNonce.data;
  12573. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12574. cacheSession->ticketNonce.len = 0;
  12575. }
  12576. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12577. #endif
  12578. #ifdef SESSION_CERTS
  12579. if (overwrite &&
  12580. addSession->chain.count == 0 &&
  12581. cacheSession->chain.count > 0) {
  12582. /* Copy in the certs from the session */
  12583. addSession->chain.count = cacheSession->chain.count;
  12584. XMEMCPY(addSession->chain.certs, cacheSession->chain.certs,
  12585. sizeof(x509_buffer) * cacheSession->chain.count);
  12586. }
  12587. #endif /* SESSION_CERTS */
  12588. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12589. /* Don't copy the peer cert into cache */
  12590. addPeer = addSession->peer;
  12591. addSession->peer = NULL;
  12592. #endif
  12593. cacheSession->heap = NULL;
  12594. /* Copy data into the cache object */
  12595. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12596. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12597. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12598. ret = wolfSSL_DupSessionEx(addSession, cacheSession, 1, preallocNonce,
  12599. &preallocNonceLen, &preallocNonceUsed) == WOLFSSL_FAILURE;
  12600. #else
  12601. ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE;
  12602. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12603. && FIPS_VERSION_GE(5,3)*/
  12604. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12605. addSession->peer = addPeer;
  12606. #endif
  12607. if (ret == 0) {
  12608. if (!overwrite) {
  12609. /* Increment the totalCount and the nextIdx */
  12610. if (sessRow->totalCount < SESSIONS_PER_ROW)
  12611. sessRow->totalCount++;
  12612. sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW;
  12613. }
  12614. if (id != addSession->sessionID) {
  12615. /* ssl->session->sessionID may contain the bogus ID or we want the
  12616. * ID from the arrays object */
  12617. XMEMCPY(cacheSession->sessionID, id, ID_LEN);
  12618. cacheSession->sessionIDSz = ID_LEN;
  12619. }
  12620. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  12621. if (ctx->rem_sess_cb != NULL)
  12622. cacheSession->rem_sess_cb = ctx->rem_sess_cb;
  12623. #endif
  12624. #ifdef HAVE_EX_DATA
  12625. /* The session in cache now owns the ex_data */
  12626. addSession->ownExData = 0;
  12627. cacheSession->ownExData = 1;
  12628. #endif
  12629. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12630. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12631. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12632. if (preallocNonce != NULL && preallocNonceUsed) {
  12633. cacheSession->ticketNonce.data = preallocNonce;
  12634. cacheSession->ticketNonce.len = preallocNonceLen;
  12635. preallocNonce = NULL;
  12636. preallocNonceLen = 0;
  12637. }
  12638. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12639. * && FIPS_VERSION_GE(5,3)*/
  12640. }
  12641. #ifdef HAVE_SESSION_TICKET
  12642. else if (ticBuffUsed) {
  12643. /* Error occurred. Need to clean up the ticket buffer. */
  12644. cacheSession->ticket = cacheSession->staticTicket;
  12645. cacheSession->ticketLenAlloc = 0;
  12646. cacheSession->ticketLen = 0;
  12647. }
  12648. #endif
  12649. SESSION_ROW_UNLOCK(sessRow);
  12650. cacheSession = NULL; /* Can't access after unlocked */
  12651. #ifndef NO_CLIENT_CACHE
  12652. if (ret == 0 && clientCacheEntry != NULL) {
  12653. ClientSession* clientCache = AddSessionToClientCache(side, row, idx,
  12654. addSession->serverID, addSession->idLen, id, useTicket);
  12655. if (clientCache != NULL)
  12656. *clientCacheEntry = clientCache;
  12657. }
  12658. #endif
  12659. #ifdef HAVE_SESSION_TICKET
  12660. if (ticBuff != NULL && !ticBuffUsed)
  12661. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12662. XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12663. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12664. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12665. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12666. XFREE(toFree, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12667. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12668. #endif
  12669. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12670. if (cachePeer != NULL) {
  12671. wolfSSL_X509_free(cachePeer);
  12672. cachePeer = NULL; /* Make sure not use after this point */
  12673. }
  12674. #endif
  12675. return ret;
  12676. }
  12677. void AddSession(WOLFSSL* ssl)
  12678. {
  12679. int error = 0;
  12680. const byte* id = NULL;
  12681. byte idSz = 0;
  12682. WOLFSSL_SESSION* session = ssl->session;
  12683. (void)error;
  12684. WOLFSSL_ENTER("AddSession");
  12685. if (SslSessionCacheOff(ssl, session)) {
  12686. WOLFSSL_MSG("Cache off");
  12687. return;
  12688. }
  12689. if (session->haveAltSessionID) {
  12690. id = session->altSessionID;
  12691. idSz = ID_LEN;
  12692. }
  12693. else {
  12694. id = session->sessionID;
  12695. idSz = session->sessionIDSz;
  12696. }
  12697. /* Do this only for the client because if the server doesn't have an ID at
  12698. * this point, it won't on resumption. */
  12699. if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12700. WC_RNG* rng = NULL;
  12701. if (ssl->rng != NULL)
  12702. rng = ssl->rng;
  12703. #if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA)
  12704. else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) {
  12705. rng = &globalRNG;
  12706. }
  12707. #endif
  12708. if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID,
  12709. ID_LEN) != 0)
  12710. return;
  12711. ssl->session->haveAltSessionID = 1;
  12712. id = ssl->session->altSessionID;
  12713. idSz = ID_LEN;
  12714. }
  12715. #ifdef HAVE_EXT_CACHE
  12716. if (!ssl->options.internalCacheOff)
  12717. #endif
  12718. {
  12719. /* Try to add the session to internal cache or external cache
  12720. if a new_sess_cb is set. Its ok if we don't succeed. */
  12721. (void)AddSessionToCache(ssl->ctx, session, id, idSz,
  12722. #ifdef SESSION_INDEX
  12723. &ssl->sessionIndex,
  12724. #else
  12725. NULL,
  12726. #endif
  12727. ssl->options.side,
  12728. #ifdef HAVE_SESSION_TICKET
  12729. ssl->options.useTicket,
  12730. #else
  12731. 0,
  12732. #endif
  12733. #ifdef NO_SESSION_CACHE_REF
  12734. NULL
  12735. #else
  12736. (ssl->options.side == WOLFSSL_CLIENT_END) ?
  12737. &ssl->clientSession : NULL
  12738. #endif
  12739. );
  12740. }
  12741. #ifdef HAVE_EXT_CACHE
  12742. if (error == 0 && ssl->ctx->new_sess_cb != NULL) {
  12743. int cbRet = 0;
  12744. wolfSSL_SESSION_up_ref(session);
  12745. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  12746. if (cbRet == 0)
  12747. wolfSSL_FreeSession(ssl->ctx, session);
  12748. }
  12749. #endif
  12750. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  12751. if (error == 0) {
  12752. word32 active = 0;
  12753. error = get_locked_session_stats(&active, NULL, NULL);
  12754. if (error == WOLFSSL_SUCCESS) {
  12755. error = 0; /* back to this function ok */
  12756. if (PeakSessions < active) {
  12757. PeakSessions = active;
  12758. }
  12759. }
  12760. }
  12761. #endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */
  12762. (void)error;
  12763. }
  12764. #ifdef SESSION_INDEX
  12765. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  12766. {
  12767. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  12768. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  12769. return ssl->sessionIndex;
  12770. }
  12771. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  12772. {
  12773. int row, col, result = WOLFSSL_FAILURE;
  12774. SessionRow* sessRow;
  12775. WOLFSSL_SESSION* cacheSession;
  12776. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  12777. session = ClientSessionToSession(session);
  12778. row = idx >> SESSIDX_ROW_SHIFT;
  12779. col = idx & SESSIDX_IDX_MASK;
  12780. if (session == NULL ||
  12781. row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) {
  12782. return WOLFSSL_FAILURE;
  12783. }
  12784. sessRow = &SessionCache[row];
  12785. if (SESSION_ROW_RD_LOCK(sessRow) != 0) {
  12786. return BAD_MUTEX_E;
  12787. }
  12788. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12789. cacheSession = sessRow->Sessions[col];
  12790. #else
  12791. cacheSession = &sessRow->Sessions[col];
  12792. #endif
  12793. if (cacheSession) {
  12794. XMEMCPY(session, cacheSession, sizeof(WOLFSSL_SESSION));
  12795. result = WOLFSSL_SUCCESS;
  12796. }
  12797. else {
  12798. result = WOLFSSL_FAILURE;
  12799. }
  12800. SESSION_ROW_UNLOCK(sessRow);
  12801. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  12802. return result;
  12803. }
  12804. #endif /* SESSION_INDEX */
  12805. #if defined(SESSION_CERTS)
  12806. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  12807. {
  12808. WOLFSSL_X509_CHAIN* chain = NULL;
  12809. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12810. session = ClientSessionToSession(session);
  12811. if (session)
  12812. chain = &session->chain;
  12813. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  12814. return chain;
  12815. }
  12816. #ifdef OPENSSL_EXTRA
  12817. /* gets the peer certificate associated with the session passed in
  12818. * returns null on failure, the caller should not free the returned pointer */
  12819. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  12820. {
  12821. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12822. session = ClientSessionToSession(session);
  12823. if (session) {
  12824. int count;
  12825. count = wolfSSL_get_chain_count(&session->chain);
  12826. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  12827. WOLFSSL_MSG("bad count found");
  12828. return NULL;
  12829. }
  12830. if (session->peer == NULL) {
  12831. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  12832. }
  12833. return session->peer;
  12834. }
  12835. WOLFSSL_MSG("No session passed in");
  12836. return NULL;
  12837. }
  12838. #endif /* OPENSSL_EXTRA */
  12839. #endif /* SESSION_INDEX && SESSION_CERTS */
  12840. #ifdef WOLFSSL_SESSION_STATS
  12841. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  12842. {
  12843. int result = WOLFSSL_SUCCESS;
  12844. int i;
  12845. int count;
  12846. int idx;
  12847. word32 now = 0;
  12848. word32 seen = 0;
  12849. word32 ticks = LowResTimer();
  12850. WOLFSSL_ENTER("get_locked_session_stats");
  12851. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12852. SESSION_ROW_RD_LOCK(&SessionCache[0]);
  12853. #endif
  12854. for (i = 0; i < SESSION_ROWS; i++) {
  12855. SessionRow* row = &SessionCache[i];
  12856. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12857. if (SESSION_ROW_RD_LOCK(row) != 0) {
  12858. WOLFSSL_MSG("Session row cache mutex lock failed");
  12859. return BAD_MUTEX_E;
  12860. }
  12861. #endif
  12862. seen += row->totalCount;
  12863. if (active == NULL) {
  12864. SESSION_ROW_UNLOCK(row);
  12865. continue;
  12866. }
  12867. count = min((word32)row->totalCount, SESSIONS_PER_ROW);
  12868. idx = row->nextIdx - 1;
  12869. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  12870. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  12871. }
  12872. for (; count > 0; --count) {
  12873. /* if not expired then good */
  12874. #ifdef SESSION_CACHE_DYNAMIC_MEM
  12875. if (row->Sessions[idx] &&
  12876. ticks < (row->Sessions[idx]->bornOn +
  12877. row->Sessions[idx]->timeout) )
  12878. #else
  12879. if (ticks < (row->Sessions[idx].bornOn +
  12880. row->Sessions[idx].timeout) )
  12881. #endif
  12882. {
  12883. now++;
  12884. }
  12885. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  12886. }
  12887. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12888. SESSION_ROW_UNLOCK(row);
  12889. #endif
  12890. }
  12891. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12892. SESSION_ROW_UNLOCK(&SessionCache[0]);
  12893. #endif
  12894. if (active) {
  12895. *active = now;
  12896. }
  12897. if (total) {
  12898. *total = seen;
  12899. }
  12900. #ifdef WOLFSSL_PEAK_SESSIONS
  12901. if (peak) {
  12902. *peak = PeakSessions;
  12903. }
  12904. #else
  12905. (void)peak;
  12906. #endif
  12907. WOLFSSL_LEAVE("get_locked_session_stats", result);
  12908. return result;
  12909. }
  12910. /* return WOLFSSL_SUCCESS on ok */
  12911. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  12912. word32* maxSessions)
  12913. {
  12914. int result = WOLFSSL_SUCCESS;
  12915. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  12916. if (maxSessions) {
  12917. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  12918. if (active == NULL && total == NULL && peak == NULL)
  12919. return result; /* we're done */
  12920. }
  12921. /* user must provide at least one query value */
  12922. if (active == NULL && total == NULL && peak == NULL) {
  12923. return BAD_FUNC_ARG;
  12924. }
  12925. result = get_locked_session_stats(active, total, peak);
  12926. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  12927. return result;
  12928. }
  12929. #endif /* WOLFSSL_SESSION_STATS */
  12930. #ifdef PRINT_SESSION_STATS
  12931. /* WOLFSSL_SUCCESS on ok */
  12932. int wolfSSL_PrintSessionStats(void)
  12933. {
  12934. word32 totalSessionsSeen = 0;
  12935. word32 totalSessionsNow = 0;
  12936. word32 peak = 0;
  12937. word32 maxSessions = 0;
  12938. int i;
  12939. int ret;
  12940. double E; /* expected freq */
  12941. double chiSquare = 0;
  12942. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  12943. &peak, &maxSessions);
  12944. if (ret != WOLFSSL_SUCCESS)
  12945. return ret;
  12946. printf("Total Sessions Seen = %u\n", totalSessionsSeen);
  12947. printf("Total Sessions Now = %u\n", totalSessionsNow);
  12948. #ifdef WOLFSSL_PEAK_SESSIONS
  12949. printf("Peak Sessions = %u\n", peak);
  12950. #endif
  12951. printf("Max Sessions = %u\n", maxSessions);
  12952. E = (double)totalSessionsSeen / SESSION_ROWS;
  12953. for (i = 0; i < SESSION_ROWS; i++) {
  12954. double diff = SessionCache[i].totalCount - E;
  12955. diff *= diff; /* square */
  12956. diff /= E; /* normalize */
  12957. chiSquare += diff;
  12958. }
  12959. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  12960. SESSION_ROWS - 1);
  12961. #if (SESSION_ROWS == 11)
  12962. printf(" .05 p value = 18.3, chi-square should be less\n");
  12963. #elif (SESSION_ROWS == 211)
  12964. printf(".05 p value = 244.8, chi-square should be less\n");
  12965. #elif (SESSION_ROWS == 5981)
  12966. printf(".05 p value = 6161.0, chi-square should be less\n");
  12967. #elif (SESSION_ROWS == 3)
  12968. printf(".05 p value = 6.0, chi-square should be less\n");
  12969. #elif (SESSION_ROWS == 2861)
  12970. printf(".05 p value = 2985.5, chi-square should be less\n");
  12971. #endif
  12972. printf("\n");
  12973. return ret;
  12974. }
  12975. #endif /* SESSION_STATS */
  12976. #else /* NO_SESSION_CACHE */
  12977. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12978. {
  12979. return (WOLFSSL_SESSION*)session;
  12980. }
  12981. /* No session cache version */
  12982. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12983. byte restoreSessionCerts)
  12984. {
  12985. (void)ssl;
  12986. (void)masterSecret;
  12987. (void)restoreSessionCerts;
  12988. return NULL;
  12989. }
  12990. #endif /* NO_SESSION_CACHE */
  12991. /* call before SSL_connect, if verifying will add name check to
  12992. date check and signature check */
  12993. WOLFSSL_ABI
  12994. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  12995. {
  12996. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  12997. if (ssl == NULL || dn == NULL) {
  12998. WOLFSSL_MSG("Bad function argument: NULL");
  12999. return WOLFSSL_FAILURE;
  13000. }
  13001. if (ssl->buffers.domainName.buffer)
  13002. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13003. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  13004. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  13005. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13006. if (ssl->buffers.domainName.buffer) {
  13007. unsigned char* domainName = ssl->buffers.domainName.buffer;
  13008. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  13009. domainName[ssl->buffers.domainName.length] = '\0';
  13010. return WOLFSSL_SUCCESS;
  13011. }
  13012. else {
  13013. ssl->error = MEMORY_ERROR;
  13014. return WOLFSSL_FAILURE;
  13015. }
  13016. }
  13017. /* turn on wolfSSL zlib compression
  13018. returns WOLFSSL_SUCCESS for success, else error (not built in)
  13019. */
  13020. int wolfSSL_set_compression(WOLFSSL* ssl)
  13021. {
  13022. WOLFSSL_ENTER("wolfSSL_set_compression");
  13023. (void)ssl;
  13024. #ifdef HAVE_LIBZ
  13025. ssl->options.usingCompression = 1;
  13026. return WOLFSSL_SUCCESS;
  13027. #else
  13028. return NOT_COMPILED_IN;
  13029. #endif
  13030. }
  13031. #ifndef USE_WINDOWS_API
  13032. #ifndef NO_WRITEV
  13033. /* simulate writev semantics, doesn't actually do block at a time though
  13034. because of SSL_write behavior and because front adds may be small */
  13035. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  13036. {
  13037. #ifdef WOLFSSL_SMALL_STACK
  13038. byte staticBuffer[1]; /* force heap usage */
  13039. #else
  13040. byte staticBuffer[FILE_BUFFER_SIZE];
  13041. #endif
  13042. byte* myBuffer = staticBuffer;
  13043. int dynamic = 0;
  13044. int sending = 0;
  13045. int idx = 0;
  13046. int i;
  13047. int ret;
  13048. WOLFSSL_ENTER("wolfSSL_writev");
  13049. for (i = 0; i < iovcnt; i++)
  13050. sending += (int)iov[i].iov_len;
  13051. if (sending > (int)sizeof(staticBuffer)) {
  13052. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  13053. DYNAMIC_TYPE_WRITEV);
  13054. if (!myBuffer)
  13055. return MEMORY_ERROR;
  13056. dynamic = 1;
  13057. }
  13058. for (i = 0; i < iovcnt; i++) {
  13059. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  13060. idx += (int)iov[i].iov_len;
  13061. }
  13062. /* myBuffer may not be initialized fully, but the span up to the
  13063. * sending length will be.
  13064. */
  13065. PRAGMA_GCC_DIAG_PUSH
  13066. PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
  13067. ret = wolfSSL_write(ssl, myBuffer, sending);
  13068. PRAGMA_GCC_DIAG_POP
  13069. if (dynamic)
  13070. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  13071. return ret;
  13072. }
  13073. #endif
  13074. #endif
  13075. #ifdef WOLFSSL_CALLBACKS
  13076. typedef struct itimerval Itimerval;
  13077. /* don't keep calling simple functions while setting up timer and signals
  13078. if no inlining these are the next best */
  13079. #define AddTimes(a, b, c) \
  13080. do { \
  13081. (c).tv_sec = (a).tv_sec + (b).tv_sec; \
  13082. (c).tv_usec = (a).tv_usec + (b).tv_usec;\
  13083. if ((c).tv_usec >= 1000000) { \
  13084. (c).tv_sec++; \
  13085. (c).tv_usec -= 1000000; \
  13086. } \
  13087. } while (0)
  13088. #define SubtractTimes(a, b, c) \
  13089. do { \
  13090. (c).tv_sec = (a).tv_sec - (b).tv_sec; \
  13091. (c).tv_usec = (a).tv_usec - (b).tv_usec;\
  13092. if ((c).tv_usec < 0) { \
  13093. (c).tv_sec--; \
  13094. (c).tv_usec += 1000000; \
  13095. } \
  13096. } while (0)
  13097. #define CmpTimes(a, b, cmp) \
  13098. (((a).tv_sec == (b).tv_sec) ? \
  13099. ((a).tv_usec cmp (b).tv_usec) : \
  13100. ((a).tv_sec cmp (b).tv_sec)) \
  13101. /* do nothing handler */
  13102. static void myHandler(int signo)
  13103. {
  13104. (void)signo;
  13105. return;
  13106. }
  13107. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13108. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13109. {
  13110. int ret = WOLFSSL_FATAL_ERROR;
  13111. int oldTimerOn = 0; /* was timer already on */
  13112. WOLFSSL_TIMEVAL startTime;
  13113. WOLFSSL_TIMEVAL endTime;
  13114. WOLFSSL_TIMEVAL totalTime;
  13115. Itimerval myTimeout;
  13116. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  13117. struct sigaction act, oact;
  13118. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  13119. if (hsCb) {
  13120. ssl->hsInfoOn = 1;
  13121. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  13122. }
  13123. if (toCb) {
  13124. ssl->toInfoOn = 1;
  13125. InitTimeoutInfo(&ssl->timeoutInfo);
  13126. if (gettimeofday(&startTime, 0) < 0)
  13127. ERR_OUT(GETTIME_ERROR);
  13128. /* use setitimer to simulate getitimer, init 0 myTimeout */
  13129. myTimeout.it_interval.tv_sec = 0;
  13130. myTimeout.it_interval.tv_usec = 0;
  13131. myTimeout.it_value.tv_sec = 0;
  13132. myTimeout.it_value.tv_usec = 0;
  13133. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  13134. ERR_OUT(SETITIMER_ERROR);
  13135. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  13136. oldTimerOn = 1;
  13137. /* is old timer going to expire before ours */
  13138. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  13139. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  13140. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  13141. }
  13142. }
  13143. myTimeout.it_value.tv_sec = timeout.tv_sec;
  13144. myTimeout.it_value.tv_usec = timeout.tv_usec;
  13145. /* set up signal handler, don't restart socket send/recv */
  13146. act.sa_handler = myHandler;
  13147. sigemptyset(&act.sa_mask);
  13148. act.sa_flags = 0;
  13149. #ifdef SA_INTERRUPT
  13150. act.sa_flags |= SA_INTERRUPT;
  13151. #endif
  13152. if (sigaction(SIGALRM, &act, &oact) < 0)
  13153. ERR_OUT(SIGACT_ERROR);
  13154. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  13155. ERR_OUT(SETITIMER_ERROR);
  13156. }
  13157. /* do main work */
  13158. #ifndef NO_WOLFSSL_CLIENT
  13159. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13160. ret = wolfSSL_connect(ssl);
  13161. #endif
  13162. #ifndef NO_WOLFSSL_SERVER
  13163. if (ssl->options.side == WOLFSSL_SERVER_END)
  13164. ret = wolfSSL_accept(ssl);
  13165. #endif
  13166. /* do callbacks */
  13167. if (toCb) {
  13168. if (oldTimerOn) {
  13169. if (gettimeofday(&endTime, 0) < 0)
  13170. ERR_OUT(SYSLIB_FAILED_E);
  13171. SubtractTimes(endTime, startTime, totalTime);
  13172. /* adjust old timer for elapsed time */
  13173. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  13174. SubtractTimes(oldTimeout.it_value, totalTime,
  13175. oldTimeout.it_value);
  13176. else {
  13177. /* reset value to interval, may be off */
  13178. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  13179. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  13180. }
  13181. /* keep iter the same whether there or not */
  13182. }
  13183. /* restore old handler */
  13184. if (sigaction(SIGALRM, &oact, 0) < 0)
  13185. ret = SIGACT_ERROR; /* more pressing error, stomp */
  13186. else
  13187. /* use old settings which may turn off (expired or not there) */
  13188. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  13189. ret = SETITIMER_ERROR;
  13190. /* if we had a timeout call callback */
  13191. if (ssl->timeoutInfo.timeoutName[0]) {
  13192. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  13193. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  13194. (toCb)(&ssl->timeoutInfo);
  13195. }
  13196. ssl->toInfoOn = 0;
  13197. }
  13198. /* clean up buffers allocated by AddPacketInfo */
  13199. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  13200. if (hsCb) {
  13201. FinishHandShakeInfo(&ssl->handShakeInfo);
  13202. (hsCb)(&ssl->handShakeInfo);
  13203. ssl->hsInfoOn = 0;
  13204. }
  13205. return ret;
  13206. }
  13207. #ifndef NO_WOLFSSL_CLIENT
  13208. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13209. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13210. {
  13211. WOLFSSL_ENTER("wolfSSL_connect_ex");
  13212. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13213. }
  13214. #endif
  13215. #ifndef NO_WOLFSSL_SERVER
  13216. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13217. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13218. {
  13219. WOLFSSL_ENTER("wolfSSL_accept_ex");
  13220. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13221. }
  13222. #endif
  13223. #endif /* WOLFSSL_CALLBACKS */
  13224. #ifndef NO_PSK
  13225. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  13226. wc_psk_client_callback cb)
  13227. {
  13228. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_callback");
  13229. if (ctx == NULL)
  13230. return;
  13231. ctx->havePSK = 1;
  13232. ctx->client_psk_cb = cb;
  13233. }
  13234. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  13235. {
  13236. byte haveRSA = 1;
  13237. int keySz = 0;
  13238. WOLFSSL_ENTER("wolfSSL_set_psk_client_callback");
  13239. if (ssl == NULL)
  13240. return;
  13241. ssl->options.havePSK = 1;
  13242. ssl->options.client_psk_cb = cb;
  13243. #ifdef NO_RSA
  13244. haveRSA = 0;
  13245. #endif
  13246. #ifndef NO_CERTS
  13247. keySz = ssl->buffers.keySz;
  13248. #endif
  13249. if (AllocateSuites(ssl) != 0)
  13250. return;
  13251. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13252. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13253. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13254. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13255. ssl->options.haveAnon, TRUE, ssl->options.side);
  13256. }
  13257. #ifdef OPENSSL_EXTRA
  13258. /**
  13259. * set call back function for psk session use
  13260. * @param ssl a pointer to WOLFSSL structure
  13261. * @param cb a function pointer to wc_psk_use_session_cb
  13262. * @return none
  13263. */
  13264. void wolfSSL_set_psk_use_session_callback(WOLFSSL* ssl,
  13265. wc_psk_use_session_cb_func cb)
  13266. {
  13267. WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback");
  13268. if (ssl != NULL) {
  13269. ssl->options.havePSK = 1;
  13270. ssl->options.session_psk_cb = cb;
  13271. }
  13272. WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS);
  13273. }
  13274. #endif
  13275. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  13276. wc_psk_server_callback cb)
  13277. {
  13278. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_server_callback");
  13279. if (ctx == NULL)
  13280. return;
  13281. ctx->havePSK = 1;
  13282. ctx->server_psk_cb = cb;
  13283. }
  13284. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  13285. {
  13286. byte haveRSA = 1;
  13287. int keySz = 0;
  13288. WOLFSSL_ENTER("wolfSSL_set_psk_server_callback");
  13289. if (ssl == NULL)
  13290. return;
  13291. ssl->options.havePSK = 1;
  13292. ssl->options.server_psk_cb = cb;
  13293. #ifdef NO_RSA
  13294. haveRSA = 0;
  13295. #endif
  13296. #ifndef NO_CERTS
  13297. keySz = ssl->buffers.keySz;
  13298. #endif
  13299. if (AllocateSuites(ssl) != 0)
  13300. return;
  13301. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13302. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13303. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13304. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13305. ssl->options.haveAnon, TRUE, ssl->options.side);
  13306. }
  13307. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  13308. {
  13309. WOLFSSL_ENTER("wolfSSL_get_psk_identity_hint");
  13310. if (ssl == NULL || ssl->arrays == NULL)
  13311. return NULL;
  13312. return ssl->arrays->server_hint;
  13313. }
  13314. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  13315. {
  13316. WOLFSSL_ENTER("wolfSSL_get_psk_identity");
  13317. if (ssl == NULL || ssl->arrays == NULL)
  13318. return NULL;
  13319. return ssl->arrays->client_identity;
  13320. }
  13321. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  13322. {
  13323. WOLFSSL_ENTER("wolfSSL_CTX_use_psk_identity_hint");
  13324. if (hint == 0)
  13325. ctx->server_hint[0] = '\0';
  13326. else {
  13327. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  13328. #ifdef WOLFSSL_QT
  13329. ctx->havePSK=1;
  13330. #endif
  13331. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  13332. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  13333. }
  13334. return WOLFSSL_SUCCESS;
  13335. }
  13336. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  13337. {
  13338. WOLFSSL_ENTER("wolfSSL_use_psk_identity_hint");
  13339. if (ssl == NULL || ssl->arrays == NULL)
  13340. return WOLFSSL_FAILURE;
  13341. if (hint == 0)
  13342. ssl->arrays->server_hint[0] = 0;
  13343. else {
  13344. XSTRNCPY(ssl->arrays->server_hint, hint,
  13345. sizeof(ssl->arrays->server_hint)-1);
  13346. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  13347. }
  13348. return WOLFSSL_SUCCESS;
  13349. }
  13350. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  13351. {
  13352. return ssl ? ssl->options.psk_ctx : NULL;
  13353. }
  13354. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  13355. {
  13356. return ctx ? ctx->psk_ctx : NULL;
  13357. }
  13358. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  13359. {
  13360. if (ssl == NULL)
  13361. return WOLFSSL_FAILURE;
  13362. ssl->options.psk_ctx = psk_ctx;
  13363. return WOLFSSL_SUCCESS;
  13364. }
  13365. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  13366. {
  13367. if (ctx == NULL)
  13368. return WOLFSSL_FAILURE;
  13369. ctx->psk_ctx = psk_ctx;
  13370. return WOLFSSL_SUCCESS;
  13371. }
  13372. #endif /* NO_PSK */
  13373. #ifdef HAVE_ANON
  13374. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  13375. {
  13376. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  13377. if (ctx == NULL)
  13378. return WOLFSSL_FAILURE;
  13379. ctx->haveAnon = 1;
  13380. return WOLFSSL_SUCCESS;
  13381. }
  13382. #endif /* HAVE_ANON */
  13383. #ifndef NO_CERTS
  13384. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  13385. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  13386. const unsigned char* in,
  13387. long sz, int format, int userChain,
  13388. word32 flags)
  13389. {
  13390. int verify;
  13391. int ret = WOLFSSL_FAILURE;
  13392. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  13393. verify = GET_VERIFY_SETTING_CTX(ctx);
  13394. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  13395. verify = VERIFY_SKIP_DATE;
  13396. if (format == WOLFSSL_FILETYPE_PEM)
  13397. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  13398. verify);
  13399. else
  13400. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  13401. userChain, verify);
  13402. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  13403. if (ret == WOLFSSL_SUCCESS)
  13404. ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format);
  13405. #endif
  13406. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  13407. return ret;
  13408. }
  13409. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  13410. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  13411. const unsigned char* in,
  13412. long sz, int format)
  13413. {
  13414. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  13415. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13416. }
  13417. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  13418. const unsigned char* in,
  13419. long sz, int format)
  13420. {
  13421. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  13422. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13423. }
  13424. #ifdef WOLFSSL_TRUST_PEER_CERT
  13425. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  13426. const unsigned char* in,
  13427. long sz, int format)
  13428. {
  13429. int verify;
  13430. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  13431. /* sanity check on arguments */
  13432. if (sz < 0 || in == NULL || ctx == NULL) {
  13433. return BAD_FUNC_ARG;
  13434. }
  13435. verify = GET_VERIFY_SETTING_CTX(ctx);
  13436. if (WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS &
  13437. WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  13438. verify = VERIFY_SKIP_DATE;
  13439. if (format == WOLFSSL_FILETYPE_PEM)
  13440. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  13441. NULL, verify);
  13442. else
  13443. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  13444. NULL, 0, verify);
  13445. }
  13446. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13447. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  13448. const unsigned char* in, long sz, int format)
  13449. {
  13450. int ret = WOLFSSL_FAILURE;
  13451. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  13452. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  13453. GET_VERIFY_SETTING_CTX(ctx));
  13454. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  13455. return ret;
  13456. }
  13457. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  13458. const unsigned char* in, long sz, int format)
  13459. {
  13460. int ret = WOLFSSL_FAILURE;
  13461. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  13462. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  13463. 0, GET_VERIFY_SETTING_CTX(ctx));
  13464. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  13465. return ret;
  13466. }
  13467. #ifdef WOLF_PRIVATE_KEY_ID
  13468. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13469. long sz, int devId, long keySz)
  13470. {
  13471. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  13472. if (ret == WOLFSSL_SUCCESS)
  13473. ctx->privateKeySz = (word32)keySz;
  13474. return ret;
  13475. }
  13476. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13477. long sz, int devId)
  13478. {
  13479. int ret = WOLFSSL_FAILURE;
  13480. FreeDer(&ctx->privateKey);
  13481. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13482. ctx->heap) == 0) {
  13483. XMEMCPY(ctx->privateKey->buffer, id, sz);
  13484. ctx->privateKeyId = 1;
  13485. if (devId != INVALID_DEVID)
  13486. ctx->privateKeyDevId = devId;
  13487. else
  13488. ctx->privateKeyDevId = ctx->devId;
  13489. ret = WOLFSSL_SUCCESS;
  13490. }
  13491. return ret;
  13492. }
  13493. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  13494. int devId)
  13495. {
  13496. int ret = WOLFSSL_FAILURE;
  13497. word32 sz = (word32)XSTRLEN(label) + 1;
  13498. FreeDer(&ctx->privateKey);
  13499. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13500. ctx->heap) == 0) {
  13501. XMEMCPY(ctx->privateKey->buffer, label, sz);
  13502. ctx->privateKeyLabel = 1;
  13503. if (devId != INVALID_DEVID)
  13504. ctx->privateKeyDevId = devId;
  13505. else
  13506. ctx->privateKeyDevId = ctx->devId;
  13507. ret = WOLFSSL_SUCCESS;
  13508. }
  13509. return ret;
  13510. }
  13511. #endif /* WOLF_PRIVATE_KEY_ID */
  13512. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  13513. const unsigned char* in, long sz, int format)
  13514. {
  13515. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  13516. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  13517. GET_VERIFY_SETTING_CTX(ctx));
  13518. }
  13519. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  13520. const unsigned char* in, long sz)
  13521. {
  13522. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  13523. WOLFSSL_FILETYPE_PEM);
  13524. }
  13525. #ifndef NO_DH
  13526. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  13527. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  13528. const unsigned char* buf,
  13529. long sz, int format)
  13530. {
  13531. DerBuffer* der = NULL;
  13532. int ret = 0;
  13533. word32 pSz = MAX_DH_SIZE;
  13534. word32 gSz = MAX_DH_SIZE;
  13535. #ifdef WOLFSSL_SMALL_STACK
  13536. byte* p = NULL;
  13537. byte* g = NULL;
  13538. #else
  13539. byte p[MAX_DH_SIZE];
  13540. byte g[MAX_DH_SIZE];
  13541. #endif
  13542. if (ctx == NULL || buf == NULL)
  13543. return BAD_FUNC_ARG;
  13544. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  13545. if (ret != 0) {
  13546. return ret;
  13547. }
  13548. der->buffer = (byte*)buf;
  13549. der->length = (word32)sz;
  13550. #ifdef WOLFSSL_SMALL_STACK
  13551. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13552. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13553. if (p == NULL || g == NULL) {
  13554. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13555. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13556. return MEMORY_E;
  13557. }
  13558. #endif
  13559. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  13560. ret = WOLFSSL_BAD_FILETYPE;
  13561. else {
  13562. if (format == WOLFSSL_FILETYPE_PEM) {
  13563. #ifdef WOLFSSL_PEM_TO_DER
  13564. FreeDer(&der);
  13565. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  13566. NULL, NULL);
  13567. if (ret < 0) {
  13568. /* Also try X9.42 format */
  13569. ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap,
  13570. NULL, NULL);
  13571. }
  13572. #ifdef WOLFSSL_WPAS
  13573. #ifndef NO_DSA
  13574. if (ret < 0) {
  13575. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  13576. NULL, NULL);
  13577. }
  13578. #endif
  13579. #endif /* WOLFSSL_WPAS */
  13580. #else
  13581. ret = NOT_COMPILED_IN;
  13582. #endif /* WOLFSSL_PEM_TO_DER */
  13583. }
  13584. if (ret == 0) {
  13585. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  13586. ret = WOLFSSL_BAD_FILETYPE;
  13587. else if (ssl)
  13588. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  13589. else
  13590. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  13591. }
  13592. }
  13593. FreeDer(&der);
  13594. #ifdef WOLFSSL_SMALL_STACK
  13595. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13596. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13597. #endif
  13598. return ret;
  13599. }
  13600. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13601. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  13602. int format)
  13603. {
  13604. if (ssl == NULL)
  13605. return BAD_FUNC_ARG;
  13606. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  13607. }
  13608. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13609. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  13610. long sz, int format)
  13611. {
  13612. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  13613. }
  13614. #endif /* NO_DH */
  13615. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  13616. const unsigned char* in, long sz, int format)
  13617. {
  13618. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  13619. if (ssl == NULL)
  13620. return BAD_FUNC_ARG;
  13621. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  13622. GET_VERIFY_SETTING_SSL(ssl));
  13623. }
  13624. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  13625. const unsigned char* in, long sz, int format)
  13626. {
  13627. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  13628. if (ssl == NULL)
  13629. return BAD_FUNC_ARG;
  13630. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  13631. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  13632. }
  13633. #ifdef WOLF_PRIVATE_KEY_ID
  13634. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  13635. long sz, int devId, long keySz)
  13636. {
  13637. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  13638. if (ret == WOLFSSL_SUCCESS)
  13639. ssl->buffers.keySz = (word32)keySz;
  13640. return ret;
  13641. }
  13642. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  13643. long sz, int devId)
  13644. {
  13645. int ret = WOLFSSL_FAILURE;
  13646. if (ssl->buffers.weOwnKey)
  13647. FreeDer(&ssl->buffers.key);
  13648. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13649. ssl->heap) == 0) {
  13650. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  13651. ssl->buffers.weOwnKey = 1;
  13652. ssl->buffers.keyId = 1;
  13653. if (devId != INVALID_DEVID)
  13654. ssl->buffers.keyDevId = devId;
  13655. else
  13656. ssl->buffers.keyDevId = ssl->devId;
  13657. ret = WOLFSSL_SUCCESS;
  13658. }
  13659. return ret;
  13660. }
  13661. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  13662. {
  13663. int ret = WOLFSSL_FAILURE;
  13664. word32 sz = (word32)XSTRLEN(label) + 1;
  13665. if (ssl->buffers.weOwnKey)
  13666. FreeDer(&ssl->buffers.key);
  13667. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13668. ssl->heap) == 0) {
  13669. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  13670. ssl->buffers.weOwnKey = 1;
  13671. ssl->buffers.keyLabel = 1;
  13672. if (devId != INVALID_DEVID)
  13673. ssl->buffers.keyDevId = devId;
  13674. else
  13675. ssl->buffers.keyDevId = ssl->devId;
  13676. ret = WOLFSSL_SUCCESS;
  13677. }
  13678. return ret;
  13679. }
  13680. #endif /* WOLF_PRIVATE_KEY_ID */
  13681. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  13682. const unsigned char* in, long sz, int format)
  13683. {
  13684. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  13685. if (ssl == NULL)
  13686. return BAD_FUNC_ARG;
  13687. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  13688. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  13689. }
  13690. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  13691. const unsigned char* in, long sz)
  13692. {
  13693. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  13694. WOLFSSL_FILETYPE_PEM);
  13695. }
  13696. /* unload any certs or keys that SSL owns, leave CTX as is
  13697. WOLFSSL_SUCCESS on ok */
  13698. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  13699. {
  13700. if (ssl == NULL) {
  13701. WOLFSSL_MSG("Null function arg");
  13702. return BAD_FUNC_ARG;
  13703. }
  13704. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  13705. WOLFSSL_MSG("Unloading cert");
  13706. FreeDer(&ssl->buffers.certificate);
  13707. #ifdef KEEP_OUR_CERT
  13708. wolfSSL_X509_free(ssl->ourCert);
  13709. ssl->ourCert = NULL;
  13710. #endif
  13711. ssl->buffers.weOwnCert = 0;
  13712. }
  13713. if (ssl->buffers.weOwnCertChain) {
  13714. WOLFSSL_MSG("Unloading cert chain");
  13715. FreeDer(&ssl->buffers.certChain);
  13716. ssl->buffers.weOwnCertChain = 0;
  13717. }
  13718. if (ssl->buffers.weOwnKey) {
  13719. WOLFSSL_MSG("Unloading key");
  13720. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  13721. FreeDer(&ssl->buffers.key);
  13722. ssl->buffers.weOwnKey = 0;
  13723. }
  13724. return WOLFSSL_SUCCESS;
  13725. }
  13726. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  13727. {
  13728. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  13729. if (ctx == NULL)
  13730. return BAD_FUNC_ARG;
  13731. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  13732. }
  13733. #ifdef WOLFSSL_TRUST_PEER_CERT
  13734. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  13735. {
  13736. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13737. if (ctx == NULL)
  13738. return BAD_FUNC_ARG;
  13739. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  13740. }
  13741. #ifdef WOLFSSL_LOCAL_X509_STORE
  13742. int wolfSSL_Unload_trust_peers(WOLFSSL* ssl)
  13743. {
  13744. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13745. if (ssl == NULL)
  13746. return BAD_FUNC_ARG;
  13747. SSL_CM_WARNING(ssl);
  13748. return wolfSSL_CertManagerUnload_trust_peers(SSL_CM(ssl));
  13749. }
  13750. #endif /* WOLFSSL_LOCAL_X509_STORE */
  13751. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13752. /* old NO_FILESYSTEM end */
  13753. #endif /* !NO_CERTS */
  13754. #ifdef OPENSSL_EXTRA
  13755. int wolfSSL_add_all_algorithms(void)
  13756. {
  13757. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  13758. if (initRefCount != 0 || wolfSSL_Init() == WOLFSSL_SUCCESS)
  13759. return WOLFSSL_SUCCESS;
  13760. else
  13761. return WOLFSSL_FATAL_ERROR;
  13762. }
  13763. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  13764. {
  13765. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  13766. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  13767. return WOLFSSL_FATAL_ERROR;
  13768. return WOLFSSL_SUCCESS;
  13769. }
  13770. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  13771. {
  13772. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  13773. /* This function is currently the same as
  13774. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  13775. the use of a wolfssl.cnf type configuration file and is only used for
  13776. OpenSSL compatibility. */
  13777. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  13778. return WOLFSSL_FATAL_ERROR;
  13779. }
  13780. return WOLFSSL_SUCCESS;
  13781. }
  13782. /* returns previous set cache size which stays constant */
  13783. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  13784. {
  13785. /* cache size fixed at compile time in wolfSSL */
  13786. (void)ctx;
  13787. (void)sz;
  13788. WOLFSSL_MSG("session cache is set at compile time");
  13789. #ifndef NO_SESSION_CACHE
  13790. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  13791. #else
  13792. return 0;
  13793. #endif
  13794. }
  13795. #endif
  13796. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  13797. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13798. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  13799. {
  13800. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  13801. if (mode)
  13802. ctx->quietShutdown = 1;
  13803. }
  13804. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  13805. {
  13806. WOLFSSL_ENTER("wolfSSL_set_quiet_shutdown");
  13807. if (mode)
  13808. ssl->options.quietShutdown = 1;
  13809. }
  13810. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL ||
  13811. WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13812. #ifdef OPENSSL_EXTRA
  13813. #ifndef NO_BIO
  13814. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  13815. {
  13816. WOLFSSL_ENTER("wolfSSL_set_bio");
  13817. if (ssl == NULL) {
  13818. WOLFSSL_MSG("Bad argument, ssl was NULL");
  13819. return;
  13820. }
  13821. /* free any existing WOLFSSL_BIOs in use but don't free those in
  13822. * a chain */
  13823. if (ssl->biord != NULL) {
  13824. if (ssl->biord != ssl->biowr) {
  13825. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  13826. wolfSSL_BIO_free(ssl->biowr);
  13827. ssl->biowr = NULL;
  13828. }
  13829. if (ssl->biord->prev != NULL)
  13830. wolfSSL_BIO_free(ssl->biord);
  13831. ssl->biord = NULL;
  13832. }
  13833. /* set flag obviously */
  13834. if (rd && !(rd->flags & WOLFSSL_BIO_FLAG_READ))
  13835. rd->flags |= WOLFSSL_BIO_FLAG_READ;
  13836. if (wr && !(wr->flags & WOLFSSL_BIO_FLAG_WRITE))
  13837. wr->flags |= WOLFSSL_BIO_FLAG_WRITE;
  13838. ssl->biord = rd;
  13839. ssl->biowr = wr;
  13840. /* set SSL to use BIO callbacks instead */
  13841. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  13842. ssl->CBIORecv = BioReceive;
  13843. }
  13844. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  13845. ssl->CBIOSend = BioSend;
  13846. }
  13847. /* User programs should always retry reading from these BIOs */
  13848. if (rd) {
  13849. /* User writes to rd */
  13850. BIO_set_retry_write(rd);
  13851. }
  13852. if (wr) {
  13853. /* User reads from wr */
  13854. BIO_set_retry_read(wr);
  13855. }
  13856. }
  13857. #endif /* !NO_BIO */
  13858. #endif /* OPENSSL_EXTRA */
  13859. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  13860. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  13861. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13862. {
  13863. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  13864. if (ctx != NULL) {
  13865. wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL);
  13866. ctx->client_ca_names = names;
  13867. }
  13868. }
  13869. void wolfSSL_set_client_CA_list(WOLFSSL* ssl,
  13870. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13871. {
  13872. WOLFSSL_ENTER("wolfSSL_set_client_CA_list");
  13873. if (ssl != NULL) {
  13874. if (ssl->client_ca_names != ssl->ctx->client_ca_names)
  13875. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  13876. ssl->client_ca_names = names;
  13877. }
  13878. }
  13879. #ifdef OPENSSL_EXTRA
  13880. /* registers client cert callback, called during handshake if server
  13881. requests client auth but user has not loaded client cert/key */
  13882. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  13883. {
  13884. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  13885. if (ctx != NULL) {
  13886. ctx->CBClientCert = cb;
  13887. }
  13888. }
  13889. void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx,
  13890. CertSetupCallback cb, void *arg)
  13891. {
  13892. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_cb");
  13893. if (ctx == NULL)
  13894. return;
  13895. ctx->certSetupCb = cb;
  13896. ctx->certSetupCbArg = arg;
  13897. }
  13898. /**
  13899. * Internal wrapper for calling certSetupCb
  13900. * @param ssl The SSL/TLS Object
  13901. * @return 0 on success
  13902. */
  13903. int CertSetupCbWrapper(WOLFSSL* ssl)
  13904. {
  13905. int ret = 0;
  13906. if (ssl->ctx->certSetupCb != NULL) {
  13907. WOLFSSL_MSG("Calling user cert setup callback");
  13908. ret = ssl->ctx->certSetupCb(ssl, ssl->ctx->certSetupCbArg);
  13909. if (ret == 1) {
  13910. WOLFSSL_MSG("User cert callback returned success");
  13911. ret = 0;
  13912. }
  13913. else if (ret == 0) {
  13914. SendAlert(ssl, alert_fatal, internal_error);
  13915. ret = CLIENT_CERT_CB_ERROR;
  13916. }
  13917. else if (ret < 0) {
  13918. ret = WOLFSSL_ERROR_WANT_X509_LOOKUP;
  13919. }
  13920. else {
  13921. WOLFSSL_MSG("Unexpected user callback return");
  13922. ret = CLIENT_CERT_CB_ERROR;
  13923. }
  13924. }
  13925. return ret;
  13926. }
  13927. #endif /* OPENSSL_EXTRA */
  13928. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  13929. #ifndef WOLFSSL_NO_CA_NAMES
  13930. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  13931. const WOLFSSL_CTX *ctx)
  13932. {
  13933. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  13934. if (ctx == NULL) {
  13935. WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list");
  13936. return NULL;
  13937. }
  13938. return ctx->client_ca_names;
  13939. }
  13940. /* returns the CA's set on server side or the CA's sent from server when
  13941. * on client side */
  13942. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  13943. const WOLFSSL* ssl)
  13944. {
  13945. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  13946. if (ssl == NULL) {
  13947. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  13948. return NULL;
  13949. }
  13950. return SSL_CA_NAMES(ssl);
  13951. }
  13952. #if !defined(NO_CERTS)
  13953. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  13954. {
  13955. WOLFSSL_X509_NAME *nameCopy = NULL;
  13956. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  13957. if (ctx == NULL || x509 == NULL){
  13958. WOLFSSL_MSG("Bad argument");
  13959. return WOLFSSL_FAILURE;
  13960. }
  13961. if (ctx->client_ca_names == NULL) {
  13962. ctx->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  13963. if (ctx->client_ca_names == NULL) {
  13964. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  13965. return WOLFSSL_FAILURE;
  13966. }
  13967. }
  13968. nameCopy = wolfSSL_X509_NAME_dup(wolfSSL_X509_get_subject_name(x509));
  13969. if (nameCopy == NULL) {
  13970. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  13971. return WOLFSSL_FAILURE;
  13972. }
  13973. if (wolfSSL_sk_X509_NAME_push(ctx->client_ca_names, nameCopy) != WOLFSSL_SUCCESS) {
  13974. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  13975. wolfSSL_X509_NAME_free(nameCopy);
  13976. return WOLFSSL_FAILURE;
  13977. }
  13978. return WOLFSSL_SUCCESS;
  13979. }
  13980. #endif
  13981. #ifndef NO_BIO
  13982. #if !defined(NO_RSA) && !defined(NO_CERTS)
  13983. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  13984. {
  13985. /* The webserver build is using this to load a CA into the server
  13986. * for client authentication as an option. Have this return NULL in
  13987. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  13988. * the function. */
  13989. #ifdef OPENSSL_EXTRA
  13990. WOLFSSL_STACK *list = NULL;
  13991. WOLFSSL_BIO* bio = NULL;
  13992. WOLFSSL_X509 *cert = NULL;
  13993. WOLFSSL_X509_NAME *nameCopy = NULL;
  13994. unsigned long err = WOLFSSL_FAILURE;
  13995. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  13996. bio = wolfSSL_BIO_new_file(fname, "rb");
  13997. if (bio == NULL) {
  13998. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  13999. goto cleanup;
  14000. }
  14001. list = wolfSSL_sk_X509_NAME_new(NULL);
  14002. if (list == NULL) {
  14003. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  14004. goto cleanup;
  14005. }
  14006. /* Read each certificate in the chain out of the file. */
  14007. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  14008. /* Need a persistent copy of the subject name. */
  14009. nameCopy = wolfSSL_X509_NAME_dup(
  14010. wolfSSL_X509_get_subject_name(cert));
  14011. if (nameCopy == NULL) {
  14012. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  14013. goto cleanup;
  14014. }
  14015. /*
  14016. * Original cert will be freed so make sure not to try to access
  14017. * it in the future.
  14018. */
  14019. nameCopy->x509 = NULL;
  14020. if (wolfSSL_sk_X509_NAME_push(list, nameCopy) !=
  14021. WOLFSSL_SUCCESS) {
  14022. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  14023. /* Do free in loop because nameCopy is now responsibility
  14024. * of list to free and adding jumps to cleanup after this
  14025. * might result in a double free. */
  14026. wolfSSL_X509_NAME_free(nameCopy);
  14027. goto cleanup;
  14028. }
  14029. wolfSSL_X509_free(cert);
  14030. cert = NULL;
  14031. }
  14032. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  14033. err = WOLFSSL_SUCCESS;
  14034. cleanup:
  14035. wolfSSL_X509_free(cert);
  14036. wolfSSL_BIO_free(bio);
  14037. if (err != WOLFSSL_SUCCESS) {
  14038. /* We failed so return NULL */
  14039. wolfSSL_sk_X509_NAME_pop_free(list, NULL);
  14040. list = NULL;
  14041. }
  14042. return list;
  14043. #else
  14044. (void)fname;
  14045. return NULL;
  14046. #endif
  14047. }
  14048. #endif
  14049. #endif /* !NO_BIO */
  14050. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
  14051. #ifdef OPENSSL_EXTRA
  14052. #ifdef WOLFSSL_SYS_CA_CERTS
  14053. /*
  14054. * This is an OpenSSL compatibility layer function, but it doesn't mirror
  14055. * the exact functionality of its OpenSSL counterpart. We don't support the
  14056. * notion of an "OpenSSL directory". This function will attempt to load the
  14057. * environment variables SSL_CERT_DIR and SSL_CERT_FILE, if either are found,
  14058. * they will be loaded. Otherwise, it will act as a wrapper around our
  14059. * native wolfSSL_CTX_load_system_CA_certs function. This function does
  14060. * conform to OpenSSL's return value conventions.
  14061. */
  14062. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  14063. {
  14064. int ret;
  14065. #ifdef XGETENV
  14066. char* certDir;
  14067. char* certFile;
  14068. word32 flags;
  14069. #endif
  14070. WOLFSSL_ENTER("wolfSSL_CTX_set_default_verify_paths");
  14071. #ifdef XGETENV
  14072. certDir = XGETENV("SSL_CERT_DIR");
  14073. certFile = XGETENV("SSL_CERT_FILE");
  14074. flags = WOLFSSL_LOAD_FLAG_PEM_CA_ONLY;
  14075. if (certDir || certFile) {
  14076. if (certDir) {
  14077. /*
  14078. * We want to keep trying to load more CAs even if one cert in
  14079. * the directory is bad and can't be used (e.g. if one is expired),
  14080. * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR.
  14081. */
  14082. flags |= WOLFSSL_LOAD_FLAG_IGNORE_ERR;
  14083. }
  14084. ret = wolfSSL_CTX_load_verify_locations_ex(ctx, certFile, certDir,
  14085. flags);
  14086. if (ret != WOLFSSL_SUCCESS) {
  14087. WOLFSSL_MSG_EX("Failed to load CA certs from SSL_CERT_FILE: %s"
  14088. " SSL_CERT_DIR: %s. Error: %d", certFile,
  14089. certDir, ret);
  14090. return WOLFSSL_FAILURE;
  14091. }
  14092. return ret;
  14093. }
  14094. #endif
  14095. ret = wolfSSL_CTX_load_system_CA_certs(ctx);
  14096. if (ret == WOLFSSL_BAD_PATH) {
  14097. /*
  14098. * OpenSSL doesn't treat the lack of a system CA cert directory as a
  14099. * failure. We do the same here.
  14100. */
  14101. ret = WOLFSSL_SUCCESS;
  14102. }
  14103. WOLFSSL_LEAVE("wolfSSL_CTX_set_default_verify_paths", ret);
  14104. return ret;
  14105. }
  14106. #endif /* WOLFSSL_SYS_CA_CERTS */
  14107. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  14108. && !defined(WC_NO_RNG)
  14109. static const byte srp_N[] = {
  14110. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  14111. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  14112. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  14113. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  14114. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  14115. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  14116. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  14117. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  14118. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  14119. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  14120. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  14121. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  14122. };
  14123. static const byte srp_g[] = {
  14124. 0x02
  14125. };
  14126. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  14127. {
  14128. int r = 0;
  14129. SrpSide srp_side = SRP_CLIENT_SIDE;
  14130. byte salt[SRP_SALT_SIZE];
  14131. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  14132. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  14133. return WOLFSSL_FAILURE;
  14134. if (ctx->method->side == WOLFSSL_SERVER_END){
  14135. srp_side = SRP_SERVER_SIDE;
  14136. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  14137. srp_side = SRP_CLIENT_SIDE;
  14138. } else {
  14139. WOLFSSL_MSG("Init CTX failed");
  14140. return WOLFSSL_FAILURE;
  14141. }
  14142. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  14143. WOLFSSL_MSG("Init SRP CTX failed");
  14144. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  14145. ctx->srp = NULL;
  14146. return WOLFSSL_FAILURE;
  14147. }
  14148. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  14149. (word32)XSTRLEN(username));
  14150. if (r < 0) {
  14151. WOLFSSL_MSG("fail to set srp username.");
  14152. return WOLFSSL_FAILURE;
  14153. }
  14154. /* if wolfSSL_CTX_set_srp_password has already been called, */
  14155. /* execute wc_SrpSetPassword here */
  14156. if (ctx->srp_password != NULL) {
  14157. WC_RNG rng;
  14158. if (wc_InitRng(&rng) < 0){
  14159. WOLFSSL_MSG("wc_InitRng failed");
  14160. return WOLFSSL_FAILURE;
  14161. }
  14162. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14163. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14164. wc_FreeRng(&rng);
  14165. if (r < 0) {
  14166. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14167. return WOLFSSL_FAILURE;
  14168. }
  14169. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14170. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14171. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  14172. WOLFSSL_MSG("wc_SrpSetParam failed");
  14173. return WOLFSSL_FAILURE;
  14174. }
  14175. r = wc_SrpSetPassword(ctx->srp,
  14176. (const byte*)ctx->srp_password,
  14177. (word32)XSTRLEN((char *)ctx->srp_password));
  14178. if (r < 0) {
  14179. WOLFSSL_MSG("fail to set srp password.");
  14180. return WOLFSSL_FAILURE;
  14181. }
  14182. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  14183. ctx->srp_password = NULL;
  14184. }
  14185. return WOLFSSL_SUCCESS;
  14186. }
  14187. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  14188. {
  14189. int r;
  14190. byte salt[SRP_SALT_SIZE];
  14191. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  14192. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  14193. return WOLFSSL_FAILURE;
  14194. if (ctx->srp->user != NULL) {
  14195. WC_RNG rng;
  14196. if (wc_InitRng(&rng) < 0) {
  14197. WOLFSSL_MSG("wc_InitRng failed");
  14198. return WOLFSSL_FAILURE;
  14199. }
  14200. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14201. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14202. wc_FreeRng(&rng);
  14203. if (r < 0) {
  14204. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14205. return WOLFSSL_FAILURE;
  14206. }
  14207. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14208. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14209. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  14210. WOLFSSL_MSG("wc_SrpSetParam failed");
  14211. wc_FreeRng(&rng);
  14212. return WOLFSSL_FAILURE;
  14213. }
  14214. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  14215. (word32)XSTRLEN(password));
  14216. if (r < 0) {
  14217. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  14218. wc_FreeRng(&rng);
  14219. return WOLFSSL_FAILURE;
  14220. }
  14221. if (ctx->srp_password != NULL){
  14222. XFREE(ctx->srp_password,NULL,
  14223. DYNAMIC_TYPE_SRP);
  14224. ctx->srp_password = NULL;
  14225. }
  14226. wc_FreeRng(&rng);
  14227. } else {
  14228. /* save password for wolfSSL_set_srp_username */
  14229. if (ctx->srp_password != NULL)
  14230. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  14231. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  14232. DYNAMIC_TYPE_SRP);
  14233. if (ctx->srp_password == NULL){
  14234. WOLFSSL_MSG("memory allocation error");
  14235. return WOLFSSL_FAILURE;
  14236. }
  14237. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  14238. }
  14239. return WOLFSSL_SUCCESS;
  14240. }
  14241. /**
  14242. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  14243. * that the requested strength is less than or equal to the size of the
  14244. * static modulus size.
  14245. * @param ctx Not used
  14246. * @param strength Minimum number of bits for the modulus
  14247. * @return 1 if strength is less than or equal to static modulus
  14248. * 0 if strength is greater than static modulus
  14249. */
  14250. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  14251. {
  14252. (void)ctx;
  14253. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  14254. if (strength > (int)(sizeof(srp_N)*8)) {
  14255. WOLFSSL_MSG("Bad Parameter");
  14256. return WOLFSSL_FAILURE;
  14257. }
  14258. return WOLFSSL_SUCCESS;
  14259. }
  14260. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  14261. {
  14262. if (ssl && ssl->ctx && ssl->ctx->srp) {
  14263. return (char*) ssl->ctx->srp->user;
  14264. }
  14265. return NULL;
  14266. }
  14267. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  14268. /* keyblock size in bytes or -1 */
  14269. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  14270. {
  14271. if (ssl == NULL)
  14272. return WOLFSSL_FATAL_ERROR;
  14273. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  14274. ssl->specs.hash_size);
  14275. }
  14276. #endif /* OPENSSL_EXTRA */
  14277. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14278. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  14279. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  14280. unsigned char** sr, unsigned int* srLen,
  14281. unsigned char** cr, unsigned int* crLen)
  14282. {
  14283. if (ssl == NULL || ssl->arrays == NULL)
  14284. return WOLFSSL_FATAL_ERROR;
  14285. *ms = ssl->arrays->masterSecret;
  14286. *sr = ssl->arrays->serverRandom;
  14287. *cr = ssl->arrays->clientRandom;
  14288. *msLen = SECRET_LEN;
  14289. *srLen = RAN_LEN;
  14290. *crLen = RAN_LEN;
  14291. return WOLFSSL_SUCCESS;
  14292. }
  14293. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  14294. {
  14295. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  14296. if (ssl == NULL)
  14297. return;
  14298. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14299. #ifdef HAVE_ECC
  14300. #ifdef WOLFSSL_SMALL_STACK
  14301. ecc_key* key = NULL;
  14302. #else
  14303. ecc_key key[1];
  14304. #endif
  14305. word32 idx = 0;
  14306. #ifdef WOLFSSL_SMALL_STACK
  14307. key = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  14308. DYNAMIC_TYPE_ECC);
  14309. if (key == NULL) {
  14310. WOLFSSL_MSG("Error allocating memory for ecc_key");
  14311. }
  14312. #endif
  14313. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  14314. if (wc_ecc_init(key) >= 0) {
  14315. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  14316. key, ssl->buffers.key->length) != 0) {
  14317. ssl->options.haveECDSAsig = 0;
  14318. ssl->options.haveECC = 0;
  14319. ssl->options.haveStaticECC = 0;
  14320. }
  14321. wc_ecc_free(key);
  14322. }
  14323. }
  14324. #ifdef WOLFSSL_SMALL_STACK
  14325. XFREE(key, ssl->heap, DYNAMIC_TYPE_ECC);
  14326. #endif
  14327. #endif
  14328. #ifndef NO_DH
  14329. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  14330. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  14331. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  14332. ssl->options.haveDH = 1;
  14333. }
  14334. #endif
  14335. }
  14336. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  14337. WOLFSSL_MSG("Error initializing server side");
  14338. }
  14339. }
  14340. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14341. /* return true if connection established */
  14342. int wolfSSL_is_init_finished(const WOLFSSL* ssl)
  14343. {
  14344. if (ssl == NULL)
  14345. return 0;
  14346. /* Can't use ssl->options.connectState and ssl->options.acceptState because
  14347. * they differ in meaning for TLS <=1.2 and 1.3 */
  14348. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  14349. return 1;
  14350. return 0;
  14351. }
  14352. #ifdef OPENSSL_EXTRA
  14353. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  14354. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  14355. {
  14356. /* wolfSSL verifies all these internally */
  14357. (void)ctx;
  14358. (void)f;
  14359. }
  14360. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  14361. {
  14362. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  14363. if(ssl==NULL) {
  14364. WOLFSSL_MSG("Shutdown not set. ssl is null");
  14365. return;
  14366. }
  14367. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  14368. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  14369. }
  14370. #endif
  14371. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  14372. {
  14373. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  14374. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  14375. if(ctx == NULL)
  14376. return BAD_FUNC_ARG;
  14377. return ctx->mask;
  14378. }
  14379. /* forward declaration */
  14380. static long wolf_set_options(long old_op, long op);
  14381. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  14382. {
  14383. WOLFSSL_ENTER("wolfSSL_CTX_set_options");
  14384. if (ctx == NULL)
  14385. return BAD_FUNC_ARG;
  14386. ctx->mask = wolf_set_options(ctx->mask, opt);
  14387. #if defined(HAVE_SESSION_TICKET) && (defined(OPENSSL_EXTRA) \
  14388. || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL))
  14389. if ((ctx->mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  14390. ctx->noTicketTls12 = 1;
  14391. }
  14392. /* This code is here for documentation purpose. You must not turn off
  14393. * session tickets with the WOLFSSL_OP_NO_TICKET option for TLSv1.3.
  14394. * Because we need to support both stateful and stateless tickets.
  14395. #ifdef WOLFSSL_TLS13
  14396. if ((ctx->mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  14397. ctx->noTicketTls13 = 1;
  14398. }
  14399. #endif
  14400. */
  14401. #endif
  14402. return ctx->mask;
  14403. }
  14404. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  14405. {
  14406. WOLFSSL_ENTER("wolfSSL_CTX_clear_options");
  14407. if(ctx == NULL)
  14408. return BAD_FUNC_ARG;
  14409. ctx->mask &= ~opt;
  14410. return ctx->mask;
  14411. }
  14412. #ifdef OPENSSL_EXTRA
  14413. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  14414. {
  14415. WOLFSSL_ENTER("wolfSSL_set_rfd");
  14416. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  14417. ssl->IOCB_ReadCtx = &ssl->rfd;
  14418. #ifdef WOLFSSL_DTLS
  14419. if (ssl->options.dtls) {
  14420. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  14421. ssl->buffers.dtlsCtx.rfd = rfd;
  14422. }
  14423. #endif
  14424. return WOLFSSL_SUCCESS;
  14425. }
  14426. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  14427. {
  14428. WOLFSSL_ENTER("wolfSSL_set_wfd");
  14429. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  14430. ssl->IOCB_WriteCtx = &ssl->wfd;
  14431. return WOLFSSL_SUCCESS;
  14432. }
  14433. #endif /* OPENSSL_EXTRA */
  14434. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  14435. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  14436. /**
  14437. * Implemented in a similar way that ngx_ssl_ocsp_validate does it when
  14438. * SSL_get0_verified_chain is not available.
  14439. * @param ssl WOLFSSL object to extract certs from
  14440. * @return Stack of verified certs
  14441. */
  14442. WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
  14443. {
  14444. WOLF_STACK_OF(WOLFSSL_X509)* chain = NULL;
  14445. WOLFSSL_X509_STORE_CTX* storeCtx = NULL;
  14446. WOLFSSL_X509* peerCert = NULL;
  14447. WOLFSSL_ENTER("wolfSSL_get0_verified_chain");
  14448. if (ssl == NULL || ssl->ctx == NULL) {
  14449. WOLFSSL_MSG("Bad parameter");
  14450. return NULL;
  14451. }
  14452. peerCert = wolfSSL_get_peer_certificate((WOLFSSL*)ssl);
  14453. if (peerCert == NULL) {
  14454. WOLFSSL_MSG("wolfSSL_get_peer_certificate error");
  14455. return NULL;
  14456. }
  14457. /* wolfSSL_get_peer_certificate returns a copy. We want the internal
  14458. * member so that we don't have to worry about free'ing it. We call
  14459. * wolfSSL_get_peer_certificate so that we don't have to worry about
  14460. * setting up the internal pointer. */
  14461. wolfSSL_X509_free(peerCert);
  14462. peerCert = (WOLFSSL_X509*)&ssl->peerCert;
  14463. chain = wolfSSL_get_peer_cert_chain(ssl);
  14464. if (chain == NULL) {
  14465. WOLFSSL_MSG("wolfSSL_get_peer_cert_chain error");
  14466. return NULL;
  14467. }
  14468. storeCtx = wolfSSL_X509_STORE_CTX_new();
  14469. if (storeCtx == NULL) {
  14470. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_new error");
  14471. return NULL;
  14472. }
  14473. if (wolfSSL_X509_STORE_CTX_init(storeCtx, SSL_STORE(ssl),
  14474. peerCert, chain) != WOLFSSL_SUCCESS) {
  14475. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init error");
  14476. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14477. return NULL;
  14478. }
  14479. if (wolfSSL_X509_verify_cert(storeCtx) <= 0) {
  14480. WOLFSSL_MSG("wolfSSL_X509_verify_cert error");
  14481. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14482. return NULL;
  14483. }
  14484. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14485. return chain;
  14486. }
  14487. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  14488. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  14489. {
  14490. if (ctx == NULL) {
  14491. return NULL;
  14492. }
  14493. if (ctx->x509_store_pt != NULL)
  14494. return ctx->x509_store_pt;
  14495. return &ctx->x509_store;
  14496. }
  14497. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  14498. {
  14499. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_store");
  14500. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  14501. return;
  14502. }
  14503. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  14504. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  14505. return;
  14506. }
  14507. /* free cert manager if have one */
  14508. if (ctx->cm != NULL) {
  14509. wolfSSL_CertManagerFree(ctx->cm);
  14510. }
  14511. ctx->cm = str->cm;
  14512. ctx->x509_store.cm = str->cm;
  14513. /* free existing store if it exists */
  14514. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  14515. ctx->x509_store.cache = str->cache;
  14516. ctx->x509_store_pt = str; /* take ownership of store and free it
  14517. with CTX free */
  14518. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has ownership
  14519. and free it with CTX free*/
  14520. }
  14521. #ifdef OPENSSL_ALL
  14522. int wolfSSL_CTX_set1_verify_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  14523. {
  14524. WOLFSSL_ENTER("wolfSSL_CTX_set1_verify_cert_store");
  14525. if (ctx == NULL || str == NULL) {
  14526. WOLFSSL_MSG("Bad parameter");
  14527. return WOLFSSL_FAILURE;
  14528. }
  14529. /* NO-OP when setting existing store */
  14530. if (str == CTX_STORE(ctx))
  14531. return WOLFSSL_SUCCESS;
  14532. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  14533. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  14534. return WOLFSSL_FAILURE;
  14535. }
  14536. /* free existing store if it exists */
  14537. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  14538. ctx->x509_store_pt = str; /* take ownership of store and free it
  14539. with CTX free */
  14540. return WOLFSSL_SUCCESS;
  14541. }
  14542. #endif
  14543. int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  14544. {
  14545. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  14546. if (ssl == NULL || str == NULL) {
  14547. WOLFSSL_MSG("Bad parameter");
  14548. return WOLFSSL_FAILURE;
  14549. }
  14550. /* NO-OP when setting existing store */
  14551. if (str == SSL_STORE(ssl))
  14552. return WOLFSSL_SUCCESS;
  14553. /* free existing store if it exists */
  14554. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  14555. if (str == ssl->ctx->x509_store_pt)
  14556. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  14557. to using that instead */
  14558. else
  14559. ssl->x509_store_pt = str; /* take ownership of store and free it
  14560. with SSL free */
  14561. return WOLFSSL_SUCCESS;
  14562. }
  14563. int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  14564. {
  14565. WOLFSSL_ENTER("wolfSSL_set1_verify_cert_store");
  14566. if (ssl == NULL || str == NULL) {
  14567. WOLFSSL_MSG("Bad parameter");
  14568. return WOLFSSL_FAILURE;
  14569. }
  14570. /* NO-OP when setting existing store */
  14571. if (str == SSL_STORE(ssl))
  14572. return WOLFSSL_SUCCESS;
  14573. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  14574. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  14575. return WOLFSSL_FAILURE;
  14576. }
  14577. /* free existing store if it exists */
  14578. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  14579. if (str == ssl->ctx->x509_store_pt)
  14580. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  14581. to using that instead */
  14582. else
  14583. ssl->x509_store_pt = str; /* take ownership of store and free it
  14584. with SSL free */
  14585. return WOLFSSL_SUCCESS;
  14586. }
  14587. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  14588. #ifdef WOLFSSL_ENCRYPTED_KEYS
  14589. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  14590. void* userdata)
  14591. {
  14592. WOLFSSL_ENTER("wolfSSL_CTX_set_default_passwd_cb_userdata");
  14593. if (ctx)
  14594. ctx->passwd_userdata = userdata;
  14595. }
  14596. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx, wc_pem_password_cb*
  14597. cb)
  14598. {
  14599. WOLFSSL_ENTER("wolfSSL_CTX_set_default_passwd_cb");
  14600. if (ctx)
  14601. ctx->passwd_cb = cb;
  14602. }
  14603. wc_pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  14604. {
  14605. if (ctx == NULL || ctx->passwd_cb == NULL) {
  14606. return NULL;
  14607. }
  14608. return ctx->passwd_cb;
  14609. }
  14610. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  14611. {
  14612. if (ctx == NULL) {
  14613. return NULL;
  14614. }
  14615. return ctx->passwd_userdata;
  14616. }
  14617. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  14618. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  14619. int wolfSSL_num_locks(void)
  14620. {
  14621. return 0;
  14622. }
  14623. void wolfSSL_set_locking_callback(mutex_cb* f)
  14624. {
  14625. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  14626. if (wc_SetMutexCb(f) != 0) {
  14627. WOLFSSL_MSG("Error when setting mutex call back");
  14628. }
  14629. }
  14630. mutex_cb* wolfSSL_get_locking_callback(void)
  14631. {
  14632. WOLFSSL_ENTER("wolfSSL_get_locking_callback");
  14633. return wc_GetMutexCb();
  14634. }
  14635. typedef unsigned long (idCb)(void);
  14636. static idCb* inner_idCb = NULL;
  14637. unsigned long wolfSSL_thread_id(void)
  14638. {
  14639. if (inner_idCb != NULL) {
  14640. return inner_idCb();
  14641. }
  14642. else {
  14643. return 0;
  14644. }
  14645. }
  14646. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  14647. {
  14648. inner_idCb = f;
  14649. }
  14650. unsigned long wolfSSL_ERR_get_error(void)
  14651. {
  14652. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  14653. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  14654. return wc_GetErrorNodeErr();
  14655. #else
  14656. return (unsigned long)(0 - NOT_COMPILED_IN);
  14657. #endif
  14658. }
  14659. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  14660. #ifndef NO_BIO
  14661. /* print out and clear all errors */
  14662. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  14663. {
  14664. const char* file = NULL;
  14665. const char* reason = NULL;
  14666. int ret;
  14667. int line = 0;
  14668. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  14669. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  14670. if (bio == NULL) {
  14671. WOLFSSL_MSG("BIO passed in was null");
  14672. return;
  14673. }
  14674. do {
  14675. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  14676. if (ret >= 0) {
  14677. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  14678. if (XSNPRINTF(buf, sizeof(buf),
  14679. "error:%d:wolfSSL library:%s:%s:%d\n",
  14680. ret, r, file, line)
  14681. >= (int)sizeof(buf))
  14682. {
  14683. WOLFSSL_MSG("Buffer overrun formatting error message");
  14684. }
  14685. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  14686. wc_RemoveErrorNode(0);
  14687. }
  14688. } while (ret >= 0);
  14689. if (wolfSSL_BIO_write(bio, "", 1) != 1) {
  14690. WOLFSSL_MSG("Issue writing final string terminator");
  14691. }
  14692. }
  14693. #endif /* !NO_BIO */
  14694. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  14695. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  14696. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  14697. defined(HAVE_SECRET_CALLBACK)
  14698. #if !defined(NO_WOLFSSL_SERVER)
  14699. /* Return the amount of random bytes copied over or error case.
  14700. * ssl : ssl struct after handshake
  14701. * out : buffer to hold random bytes
  14702. * outSz : either 0 (return max buffer sz) or size of out buffer
  14703. */
  14704. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  14705. size_t outSz)
  14706. {
  14707. size_t size;
  14708. /* return max size of buffer */
  14709. if (outSz == 0) {
  14710. return RAN_LEN;
  14711. }
  14712. if (ssl == NULL || out == NULL) {
  14713. return 0;
  14714. }
  14715. if (ssl->arrays == NULL) {
  14716. WOLFSSL_MSG("Arrays struct not saved after handshake");
  14717. return 0;
  14718. }
  14719. if (outSz > RAN_LEN) {
  14720. size = RAN_LEN;
  14721. }
  14722. else {
  14723. size = outSz;
  14724. }
  14725. XMEMCPY(out, ssl->arrays->serverRandom, size);
  14726. return size;
  14727. }
  14728. #endif /* !NO_WOLFSSL_SERVER */
  14729. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  14730. #ifdef OPENSSL_EXTRA
  14731. #if !defined(NO_WOLFSSL_SERVER)
  14732. /* Used to get the peer ephemeral public key sent during the connection
  14733. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  14734. * before the ephemeral key is stored.
  14735. * return WOLFSSL_SUCCESS on success */
  14736. int wolfSSL_get_peer_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  14737. {
  14738. WOLFSSL_EVP_PKEY* ret = NULL;
  14739. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  14740. if (ssl == NULL || pkey == NULL) {
  14741. WOLFSSL_MSG("Bad argument passed in");
  14742. return WOLFSSL_FAILURE;
  14743. }
  14744. #ifdef HAVE_ECC
  14745. if (ssl->peerEccKey != NULL) {
  14746. unsigned char* der;
  14747. const unsigned char* pt;
  14748. unsigned int derSz = 0;
  14749. int sz;
  14750. PRIVATE_KEY_UNLOCK();
  14751. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  14752. LENGTH_ONLY_E) {
  14753. WOLFSSL_MSG("get ecc der size failed");
  14754. PRIVATE_KEY_LOCK();
  14755. return WOLFSSL_FAILURE;
  14756. }
  14757. PRIVATE_KEY_LOCK();
  14758. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  14759. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  14760. if (der == NULL) {
  14761. WOLFSSL_MSG("Memory error");
  14762. return WOLFSSL_FAILURE;
  14763. }
  14764. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  14765. WOLFSSL_MSG("get ecc der failed");
  14766. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14767. return WOLFSSL_FAILURE;
  14768. }
  14769. pt = der; /* in case pointer gets advanced */
  14770. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  14771. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14772. }
  14773. #endif
  14774. *pkey = ret;
  14775. #ifdef HAVE_ECC
  14776. if (ret != NULL)
  14777. return WOLFSSL_SUCCESS;
  14778. else
  14779. #endif
  14780. return WOLFSSL_FAILURE;
  14781. }
  14782. #endif /* !NO_WOLFSSL_SERVER */
  14783. /**
  14784. * This function checks if any compiled in protocol versions are
  14785. * left enabled after calls to set_min or set_max API.
  14786. * @param major The SSL/TLS major version
  14787. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14788. * protocol versions are left enabled.
  14789. */
  14790. static int CheckSslMethodVersion(byte major, unsigned long options)
  14791. {
  14792. int sanityConfirmed = 0;
  14793. (void)options;
  14794. switch (major) {
  14795. #ifndef NO_TLS
  14796. case SSLv3_MAJOR:
  14797. #ifdef WOLFSSL_ALLOW_SSLV3
  14798. if (!(options & WOLFSSL_OP_NO_SSLv3)) {
  14799. sanityConfirmed = 1;
  14800. }
  14801. #endif
  14802. #ifndef NO_OLD_TLS
  14803. if (!(options & WOLFSSL_OP_NO_TLSv1))
  14804. sanityConfirmed = 1;
  14805. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  14806. sanityConfirmed = 1;
  14807. #endif
  14808. #ifndef WOLFSSL_NO_TLS12
  14809. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  14810. sanityConfirmed = 1;
  14811. #endif
  14812. #ifdef WOLFSSL_TLS13
  14813. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  14814. sanityConfirmed = 1;
  14815. #endif
  14816. break;
  14817. #endif
  14818. #ifdef WOLFSSL_DTLS
  14819. case DTLS_MAJOR:
  14820. sanityConfirmed = 1;
  14821. break;
  14822. #endif
  14823. default:
  14824. WOLFSSL_MSG("Invalid major version");
  14825. return WOLFSSL_FAILURE;
  14826. }
  14827. if (!sanityConfirmed) {
  14828. WOLFSSL_MSG("All compiled in TLS versions disabled");
  14829. return WOLFSSL_FAILURE;
  14830. }
  14831. return WOLFSSL_SUCCESS;
  14832. }
  14833. /**
  14834. * protoVerTbl holds (D)TLS version numbers in ascending order.
  14835. * Except DTLS versions, the newer version is located in the latter part of
  14836. * the table. This table is referred by wolfSSL_CTX_set_min_proto_version and
  14837. * wolfSSL_CTX_set_max_proto_version.
  14838. */
  14839. static const int protoVerTbl[] = {
  14840. SSL3_VERSION,
  14841. TLS1_VERSION,
  14842. TLS1_1_VERSION,
  14843. TLS1_2_VERSION,
  14844. TLS1_3_VERSION,
  14845. DTLS1_VERSION,
  14846. DTLS1_2_VERSION
  14847. };
  14848. /* number of protocol versions listed in protoVerTbl */
  14849. #define NUMBER_OF_PROTOCOLS (sizeof(protoVerTbl)/sizeof(int))
  14850. /**
  14851. * wolfSSL_CTX_set_min_proto_version attempts to set the minimum protocol
  14852. * version to use by SSL objects created from this WOLFSSL_CTX.
  14853. * This API guarantees that a version of SSL/TLS lower than specified
  14854. * here will not be allowed. If the version specified is not compiled in
  14855. * then this API sets the lowest compiled in protocol version.
  14856. * This API also accept 0 as version, to set the minimum version automatically.
  14857. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  14858. * are enabled.
  14859. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  14860. * @param version Any of the following
  14861. * * 0
  14862. * * SSL3_VERSION
  14863. * * TLS1_VERSION
  14864. * * TLS1_1_VERSION
  14865. * * TLS1_2_VERSION
  14866. * * TLS1_3_VERSION
  14867. * * DTLS1_VERSION
  14868. * * DTLS1_2_VERSION
  14869. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14870. * protocol versions are left enabled.
  14871. */
  14872. static int Set_CTX_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14873. {
  14874. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version_ex");
  14875. if (ctx == NULL) {
  14876. return WOLFSSL_FAILURE;
  14877. }
  14878. switch (version) {
  14879. #ifndef NO_TLS
  14880. case SSL3_VERSION:
  14881. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  14882. ctx->minDowngrade = SSLv3_MINOR;
  14883. break;
  14884. #endif
  14885. case TLS1_VERSION:
  14886. #ifdef WOLFSSL_ALLOW_TLSV10
  14887. ctx->minDowngrade = TLSv1_MINOR;
  14888. break;
  14889. #endif
  14890. case TLS1_1_VERSION:
  14891. #ifndef NO_OLD_TLS
  14892. ctx->minDowngrade = TLSv1_1_MINOR;
  14893. break;
  14894. #endif
  14895. case TLS1_2_VERSION:
  14896. #ifndef WOLFSSL_NO_TLS12
  14897. ctx->minDowngrade = TLSv1_2_MINOR;
  14898. break;
  14899. #endif
  14900. case TLS1_3_VERSION:
  14901. #ifdef WOLFSSL_TLS13
  14902. ctx->minDowngrade = TLSv1_3_MINOR;
  14903. break;
  14904. #endif
  14905. #endif
  14906. #ifdef WOLFSSL_DTLS
  14907. case DTLS1_VERSION:
  14908. #ifndef NO_OLD_TLS
  14909. ctx->minDowngrade = DTLS_MINOR;
  14910. break;
  14911. #endif
  14912. case DTLS1_2_VERSION:
  14913. ctx->minDowngrade = DTLSv1_2_MINOR;
  14914. break;
  14915. #endif
  14916. default:
  14917. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14918. return WOLFSSL_FAILURE;
  14919. }
  14920. switch (version) {
  14921. #ifndef NO_TLS
  14922. case TLS1_3_VERSION:
  14923. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  14924. FALL_THROUGH;
  14925. case TLS1_2_VERSION:
  14926. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  14927. FALL_THROUGH;
  14928. case TLS1_1_VERSION:
  14929. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  14930. FALL_THROUGH;
  14931. case TLS1_VERSION:
  14932. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  14933. break;
  14934. case SSL3_VERSION:
  14935. case SSL2_VERSION:
  14936. /* Nothing to do here */
  14937. break;
  14938. #endif
  14939. #ifdef WOLFSSL_DTLS
  14940. case DTLS1_VERSION:
  14941. case DTLS1_2_VERSION:
  14942. break;
  14943. #endif
  14944. default:
  14945. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14946. return WOLFSSL_FAILURE;
  14947. }
  14948. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  14949. }
  14950. /* Sets the min protocol version allowed with WOLFSSL_CTX
  14951. * returns WOLFSSL_SUCCESS on success */
  14952. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14953. {
  14954. int ret;
  14955. int proto = 0;
  14956. int maxProto = 0;
  14957. int i;
  14958. int idx = 0;
  14959. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  14960. if (ctx == NULL) {
  14961. return WOLFSSL_FAILURE;
  14962. }
  14963. if (version != 0) {
  14964. proto = version;
  14965. ctx->minProto = 0; /* turn min proto flag off */
  14966. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14967. if (protoVerTbl[i] == version) {
  14968. break;
  14969. }
  14970. }
  14971. }
  14972. else {
  14973. /* when 0 is specified as version, try to find out the min version */
  14974. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14975. ret = Set_CTX_min_proto_version(ctx, protoVerTbl[i]);
  14976. if (ret == WOLFSSL_SUCCESS) {
  14977. proto = protoVerTbl[i];
  14978. ctx->minProto = 1; /* turn min proto flag on */
  14979. break;
  14980. }
  14981. }
  14982. }
  14983. /* check case where max > min , if so then clear the NO_* options
  14984. * i is the index into the table for proto version used, see if the max
  14985. * proto version index found is smaller */
  14986. maxProto = wolfSSL_CTX_get_max_proto_version(ctx);
  14987. for (idx = 0; (unsigned)idx < NUMBER_OF_PROTOCOLS; idx++) {
  14988. if (protoVerTbl[idx] == maxProto) {
  14989. break;
  14990. }
  14991. }
  14992. if (idx < i) {
  14993. wolfSSL_CTX_clear_options(ctx, WOLFSSL_OP_NO_TLSv1 |
  14994. WOLFSSL_OP_NO_TLSv1_1 | WOLFSSL_OP_NO_TLSv1_2 |
  14995. WOLFSSL_OP_NO_TLSv1_3);
  14996. }
  14997. ret = Set_CTX_min_proto_version(ctx, proto);
  14998. return ret;
  14999. }
  15000. /**
  15001. * wolfSSL_CTX_set_max_proto_version attempts to set the maximum protocol
  15002. * version to use by SSL objects created from this WOLFSSL_CTX.
  15003. * This API guarantees that a version of SSL/TLS higher than specified
  15004. * here will not be allowed. If the version specified is not compiled in
  15005. * then this API sets the highest compiled in protocol version.
  15006. * This API also accept 0 as version, to set the maximum version automatically.
  15007. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  15008. * are enabled.
  15009. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  15010. * @param ver Any of the following
  15011. * * 0
  15012. * * SSL3_VERSION
  15013. * * TLS1_VERSION
  15014. * * TLS1_1_VERSION
  15015. * * TLS1_2_VERSION
  15016. * * TLS1_3_VERSION
  15017. * * DTLS1_VERSION
  15018. * * DTLS1_2_VERSION
  15019. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15020. * protocol versions are left enabled.
  15021. */
  15022. static int Set_CTX_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  15023. {
  15024. int ret;
  15025. WOLFSSL_ENTER("Set_CTX_max_proto_version");
  15026. if (!ctx || !ctx->method) {
  15027. WOLFSSL_MSG("Bad parameter");
  15028. return WOLFSSL_FAILURE;
  15029. }
  15030. switch (ver) {
  15031. case SSL2_VERSION:
  15032. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15033. return WOLFSSL_FAILURE;
  15034. #ifndef NO_TLS
  15035. case SSL3_VERSION:
  15036. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  15037. FALL_THROUGH;
  15038. case TLS1_VERSION:
  15039. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  15040. FALL_THROUGH;
  15041. case TLS1_1_VERSION:
  15042. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  15043. FALL_THROUGH;
  15044. case TLS1_2_VERSION:
  15045. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  15046. FALL_THROUGH;
  15047. case TLS1_3_VERSION:
  15048. /* Nothing to do here */
  15049. break;
  15050. #endif
  15051. #ifdef WOLFSSL_DTLS
  15052. case DTLS1_VERSION:
  15053. case DTLS1_2_VERSION:
  15054. break;
  15055. #endif
  15056. default:
  15057. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15058. return WOLFSSL_FAILURE;
  15059. }
  15060. ret = CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  15061. if (ret == WOLFSSL_SUCCESS) {
  15062. /* Check the major */
  15063. switch (ver) {
  15064. #ifndef NO_TLS
  15065. case SSL3_VERSION:
  15066. case TLS1_VERSION:
  15067. case TLS1_1_VERSION:
  15068. case TLS1_2_VERSION:
  15069. case TLS1_3_VERSION:
  15070. if (ctx->method->version.major != SSLv3_MAJOR) {
  15071. WOLFSSL_MSG("Mismatched protocol version");
  15072. return WOLFSSL_FAILURE;
  15073. }
  15074. break;
  15075. #endif
  15076. #ifdef WOLFSSL_DTLS
  15077. case DTLS1_VERSION:
  15078. case DTLS1_2_VERSION:
  15079. if (ctx->method->version.major != DTLS_MAJOR) {
  15080. WOLFSSL_MSG("Mismatched protocol version");
  15081. return WOLFSSL_FAILURE;
  15082. }
  15083. break;
  15084. #endif
  15085. }
  15086. /* Update the method */
  15087. switch (ver) {
  15088. case SSL2_VERSION:
  15089. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15090. return WOLFSSL_FAILURE;
  15091. #ifndef NO_TLS
  15092. case SSL3_VERSION:
  15093. ctx->method->version.minor = SSLv3_MINOR;
  15094. break;
  15095. case TLS1_VERSION:
  15096. ctx->method->version.minor = TLSv1_MINOR;
  15097. break;
  15098. case TLS1_1_VERSION:
  15099. ctx->method->version.minor = TLSv1_1_MINOR;
  15100. break;
  15101. case TLS1_2_VERSION:
  15102. ctx->method->version.minor = TLSv1_2_MINOR;
  15103. break;
  15104. case TLS1_3_VERSION:
  15105. ctx->method->version.minor = TLSv1_3_MINOR;
  15106. break;
  15107. #endif
  15108. #ifdef WOLFSSL_DTLS
  15109. case DTLS1_VERSION:
  15110. ctx->method->version.minor = DTLS_MINOR;
  15111. break;
  15112. case DTLS1_2_VERSION:
  15113. ctx->method->version.minor = DTLSv1_2_MINOR;
  15114. break;
  15115. #endif
  15116. default:
  15117. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15118. return WOLFSSL_FAILURE;
  15119. }
  15120. }
  15121. return ret;
  15122. }
  15123. /* Sets the max protocol version allowed with WOLFSSL_CTX
  15124. * returns WOLFSSL_SUCCESS on success */
  15125. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version)
  15126. {
  15127. int i;
  15128. int ret = WOLFSSL_FAILURE;
  15129. int minProto;
  15130. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  15131. if (ctx == NULL) {
  15132. return ret;
  15133. }
  15134. /* clear out flags and reset min protocol version */
  15135. minProto = wolfSSL_CTX_get_min_proto_version(ctx);
  15136. wolfSSL_CTX_clear_options(ctx,
  15137. WOLFSSL_OP_NO_TLSv1 | WOLFSSL_OP_NO_TLSv1_1 |
  15138. WOLFSSL_OP_NO_TLSv1_2 | WOLFSSL_OP_NO_TLSv1_3);
  15139. wolfSSL_CTX_set_min_proto_version(ctx, minProto);
  15140. if (version != 0) {
  15141. ctx->maxProto = 0; /* turn max proto flag off */
  15142. return Set_CTX_max_proto_version(ctx, version);
  15143. }
  15144. /* when 0 is specified as version, try to find out the min version from
  15145. * the bottom to top of the protoverTbl.
  15146. */
  15147. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15148. ret = Set_CTX_max_proto_version(ctx, protoVerTbl[i]);
  15149. if (ret == WOLFSSL_SUCCESS) {
  15150. ctx->maxProto = 1; /* turn max proto flag on */
  15151. break;
  15152. }
  15153. }
  15154. return ret;
  15155. }
  15156. static int Set_SSL_min_proto_version(WOLFSSL* ssl, int ver)
  15157. {
  15158. WOLFSSL_ENTER("Set_SSL_min_proto_version");
  15159. if (ssl == NULL) {
  15160. return WOLFSSL_FAILURE;
  15161. }
  15162. switch (ver) {
  15163. #ifndef NO_TLS
  15164. case SSL3_VERSION:
  15165. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  15166. ssl->options.minDowngrade = SSLv3_MINOR;
  15167. break;
  15168. #endif
  15169. case TLS1_VERSION:
  15170. #ifdef WOLFSSL_ALLOW_TLSV10
  15171. ssl->options.minDowngrade = TLSv1_MINOR;
  15172. break;
  15173. #endif
  15174. case TLS1_1_VERSION:
  15175. #ifndef NO_OLD_TLS
  15176. ssl->options.minDowngrade = TLSv1_1_MINOR;
  15177. break;
  15178. #endif
  15179. case TLS1_2_VERSION:
  15180. #ifndef WOLFSSL_NO_TLS12
  15181. ssl->options.minDowngrade = TLSv1_2_MINOR;
  15182. break;
  15183. #endif
  15184. case TLS1_3_VERSION:
  15185. #ifdef WOLFSSL_TLS13
  15186. ssl->options.minDowngrade = TLSv1_3_MINOR;
  15187. break;
  15188. #endif
  15189. #endif
  15190. #ifdef WOLFSSL_DTLS
  15191. case DTLS1_VERSION:
  15192. #ifndef NO_OLD_TLS
  15193. ssl->options.minDowngrade = DTLS_MINOR;
  15194. break;
  15195. #endif
  15196. case DTLS1_2_VERSION:
  15197. ssl->options.minDowngrade = DTLSv1_2_MINOR;
  15198. break;
  15199. #endif
  15200. default:
  15201. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15202. return WOLFSSL_FAILURE;
  15203. }
  15204. switch (ver) {
  15205. #ifndef NO_TLS
  15206. case TLS1_3_VERSION:
  15207. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15208. FALL_THROUGH;
  15209. case TLS1_2_VERSION:
  15210. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15211. FALL_THROUGH;
  15212. case TLS1_1_VERSION:
  15213. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15214. FALL_THROUGH;
  15215. case TLS1_VERSION:
  15216. ssl->options.mask |= WOLFSSL_OP_NO_SSLv3;
  15217. break;
  15218. case SSL3_VERSION:
  15219. case SSL2_VERSION:
  15220. /* Nothing to do here */
  15221. break;
  15222. #endif
  15223. #ifdef WOLFSSL_DTLS
  15224. case DTLS1_VERSION:
  15225. case DTLS1_2_VERSION:
  15226. break;
  15227. #endif
  15228. default:
  15229. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15230. return WOLFSSL_FAILURE;
  15231. }
  15232. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15233. }
  15234. int wolfSSL_set_min_proto_version(WOLFSSL* ssl, int version)
  15235. {
  15236. int i;
  15237. int ret = WOLFSSL_FAILURE;;
  15238. WOLFSSL_ENTER("wolfSSL_set_min_proto_version");
  15239. if (ssl == NULL) {
  15240. return WOLFSSL_FAILURE;
  15241. }
  15242. if (version != 0) {
  15243. return Set_SSL_min_proto_version(ssl, version);
  15244. }
  15245. /* when 0 is specified as version, try to find out the min version */
  15246. for (i= 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15247. ret = Set_SSL_min_proto_version(ssl, protoVerTbl[i]);
  15248. if (ret == WOLFSSL_SUCCESS)
  15249. break;
  15250. }
  15251. return ret;
  15252. }
  15253. static int Set_SSL_max_proto_version(WOLFSSL* ssl, int ver)
  15254. {
  15255. WOLFSSL_ENTER("Set_SSL_max_proto_version");
  15256. if (!ssl) {
  15257. WOLFSSL_MSG("Bad parameter");
  15258. return WOLFSSL_FAILURE;
  15259. }
  15260. switch (ver) {
  15261. case SSL2_VERSION:
  15262. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15263. return WOLFSSL_FAILURE;
  15264. #ifndef NO_TLS
  15265. case SSL3_VERSION:
  15266. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15267. FALL_THROUGH;
  15268. case TLS1_VERSION:
  15269. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15270. FALL_THROUGH;
  15271. case TLS1_1_VERSION:
  15272. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15273. FALL_THROUGH;
  15274. case TLS1_2_VERSION:
  15275. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3;
  15276. FALL_THROUGH;
  15277. case TLS1_3_VERSION:
  15278. /* Nothing to do here */
  15279. break;
  15280. #endif
  15281. #ifdef WOLFSSL_DTLS
  15282. case DTLS1_VERSION:
  15283. case DTLS1_2_VERSION:
  15284. break;
  15285. #endif
  15286. default:
  15287. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15288. return WOLFSSL_FAILURE;
  15289. }
  15290. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15291. }
  15292. int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version)
  15293. {
  15294. int i;
  15295. int ret = WOLFSSL_FAILURE;;
  15296. WOLFSSL_ENTER("wolfSSL_set_max_proto_version");
  15297. if (ssl == NULL) {
  15298. return WOLFSSL_FAILURE;
  15299. }
  15300. if (version != 0) {
  15301. return Set_SSL_max_proto_version(ssl, version);
  15302. }
  15303. /* when 0 is specified as version, try to find out the min version from
  15304. * the bottom to top of the protoverTbl.
  15305. */
  15306. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15307. ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]);
  15308. if (ret == WOLFSSL_SUCCESS)
  15309. break;
  15310. }
  15311. return ret;
  15312. }
  15313. static int GetMinProtoVersion(int minDowngrade)
  15314. {
  15315. int ret;
  15316. switch (minDowngrade) {
  15317. #ifndef NO_OLD_TLS
  15318. #ifdef WOLFSSL_ALLOW_SSLV3
  15319. case SSLv3_MINOR:
  15320. ret = SSL3_VERSION;
  15321. break;
  15322. #endif
  15323. #ifdef WOLFSSL_ALLOW_TLSV10
  15324. case TLSv1_MINOR:
  15325. ret = TLS1_VERSION;
  15326. break;
  15327. #endif
  15328. case TLSv1_1_MINOR:
  15329. ret = TLS1_1_VERSION;
  15330. break;
  15331. #endif
  15332. #ifndef WOLFSSL_NO_TLS12
  15333. case TLSv1_2_MINOR:
  15334. ret = TLS1_2_VERSION;
  15335. break;
  15336. #endif
  15337. #ifdef WOLFSSL_TLS13
  15338. case TLSv1_3_MINOR:
  15339. ret = TLS1_3_VERSION;
  15340. break;
  15341. #endif
  15342. default:
  15343. ret = 0;
  15344. break;
  15345. }
  15346. return ret;
  15347. }
  15348. int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  15349. {
  15350. int ret = 0;
  15351. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  15352. if (ctx != NULL) {
  15353. if (ctx->minProto) {
  15354. ret = 0;
  15355. }
  15356. else {
  15357. ret = GetMinProtoVersion(ctx->minDowngrade);
  15358. }
  15359. }
  15360. else {
  15361. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  15362. }
  15363. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  15364. return ret;
  15365. }
  15366. /* returns the maximum allowed protocol version given the 'options' used
  15367. * returns WOLFSSL_FATAL_ERROR on no match */
  15368. static int GetMaxProtoVersion(long options)
  15369. {
  15370. #ifndef NO_TLS
  15371. #ifdef WOLFSSL_TLS13
  15372. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15373. return TLS1_3_VERSION;
  15374. #endif
  15375. #ifndef WOLFSSL_NO_TLS12
  15376. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15377. return TLS1_2_VERSION;
  15378. #endif
  15379. #ifndef NO_OLD_TLS
  15380. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15381. return TLS1_1_VERSION;
  15382. #ifdef WOLFSSL_ALLOW_TLSV10
  15383. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15384. return TLS1_VERSION;
  15385. #endif
  15386. #ifdef WOLFSSL_ALLOW_SSLV3
  15387. if (!(options & WOLFSSL_OP_NO_SSLv3))
  15388. return SSL3_VERSION;
  15389. #endif
  15390. #endif
  15391. #else
  15392. (void)options;
  15393. #endif /* NO_TLS */
  15394. return WOLFSSL_FATAL_ERROR;
  15395. }
  15396. /* returns the maximum protocol version for 'ctx' */
  15397. int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx)
  15398. {
  15399. int ret = 0;
  15400. long options = 0; /* default to nothing set */
  15401. WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version");
  15402. if (ctx != NULL) {
  15403. options = wolfSSL_CTX_get_options(ctx);
  15404. }
  15405. if ((ctx != NULL) && ctx->maxProto) {
  15406. ret = 0;
  15407. }
  15408. else {
  15409. ret = GetMaxProtoVersion(options);
  15410. }
  15411. WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret);
  15412. if (ret == WOLFSSL_FATAL_ERROR) {
  15413. WOLFSSL_MSG("Error getting max proto version");
  15414. ret = 0; /* setting ret to 0 to match compat return */
  15415. }
  15416. return ret;
  15417. }
  15418. #endif /* OPENSSL_EXTRA */
  15419. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15420. defined(HAVE_SECRET_CALLBACK)
  15421. #if !defined(NO_WOLFSSL_CLIENT)
  15422. /* Return the amount of random bytes copied over or error case.
  15423. * ssl : ssl struct after handshake
  15424. * out : buffer to hold random bytes
  15425. * outSz : either 0 (return max buffer sz) or size of out buffer
  15426. */
  15427. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  15428. size_t outSz)
  15429. {
  15430. size_t size;
  15431. /* return max size of buffer */
  15432. if (outSz == 0) {
  15433. return RAN_LEN;
  15434. }
  15435. if (ssl == NULL || out == NULL) {
  15436. return 0;
  15437. }
  15438. if (ssl->arrays == NULL) {
  15439. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15440. return 0;
  15441. }
  15442. if (outSz > RAN_LEN) {
  15443. size = RAN_LEN;
  15444. }
  15445. else {
  15446. size = outSz;
  15447. }
  15448. XMEMCPY(out, ssl->arrays->clientRandom, size);
  15449. return size;
  15450. }
  15451. #endif /* !NO_WOLFSSL_CLIENT */
  15452. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15453. #ifdef OPENSSL_EXTRA
  15454. unsigned long wolfSSLeay(void)
  15455. {
  15456. return SSLEAY_VERSION_NUMBER;
  15457. }
  15458. unsigned long wolfSSL_OpenSSL_version_num(void)
  15459. {
  15460. return OPENSSL_VERSION_NUMBER;
  15461. }
  15462. const char* wolfSSLeay_version(int type)
  15463. {
  15464. (void)type;
  15465. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  15466. return wolfSSL_OpenSSL_version(type);
  15467. #else
  15468. return wolfSSL_OpenSSL_version();
  15469. #endif
  15470. }
  15471. #endif /* OPENSSL_EXTRA */
  15472. #ifdef OPENSSL_EXTRA
  15473. void wolfSSL_ERR_free_strings(void)
  15474. {
  15475. /* handled internally */
  15476. }
  15477. void wolfSSL_cleanup_all_ex_data(void)
  15478. {
  15479. /* nothing to do here */
  15480. }
  15481. #endif /* OPENSSL_EXTRA */
  15482. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) || \
  15483. defined(HAVE_CURL)
  15484. void wolfSSL_ERR_clear_error(void)
  15485. {
  15486. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  15487. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  15488. wc_ClearErrorNodes();
  15489. #endif
  15490. }
  15491. #endif
  15492. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15493. int wolfSSL_clear(WOLFSSL* ssl)
  15494. {
  15495. WOLFSSL_ENTER("wolfSSL_clear");
  15496. if (ssl == NULL) {
  15497. return WOLFSSL_FAILURE;
  15498. }
  15499. if (!ssl->options.handShakeDone) {
  15500. /* Only reset the session if we didn't complete a handshake */
  15501. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  15502. ssl->session = wolfSSL_NewSession(ssl->heap);
  15503. if (ssl->session == NULL) {
  15504. return WOLFSSL_FAILURE;
  15505. }
  15506. }
  15507. /* reset error */
  15508. ssl->error = 0;
  15509. /* reset option bits */
  15510. ssl->options.isClosed = 0;
  15511. ssl->options.connReset = 0;
  15512. ssl->options.sentNotify = 0;
  15513. ssl->options.closeNotify = 0;
  15514. ssl->options.sendVerify = 0;
  15515. ssl->options.serverState = NULL_STATE;
  15516. ssl->options.clientState = NULL_STATE;
  15517. ssl->options.connectState = CONNECT_BEGIN;
  15518. ssl->options.acceptState = ACCEPT_BEGIN;
  15519. ssl->options.handShakeState = NULL_STATE;
  15520. ssl->options.handShakeDone = 0;
  15521. ssl->options.processReply = 0; /* doProcessInit */
  15522. ssl->options.havePeerVerify = 0;
  15523. ssl->options.havePeerCert = 0;
  15524. ssl->options.peerAuthGood = 0;
  15525. ssl->options.tls1_3 = 0;
  15526. ssl->options.haveSessionId = 0;
  15527. ssl->options.tls = 0;
  15528. ssl->options.tls1_1 = 0;
  15529. #ifdef WOLFSSL_DTLS
  15530. ssl->options.dtlsStateful = 0;
  15531. #endif
  15532. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  15533. ssl->options.noPskDheKe = 0;
  15534. #ifdef HAVE_SUPPORTED_CURVES
  15535. ssl->options.onlyPskDheKe = 0;
  15536. #endif
  15537. #endif
  15538. #ifdef HAVE_SESSION_TICKET
  15539. #ifdef WOLFSSL_TLS13
  15540. ssl->options.ticketsSent = 0;
  15541. #endif
  15542. ssl->options.rejectTicket = 0;
  15543. #endif
  15544. #ifdef WOLFSSL_EARLY_DATA
  15545. ssl->earlyData = no_early_data;
  15546. ssl->earlyDataSz = 0;
  15547. #endif
  15548. #if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS)
  15549. TLSX_FreeAll(ssl->extensions, ssl->heap);
  15550. ssl->extensions = NULL;
  15551. #endif
  15552. if (ssl->keys.encryptionOn) {
  15553. ForceZero(ssl->buffers.inputBuffer.buffer -
  15554. ssl->buffers.inputBuffer.offset,
  15555. ssl->buffers.inputBuffer.bufferSize);
  15556. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15557. wc_MemZero_Check(ssl->buffers.inputBuffer.buffer -
  15558. ssl->buffers.inputBuffer.offset,
  15559. ssl->buffers.inputBuffer.bufferSize);
  15560. #endif
  15561. }
  15562. ssl->keys.encryptionOn = 0;
  15563. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  15564. if (InitSSL_Suites(ssl) != WOLFSSL_SUCCESS)
  15565. return WOLFSSL_FAILURE;
  15566. if (InitHandshakeHashes(ssl) != 0)
  15567. return WOLFSSL_FAILURE;
  15568. #ifdef KEEP_PEER_CERT
  15569. FreeX509(&ssl->peerCert);
  15570. InitX509(&ssl->peerCert, 0, ssl->heap);
  15571. #endif
  15572. #ifdef WOLFSSL_QUIC
  15573. wolfSSL_quic_clear(ssl);
  15574. #endif
  15575. return WOLFSSL_SUCCESS;
  15576. }
  15577. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15578. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  15579. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  15580. {
  15581. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  15582. WOLFSSL_ENTER("wolfSSL_CTX_set_mode");
  15583. switch(mode) {
  15584. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  15585. ctx->partialWrite = 1;
  15586. break;
  15587. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15588. case SSL_MODE_RELEASE_BUFFERS:
  15589. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  15590. break;
  15591. #endif
  15592. case SSL_MODE_AUTO_RETRY:
  15593. ctx->autoRetry = 1;
  15594. break;
  15595. default:
  15596. WOLFSSL_MSG("Mode Not Implemented");
  15597. }
  15598. /* SSL_MODE_AUTO_RETRY
  15599. * Should not return -1 with renegotiation on read/write */
  15600. return mode;
  15601. }
  15602. long wolfSSL_CTX_clear_mode(WOLFSSL_CTX* ctx, long mode)
  15603. {
  15604. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  15605. WOLFSSL_ENTER("wolfSSL_CTX_clear_mode");
  15606. switch(mode) {
  15607. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  15608. ctx->partialWrite = 0;
  15609. break;
  15610. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15611. case SSL_MODE_RELEASE_BUFFERS:
  15612. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  15613. break;
  15614. #endif
  15615. case SSL_MODE_AUTO_RETRY:
  15616. ctx->autoRetry = 0;
  15617. break;
  15618. default:
  15619. WOLFSSL_MSG("Mode Not Implemented");
  15620. }
  15621. /* SSL_MODE_AUTO_RETRY
  15622. * Should not return -1 with renegotiation on read/write */
  15623. return 0;
  15624. }
  15625. #endif
  15626. #ifdef OPENSSL_EXTRA
  15627. #ifndef NO_WOLFSSL_STUB
  15628. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  15629. {
  15630. /* TODO: */
  15631. (void)ssl;
  15632. WOLFSSL_STUB("SSL_get_mode");
  15633. return 0;
  15634. }
  15635. #endif
  15636. #ifndef NO_WOLFSSL_STUB
  15637. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  15638. {
  15639. /* TODO: */
  15640. (void)ctx;
  15641. WOLFSSL_STUB("SSL_CTX_get_mode");
  15642. return 0;
  15643. }
  15644. #endif
  15645. #ifndef NO_WOLFSSL_STUB
  15646. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  15647. {
  15648. /* TODO: maybe? */
  15649. (void)ctx;
  15650. (void)m;
  15651. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  15652. }
  15653. #endif
  15654. /* Storing app session context id, this value is inherited by WOLFSSL
  15655. * objects created from WOLFSSL_CTX. Any session that is imported with a
  15656. * different session context id will be rejected.
  15657. *
  15658. * ctx structure to set context in
  15659. * sid_ctx value of context to set
  15660. * sid_ctx_len length of sid_ctx buffer
  15661. *
  15662. * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing
  15663. */
  15664. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  15665. const unsigned char* sid_ctx,
  15666. unsigned int sid_ctx_len)
  15667. {
  15668. WOLFSSL_ENTER("wolfSSL_CTX_set_session_id_context");
  15669. /* No application specific context needed for wolfSSL */
  15670. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  15671. return WOLFSSL_FAILURE;
  15672. }
  15673. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  15674. ctx->sessionCtxSz = (byte)sid_ctx_len;
  15675. return WOLFSSL_SUCCESS;
  15676. }
  15677. /* Storing app session context id. Any session that is imported with a
  15678. * different session context id will be rejected.
  15679. *
  15680. * ssl structure to set context in
  15681. * id value of context to set
  15682. * len length of sid_ctx buffer
  15683. *
  15684. * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing
  15685. */
  15686. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  15687. unsigned int len)
  15688. {
  15689. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  15690. if (len > ID_LEN || ssl == NULL || id == NULL) {
  15691. return WOLFSSL_FAILURE;
  15692. }
  15693. XMEMCPY(ssl->sessionCtx, id, len);
  15694. ssl->sessionCtxSz = (byte)len;
  15695. return WOLFSSL_SUCCESS;
  15696. }
  15697. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  15698. {
  15699. (void)ctx;
  15700. #ifndef NO_SESSION_CACHE
  15701. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  15702. #else
  15703. return 0;
  15704. #endif
  15705. }
  15706. /* returns the unsigned error value and increments the pointer into the
  15707. * error queue.
  15708. *
  15709. * file pointer to file name
  15710. * line gets set to line number of error when not NULL
  15711. */
  15712. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  15713. {
  15714. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15715. int ret = wc_PullErrorNode(file, NULL, line);
  15716. if (ret < 0) {
  15717. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15718. WOLFSSL_MSG("Issue getting error node");
  15719. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  15720. ret = 0 - ret; /* return absolute value of error */
  15721. /* panic and try to clear out nodes */
  15722. wc_ClearErrorNodes();
  15723. }
  15724. return (unsigned long)ret;
  15725. #else
  15726. (void)file;
  15727. (void)line;
  15728. return 0;
  15729. #endif
  15730. }
  15731. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  15732. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  15733. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  15734. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  15735. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  15736. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  15737. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  15738. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  15739. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  15740. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  15741. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  15742. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  15743. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  15744. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  15745. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  15746. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  15747. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  15748. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  15749. /* switch with int mapped to function name for compatibility */
  15750. static const char* wolfSSL_ERR_sys_func(int fun)
  15751. {
  15752. switch (fun) {
  15753. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  15754. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  15755. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  15756. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  15757. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  15758. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  15759. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  15760. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  15761. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  15762. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  15763. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  15764. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  15765. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  15766. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  15767. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  15768. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  15769. default:
  15770. return "NULL";
  15771. }
  15772. }
  15773. #endif /* DEBUG_WOLFSSL */
  15774. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  15775. int line)
  15776. {
  15777. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  15778. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  15779. (void)fun;
  15780. (void)err;
  15781. (void)file;
  15782. (void)line;
  15783. WOLFSSL_MSG("Not compiled in debug mode");
  15784. #elif defined(OPENSSL_EXTRA) && \
  15785. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  15786. (void)fun;
  15787. (void)file;
  15788. (void)line;
  15789. WOLFSSL_ERROR(err);
  15790. #else
  15791. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  15792. file, NULL);
  15793. #endif
  15794. (void)lib;
  15795. }
  15796. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  15797. * more flexibility.
  15798. *
  15799. * file output pointer to file where error happened
  15800. * line output to line number of error
  15801. * data output data. Is a string if ERR_TXT_STRING flag is used
  15802. * flags output format of output
  15803. *
  15804. * Returns the error value or 0 if no errors are in the queue
  15805. */
  15806. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  15807. const char** data, int *flags)
  15808. {
  15809. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15810. int ret;
  15811. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  15812. if (flags != NULL)
  15813. *flags = ERR_TXT_STRING; /* Clear the flags */
  15814. ret = wc_PullErrorNode(file, data, line);
  15815. if (ret < 0) {
  15816. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15817. WOLFSSL_MSG("Error with pulling error node!");
  15818. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15819. ret = 0 - ret; /* return absolute value of error */
  15820. /* panic and try to clear out nodes */
  15821. wc_ClearErrorNodes();
  15822. }
  15823. return (unsigned long)ret;
  15824. #else
  15825. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  15826. WOLFSSL_MSG("Error queue turned off, can not get error line");
  15827. (void)file;
  15828. (void)line;
  15829. (void)data;
  15830. (void)flags;
  15831. return 0;
  15832. #endif
  15833. }
  15834. #endif /* OPENSSL_EXTRA */
  15835. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  15836. (defined(OPENSSL_EXTRA) && defined(SESSION_CERTS))
  15837. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  15838. *
  15839. * x509 WOLFSSL_X509 object to decode into.
  15840. * in X509 DER data.
  15841. * len Length of the X509 DER data.
  15842. * returns the new certificate on success, otherwise NULL.
  15843. */
  15844. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  15845. {
  15846. int ret;
  15847. #ifdef WOLFSSL_SMALL_STACK
  15848. DecodedCert* cert;
  15849. #else
  15850. DecodedCert cert[1];
  15851. #endif
  15852. if (x509 == NULL || in == NULL || len <= 0)
  15853. return BAD_FUNC_ARG;
  15854. #ifdef WOLFSSL_SMALL_STACK
  15855. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15856. DYNAMIC_TYPE_DCERT);
  15857. if (cert == NULL)
  15858. return MEMORY_E;
  15859. #endif
  15860. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  15861. */
  15862. InitDecodedCert(cert, (byte*)in, len, NULL);
  15863. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  15864. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  15865. if (x509->dynamicMemory != TRUE)
  15866. InitX509(x509, 0, NULL);
  15867. ret = CopyDecodedToX509(x509, cert);
  15868. }
  15869. FreeDecodedCert(cert);
  15870. #ifdef WOLFSSL_SMALL_STACK
  15871. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15872. #endif
  15873. return ret;
  15874. }
  15875. #endif /* (KEEP_PEER_CERT & SESSION_CERTS) || (OPENSSL_EXTRA & SESSION_CERTS) */
  15876. #ifdef KEEP_PEER_CERT
  15877. WOLFSSL_ABI
  15878. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  15879. {
  15880. WOLFSSL_X509* ret = NULL;
  15881. WOLFSSL_ENTER("wolfSSL_get_peer_certificate");
  15882. if (ssl != NULL) {
  15883. if (ssl->peerCert.issuer.sz)
  15884. ret = wolfSSL_X509_dup(&ssl->peerCert);
  15885. #ifdef SESSION_CERTS
  15886. else if (ssl->session->chain.count > 0) {
  15887. if (DecodeToX509(&ssl->peerCert,
  15888. ssl->session->chain.certs[0].buffer,
  15889. ssl->session->chain.certs[0].length) == 0) {
  15890. ret = wolfSSL_X509_dup(&ssl->peerCert);
  15891. }
  15892. }
  15893. #endif
  15894. }
  15895. WOLFSSL_LEAVE("wolfSSL_get_peer_certificate", ret != NULL);
  15896. return ret;
  15897. }
  15898. #endif /* KEEP_PEER_CERT */
  15899. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  15900. /* Return stack of peer certs.
  15901. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  15902. */
  15903. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  15904. {
  15905. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  15906. if (ssl == NULL)
  15907. return NULL;
  15908. /* Try to populate if NULL or empty */
  15909. if (ssl->peerCertChain == NULL ||
  15910. wolfSSL_sk_X509_num(ssl->peerCertChain) == 0)
  15911. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  15912. return ssl->peerCertChain;
  15913. }
  15914. #ifndef WOLFSSL_QT
  15915. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  15916. WOLFSSL_X509 *x);
  15917. /**
  15918. * Recursively push the issuer CA chain onto the stack
  15919. * @param cm The cert manager that is queried for the issuer
  15920. * @param x This cert's issuer will be queried in cm
  15921. * @param sk The issuer is pushed onto this stack
  15922. * @return WOLFSSL_SUCCESS on success
  15923. * WOLFSSL_FAILURE on no issuer found
  15924. * WOLFSSL_FATAL_ERROR on a fatal error
  15925. */
  15926. static int PushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  15927. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  15928. {
  15929. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  15930. int i;
  15931. int push = 1;
  15932. int ret = WOLFSSL_SUCCESS;
  15933. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  15934. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  15935. != WOLFSSL_SUCCESS)
  15936. break;
  15937. x = issuer[i];
  15938. }
  15939. if (i == 0) /* No further chain found */
  15940. return WOLFSSL_FAILURE;
  15941. i--;
  15942. for (; i >= 0; i--) {
  15943. if (push) {
  15944. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  15945. wolfSSL_X509_free(issuer[i]);
  15946. ret = WOLFSSL_FATAL_ERROR;
  15947. push = 0; /* Free the rest of the unpushed certs */
  15948. }
  15949. }
  15950. else {
  15951. wolfSSL_X509_free(issuer[i]);
  15952. }
  15953. }
  15954. return ret;
  15955. }
  15956. #endif /* !WOLFSSL_QT */
  15957. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  15958. based off of the ssl session chain. Attempts to place CA certificates
  15959. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  15960. NULL on failure */
  15961. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  15962. {
  15963. WOLFSSL_STACK* sk;
  15964. WOLFSSL_X509* x509;
  15965. int i = 0;
  15966. int ret;
  15967. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  15968. if ((ssl == NULL) || (ssl->session->chain.count == 0))
  15969. return NULL;
  15970. sk = wolfSSL_sk_X509_new_null();
  15971. i = ssl->session->chain.count-1;
  15972. for (; i >= 0; i--) {
  15973. x509 = wolfSSL_X509_new();
  15974. if (x509 == NULL) {
  15975. WOLFSSL_MSG("Error Creating X509");
  15976. wolfSSL_sk_X509_pop_free(sk, NULL);
  15977. return NULL;
  15978. }
  15979. ret = DecodeToX509(x509, ssl->session->chain.certs[i].buffer,
  15980. ssl->session->chain.certs[i].length);
  15981. #if !defined(WOLFSSL_QT)
  15982. if (ret == 0 && i == ssl->session->chain.count-1) {
  15983. /* On the last element in the chain try to add the CA chain
  15984. * first if we have one for this cert */
  15985. SSL_CM_WARNING(ssl);
  15986. if (PushCAx509Chain(SSL_CM(ssl), x509, sk)
  15987. == WOLFSSL_FATAL_ERROR) {
  15988. ret = WOLFSSL_FATAL_ERROR;
  15989. }
  15990. }
  15991. #endif
  15992. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  15993. WOLFSSL_MSG("Error decoding cert");
  15994. wolfSSL_X509_free(x509);
  15995. wolfSSL_sk_X509_pop_free(sk, NULL);
  15996. return NULL;
  15997. }
  15998. }
  15999. if (sk == NULL) {
  16000. WOLFSSL_MSG("Null session chain");
  16001. }
  16002. #if defined(OPENSSL_ALL)
  16003. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  16004. /* to be compliant with openssl
  16005. first element is kept as peer cert on server side.*/
  16006. wolfSSL_sk_X509_pop(sk);
  16007. }
  16008. #endif
  16009. if (ssl->peerCertChain != NULL)
  16010. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  16011. /* This is Free'd when ssl is Free'd */
  16012. ssl->peerCertChain = sk;
  16013. return sk;
  16014. }
  16015. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  16016. #ifndef NO_CERTS
  16017. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16018. /* create a generic wolfSSL stack node
  16019. * returns a new WOLFSSL_STACK structure on success */
  16020. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16021. {
  16022. WOLFSSL_STACK* sk;
  16023. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16024. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16025. DYNAMIC_TYPE_OPENSSL);
  16026. if (sk != NULL) {
  16027. XMEMSET(sk, 0, sizeof(*sk));
  16028. sk->heap = heap;
  16029. }
  16030. return sk;
  16031. }
  16032. /* free's node but does not free internal data such as in->data.x509 */
  16033. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16034. {
  16035. if (in != NULL) {
  16036. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16037. }
  16038. }
  16039. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16040. * also handles internal "num" for number of nodes on stack
  16041. * return WOLFSSL_SUCCESS on success
  16042. */
  16043. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16044. {
  16045. if (stack == NULL || in == NULL) {
  16046. return WOLFSSL_FAILURE;
  16047. }
  16048. if (*stack == NULL) {
  16049. in->num = 1;
  16050. *stack = in;
  16051. return WOLFSSL_SUCCESS;
  16052. }
  16053. in->num = (*stack)->num + 1;
  16054. in->next = *stack;
  16055. *stack = in;
  16056. return WOLFSSL_SUCCESS;
  16057. }
  16058. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16059. static WC_INLINE int compare_WOLFSSL_CIPHER(
  16060. WOLFSSL_CIPHER *a,
  16061. WOLFSSL_CIPHER *b)
  16062. {
  16063. if ((a->cipherSuite0 == b->cipherSuite0) &&
  16064. (a->cipherSuite == b->cipherSuite) &&
  16065. (a->ssl == b->ssl) &&
  16066. (XMEMCMP(a->description, b->description, sizeof a->description) == 0) &&
  16067. (a->offset == b->offset) &&
  16068. (a->in_stack == b->in_stack) &&
  16069. (a->bits == b->bits))
  16070. return 0;
  16071. else
  16072. return -1;
  16073. }
  16074. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16075. /* return 1 on success 0 on fail */
  16076. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16077. {
  16078. WOLFSSL_STACK* node;
  16079. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16080. WOLFSSL_CIPHER ciph;
  16081. #endif
  16082. WOLFSSL_ENTER("wolfSSL_sk_push");
  16083. if (!sk) {
  16084. return WOLFSSL_FAILURE;
  16085. }
  16086. /* Check if empty data */
  16087. switch (sk->type) {
  16088. case STACK_TYPE_CIPHER:
  16089. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16090. /* check if entire struct is zero */
  16091. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16092. if (compare_WOLFSSL_CIPHER(&sk->data.cipher, &ciph) == 0) {
  16093. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16094. sk->num = 1;
  16095. if (sk->hash_fn) {
  16096. sk->hash = sk->hash_fn(&sk->data.cipher);
  16097. }
  16098. return WOLFSSL_SUCCESS;
  16099. }
  16100. break;
  16101. #endif
  16102. case STACK_TYPE_X509:
  16103. case STACK_TYPE_GEN_NAME:
  16104. case STACK_TYPE_BIO:
  16105. case STACK_TYPE_OBJ:
  16106. case STACK_TYPE_STRING:
  16107. case STACK_TYPE_ACCESS_DESCRIPTION:
  16108. case STACK_TYPE_X509_EXT:
  16109. case STACK_TYPE_X509_REQ_ATTR:
  16110. case STACK_TYPE_NULL:
  16111. case STACK_TYPE_X509_NAME:
  16112. case STACK_TYPE_X509_NAME_ENTRY:
  16113. case STACK_TYPE_CONF_VALUE:
  16114. case STACK_TYPE_X509_INFO:
  16115. case STACK_TYPE_BY_DIR_entry:
  16116. case STACK_TYPE_BY_DIR_hash:
  16117. case STACK_TYPE_X509_OBJ:
  16118. case STACK_TYPE_DIST_POINT:
  16119. case STACK_TYPE_X509_CRL:
  16120. default:
  16121. /* All other types are pointers */
  16122. if (!sk->data.generic) {
  16123. sk->data.generic = (void*)data;
  16124. sk->num = 1;
  16125. #ifdef OPENSSL_ALL
  16126. if (sk->hash_fn) {
  16127. sk->hash = sk->hash_fn(sk->data.generic);
  16128. }
  16129. #endif
  16130. return WOLFSSL_SUCCESS;
  16131. }
  16132. break;
  16133. }
  16134. /* stack already has value(s) create a new node and add more */
  16135. node = wolfSSL_sk_new_node(sk->heap);
  16136. if (!node) {
  16137. WOLFSSL_MSG("Memory error");
  16138. return WOLFSSL_FAILURE;
  16139. }
  16140. /* push new x509 onto head of stack */
  16141. node->next = sk->next;
  16142. node->type = sk->type;
  16143. sk->next = node;
  16144. sk->num += 1;
  16145. #ifdef OPENSSL_ALL
  16146. node->hash_fn = sk->hash_fn;
  16147. node->hash = sk->hash;
  16148. sk->hash = 0;
  16149. #endif
  16150. switch (sk->type) {
  16151. case STACK_TYPE_CIPHER:
  16152. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16153. node->data.cipher = sk->data.cipher;
  16154. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16155. if (sk->hash_fn) {
  16156. sk->hash = sk->hash_fn(&sk->data.cipher);
  16157. }
  16158. break;
  16159. #endif
  16160. case STACK_TYPE_X509:
  16161. case STACK_TYPE_GEN_NAME:
  16162. case STACK_TYPE_BIO:
  16163. case STACK_TYPE_OBJ:
  16164. case STACK_TYPE_STRING:
  16165. case STACK_TYPE_ACCESS_DESCRIPTION:
  16166. case STACK_TYPE_X509_EXT:
  16167. case STACK_TYPE_X509_REQ_ATTR:
  16168. case STACK_TYPE_NULL:
  16169. case STACK_TYPE_X509_NAME:
  16170. case STACK_TYPE_X509_NAME_ENTRY:
  16171. case STACK_TYPE_CONF_VALUE:
  16172. case STACK_TYPE_X509_INFO:
  16173. case STACK_TYPE_BY_DIR_entry:
  16174. case STACK_TYPE_BY_DIR_hash:
  16175. case STACK_TYPE_X509_OBJ:
  16176. case STACK_TYPE_DIST_POINT:
  16177. case STACK_TYPE_X509_CRL:
  16178. default:
  16179. /* All other types are pointers */
  16180. node->data.generic = sk->data.generic;
  16181. sk->data.generic = (void*)data;
  16182. #ifdef OPENSSL_ALL
  16183. if (sk->hash_fn) {
  16184. sk->hash = sk->hash_fn(sk->data.generic);
  16185. }
  16186. #endif
  16187. break;
  16188. }
  16189. return WOLFSSL_SUCCESS;
  16190. }
  16191. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16192. #ifdef OPENSSL_EXTRA
  16193. /* returns the node at index "idx", NULL if not found */
  16194. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16195. {
  16196. int i;
  16197. WOLFSSL_STACK* ret = NULL;
  16198. WOLFSSL_STACK* current;
  16199. current = sk;
  16200. for (i = 0; i <= idx && current != NULL; i++) {
  16201. if (i == idx) {
  16202. ret = current;
  16203. break;
  16204. }
  16205. current = current->next;
  16206. }
  16207. return ret;
  16208. }
  16209. #endif /* OPENSSL_EXTRA */
  16210. #ifdef OPENSSL_EXTRA
  16211. #if defined(OPENSSL_ALL)
  16212. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16213. {
  16214. unsigned long hash;
  16215. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16216. if (!sk || !data) {
  16217. WOLFSSL_MSG("Bad parameters");
  16218. return NULL;
  16219. }
  16220. if (!sk->hash_fn) {
  16221. WOLFSSL_MSG("No hash function defined");
  16222. return NULL;
  16223. }
  16224. hash = sk->hash_fn(data);
  16225. while (sk) {
  16226. /* Calc hash if not done so yet */
  16227. if (!sk->hash) {
  16228. switch (sk->type) {
  16229. case STACK_TYPE_CIPHER:
  16230. sk->hash = sk->hash_fn(&sk->data.cipher);
  16231. break;
  16232. case STACK_TYPE_X509:
  16233. case STACK_TYPE_GEN_NAME:
  16234. case STACK_TYPE_BIO:
  16235. case STACK_TYPE_OBJ:
  16236. case STACK_TYPE_STRING:
  16237. case STACK_TYPE_ACCESS_DESCRIPTION:
  16238. case STACK_TYPE_X509_EXT:
  16239. case STACK_TYPE_X509_REQ_ATTR:
  16240. case STACK_TYPE_NULL:
  16241. case STACK_TYPE_X509_NAME:
  16242. case STACK_TYPE_X509_NAME_ENTRY:
  16243. case STACK_TYPE_CONF_VALUE:
  16244. case STACK_TYPE_X509_INFO:
  16245. case STACK_TYPE_BY_DIR_entry:
  16246. case STACK_TYPE_BY_DIR_hash:
  16247. case STACK_TYPE_X509_OBJ:
  16248. case STACK_TYPE_DIST_POINT:
  16249. case STACK_TYPE_X509_CRL:
  16250. default:
  16251. sk->hash = sk->hash_fn(sk->data.generic);
  16252. break;
  16253. }
  16254. }
  16255. if (sk->hash == hash) {
  16256. switch (sk->type) {
  16257. case STACK_TYPE_CIPHER:
  16258. return &sk->data.cipher;
  16259. case STACK_TYPE_X509:
  16260. case STACK_TYPE_GEN_NAME:
  16261. case STACK_TYPE_BIO:
  16262. case STACK_TYPE_OBJ:
  16263. case STACK_TYPE_STRING:
  16264. case STACK_TYPE_ACCESS_DESCRIPTION:
  16265. case STACK_TYPE_X509_EXT:
  16266. case STACK_TYPE_X509_REQ_ATTR:
  16267. case STACK_TYPE_NULL:
  16268. case STACK_TYPE_X509_NAME:
  16269. case STACK_TYPE_X509_NAME_ENTRY:
  16270. case STACK_TYPE_CONF_VALUE:
  16271. case STACK_TYPE_X509_INFO:
  16272. case STACK_TYPE_BY_DIR_entry:
  16273. case STACK_TYPE_BY_DIR_hash:
  16274. case STACK_TYPE_X509_OBJ:
  16275. case STACK_TYPE_DIST_POINT:
  16276. case STACK_TYPE_X509_CRL:
  16277. default:
  16278. return sk->data.generic;
  16279. }
  16280. }
  16281. sk = sk->next;
  16282. }
  16283. return NULL;
  16284. }
  16285. #endif /* OPENSSL_ALL */
  16286. #endif /* OPENSSL_EXTRA */
  16287. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  16288. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  16289. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  16290. defined(KEEP_OUR_CERT)
  16291. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  16292. {
  16293. if (ssl == NULL) {
  16294. return NULL;
  16295. }
  16296. if (ssl->buffers.weOwnCert) {
  16297. if (ssl->ourCert == NULL) {
  16298. if (ssl->buffers.certificate == NULL) {
  16299. WOLFSSL_MSG("Certificate buffer not set!");
  16300. return NULL;
  16301. }
  16302. #ifndef WOLFSSL_X509_STORE_CERTS
  16303. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  16304. ssl->buffers.certificate->buffer,
  16305. ssl->buffers.certificate->length);
  16306. #endif
  16307. }
  16308. return ssl->ourCert;
  16309. }
  16310. else { /* if cert not owned get parent ctx cert or return null */
  16311. if (ssl->ctx) {
  16312. if (ssl->ctx->ourCert == NULL) {
  16313. if (ssl->ctx->certificate == NULL) {
  16314. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16315. return NULL;
  16316. }
  16317. #ifndef WOLFSSL_X509_STORE_CERTS
  16318. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16319. ssl->ctx->certificate->buffer,
  16320. ssl->ctx->certificate->length);
  16321. #endif
  16322. ssl->ctx->ownOurCert = 1;
  16323. }
  16324. return ssl->ctx->ourCert;
  16325. }
  16326. }
  16327. return NULL;
  16328. }
  16329. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  16330. {
  16331. if (ctx) {
  16332. if (ctx->ourCert == NULL) {
  16333. if (ctx->certificate == NULL) {
  16334. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16335. return NULL;
  16336. }
  16337. #ifndef WOLFSSL_X509_STORE_CERTS
  16338. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16339. ctx->certificate->buffer,
  16340. ctx->certificate->length);
  16341. #endif
  16342. ctx->ownOurCert = 1;
  16343. }
  16344. return ctx->ourCert;
  16345. }
  16346. return NULL;
  16347. }
  16348. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  16349. #endif /* NO_CERTS */
  16350. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16351. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  16352. {
  16353. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  16354. if (ssl == NULL) {
  16355. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  16356. return;
  16357. }
  16358. #ifndef NO_DH
  16359. /* client creates its own DH parameters on handshake */
  16360. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  16361. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  16362. DYNAMIC_TYPE_PUBLIC_KEY);
  16363. }
  16364. ssl->buffers.serverDH_P.buffer = NULL;
  16365. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  16366. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  16367. DYNAMIC_TYPE_PUBLIC_KEY);
  16368. }
  16369. ssl->buffers.serverDH_G.buffer = NULL;
  16370. #endif
  16371. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  16372. WOLFSSL_MSG("Error initializing client side");
  16373. }
  16374. }
  16375. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16376. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  16377. {
  16378. int isShutdown = 0;
  16379. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  16380. if (ssl) {
  16381. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16382. if (ssl->options.shutdownDone) {
  16383. /* The SSL object was possibly cleared with wolfSSL_clear after
  16384. * a successful shutdown. Simulate a response for a full
  16385. * bidirectional shutdown. */
  16386. isShutdown = WOLFSSL_SENT_SHUTDOWN | WOLFSSL_RECEIVED_SHUTDOWN;
  16387. }
  16388. else
  16389. #endif
  16390. {
  16391. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  16392. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  16393. if (ssl->options.sentNotify)
  16394. isShutdown |= WOLFSSL_SENT_SHUTDOWN;
  16395. if (ssl->options.closeNotify||ssl->options.connReset)
  16396. isShutdown |= WOLFSSL_RECEIVED_SHUTDOWN;
  16397. }
  16398. }
  16399. WOLFSSL_LEAVE("wolfSSL_get_shutdown", isShutdown);
  16400. return isShutdown;
  16401. }
  16402. int wolfSSL_session_reused(WOLFSSL* ssl)
  16403. {
  16404. int resuming = 0;
  16405. WOLFSSL_ENTER("wolfSSL_session_reused");
  16406. if (ssl) {
  16407. #ifndef HAVE_SECURE_RENEGOTIATION
  16408. resuming = ssl->options.resuming;
  16409. #else
  16410. resuming = ssl->options.resuming || ssl->options.resumed;
  16411. #endif
  16412. }
  16413. WOLFSSL_LEAVE("wolfSSL_session_reused", resuming);
  16414. return resuming;
  16415. }
  16416. /* return a new malloc'd session with default settings on success */
  16417. WOLFSSL_SESSION* wolfSSL_NewSession(void* heap)
  16418. {
  16419. WOLFSSL_SESSION* ret = NULL;
  16420. WOLFSSL_ENTER("wolfSSL_NewSession");
  16421. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap,
  16422. DYNAMIC_TYPE_SESSION);
  16423. if (ret != NULL) {
  16424. int err;
  16425. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  16426. wolfSSL_RefInit(&ret->ref, &err);
  16427. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  16428. if (err != 0) {
  16429. WOLFSSL_MSG("Error setting up session reference mutex");
  16430. XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION);
  16431. return NULL;
  16432. }
  16433. #else
  16434. (void)err;
  16435. #endif
  16436. #ifndef NO_SESSION_CACHE
  16437. ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */
  16438. #endif
  16439. ret->type = WOLFSSL_SESSION_TYPE_HEAP;
  16440. ret->heap = heap;
  16441. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16442. wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN);
  16443. wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN);
  16444. #endif
  16445. #ifdef HAVE_SESSION_TICKET
  16446. ret->ticket = ret->staticTicket;
  16447. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16448. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16449. ret->ticketNonce.data = ret->ticketNonce.dataStatic;
  16450. #endif
  16451. #endif
  16452. #ifdef HAVE_EX_DATA
  16453. ret->ownExData = 1;
  16454. if (crypto_ex_cb_ctx_session != NULL) {
  16455. crypto_ex_cb_setup_new_data(ret, crypto_ex_cb_ctx_session,
  16456. &ret->ex_data);
  16457. }
  16458. #endif
  16459. }
  16460. return ret;
  16461. }
  16462. WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap)
  16463. {
  16464. return wolfSSL_NewSession(heap);
  16465. }
  16466. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  16467. {
  16468. return wolfSSL_SESSION_new_ex(NULL);
  16469. }
  16470. /* add one to session reference count
  16471. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  16472. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  16473. {
  16474. int ret;
  16475. session = ClientSessionToSession(session);
  16476. if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP)
  16477. return WOLFSSL_FAILURE;
  16478. wolfSSL_RefInc(&session->ref, &ret);
  16479. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  16480. if (ret != 0) {
  16481. WOLFSSL_MSG("Failed to lock session mutex");
  16482. return WOLFSSL_FAILURE;
  16483. }
  16484. #else
  16485. (void)ret;
  16486. #endif
  16487. return WOLFSSL_SUCCESS;
  16488. }
  16489. /**
  16490. * Deep copy the contents from input to output.
  16491. * @param input The source of the copy.
  16492. * @param output The destination of the copy.
  16493. * @param avoidSysCalls If true, then system calls will be avoided or an error
  16494. * will be returned if it is not possible to proceed
  16495. * without a system call. This is useful for fetching
  16496. * sessions from cache. When a cache row is locked, we
  16497. * don't want to block other threads with long running
  16498. * system calls.
  16499. * @param ticketNonceBuf If not null and @avoidSysCalls is true, the copy of the
  16500. * ticketNonce will happen in this pre allocated buffer
  16501. * @param ticketNonceLen @ticketNonceBuf len as input, used length on output
  16502. * @param ticketNonceUsed if @ticketNonceBuf was used to copy the ticket noncet
  16503. * @return WOLFSSL_SUCCESS on success
  16504. * WOLFSSL_FAILURE on failure
  16505. */
  16506. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  16507. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  16508. byte* ticketNonceLen, byte* preallocUsed)
  16509. {
  16510. #ifdef HAVE_SESSION_TICKET
  16511. int ticLenAlloc = 0;
  16512. byte *ticBuff = NULL;
  16513. #endif
  16514. const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + sizeof(input->heap);
  16515. int ret = WOLFSSL_SUCCESS;
  16516. (void)avoidSysCalls;
  16517. (void)ticketNonceBuf;
  16518. (void)ticketNonceLen;
  16519. (void)preallocUsed;
  16520. input = ClientSessionToSession(input);
  16521. output = ClientSessionToSession(output);
  16522. if (input == NULL || output == NULL || input == output) {
  16523. WOLFSSL_MSG("input or output are null or same");
  16524. return WOLFSSL_FAILURE;
  16525. }
  16526. #ifdef HAVE_SESSION_TICKET
  16527. if (output->ticket != output->staticTicket) {
  16528. ticBuff = output->ticket;
  16529. ticLenAlloc = output->ticketLenAlloc;
  16530. }
  16531. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16532. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16533. /* free the data, it would be better to reuse the buffer but this
  16534. * maintain the code simpler. A smart allocator should reuse the free'd
  16535. * buffer in the next malloc without much performance penalties. */
  16536. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  16537. /* Callers that avoid syscall should never calls this with
  16538. * output->tickeNonce.data being a dynamic buffer.*/
  16539. if (avoidSysCalls) {
  16540. WOLFSSL_MSG("can't avoid syscalls with dynamic TicketNonce buffer");
  16541. return WOLFSSL_FAILURE;
  16542. }
  16543. XFREE(output->ticketNonce.data,
  16544. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16545. output->ticketNonce.data = output->ticketNonce.dataStatic;
  16546. output->ticketNonce.len = 0;
  16547. }
  16548. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  16549. #endif /* HAVE_SESSION_TICKET */
  16550. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16551. if (output->peer != NULL) {
  16552. if (avoidSysCalls) {
  16553. WOLFSSL_MSG("Can't free cert when avoiding syscalls");
  16554. return WOLFSSL_FAILURE;
  16555. }
  16556. wolfSSL_X509_free(output->peer);
  16557. output->peer = NULL;
  16558. }
  16559. #endif
  16560. XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset,
  16561. sizeof(WOLFSSL_SESSION) - copyOffset);
  16562. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  16563. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16564. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16565. /* fix pointer to static after the copy */
  16566. output->ticketNonce.data = output->ticketNonce.dataStatic;
  16567. #endif
  16568. /* Set sane values for copy */
  16569. #ifndef NO_SESSION_CACHE
  16570. if (output->type != WOLFSSL_SESSION_TYPE_CACHE)
  16571. output->cacheRow = INVALID_SESSION_ROW;
  16572. #endif
  16573. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16574. if (input->peer != NULL && input->peer->dynamicMemory) {
  16575. if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) {
  16576. WOLFSSL_MSG("Can't increase peer cert ref count");
  16577. output->peer = NULL;
  16578. }
  16579. }
  16580. else if (!avoidSysCalls)
  16581. output->peer = wolfSSL_X509_dup(input->peer);
  16582. else
  16583. /* output->peer is not that important to copy */
  16584. output->peer = NULL;
  16585. #endif
  16586. #ifdef HAVE_SESSION_TICKET
  16587. if (input->ticketLen > SESSION_TICKET_LEN) {
  16588. /* Need dynamic buffer */
  16589. if (ticBuff == NULL || ticLenAlloc < input->ticketLen) {
  16590. /* allocate new one */
  16591. byte* tmp;
  16592. if (avoidSysCalls) {
  16593. WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding"
  16594. " syscalls");
  16595. output->ticket = ticBuff;
  16596. output->ticketLenAlloc = (word16) ticLenAlloc;
  16597. output->ticketLen = 0;
  16598. ret = WOLFSSL_FAILURE;
  16599. }
  16600. else {
  16601. #ifdef WOLFSSL_NO_REALLOC
  16602. tmp = (byte*)XMALLOC(input->ticketLen,
  16603. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16604. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16605. ticBuff = NULL;
  16606. #else
  16607. tmp = (byte*)XREALLOC(ticBuff, input->ticketLen,
  16608. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16609. #endif /* WOLFSSL_NO_REALLOC */
  16610. if (tmp == NULL) {
  16611. WOLFSSL_MSG("Failed to allocate memory for ticket");
  16612. #ifndef WOLFSSL_NO_REALLOC
  16613. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16614. ticBuff = NULL;
  16615. #endif /* WOLFSSL_NO_REALLOC */
  16616. output->ticket = NULL;
  16617. output->ticketLen = 0;
  16618. output->ticketLenAlloc = 0;
  16619. ret = WOLFSSL_FAILURE;
  16620. }
  16621. else {
  16622. ticBuff = tmp;
  16623. ticLenAlloc = input->ticketLen;
  16624. }
  16625. }
  16626. }
  16627. if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) {
  16628. XMEMCPY(ticBuff, input->ticket, input->ticketLen);
  16629. output->ticket = ticBuff;
  16630. output->ticketLenAlloc = (word16) ticLenAlloc;
  16631. }
  16632. }
  16633. else {
  16634. /* Default ticket to non dynamic */
  16635. if (avoidSysCalls) {
  16636. /* Try to use ticBuf if available. Caller can later move it to
  16637. * the static buffer. */
  16638. if (ticBuff != NULL) {
  16639. if (ticLenAlloc >= input->ticketLen) {
  16640. output->ticket = ticBuff;
  16641. output->ticketLenAlloc = ticLenAlloc;
  16642. }
  16643. else {
  16644. WOLFSSL_MSG("ticket dynamic buffer too small but we are "
  16645. "avoiding system calls");
  16646. ret = WOLFSSL_FAILURE;
  16647. output->ticket = ticBuff;
  16648. output->ticketLenAlloc = (word16) ticLenAlloc;
  16649. output->ticketLen = 0;
  16650. }
  16651. }
  16652. else {
  16653. output->ticket = output->staticTicket;
  16654. output->ticketLenAlloc = 0;
  16655. }
  16656. }
  16657. else {
  16658. if (ticBuff != NULL)
  16659. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16660. output->ticket = output->staticTicket;
  16661. output->ticketLenAlloc = 0;
  16662. }
  16663. if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) {
  16664. /* Shouldn't happen as session should have placed this in
  16665. * the static buffer */
  16666. XMEMCPY(output->ticket, input->ticket,
  16667. input->ticketLen);
  16668. }
  16669. }
  16670. ticBuff = NULL;
  16671. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16672. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16673. if (preallocUsed != NULL)
  16674. *preallocUsed = 0;
  16675. if (input->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ &&
  16676. ret == WOLFSSL_SUCCESS) {
  16677. /* TicketNonce does not fit in the static buffer */
  16678. if (!avoidSysCalls) {
  16679. output->ticketNonce.data = (byte*)XMALLOC(input->ticketNonce.len,
  16680. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16681. if (output->ticketNonce.data == NULL) {
  16682. WOLFSSL_MSG("Failed to allocate space for ticket nonce");
  16683. output->ticketNonce.data = output->ticketNonce.dataStatic;
  16684. output->ticketNonce.len = 0;
  16685. ret = WOLFSSL_FAILURE;
  16686. }
  16687. else {
  16688. output->ticketNonce.len = input->ticketNonce.len;
  16689. XMEMCPY(output->ticketNonce.data, input->ticketNonce.data,
  16690. input->ticketNonce.len);
  16691. ret = WOLFSSL_SUCCESS;
  16692. }
  16693. }
  16694. /* we can't do syscalls. Use prealloc buffers if provided from the
  16695. * caller. */
  16696. else if (ticketNonceBuf != NULL &&
  16697. *ticketNonceLen >= input->ticketNonce.len) {
  16698. XMEMCPY(ticketNonceBuf, input->ticketNonce.data,
  16699. input->ticketNonce.len);
  16700. *ticketNonceLen = input->ticketNonce.len;
  16701. if (preallocUsed != NULL)
  16702. *preallocUsed = 1;
  16703. ret = WOLFSSL_SUCCESS;
  16704. }
  16705. else {
  16706. WOLFSSL_MSG("TicketNonce bigger than static buffer, and we can't "
  16707. "do syscalls");
  16708. ret = WOLFSSL_FAILURE;
  16709. }
  16710. }
  16711. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  16712. #endif /* HAVE_SESSION_TICKET */
  16713. #ifdef HAVE_EX_DATA
  16714. if (input->type != WOLFSSL_SESSION_TYPE_CACHE &&
  16715. output->type != WOLFSSL_SESSION_TYPE_CACHE) {
  16716. /* Not called with cache as that passes ownership of ex_data */
  16717. ret = crypto_ex_cb_dup_data(&input->ex_data, &output->ex_data,
  16718. crypto_ex_cb_ctx_session);
  16719. }
  16720. #endif
  16721. return ret;
  16722. }
  16723. /**
  16724. * Deep copy the contents from input to output.
  16725. * @param input The source of the copy.
  16726. * @param output The destination of the copy.
  16727. * @param avoidSysCalls If true, then system calls will be avoided or an error
  16728. * will be returned if it is not possible to proceed
  16729. * without a system call. This is useful for fetching
  16730. * sessions from cache. When a cache row is locked, we
  16731. * don't want to block other threads with long running
  16732. * system calls.
  16733. * @return WOLFSSL_SUCCESS on success
  16734. * WOLFSSL_FAILURE on failure
  16735. */
  16736. int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output,
  16737. int avoidSysCalls)
  16738. {
  16739. return wolfSSL_DupSessionEx(input, output, avoidSysCalls, NULL, NULL, NULL);
  16740. }
  16741. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  16742. {
  16743. WOLFSSL_SESSION* copy;
  16744. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  16745. session = ClientSessionToSession(session);
  16746. if (session == NULL)
  16747. return NULL;
  16748. #ifdef HAVE_SESSION_TICKET
  16749. if (session->ticketLenAlloc > 0 && !session->ticket) {
  16750. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  16751. return NULL;
  16752. }
  16753. #endif
  16754. copy = wolfSSL_NewSession(session->heap);
  16755. if (copy != NULL &&
  16756. wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) {
  16757. wolfSSL_FreeSession(NULL, copy);
  16758. copy = NULL;
  16759. }
  16760. return copy;
  16761. }
  16762. void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  16763. {
  16764. session = ClientSessionToSession(session);
  16765. if (session == NULL)
  16766. return;
  16767. (void)ctx;
  16768. WOLFSSL_ENTER("wolfSSL_FreeSession");
  16769. if (session->ref.count > 0) {
  16770. int ret;
  16771. int isZero;
  16772. wolfSSL_RefDec(&session->ref, &isZero, &ret);
  16773. (void)ret;
  16774. if (!isZero) {
  16775. return;
  16776. }
  16777. wolfSSL_RefFree(&session->ref);
  16778. }
  16779. WOLFSSL_MSG("wolfSSL_FreeSession full free");
  16780. #ifdef HAVE_EX_DATA
  16781. if (session->ownExData) {
  16782. crypto_ex_cb_free_data(session, crypto_ex_cb_ctx_session,
  16783. &session->ex_data);
  16784. }
  16785. #endif
  16786. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  16787. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  16788. #endif
  16789. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16790. if (session->peer) {
  16791. wolfSSL_X509_free(session->peer);
  16792. session->peer = NULL;
  16793. }
  16794. #endif
  16795. #ifdef HAVE_SESSION_TICKET
  16796. if (session->ticketLenAlloc > 0) {
  16797. XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK);
  16798. }
  16799. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  16800. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  16801. if (session->ticketNonce.data != session->ticketNonce.dataStatic) {
  16802. XFREE(session->ticketNonce.data, session->heap,
  16803. DYNAMIC_TYPE_SESSION_TICK);
  16804. }
  16805. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  16806. #endif
  16807. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  16808. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  16809. #endif
  16810. /* Make sure masterSecret is zeroed. */
  16811. ForceZero(session->masterSecret, SECRET_LEN);
  16812. /* Session ID is sensitive information too. */
  16813. ForceZero(session->sessionID, ID_LEN);
  16814. if (session->type == WOLFSSL_SESSION_TYPE_HEAP) {
  16815. XFREE(session, session->heap, DYNAMIC_TYPE_SESSION);
  16816. }
  16817. }
  16818. /* DO NOT use this API internally. Use wolfSSL_FreeSession directly instead
  16819. * and pass in the ctx parameter if possible (like from ssl->ctx). */
  16820. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  16821. {
  16822. session = ClientSessionToSession(session);
  16823. wolfSSL_FreeSession(NULL, session);
  16824. }
  16825. #ifndef NO_SESSION_CACHE
  16826. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  16827. {
  16828. int error = 0;
  16829. const byte* id = NULL;
  16830. byte idSz = 0;
  16831. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  16832. session = ClientSessionToSession(session);
  16833. if (session == NULL)
  16834. return WOLFSSL_FAILURE;
  16835. /* Session cache is global */
  16836. (void)ctx;
  16837. if (session->haveAltSessionID) {
  16838. id = session->altSessionID;
  16839. idSz = ID_LEN;
  16840. }
  16841. else {
  16842. id = session->sessionID;
  16843. idSz = session->sessionIDSz;
  16844. }
  16845. error = AddSessionToCache(ctx, session, id, idSz,
  16846. NULL, session->side,
  16847. #ifdef HAVE_SESSION_TICKET
  16848. session->ticketLen > 0,
  16849. #else
  16850. 0,
  16851. #endif
  16852. NULL);
  16853. return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  16854. }
  16855. #endif
  16856. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  16857. /**
  16858. * set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER
  16859. * @param session a pointer to WOLFSSL_SESSION structure
  16860. * @param cipher a function pointer to WOLFSSL_CIPHER
  16861. * @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE
  16862. */
  16863. int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session,
  16864. const WOLFSSL_CIPHER* cipher)
  16865. {
  16866. WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher");
  16867. session = ClientSessionToSession(session);
  16868. /* sanity check */
  16869. if (session == NULL || cipher == NULL) {
  16870. WOLFSSL_MSG("bad argument");
  16871. return WOLFSSL_FAILURE;
  16872. }
  16873. session->cipherSuite0 = cipher->cipherSuite0;
  16874. session->cipherSuite = cipher->cipherSuite;
  16875. WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS);
  16876. return WOLFSSL_SUCCESS;
  16877. }
  16878. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  16879. /* helper function that takes in a protocol version struct and returns string */
  16880. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  16881. {
  16882. WOLFSSL_ENTER("wolfSSL_get_version");
  16883. if (version == NULL) {
  16884. return "Bad arg";
  16885. }
  16886. if (version->major == SSLv3_MAJOR) {
  16887. switch (version->minor) {
  16888. case SSLv3_MINOR :
  16889. return "SSLv3";
  16890. case TLSv1_MINOR :
  16891. return "TLSv1";
  16892. case TLSv1_1_MINOR :
  16893. return "TLSv1.1";
  16894. case TLSv1_2_MINOR :
  16895. return "TLSv1.2";
  16896. case TLSv1_3_MINOR :
  16897. return "TLSv1.3";
  16898. default:
  16899. return "unknown";
  16900. }
  16901. }
  16902. #ifdef WOLFSSL_DTLS
  16903. else if (version->major == DTLS_MAJOR) {
  16904. switch (version->minor) {
  16905. case DTLS_MINOR :
  16906. return "DTLS";
  16907. case DTLSv1_2_MINOR :
  16908. return "DTLSv1.2";
  16909. case DTLSv1_3_MINOR :
  16910. return "DTLSv1.3";
  16911. default:
  16912. return "unknown";
  16913. }
  16914. }
  16915. #endif /* WOLFSSL_DTLS */
  16916. return "unknown";
  16917. }
  16918. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  16919. {
  16920. if (ssl == NULL) {
  16921. WOLFSSL_MSG("Bad argument");
  16922. return "unknown";
  16923. }
  16924. return wolfSSL_internal_get_version(&ssl->version);
  16925. }
  16926. /* current library version */
  16927. const char* wolfSSL_lib_version(void)
  16928. {
  16929. return LIBWOLFSSL_VERSION_STRING;
  16930. }
  16931. #ifdef OPENSSL_EXTRA
  16932. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  16933. const char* wolfSSL_OpenSSL_version(int a)
  16934. {
  16935. (void)a;
  16936. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  16937. }
  16938. #else
  16939. const char* wolfSSL_OpenSSL_version(void)
  16940. {
  16941. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  16942. }
  16943. #endif /* WOLFSSL_QT */
  16944. #endif
  16945. /* current library version in hex */
  16946. word32 wolfSSL_lib_version_hex(void)
  16947. {
  16948. return LIBWOLFSSL_VERSION_HEX;
  16949. }
  16950. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  16951. {
  16952. WOLFSSL_ENTER("wolfSSL_get_current_cipher_suite");
  16953. if (ssl)
  16954. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  16955. return 0;
  16956. }
  16957. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  16958. {
  16959. WOLFSSL_ENTER("wolfSSL_get_current_cipher");
  16960. if (ssl) {
  16961. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  16962. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  16963. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16964. ssl->cipher.bits = ssl->specs.key_size * 8;
  16965. #endif
  16966. return &ssl->cipher;
  16967. }
  16968. else
  16969. return NULL;
  16970. }
  16971. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  16972. {
  16973. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  16974. if (cipher == NULL) {
  16975. return NULL;
  16976. }
  16977. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  16978. !defined(WOLFSSL_QT)
  16979. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  16980. #else
  16981. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  16982. cipher->cipherSuite);
  16983. #endif
  16984. }
  16985. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  16986. {
  16987. WOLFSSL_ENTER("wolfSSL_CIPHER_get_version");
  16988. if (cipher == NULL || cipher->ssl == NULL) {
  16989. return NULL;
  16990. }
  16991. return wolfSSL_get_version(cipher->ssl);
  16992. }
  16993. const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session)
  16994. {
  16995. session = ClientSessionToSession(session);
  16996. if (session == NULL) {
  16997. return NULL;
  16998. }
  16999. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  17000. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  17001. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  17002. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  17003. #else
  17004. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  17005. #endif
  17006. #else
  17007. return NULL;
  17008. #endif
  17009. }
  17010. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  17011. {
  17012. WOLFSSL_ENTER("wolfSSL_get_cipher");
  17013. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  17014. }
  17015. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  17016. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  17017. {
  17018. /* get access to cipher_name_idx in internal.c */
  17019. return wolfSSL_get_cipher_name_internal(ssl);
  17020. }
  17021. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  17022. const byte cipherSuite)
  17023. {
  17024. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  17025. }
  17026. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  17027. const byte cipherSuite)
  17028. {
  17029. return GetCipherNameIana(cipherSuite0, cipherSuite);
  17030. }
  17031. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  17032. byte* cipherSuite, int *flags) {
  17033. if ((name == NULL) ||
  17034. (cipherSuite0 == NULL) ||
  17035. (cipherSuite == NULL) ||
  17036. (flags == NULL))
  17037. return BAD_FUNC_ARG;
  17038. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  17039. }
  17040. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17041. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17042. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  17043. {
  17044. WOLFSSL_STACK* sk;
  17045. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  17046. sk = wolfSSL_sk_new_null();
  17047. if (sk == NULL)
  17048. return NULL;
  17049. sk->type = STACK_TYPE_CIPHER;
  17050. return sk;
  17051. }
  17052. /* return 1 on success 0 on fail */
  17053. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  17054. WOLFSSL_CIPHER* cipher)
  17055. {
  17056. return wolfSSL_sk_push(sk, cipher);
  17057. }
  17058. #ifndef NO_WOLFSSL_STUB
  17059. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17060. {
  17061. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  17062. (void)sk;
  17063. return NULL;
  17064. }
  17065. #endif /* NO_WOLFSSL_STUB */
  17066. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17067. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  17068. {
  17069. word16 cipher_id = 0;
  17070. WOLFSSL_ENTER("wolfSSL_CIPHER_get_id");
  17071. if (cipher && cipher->ssl) {
  17072. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  17073. cipher->ssl->options.cipherSuite;
  17074. }
  17075. return cipher_id;
  17076. }
  17077. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  17078. {
  17079. const WOLFSSL_CIPHER* cipher = NULL;
  17080. byte cipherSuite0, cipherSuite;
  17081. WOLFSSL_ENTER("wolfSSL_get_cipher_by_value");
  17082. /* extract cipher id information */
  17083. cipherSuite = (value & 0xFF);
  17084. cipherSuite0 = ((value >> 8) & 0xFF);
  17085. /* TODO: lookup by cipherSuite0 / cipherSuite */
  17086. (void)cipherSuite0;
  17087. (void)cipherSuite;
  17088. return cipher;
  17089. }
  17090. #if defined(OPENSSL_EXTRA)
  17091. /* Free the structure for WOLFSSL_CIPHER stack
  17092. *
  17093. * sk stack to free nodes in
  17094. */
  17095. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17096. {
  17097. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  17098. wolfSSL_sk_free(sk);
  17099. }
  17100. #endif /* OPENSSL_ALL */
  17101. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  17102. !defined(NO_DH)
  17103. #ifdef HAVE_FFDHE
  17104. static const char* wolfssl_ffdhe_name(word16 group)
  17105. {
  17106. const char* str = NULL;
  17107. switch (group) {
  17108. case WOLFSSL_FFDHE_2048:
  17109. str = "FFDHE_2048";
  17110. break;
  17111. case WOLFSSL_FFDHE_3072:
  17112. str = "FFDHE_3072";
  17113. break;
  17114. case WOLFSSL_FFDHE_4096:
  17115. str = "FFDHE_4096";
  17116. break;
  17117. case WOLFSSL_FFDHE_6144:
  17118. str = "FFDHE_6144";
  17119. break;
  17120. case WOLFSSL_FFDHE_8192:
  17121. str = "FFDHE_8192";
  17122. break;
  17123. default:
  17124. break;
  17125. }
  17126. return str;
  17127. }
  17128. #endif
  17129. /* Return the name of the curve used for key exchange as a printable string.
  17130. *
  17131. * ssl The SSL/TLS object.
  17132. * returns NULL if ECDH was not used, otherwise the name as a string.
  17133. */
  17134. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  17135. {
  17136. const char* cName = NULL;
  17137. WOLFSSL_ENTER("wolfSSL_get_curve_name");
  17138. if (ssl == NULL)
  17139. return NULL;
  17140. #if defined(WOLFSSL_TLS13) && defined(HAVE_PQC)
  17141. /* Check for post-quantum groups. Return now because we do not want the ECC
  17142. * check to override this result in the case of a hybrid. */
  17143. if (IsAtLeastTLSv1_3(ssl->version)) {
  17144. switch (ssl->namedGroup) {
  17145. #ifdef HAVE_LIBOQS
  17146. case WOLFSSL_KYBER_LEVEL1:
  17147. return "KYBER_LEVEL1";
  17148. case WOLFSSL_KYBER_LEVEL3:
  17149. return "KYBER_LEVEL3";
  17150. case WOLFSSL_KYBER_LEVEL5:
  17151. return "KYBER_LEVEL5";
  17152. case WOLFSSL_P256_KYBER_LEVEL1:
  17153. return "P256_KYBER_LEVEL1";
  17154. case WOLFSSL_P384_KYBER_LEVEL3:
  17155. return "P384_KYBER_LEVEL3";
  17156. case WOLFSSL_P521_KYBER_LEVEL5:
  17157. return "P521_KYBER_LEVEL5";
  17158. #elif defined(HAVE_PQM4)
  17159. case WOLFSSL_KYBER_LEVEL1:
  17160. return "KYBER_LEVEL1";
  17161. #elif defined(WOLFSSL_WC_KYBER)
  17162. #ifdef WOLFSSL_KYBER512
  17163. case WOLFSSL_KYBER_LEVEL1:
  17164. return "KYBER_LEVEL1";
  17165. #endif
  17166. #ifdef WOLFSSL_KYBER768
  17167. case WOLFSSL_KYBER_LEVEL3:
  17168. return "KYBER_LEVEL3";
  17169. #endif
  17170. #ifdef WOLFSSL_KYBER1024
  17171. case WOLFSSL_KYBER_LEVEL5:
  17172. return "KYBER_LEVEL5";
  17173. #endif
  17174. #endif
  17175. }
  17176. }
  17177. #endif /* WOLFSSL_TLS13 && HAVE_PQC */
  17178. #ifdef HAVE_FFDHE
  17179. if (ssl->namedGroup != 0) {
  17180. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  17181. }
  17182. #endif
  17183. #ifdef HAVE_CURVE25519
  17184. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  17185. cName = "X25519";
  17186. }
  17187. #endif
  17188. #ifdef HAVE_CURVE448
  17189. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  17190. cName = "X448";
  17191. }
  17192. #endif
  17193. #ifdef HAVE_ECC
  17194. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  17195. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  17196. NULL));
  17197. }
  17198. #endif
  17199. return cName;
  17200. }
  17201. #endif
  17202. #ifdef OPENSSL_EXTRA
  17203. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17204. /* return authentication NID corresponding to cipher suite
  17205. * @param cipher a pointer to WOLFSSL_CIPHER
  17206. * return NID if found, NID_undef if not found
  17207. */
  17208. int wolfSSL_CIPHER_get_auth_nid(const WOLFSSL_CIPHER* cipher)
  17209. {
  17210. static const struct authnid {
  17211. const char* alg_name;
  17212. const int nid;
  17213. } authnid_tbl[] = {
  17214. {"RSA", NID_auth_rsa},
  17215. {"PSK", NID_auth_psk},
  17216. {"SRP", NID_auth_srp},
  17217. {"ECDSA", NID_auth_ecdsa},
  17218. {"None", NID_auth_null},
  17219. {NULL, NID_undef}
  17220. };
  17221. const char* authStr;
  17222. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17223. if (GetCipherSegment(cipher, n) == NULL) {
  17224. WOLFSSL_MSG("no suitable cipher name found");
  17225. return NID_undef;
  17226. }
  17227. authStr = GetCipherAuthStr(n);
  17228. if (authStr != NULL) {
  17229. const struct authnid* sa;
  17230. for(sa = authnid_tbl; sa->alg_name != NULL; sa++) {
  17231. if (XSTRCMP(sa->alg_name, authStr) == 0) {
  17232. return sa->nid;
  17233. }
  17234. }
  17235. }
  17236. return NID_undef;
  17237. }
  17238. /* return cipher NID corresponding to cipher suite
  17239. * @param cipher a pointer to WOLFSSL_CIPHER
  17240. * return NID if found, NID_undef if not found
  17241. */
  17242. int wolfSSL_CIPHER_get_cipher_nid(const WOLFSSL_CIPHER* cipher)
  17243. {
  17244. static const struct ciphernid {
  17245. const char* alg_name;
  17246. const int nid;
  17247. } ciphernid_tbl[] = {
  17248. {"AESGCM(256)", NID_aes_256_gcm},
  17249. {"AESGCM(128)", NID_aes_128_gcm},
  17250. {"AESCCM(128)", NID_aes_128_ccm},
  17251. {"AES(128)", NID_aes_128_cbc},
  17252. {"AES(256)", NID_aes_256_cbc},
  17253. {"CAMELLIA(256)", NID_camellia_256_cbc},
  17254. {"CAMELLIA(128)", NID_camellia_128_cbc},
  17255. {"RC4", NID_rc4},
  17256. {"3DES", NID_des_ede3_cbc},
  17257. {"CHACHA20/POLY1305(256)", NID_chacha20_poly1305},
  17258. {"None", NID_undef},
  17259. {NULL, NID_undef}
  17260. };
  17261. const char* encStr;
  17262. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17263. WOLFSSL_ENTER("wolfSSL_CIPHER_get_cipher_nid");
  17264. if (GetCipherSegment(cipher, n) == NULL) {
  17265. WOLFSSL_MSG("no suitable cipher name found");
  17266. return NID_undef;
  17267. }
  17268. encStr = GetCipherEncStr(n);
  17269. if (encStr != NULL) {
  17270. const struct ciphernid* c;
  17271. for(c = ciphernid_tbl; c->alg_name != NULL; c++) {
  17272. if (XSTRCMP(c->alg_name, encStr) == 0) {
  17273. return c->nid;
  17274. }
  17275. }
  17276. }
  17277. return NID_undef;
  17278. }
  17279. /* return digest NID corresponding to cipher suite
  17280. * @param cipher a pointer to WOLFSSL_CIPHER
  17281. * return NID if found, NID_undef if not found
  17282. */
  17283. int wolfSSL_CIPHER_get_digest_nid(const WOLFSSL_CIPHER* cipher)
  17284. {
  17285. static const struct macnid {
  17286. const char* alg_name;
  17287. const int nid;
  17288. } macnid_tbl[] = {
  17289. {"SHA1", NID_sha1},
  17290. {"SHA256", NID_sha256},
  17291. {"SHA384", NID_sha384},
  17292. {NULL, NID_undef}
  17293. };
  17294. const char* name;
  17295. const char* macStr;
  17296. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17297. (void)name;
  17298. WOLFSSL_ENTER("wolfSSL_CIPHER_get_digest_nid");
  17299. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17300. WOLFSSL_MSG("no suitable cipher name found");
  17301. return NID_undef;
  17302. }
  17303. /* in MD5 case, NID will be NID_md5 */
  17304. if (XSTRSTR(name, "MD5") != NULL) {
  17305. return NID_md5;
  17306. }
  17307. macStr = GetCipherMacStr(n);
  17308. if (macStr != NULL) {
  17309. const struct macnid* mc;
  17310. for(mc = macnid_tbl; mc->alg_name != NULL; mc++) {
  17311. if (XSTRCMP(mc->alg_name, macStr) == 0) {
  17312. return mc->nid;
  17313. }
  17314. }
  17315. }
  17316. return NID_undef;
  17317. }
  17318. /* return key exchange NID corresponding to cipher suite
  17319. * @param cipher a pointer to WOLFSSL_CIPHER
  17320. * return NID if found, NID_undef if not found
  17321. */
  17322. int wolfSSL_CIPHER_get_kx_nid(const WOLFSSL_CIPHER* cipher)
  17323. {
  17324. static const struct kxnid {
  17325. const char* name;
  17326. const int nid;
  17327. } kxnid_table[] = {
  17328. {"ECDHEPSK", NID_kx_ecdhe_psk},
  17329. {"ECDH", NID_kx_ecdhe},
  17330. {"DHEPSK", NID_kx_dhe_psk},
  17331. {"DH", NID_kx_dhe},
  17332. {"RSAPSK", NID_kx_rsa_psk},
  17333. {"SRP", NID_kx_srp},
  17334. {"EDH", NID_kx_dhe},
  17335. {"RSA", NID_kx_rsa},
  17336. {NULL, NID_undef}
  17337. };
  17338. const char* keaStr;
  17339. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17340. WOLFSSL_ENTER("wolfSSL_CIPHER_get_kx_nid");
  17341. if (GetCipherSegment(cipher, n) == NULL) {
  17342. WOLFSSL_MSG("no suitable cipher name found");
  17343. return NID_undef;
  17344. }
  17345. /* in TLS 1.3 case, NID will be NID_kx_any */
  17346. if (XSTRCMP(n[0], "TLS13") == 0) {
  17347. return NID_kx_any;
  17348. }
  17349. keaStr = GetCipherKeaStr(n);
  17350. if (keaStr != NULL) {
  17351. const struct kxnid* k;
  17352. for(k = kxnid_table; k->name != NULL; k++) {
  17353. if (XSTRCMP(k->name, keaStr) == 0) {
  17354. return k->nid;
  17355. }
  17356. }
  17357. }
  17358. return NID_undef;
  17359. }
  17360. /* check if cipher suite is AEAD
  17361. * @param cipher a pointer to WOLFSSL_CIPHER
  17362. * return 1 if cipher is AEAD, 0 otherwise
  17363. */
  17364. int wolfSSL_CIPHER_is_aead(const WOLFSSL_CIPHER* cipher)
  17365. {
  17366. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17367. WOLFSSL_ENTER("wolfSSL_CIPHER_is_aead");
  17368. if (GetCipherSegment(cipher, n) == NULL) {
  17369. WOLFSSL_MSG("no suitable cipher name found");
  17370. return NID_undef;
  17371. }
  17372. return IsCipherAEAD(n);
  17373. }
  17374. /* Creates cipher->description based on cipher->offset
  17375. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  17376. * to a stack of ciphers.
  17377. * @param [in] cipher: A cipher from a stack of ciphers.
  17378. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  17379. */
  17380. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  17381. {
  17382. int strLen;
  17383. unsigned long offset;
  17384. char* dp;
  17385. const char* name;
  17386. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  17387. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17388. int len = MAX_DESCRIPTION_SZ-1;
  17389. const CipherSuiteInfo* cipher_names;
  17390. ProtocolVersion pv;
  17391. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  17392. if (cipher == NULL)
  17393. return WOLFSSL_FAILURE;
  17394. dp = cipher->description;
  17395. if (dp == NULL)
  17396. return WOLFSSL_FAILURE;
  17397. cipher_names = GetCipherNames();
  17398. offset = cipher->offset;
  17399. if (offset >= (unsigned long)GetCipherNamesSize())
  17400. return WOLFSSL_FAILURE;
  17401. pv.major = cipher_names[offset].major;
  17402. pv.minor = cipher_names[offset].minor;
  17403. protocol = wolfSSL_internal_get_version(&pv);
  17404. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17405. WOLFSSL_MSG("no suitable cipher name found");
  17406. return WOLFSSL_FAILURE;
  17407. }
  17408. /* keaStr */
  17409. keaStr = GetCipherKeaStr(n);
  17410. /* authStr */
  17411. authStr = GetCipherAuthStr(n);
  17412. /* encStr */
  17413. encStr = GetCipherEncStr(n);
  17414. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  17415. WOLFSSL_MSG("Cipher Bits Not Set.");
  17416. }
  17417. /* macStr */
  17418. macStr = GetCipherMacStr(n);
  17419. /* Build up the string by copying onto the end. */
  17420. XSTRNCPY(dp, name, len);
  17421. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17422. len -= strLen; dp += strLen;
  17423. XSTRNCPY(dp, " ", len);
  17424. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17425. len -= strLen; dp += strLen;
  17426. XSTRNCPY(dp, protocol, len);
  17427. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17428. len -= strLen; dp += strLen;
  17429. XSTRNCPY(dp, " Kx=", len);
  17430. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17431. len -= strLen; dp += strLen;
  17432. XSTRNCPY(dp, keaStr, len);
  17433. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17434. len -= strLen; dp += strLen;
  17435. XSTRNCPY(dp, " Au=", len);
  17436. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17437. len -= strLen; dp += strLen;
  17438. XSTRNCPY(dp, authStr, len);
  17439. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17440. len -= strLen; dp += strLen;
  17441. XSTRNCPY(dp, " Enc=", len);
  17442. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17443. len -= strLen; dp += strLen;
  17444. XSTRNCPY(dp, encStr, len);
  17445. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17446. len -= strLen; dp += strLen;
  17447. XSTRNCPY(dp, " Mac=", len);
  17448. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17449. len -= strLen; dp += strLen;
  17450. XSTRNCPY(dp, macStr, len);
  17451. dp[len-1] = '\0';
  17452. return WOLFSSL_SUCCESS;
  17453. }
  17454. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  17455. static WC_INLINE const char* wolfssl_kea_to_string(int kea)
  17456. {
  17457. const char* keaStr;
  17458. switch (kea) {
  17459. case no_kea:
  17460. keaStr = "None";
  17461. break;
  17462. #ifndef NO_RSA
  17463. case rsa_kea:
  17464. keaStr = "RSA";
  17465. break;
  17466. #endif
  17467. #ifndef NO_DH
  17468. case diffie_hellman_kea:
  17469. keaStr = "DHE";
  17470. break;
  17471. #endif
  17472. case fortezza_kea:
  17473. keaStr = "FZ";
  17474. break;
  17475. #ifndef NO_PSK
  17476. case psk_kea:
  17477. keaStr = "PSK";
  17478. break;
  17479. #ifndef NO_DH
  17480. case dhe_psk_kea:
  17481. keaStr = "DHEPSK";
  17482. break;
  17483. #endif
  17484. #ifdef HAVE_ECC
  17485. case ecdhe_psk_kea:
  17486. keaStr = "ECDHEPSK";
  17487. break;
  17488. #endif
  17489. #endif
  17490. #ifdef HAVE_ECC
  17491. case ecc_diffie_hellman_kea:
  17492. keaStr = "ECDHE";
  17493. break;
  17494. case ecc_static_diffie_hellman_kea:
  17495. keaStr = "ECDH";
  17496. break;
  17497. #endif
  17498. default:
  17499. keaStr = "unknown";
  17500. break;
  17501. }
  17502. return keaStr;
  17503. }
  17504. static WC_INLINE const char* wolfssl_sigalg_to_string(int sig_algo)
  17505. {
  17506. const char* authStr;
  17507. switch (sig_algo) {
  17508. case anonymous_sa_algo:
  17509. authStr = "None";
  17510. break;
  17511. #ifndef NO_RSA
  17512. case rsa_sa_algo:
  17513. authStr = "RSA";
  17514. break;
  17515. #ifdef WC_RSA_PSS
  17516. case rsa_pss_sa_algo:
  17517. authStr = "RSA-PSS";
  17518. break;
  17519. #endif
  17520. #endif
  17521. #ifndef NO_DSA
  17522. case dsa_sa_algo:
  17523. authStr = "DSA";
  17524. break;
  17525. #endif
  17526. #ifdef HAVE_ECC
  17527. case ecc_dsa_sa_algo:
  17528. authStr = "ECDSA";
  17529. break;
  17530. #endif
  17531. #ifdef WOLFSSL_SM2
  17532. case sm2_sa_algo:
  17533. authStr = "SM2";
  17534. break;
  17535. #endif
  17536. #ifdef HAVE_ED25519
  17537. case ed25519_sa_algo:
  17538. authStr = "Ed25519";
  17539. break;
  17540. #endif
  17541. #ifdef HAVE_ED448
  17542. case ed448_sa_algo:
  17543. authStr = "Ed448";
  17544. break;
  17545. #endif
  17546. default:
  17547. authStr = "unknown";
  17548. break;
  17549. }
  17550. return authStr;
  17551. }
  17552. static WC_INLINE const char* wolfssl_cipher_to_string(int cipher, int key_size)
  17553. {
  17554. const char* encStr;
  17555. (void)key_size;
  17556. switch (cipher) {
  17557. case wolfssl_cipher_null:
  17558. encStr = "None";
  17559. break;
  17560. #ifndef NO_RC4
  17561. case wolfssl_rc4:
  17562. encStr = "RC4(128)";
  17563. break;
  17564. #endif
  17565. #ifndef NO_DES3
  17566. case wolfssl_triple_des:
  17567. encStr = "3DES(168)";
  17568. break;
  17569. #endif
  17570. #ifndef NO_AES
  17571. case wolfssl_aes:
  17572. if (key_size == 128)
  17573. encStr = "AES(128)";
  17574. else if (key_size == 256)
  17575. encStr = "AES(256)";
  17576. else
  17577. encStr = "AES(?)";
  17578. break;
  17579. #ifdef HAVE_AESGCM
  17580. case wolfssl_aes_gcm:
  17581. if (key_size == 128)
  17582. encStr = "AESGCM(128)";
  17583. else if (key_size == 256)
  17584. encStr = "AESGCM(256)";
  17585. else
  17586. encStr = "AESGCM(?)";
  17587. break;
  17588. #endif
  17589. #ifdef HAVE_AESCCM
  17590. case wolfssl_aes_ccm:
  17591. if (key_size == 128)
  17592. encStr = "AESCCM(128)";
  17593. else if (key_size == 256)
  17594. encStr = "AESCCM(256)";
  17595. else
  17596. encStr = "AESCCM(?)";
  17597. break;
  17598. #endif
  17599. #endif
  17600. #ifdef HAVE_CHACHA
  17601. case wolfssl_chacha:
  17602. encStr = "CHACHA20/POLY1305(256)";
  17603. break;
  17604. #endif
  17605. #ifdef HAVE_ARIA
  17606. case wolfssl_aria_gcm:
  17607. if (key_size == 128)
  17608. encStr = "Aria(128)";
  17609. else if (key_size == 192)
  17610. encStr = "Aria(192)";
  17611. else if (key_size == 256)
  17612. encStr = "Aria(256)";
  17613. else
  17614. encStr = "Aria(?)";
  17615. break;
  17616. #endif
  17617. #ifdef HAVE_CAMELLIA
  17618. case wolfssl_camellia:
  17619. if (key_size == 128)
  17620. encStr = "Camellia(128)";
  17621. else if (key_size == 256)
  17622. encStr = "Camellia(256)";
  17623. else
  17624. encStr = "Camellia(?)";
  17625. break;
  17626. #endif
  17627. default:
  17628. encStr = "unknown";
  17629. break;
  17630. }
  17631. return encStr;
  17632. }
  17633. static WC_INLINE const char* wolfssl_mac_to_string(int mac)
  17634. {
  17635. const char* macStr;
  17636. switch (mac) {
  17637. case no_mac:
  17638. macStr = "None";
  17639. break;
  17640. #ifndef NO_MD5
  17641. case md5_mac:
  17642. macStr = "MD5";
  17643. break;
  17644. #endif
  17645. #ifndef NO_SHA
  17646. case sha_mac:
  17647. macStr = "SHA1";
  17648. break;
  17649. #endif
  17650. #ifdef HAVE_SHA224
  17651. case sha224_mac:
  17652. macStr = "SHA224";
  17653. break;
  17654. #endif
  17655. #ifndef NO_SHA256
  17656. case sha256_mac:
  17657. macStr = "SHA256";
  17658. break;
  17659. #endif
  17660. #ifdef HAVE_SHA384
  17661. case sha384_mac:
  17662. macStr = "SHA384";
  17663. break;
  17664. #endif
  17665. #ifdef HAVE_SHA512
  17666. case sha512_mac:
  17667. macStr = "SHA512";
  17668. break;
  17669. #endif
  17670. default:
  17671. macStr = "unknown";
  17672. break;
  17673. }
  17674. return macStr;
  17675. }
  17676. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  17677. int len)
  17678. {
  17679. char *ret = in;
  17680. const char *keaStr, *authStr, *encStr, *macStr;
  17681. size_t strLen;
  17682. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  17683. if (cipher == NULL || in == NULL)
  17684. return NULL;
  17685. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17686. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  17687. * Return the description based on cipher_names[cipher->offset]
  17688. */
  17689. if (cipher->in_stack == TRUE) {
  17690. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  17691. XSTRNCPY(in,cipher->description,len);
  17692. return ret;
  17693. }
  17694. #endif
  17695. /* Get the cipher description based on the SSL session cipher */
  17696. keaStr = wolfssl_kea_to_string(cipher->ssl->specs.kea);
  17697. authStr = wolfssl_sigalg_to_string(cipher->ssl->specs.sig_algo);
  17698. encStr = wolfssl_cipher_to_string(cipher->ssl->specs.bulk_cipher_algorithm,
  17699. cipher->ssl->specs.key_size);
  17700. macStr = wolfssl_mac_to_string(cipher->ssl->specs.mac_algorithm);
  17701. /* Build up the string by copying onto the end. */
  17702. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  17703. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17704. XSTRNCPY(in, " ", len);
  17705. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17706. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  17707. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17708. XSTRNCPY(in, " Kx=", len);
  17709. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17710. XSTRNCPY(in, keaStr, len);
  17711. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17712. XSTRNCPY(in, " Au=", len);
  17713. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17714. XSTRNCPY(in, authStr, len);
  17715. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17716. XSTRNCPY(in, " Enc=", len);
  17717. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17718. XSTRNCPY(in, encStr, len);
  17719. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17720. XSTRNCPY(in, " Mac=", len);
  17721. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17722. XSTRNCPY(in, macStr, len);
  17723. in[len-1] = '\0';
  17724. return ret;
  17725. }
  17726. #ifndef NO_WOLFSSL_STUB
  17727. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  17728. int* ssl)
  17729. {
  17730. (void)url;
  17731. (void)host;
  17732. (void)port;
  17733. (void)path;
  17734. (void)ssl;
  17735. WOLFSSL_STUB("OCSP_parse_url");
  17736. return 0;
  17737. }
  17738. #endif
  17739. #ifndef NO_WOLFSSL_STUB
  17740. void wolfSSL_RAND_screen(void)
  17741. {
  17742. WOLFSSL_STUB("RAND_screen");
  17743. }
  17744. #endif
  17745. int wolfSSL_RAND_load_file(const char* fname, long len)
  17746. {
  17747. (void)fname;
  17748. /* wolfCrypt provides enough entropy internally or will report error */
  17749. if (len == -1)
  17750. return 1024;
  17751. else
  17752. return (int)len;
  17753. }
  17754. #ifndef NO_WOLFSSL_STUB
  17755. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  17756. {
  17757. WOLFSSL_STUB("COMP_zlib");
  17758. return 0;
  17759. }
  17760. #endif
  17761. #ifndef NO_WOLFSSL_STUB
  17762. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  17763. {
  17764. WOLFSSL_STUB("COMP_rle");
  17765. return 0;
  17766. }
  17767. #endif
  17768. #ifndef NO_WOLFSSL_STUB
  17769. int wolfSSL_COMP_add_compression_method(int method, void* data)
  17770. {
  17771. (void)method;
  17772. (void)data;
  17773. WOLFSSL_STUB("COMP_add_compression_method");
  17774. return 0;
  17775. }
  17776. #endif
  17777. /* wolfSSL_set_dynlock_create_callback
  17778. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  17779. * This function exists for compatibility purposes because wolfSSL satisfies
  17780. * thread safety without relying on the callback.
  17781. */
  17782. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  17783. const char*, int))
  17784. {
  17785. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  17786. (void)f;
  17787. }
  17788. /* wolfSSL_set_dynlock_lock_callback
  17789. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  17790. * This function exists for compatibility purposes because wolfSSL satisfies
  17791. * thread safety without relying on the callback.
  17792. */
  17793. void wolfSSL_set_dynlock_lock_callback(
  17794. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  17795. {
  17796. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  17797. (void)f;
  17798. }
  17799. /* wolfSSL_set_dynlock_destroy_callback
  17800. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  17801. * This function exists for compatibility purposes because wolfSSL satisfies
  17802. * thread safety without relying on the callback.
  17803. */
  17804. void wolfSSL_set_dynlock_destroy_callback(
  17805. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  17806. {
  17807. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  17808. (void)f;
  17809. }
  17810. #endif /* OPENSSL_EXTRA */
  17811. #ifdef OPENSSL_EXTRA
  17812. #ifndef NO_CERTS
  17813. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  17814. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  17815. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  17816. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  17817. *
  17818. * Returns size of key buffer on success
  17819. */
  17820. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  17821. {
  17822. return wolfSSL_EVP_PKEY_get_der(key, der);
  17823. }
  17824. int wolfSSL_i2d_PublicKey(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  17825. {
  17826. #if !defined(NO_RSA) || defined(HAVE_ECC)
  17827. #ifdef HAVE_ECC
  17828. unsigned char *local_der = NULL;
  17829. word32 local_derSz = 0;
  17830. unsigned char *pub_der = NULL;
  17831. ecc_key *eccKey = NULL;
  17832. word32 inOutIdx = 0;
  17833. #endif
  17834. word32 pub_derSz = 0;
  17835. int ret;
  17836. int key_type = 0;
  17837. if (key == NULL) {
  17838. return WOLFSSL_FATAL_ERROR;
  17839. }
  17840. key_type = key->type;
  17841. if ((key_type != EVP_PKEY_EC) && (key_type != EVP_PKEY_RSA)) {
  17842. return WOLFSSL_FATAL_ERROR;
  17843. }
  17844. #ifndef NO_RSA
  17845. if (key_type == EVP_PKEY_RSA) {
  17846. return wolfSSL_i2d_RSAPublicKey(key->rsa, der);
  17847. }
  17848. #endif
  17849. /* Now that RSA is taken care of, we only need to consider the ECC case. */
  17850. #ifdef HAVE_ECC
  17851. /* We need to get the DER, then convert it to a public key. But what we get
  17852. * might be a buffered private key so we need to decode it and then encode
  17853. * the public part. */
  17854. ret = wolfSSL_EVP_PKEY_get_der(key, &local_der);
  17855. if (ret <= 0) {
  17856. /* In this case, there was no buffered DER at all. This could be the
  17857. * case where the key that was passed in was generated. So now we
  17858. * have to create the local DER. */
  17859. local_derSz = wolfSSL_i2d_ECPrivateKey(key->ecc, &local_der);
  17860. if (local_derSz == 0) {
  17861. ret = WOLFSSL_FATAL_ERROR;
  17862. }
  17863. } else {
  17864. local_derSz = ret;
  17865. ret = 0;
  17866. }
  17867. if (ret == 0) {
  17868. eccKey = (ecc_key *)XMALLOC(sizeof(*eccKey), NULL, DYNAMIC_TYPE_ECC);
  17869. if (eccKey == NULL) {
  17870. WOLFSSL_MSG("Failed to allocate key buffer.");
  17871. ret = WOLFSSL_FATAL_ERROR;
  17872. }
  17873. }
  17874. if (ret == 0) {
  17875. ret = wc_ecc_init(eccKey);
  17876. }
  17877. if (ret == 0) {
  17878. ret = wc_EccPublicKeyDecode(local_der, &inOutIdx, eccKey, local_derSz);
  17879. if (ret < 0) {
  17880. /* We now try again as x.963 [point type][x][opt y]. */
  17881. ret = wc_ecc_import_x963(local_der, local_derSz, eccKey);
  17882. }
  17883. }
  17884. if (ret == 0) {
  17885. pub_derSz = wc_EccPublicKeyDerSize(eccKey, 0);
  17886. if ((int)pub_derSz <= 0) {
  17887. ret = WOLFSSL_FAILURE;
  17888. }
  17889. }
  17890. if (ret == 0) {
  17891. pub_der = (unsigned char*)XMALLOC(pub_derSz, NULL,
  17892. DYNAMIC_TYPE_PUBLIC_KEY);
  17893. if (pub_der == NULL) {
  17894. WOLFSSL_MSG("Failed to allocate output buffer.");
  17895. ret = WOLFSSL_FATAL_ERROR;
  17896. }
  17897. }
  17898. if (ret == 0) {
  17899. pub_derSz = wc_EccPublicKeyToDer(eccKey, pub_der, pub_derSz, 0);
  17900. if ((int)pub_derSz <= 0) {
  17901. ret = WOLFSSL_FATAL_ERROR;
  17902. }
  17903. }
  17904. /* This block is for actually returning the DER of the public key */
  17905. if ((ret == 0) && (der != NULL)) {
  17906. if (*der == NULL) {
  17907. *der = (unsigned char*)XMALLOC(pub_derSz, NULL,
  17908. DYNAMIC_TYPE_PUBLIC_KEY);
  17909. if (*der == NULL) {
  17910. WOLFSSL_MSG("Failed to allocate output buffer.");
  17911. ret = WOLFSSL_FATAL_ERROR;
  17912. }
  17913. if (ret == 0) {
  17914. XMEMCPY(*der, pub_der, pub_derSz);
  17915. }
  17916. }
  17917. else {
  17918. XMEMCPY(*der, pub_der, pub_derSz);
  17919. *der += pub_derSz;
  17920. }
  17921. }
  17922. XFREE(pub_der, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  17923. XFREE(local_der, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  17924. wc_ecc_free(eccKey);
  17925. XFREE(eccKey, NULL, DYNAMIC_TYPE_ECC);
  17926. #else
  17927. ret = WOLFSSL_FATAL_ERROR;
  17928. #endif /* HAVE_ECC */
  17929. if (ret == 0) {
  17930. return pub_derSz;
  17931. }
  17932. return ret;
  17933. #else
  17934. return WOLFSSL_FATAL_ERROR;
  17935. #endif /* !NO_RSA || HAVE_ECC */
  17936. }
  17937. #endif /* !NO_ASN && !NO_PWDBASED */
  17938. #endif /* !NO_CERTS */
  17939. #endif /* OPENSSL_EXTRA */
  17940. #ifdef OPENSSL_EXTRA
  17941. /* Sets the DNS hostname to name.
  17942. * Hostname is cleared if name is NULL or empty. */
  17943. int wolfSSL_set1_host(WOLFSSL * ssl, const char* name)
  17944. {
  17945. if (ssl == NULL) {
  17946. return WOLFSSL_FAILURE;
  17947. }
  17948. return wolfSSL_X509_VERIFY_PARAM_set1_host(ssl->param, name, 0);
  17949. }
  17950. /******************************************************************************
  17951. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  17952. *
  17953. * RETURNS:
  17954. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  17955. * Note: Returns WOLFSSL_SUCCESS, in case either parameter is NULL,
  17956. * same as openssl.
  17957. */
  17958. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  17959. {
  17960. if (ctx == NULL || vpm == NULL)
  17961. return WOLFSSL_SUCCESS;
  17962. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  17963. }
  17964. /******************************************************************************
  17965. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  17966. *
  17967. * RETURNS:
  17968. * returns pointer to the SSL verification parameters on success,
  17969. * otherwise returns NULL
  17970. */
  17971. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  17972. {
  17973. if (ctx == NULL) {
  17974. return NULL;
  17975. }
  17976. return ctx->param;
  17977. }
  17978. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  17979. {
  17980. if (ssl == NULL) {
  17981. return NULL;
  17982. }
  17983. return ssl->param;
  17984. }
  17985. #endif /* OPENSSL_EXTRA */
  17986. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17987. /* Gets an index to store SSL structure at.
  17988. *
  17989. * Returns positive index on success and negative values on failure
  17990. */
  17991. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  17992. {
  17993. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  17994. /* store SSL at index 0 */
  17995. return 0;
  17996. }
  17997. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17998. #ifdef OPENSSL_EXTRA
  17999. /* Sets a function callback that will send information about the state of all
  18000. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  18001. * in.
  18002. *
  18003. * ctx WOLFSSL_CTX structure to set callback function in
  18004. * f callback function to use
  18005. */
  18006. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  18007. void (*f)(const WOLFSSL* ssl, int type, int val))
  18008. {
  18009. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  18010. if (ctx == NULL) {
  18011. WOLFSSL_MSG("Bad function argument");
  18012. }
  18013. else {
  18014. ctx->CBIS = f;
  18015. }
  18016. }
  18017. unsigned long wolfSSL_ERR_peek_error(void)
  18018. {
  18019. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  18020. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  18021. }
  18022. int wolfSSL_ERR_GET_LIB(unsigned long err)
  18023. {
  18024. unsigned long value;
  18025. value = (err & 0xFFFFFFL);
  18026. switch (value) {
  18027. case -SSL_R_HTTP_REQUEST:
  18028. return ERR_LIB_SSL;
  18029. case -ASN_NO_PEM_HEADER:
  18030. case PEM_R_NO_START_LINE:
  18031. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  18032. case PEM_R_BAD_PASSWORD_READ:
  18033. case PEM_R_BAD_DECRYPT:
  18034. return ERR_LIB_PEM;
  18035. case EVP_R_BAD_DECRYPT:
  18036. case EVP_R_BN_DECODE_ERROR:
  18037. case EVP_R_DECODE_ERROR:
  18038. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  18039. return ERR_LIB_EVP;
  18040. case ASN1_R_HEADER_TOO_LONG:
  18041. return ERR_LIB_ASN1;
  18042. default:
  18043. return 0;
  18044. }
  18045. }
  18046. /* This function is to find global error values that are the same through out
  18047. * all library version. With wolfSSL having only one set of error codes the
  18048. * return value is pretty straight forward. The only thing needed is all wolfSSL
  18049. * error values are typically negative.
  18050. *
  18051. * Returns the error reason
  18052. */
  18053. int wolfSSL_ERR_GET_REASON(unsigned long err)
  18054. {
  18055. int ret = (int)err;
  18056. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  18057. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  18058. /* Nginx looks for this error to know to stop parsing certificates.
  18059. * Same for HAProxy. */
  18060. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE) ||
  18061. ((err & 0xFFFFFFL) == -ASN_NO_PEM_HEADER) ||
  18062. ((err & 0xFFFL) == PEM_R_NO_START_LINE ))
  18063. return PEM_R_NO_START_LINE;
  18064. if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST))
  18065. return SSL_R_HTTP_REQUEST;
  18066. #endif
  18067. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  18068. if (err == ((ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG))
  18069. return ASN1_R_HEADER_TOO_LONG;
  18070. #endif
  18071. /* check if error value is in range of wolfSSL errors */
  18072. ret = 0 - ret; /* setting as negative value */
  18073. /* wolfCrypt range is less than MAX (-100)
  18074. wolfSSL range is MIN (-300) and lower */
  18075. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  18076. return ret;
  18077. }
  18078. else {
  18079. WOLFSSL_MSG("Not in range of typical error values");
  18080. ret = (int)err;
  18081. }
  18082. return ret;
  18083. }
  18084. /* returns a string that describes the alert
  18085. *
  18086. * alertID the alert value to look up
  18087. */
  18088. const char* wolfSSL_alert_type_string_long(int alertID)
  18089. {
  18090. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  18091. return AlertTypeToString(alertID);
  18092. }
  18093. const char* wolfSSL_alert_desc_string_long(int alertID)
  18094. {
  18095. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  18096. return AlertTypeToString(alertID);
  18097. }
  18098. #define STATE_STRINGS_PROTO(s) \
  18099. { \
  18100. {"SSLv3 " s, \
  18101. "SSLv3 " s, \
  18102. "SSLv3 " s}, \
  18103. {"TLSv1 " s, \
  18104. "TLSv1 " s, \
  18105. "TLSv1 " s}, \
  18106. {"TLSv1_1 " s, \
  18107. "TLSv1_1 " s, \
  18108. "TLSv1_1 " s}, \
  18109. {"TLSv1_2 " s, \
  18110. "TLSv1_2 " s, \
  18111. "TLSv1_2 " s}, \
  18112. {"TLSv1_3 " s, \
  18113. "TLSv1_3 " s, \
  18114. "TLSv1_3 " s}, \
  18115. {"DTLSv1 " s, \
  18116. "DTLSv1 " s, \
  18117. "DTLSv1 " s}, \
  18118. {"DTLSv1_2 " s, \
  18119. "DTLSv1_2 " s, \
  18120. "DTLSv1_2 " s}, \
  18121. {"DTLSv1_3 " s, \
  18122. "DTLSv1_3 " s, \
  18123. "DTLSv1_3 " s}, \
  18124. }
  18125. #define STATE_STRINGS_PROTO_RW(s) \
  18126. { \
  18127. {"SSLv3 read " s, \
  18128. "SSLv3 write " s, \
  18129. "SSLv3 " s}, \
  18130. {"TLSv1 read " s, \
  18131. "TLSv1 write " s, \
  18132. "TLSv1 " s}, \
  18133. {"TLSv1_1 read " s, \
  18134. "TLSv1_1 write " s, \
  18135. "TLSv1_1 " s}, \
  18136. {"TLSv1_2 read " s, \
  18137. "TLSv1_2 write " s, \
  18138. "TLSv1_2 " s}, \
  18139. {"TLSv1_3 read " s, \
  18140. "TLSv1_3 write " s, \
  18141. "TLSv1_3 " s}, \
  18142. {"DTLSv1 read " s, \
  18143. "DTLSv1 write " s, \
  18144. "DTLSv1 " s}, \
  18145. {"DTLSv1_2 read " s, \
  18146. "DTLSv1_2 write " s, \
  18147. "DTLSv1_2 " s}, \
  18148. {"DTLSv1_3 read " s, \
  18149. "DTLSv1_3 write " s, \
  18150. "DTLSv1_3 " s}, \
  18151. }
  18152. /* Gets the current state of the WOLFSSL structure
  18153. *
  18154. * ssl WOLFSSL structure to get state of
  18155. *
  18156. * Returns a human readable string of the WOLFSSL structure state
  18157. */
  18158. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  18159. {
  18160. static const char* OUTPUT_STR[24][8][3] = {
  18161. STATE_STRINGS_PROTO("Initialization"),
  18162. STATE_STRINGS_PROTO_RW("Server Hello Request"),
  18163. STATE_STRINGS_PROTO_RW("Server Hello Verify Request"),
  18164. STATE_STRINGS_PROTO_RW("Server Hello Retry Request"),
  18165. STATE_STRINGS_PROTO_RW("Server Hello"),
  18166. STATE_STRINGS_PROTO_RW("Server Certificate Status"),
  18167. STATE_STRINGS_PROTO_RW("Server Encrypted Extensions"),
  18168. STATE_STRINGS_PROTO_RW("Server Session Ticket"),
  18169. STATE_STRINGS_PROTO_RW("Server Certificate Request"),
  18170. STATE_STRINGS_PROTO_RW("Server Cert"),
  18171. STATE_STRINGS_PROTO_RW("Server Key Exchange"),
  18172. STATE_STRINGS_PROTO_RW("Server Hello Done"),
  18173. STATE_STRINGS_PROTO_RW("Server Change CipherSpec"),
  18174. STATE_STRINGS_PROTO_RW("Server Finished"),
  18175. STATE_STRINGS_PROTO_RW("server Key Update"),
  18176. STATE_STRINGS_PROTO_RW("Client Hello"),
  18177. STATE_STRINGS_PROTO_RW("Client Key Exchange"),
  18178. STATE_STRINGS_PROTO_RW("Client Cert"),
  18179. STATE_STRINGS_PROTO_RW("Client Change CipherSpec"),
  18180. STATE_STRINGS_PROTO_RW("Client Certificate Verify"),
  18181. STATE_STRINGS_PROTO_RW("Client End Of Early Data"),
  18182. STATE_STRINGS_PROTO_RW("Client Finished"),
  18183. STATE_STRINGS_PROTO_RW("Client Key Update"),
  18184. STATE_STRINGS_PROTO("Handshake Done"),
  18185. };
  18186. enum ProtocolVer {
  18187. SSL_V3 = 0,
  18188. TLS_V1,
  18189. TLS_V1_1,
  18190. TLS_V1_2,
  18191. TLS_V1_3,
  18192. DTLS_V1,
  18193. DTLS_V1_2,
  18194. DTLS_V1_3,
  18195. UNKNOWN = 100
  18196. };
  18197. enum IOMode {
  18198. SS_READ = 0,
  18199. SS_WRITE,
  18200. SS_NEITHER
  18201. };
  18202. enum SslState {
  18203. ss_null_state = 0,
  18204. ss_server_hellorequest,
  18205. ss_server_helloverify,
  18206. ss_server_helloretryrequest,
  18207. ss_server_hello,
  18208. ss_server_certificatestatus,
  18209. ss_server_encryptedextensions,
  18210. ss_server_sessionticket,
  18211. ss_server_certrequest,
  18212. ss_server_cert,
  18213. ss_server_keyexchange,
  18214. ss_server_hellodone,
  18215. ss_server_changecipherspec,
  18216. ss_server_finished,
  18217. ss_server_keyupdate,
  18218. ss_client_hello,
  18219. ss_client_keyexchange,
  18220. ss_client_cert,
  18221. ss_client_changecipherspec,
  18222. ss_client_certverify,
  18223. ss_client_endofearlydata,
  18224. ss_client_finished,
  18225. ss_client_keyupdate,
  18226. ss_handshake_done
  18227. };
  18228. int protocol = 0;
  18229. int cbmode = 0;
  18230. int state = 0;
  18231. WOLFSSL_ENTER("wolfSSL_state_string_long");
  18232. if (ssl == NULL) {
  18233. WOLFSSL_MSG("Null argument passed in");
  18234. return NULL;
  18235. }
  18236. /* Get state of callback */
  18237. if (ssl->cbmode == SSL_CB_MODE_WRITE) {
  18238. cbmode = SS_WRITE;
  18239. }
  18240. else if (ssl->cbmode == SSL_CB_MODE_READ) {
  18241. cbmode = SS_READ;
  18242. }
  18243. else {
  18244. cbmode = SS_NEITHER;
  18245. }
  18246. /* Get protocol version */
  18247. switch (ssl->version.major) {
  18248. case SSLv3_MAJOR:
  18249. switch (ssl->version.minor) {
  18250. case SSLv3_MINOR:
  18251. protocol = SSL_V3;
  18252. break;
  18253. case TLSv1_MINOR:
  18254. protocol = TLS_V1;
  18255. break;
  18256. case TLSv1_1_MINOR:
  18257. protocol = TLS_V1_1;
  18258. break;
  18259. case TLSv1_2_MINOR:
  18260. protocol = TLS_V1_2;
  18261. break;
  18262. case TLSv1_3_MINOR:
  18263. protocol = TLS_V1_3;
  18264. break;
  18265. default:
  18266. protocol = UNKNOWN;
  18267. }
  18268. break;
  18269. case DTLS_MAJOR:
  18270. switch (ssl->version.minor) {
  18271. case DTLS_MINOR:
  18272. protocol = DTLS_V1;
  18273. break;
  18274. case DTLSv1_2_MINOR:
  18275. protocol = DTLS_V1_2;
  18276. break;
  18277. case DTLSv1_3_MINOR:
  18278. protocol = DTLS_V1_3;
  18279. break;
  18280. default:
  18281. protocol = UNKNOWN;
  18282. }
  18283. break;
  18284. default:
  18285. protocol = UNKNOWN;
  18286. }
  18287. /* accept process */
  18288. if (ssl->cbmode == SSL_CB_MODE_READ) {
  18289. state = ssl->cbtype;
  18290. switch (state) {
  18291. case hello_request:
  18292. state = ss_server_hellorequest;
  18293. break;
  18294. case client_hello:
  18295. state = ss_client_hello;
  18296. break;
  18297. case server_hello:
  18298. state = ss_server_hello;
  18299. break;
  18300. case hello_verify_request:
  18301. state = ss_server_helloverify;
  18302. break;
  18303. case session_ticket:
  18304. state = ss_server_sessionticket;
  18305. break;
  18306. case end_of_early_data:
  18307. state = ss_client_endofearlydata;
  18308. break;
  18309. case hello_retry_request:
  18310. state = ss_server_helloretryrequest;
  18311. break;
  18312. case encrypted_extensions:
  18313. state = ss_server_encryptedextensions;
  18314. break;
  18315. case certificate:
  18316. if (ssl->options.side == WOLFSSL_SERVER_END)
  18317. state = ss_client_cert;
  18318. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18319. state = ss_server_cert;
  18320. else {
  18321. WOLFSSL_MSG("Unknown State");
  18322. state = ss_null_state;
  18323. }
  18324. break;
  18325. case server_key_exchange:
  18326. state = ss_server_keyexchange;
  18327. break;
  18328. case certificate_request:
  18329. state = ss_server_certrequest;
  18330. break;
  18331. case server_hello_done:
  18332. state = ss_server_hellodone;
  18333. break;
  18334. case certificate_verify:
  18335. state = ss_client_certverify;
  18336. break;
  18337. case client_key_exchange:
  18338. state = ss_client_keyexchange;
  18339. break;
  18340. case finished:
  18341. if (ssl->options.side == WOLFSSL_SERVER_END)
  18342. state = ss_client_finished;
  18343. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18344. state = ss_server_finished;
  18345. else {
  18346. WOLFSSL_MSG("Unknown State");
  18347. state = ss_null_state;
  18348. }
  18349. break;
  18350. case certificate_status:
  18351. state = ss_server_certificatestatus;
  18352. break;
  18353. case key_update:
  18354. if (ssl->options.side == WOLFSSL_SERVER_END)
  18355. state = ss_client_keyupdate;
  18356. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18357. state = ss_server_keyupdate;
  18358. else {
  18359. WOLFSSL_MSG("Unknown State");
  18360. state = ss_null_state;
  18361. }
  18362. break;
  18363. case change_cipher_hs:
  18364. if (ssl->options.side == WOLFSSL_SERVER_END)
  18365. state = ss_client_changecipherspec;
  18366. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  18367. state = ss_server_changecipherspec;
  18368. else {
  18369. WOLFSSL_MSG("Unknown State");
  18370. state = ss_null_state;
  18371. }
  18372. break;
  18373. default:
  18374. WOLFSSL_MSG("Unknown State");
  18375. state = ss_null_state;
  18376. }
  18377. }
  18378. else {
  18379. /* Send process */
  18380. if (ssl->options.side == WOLFSSL_SERVER_END)
  18381. state = ssl->options.serverState;
  18382. else
  18383. state = ssl->options.clientState;
  18384. switch (state) {
  18385. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  18386. state = ss_server_helloverify;
  18387. break;
  18388. case SERVER_HELLO_RETRY_REQUEST_COMPLETE:
  18389. state = ss_server_helloretryrequest;
  18390. break;
  18391. case SERVER_HELLO_COMPLETE:
  18392. state = ss_server_hello;
  18393. break;
  18394. case SERVER_ENCRYPTED_EXTENSIONS_COMPLETE:
  18395. state = ss_server_encryptedextensions;
  18396. break;
  18397. case SERVER_CERT_COMPLETE:
  18398. state = ss_server_cert;
  18399. break;
  18400. case SERVER_KEYEXCHANGE_COMPLETE:
  18401. state = ss_server_keyexchange;
  18402. break;
  18403. case SERVER_HELLODONE_COMPLETE:
  18404. state = ss_server_hellodone;
  18405. break;
  18406. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  18407. state = ss_server_changecipherspec;
  18408. break;
  18409. case SERVER_FINISHED_COMPLETE:
  18410. state = ss_server_finished;
  18411. break;
  18412. case CLIENT_HELLO_RETRY:
  18413. case CLIENT_HELLO_COMPLETE:
  18414. state = ss_client_hello;
  18415. break;
  18416. case CLIENT_KEYEXCHANGE_COMPLETE:
  18417. state = ss_client_keyexchange;
  18418. break;
  18419. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  18420. state = ss_client_changecipherspec;
  18421. break;
  18422. case CLIENT_FINISHED_COMPLETE:
  18423. state = ss_client_finished;
  18424. break;
  18425. case HANDSHAKE_DONE:
  18426. state = ss_handshake_done;
  18427. break;
  18428. default:
  18429. WOLFSSL_MSG("Unknown State");
  18430. state = ss_null_state;
  18431. }
  18432. }
  18433. if (protocol == UNKNOWN) {
  18434. WOLFSSL_MSG("Unknown protocol");
  18435. return "";
  18436. }
  18437. else {
  18438. return OUTPUT_STR[state][protocol][cbmode];
  18439. }
  18440. }
  18441. /*
  18442. * Sets default PEM callback password if null is passed into
  18443. * the callback parameter of a PEM_read_bio_* function.
  18444. *
  18445. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  18446. */
  18447. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  18448. {
  18449. (void)w;
  18450. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  18451. /* We assume that the user passes a default password as userdata */
  18452. if (key) {
  18453. int sz = (int)XSTRLEN((const char*)key);
  18454. sz = (sz > num) ? num : sz;
  18455. XMEMCPY(name, key, sz);
  18456. return sz;
  18457. } else {
  18458. WOLFSSL_MSG("Error, default password cannot be created.");
  18459. return WOLFSSL_FAILURE;
  18460. }
  18461. }
  18462. #endif /* OPENSSL_EXTRA */
  18463. static long wolf_set_options(long old_op, long op)
  18464. {
  18465. /* if SSL_OP_ALL then turn all bug workarounds on */
  18466. if ((op & WOLFSSL_OP_ALL) == WOLFSSL_OP_ALL) {
  18467. WOLFSSL_MSG("\tSSL_OP_ALL");
  18468. }
  18469. /* by default cookie exchange is on with DTLS */
  18470. if ((op & WOLFSSL_OP_COOKIE_EXCHANGE) == WOLFSSL_OP_COOKIE_EXCHANGE) {
  18471. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  18472. }
  18473. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  18474. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  18475. }
  18476. #ifdef SSL_OP_NO_TLSv1_3
  18477. if ((op & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  18478. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  18479. }
  18480. #endif
  18481. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  18482. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  18483. }
  18484. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  18485. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  18486. }
  18487. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  18488. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  18489. }
  18490. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  18491. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  18492. }
  18493. if ((op & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) ==
  18494. WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  18495. WOLFSSL_MSG("\tWOLFSSL_OP_CIPHER_SERVER_PREFERENCE");
  18496. }
  18497. if ((op & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  18498. #ifdef HAVE_LIBZ
  18499. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  18500. #else
  18501. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  18502. #endif
  18503. }
  18504. return old_op | op;
  18505. }
  18506. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  18507. {
  18508. word16 haveRSA = 1;
  18509. word16 havePSK = 0;
  18510. int keySz = 0;
  18511. WOLFSSL_ENTER("wolfSSL_set_options");
  18512. if (ssl == NULL) {
  18513. return 0;
  18514. }
  18515. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  18516. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  18517. if (ssl->version.minor == TLSv1_3_MINOR)
  18518. ssl->version.minor = TLSv1_2_MINOR;
  18519. }
  18520. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  18521. if (ssl->version.minor == TLSv1_2_MINOR)
  18522. ssl->version.minor = TLSv1_1_MINOR;
  18523. }
  18524. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  18525. if (ssl->version.minor == TLSv1_1_MINOR)
  18526. ssl->version.minor = TLSv1_MINOR;
  18527. }
  18528. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  18529. if (ssl->version.minor == TLSv1_MINOR)
  18530. ssl->version.minor = SSLv3_MINOR;
  18531. }
  18532. if ((ssl->options.mask & WOLFSSL_OP_NO_COMPRESSION)
  18533. == WOLFSSL_OP_NO_COMPRESSION) {
  18534. #ifdef HAVE_LIBZ
  18535. ssl->options.usingCompression = 0;
  18536. #endif
  18537. }
  18538. #if defined(HAVE_SESSION_TICKET) && (defined(OPENSSL_EXTRA) \
  18539. || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL))
  18540. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == WOLFSSL_OP_NO_TICKET) {
  18541. ssl->options.noTicketTls12 = 1;
  18542. }
  18543. #endif
  18544. /* in the case of a version change the cipher suites should be reset */
  18545. #ifndef NO_PSK
  18546. havePSK = ssl->options.havePSK;
  18547. #endif
  18548. #ifdef NO_RSA
  18549. haveRSA = 0;
  18550. #endif
  18551. #ifndef NO_CERTS
  18552. keySz = ssl->buffers.keySz;
  18553. #endif
  18554. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  18555. if (AllocateSuites(ssl) != 0)
  18556. return 0;
  18557. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  18558. ssl->options.haveDH, ssl->options.haveECDSAsig,
  18559. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  18560. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  18561. ssl->options.haveAnon, TRUE, ssl->options.side);
  18562. }
  18563. return ssl->options.mask;
  18564. }
  18565. long wolfSSL_get_options(const WOLFSSL* ssl)
  18566. {
  18567. WOLFSSL_ENTER("wolfSSL_get_options");
  18568. if(ssl == NULL)
  18569. return WOLFSSL_FAILURE;
  18570. return ssl->options.mask;
  18571. }
  18572. #if defined(HAVE_SECURE_RENEGOTIATION) \
  18573. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  18574. /* clears the counter for number of renegotiations done
  18575. * returns the current count before it is cleared */
  18576. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  18577. {
  18578. long total;
  18579. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  18580. if (s == NULL)
  18581. return 0;
  18582. total = s->secure_rene_count;
  18583. s->secure_rene_count = 0;
  18584. return total;
  18585. }
  18586. /* return the number of renegotiations since wolfSSL_new */
  18587. long wolfSSL_total_renegotiations(WOLFSSL *s)
  18588. {
  18589. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  18590. return wolfSSL_num_renegotiations(s);
  18591. }
  18592. /* return the number of renegotiations since wolfSSL_new */
  18593. long wolfSSL_num_renegotiations(WOLFSSL* s)
  18594. {
  18595. if (s == NULL) {
  18596. return 0;
  18597. }
  18598. return s->secure_rene_count;
  18599. }
  18600. /* Is there a renegotiation currently in progress? */
  18601. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  18602. {
  18603. return s && s->options.handShakeDone &&
  18604. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  18605. }
  18606. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  18607. #ifdef OPENSSL_EXTRA
  18608. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  18609. {
  18610. WOLFSSL_ENTER("wolfSSL_clear_options");
  18611. if(ssl == NULL)
  18612. return WOLFSSL_FAILURE;
  18613. ssl->options.mask &= ~opt;
  18614. return ssl->options.mask;
  18615. }
  18616. #ifdef HAVE_PK_CALLBACKS
  18617. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  18618. {
  18619. if (ssl == NULL) {
  18620. return WOLFSSL_FAILURE;
  18621. }
  18622. ssl->loggingCtx = arg;
  18623. return WOLFSSL_SUCCESS;
  18624. }
  18625. #endif /* HAVE_PK_CALLBACKS */
  18626. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  18627. const unsigned char *wolfSSL_SESSION_get0_id_context(
  18628. const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  18629. {
  18630. return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  18631. }
  18632. int wolfSSL_SESSION_set1_id(WOLFSSL_SESSION *s,
  18633. const unsigned char *sid, unsigned int sid_len)
  18634. {
  18635. if (s == NULL) {
  18636. return WOLFSSL_FAILURE;
  18637. }
  18638. if (sid_len > ID_LEN) {
  18639. return WOLFSSL_FAILURE;
  18640. }
  18641. s->sessionIDSz = sid_len;
  18642. if (sid != s->sessionID) {
  18643. XMEMCPY(s->sessionID, sid, sid_len);
  18644. }
  18645. return WOLFSSL_SUCCESS;
  18646. }
  18647. int wolfSSL_SESSION_set1_id_context(WOLFSSL_SESSION *s,
  18648. const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  18649. {
  18650. if (s == NULL) {
  18651. return WOLFSSL_FAILURE;
  18652. }
  18653. if (sid_ctx_len > ID_LEN) {
  18654. return WOLFSSL_FAILURE;
  18655. }
  18656. s->sessionCtxSz = sid_ctx_len;
  18657. if (sid_ctx != s->sessionCtx) {
  18658. XMEMCPY(s->sessionCtx, sid_ctx, sid_ctx_len);
  18659. }
  18660. return WOLFSSL_SUCCESS;
  18661. }
  18662. #endif
  18663. /*** TBD ***/
  18664. #ifndef NO_WOLFSSL_STUB
  18665. int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  18666. {
  18667. (void)st;
  18668. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  18669. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  18670. return WOLFSSL_FAILURE;
  18671. }
  18672. #endif
  18673. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  18674. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  18675. {
  18676. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  18677. if (s == NULL){
  18678. return BAD_FUNC_ARG;
  18679. }
  18680. if (type == TLSEXT_STATUSTYPE_ocsp){
  18681. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  18682. s->heap, s->devId);
  18683. return (long)r;
  18684. } else {
  18685. WOLFSSL_MSG(
  18686. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  18687. return WOLFSSL_FAILURE;
  18688. }
  18689. }
  18690. long wolfSSL_get_tlsext_status_type(WOLFSSL *s)
  18691. {
  18692. TLSX* extension;
  18693. if (s == NULL)
  18694. return WOLFSSL_FATAL_ERROR;
  18695. extension = TLSX_Find(s->extensions, TLSX_STATUS_REQUEST);
  18696. return extension != NULL ? TLSEXT_STATUSTYPE_ocsp : WOLFSSL_FATAL_ERROR;
  18697. }
  18698. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  18699. #ifndef NO_WOLFSSL_STUB
  18700. long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  18701. {
  18702. (void)s;
  18703. (void)arg;
  18704. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  18705. return WOLFSSL_FAILURE;
  18706. }
  18707. #endif
  18708. /*** TBD ***/
  18709. #ifndef NO_WOLFSSL_STUB
  18710. long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  18711. {
  18712. (void)s;
  18713. (void)arg;
  18714. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  18715. return WOLFSSL_FAILURE;
  18716. }
  18717. #endif
  18718. /*** TBD ***/
  18719. #ifndef NO_WOLFSSL_STUB
  18720. long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  18721. {
  18722. (void)s;
  18723. (void)arg;
  18724. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  18725. return WOLFSSL_FAILURE;
  18726. }
  18727. #endif
  18728. /*** TBD ***/
  18729. #ifndef NO_WOLFSSL_STUB
  18730. long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  18731. {
  18732. (void)s;
  18733. (void)arg;
  18734. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  18735. return WOLFSSL_FAILURE;
  18736. }
  18737. #endif
  18738. #ifndef NO_WOLFSSL_STUB
  18739. /*** TBD ***/
  18740. WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  18741. {
  18742. (void)ssl;
  18743. WOLFSSL_STUB("SSL_get_privatekey");
  18744. return NULL;
  18745. }
  18746. #endif
  18747. #ifndef NO_WOLFSSL_STUB
  18748. /*** TBD ***/
  18749. void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx,
  18750. WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  18751. {
  18752. (void)ctx;
  18753. (void)dh;
  18754. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  18755. }
  18756. #endif
  18757. #ifndef NO_WOLFSSL_STUB
  18758. /*** TBD ***/
  18759. WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  18760. {
  18761. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  18762. return NULL;
  18763. }
  18764. #endif
  18765. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  18766. {
  18767. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  18768. if (p == NULL) {
  18769. return WOLFSSL_FATAL_ERROR;
  18770. }
  18771. return (int)p->num;
  18772. }
  18773. WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  18774. {
  18775. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  18776. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  18777. }
  18778. #if !defined(NETOS)
  18779. void ERR_load_SSL_strings(void)
  18780. {
  18781. }
  18782. #endif
  18783. #ifdef HAVE_OCSP
  18784. long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  18785. {
  18786. if (s == NULL || resp == NULL)
  18787. return 0;
  18788. *resp = s->ocspResp;
  18789. return s->ocspRespSz;
  18790. }
  18791. long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp,
  18792. int len)
  18793. {
  18794. if (s == NULL)
  18795. return WOLFSSL_FAILURE;
  18796. s->ocspResp = resp;
  18797. s->ocspRespSz = len;
  18798. return WOLFSSL_SUCCESS;
  18799. }
  18800. #endif /* HAVE_OCSP */
  18801. #ifdef HAVE_MAX_FRAGMENT
  18802. #ifndef NO_WOLFSSL_CLIENT
  18803. /**
  18804. * Set max fragment tls extension
  18805. * @param c a pointer to WOLFSSL_CTX object
  18806. * @param mode maximum fragment length mode
  18807. * @return 1 on success, otherwise 0 or negative error code
  18808. */
  18809. int wolfSSL_CTX_set_tlsext_max_fragment_length(WOLFSSL_CTX *c,
  18810. unsigned char mode)
  18811. {
  18812. if (c == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  18813. return BAD_FUNC_ARG;
  18814. return wolfSSL_CTX_UseMaxFragment(c, mode);
  18815. }
  18816. /**
  18817. * Set max fragment tls extension
  18818. * @param c a pointer to WOLFSSL object
  18819. * @param mode maximum fragment length mode
  18820. * @return 1 on success, otherwise 0 or negative error code
  18821. */
  18822. int wolfSSL_set_tlsext_max_fragment_length(WOLFSSL *s, unsigned char mode)
  18823. {
  18824. if (s == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  18825. return BAD_FUNC_ARG;
  18826. return wolfSSL_UseMaxFragment(s, mode);
  18827. }
  18828. #endif /* NO_WOLFSSL_CLIENT */
  18829. #endif /* HAVE_MAX_FRAGMENT */
  18830. #endif /* OPENSSL_EXTRA */
  18831. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  18832. size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  18833. {
  18834. byte len = 0;
  18835. WOLFSSL_ENTER("wolfSSL_get_finished");
  18836. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  18837. WOLFSSL_MSG("Bad parameter");
  18838. return WOLFSSL_FAILURE;
  18839. }
  18840. if (ssl->options.side == WOLFSSL_SERVER_END) {
  18841. len = ssl->serverFinished_len;
  18842. XMEMCPY(buf, ssl->serverFinished, len);
  18843. }
  18844. else {
  18845. len = ssl->clientFinished_len;
  18846. XMEMCPY(buf, ssl->clientFinished, len);
  18847. }
  18848. return len;
  18849. }
  18850. size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  18851. {
  18852. byte len = 0;
  18853. WOLFSSL_ENTER("wolfSSL_get_peer_finished");
  18854. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  18855. WOLFSSL_MSG("Bad parameter");
  18856. return WOLFSSL_FAILURE;
  18857. }
  18858. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18859. len = ssl->serverFinished_len;
  18860. XMEMCPY(buf, ssl->serverFinished, len);
  18861. }
  18862. else {
  18863. len = ssl->clientFinished_len;
  18864. XMEMCPY(buf, ssl->clientFinished, len);
  18865. }
  18866. return len;
  18867. }
  18868. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  18869. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  18870. defined(OPENSSL_ALL)
  18871. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  18872. {
  18873. if (ssl == NULL) {
  18874. return WOLFSSL_FAILURE;
  18875. }
  18876. return ssl->peerVerifyRet;
  18877. }
  18878. #endif
  18879. #ifdef OPENSSL_EXTRA
  18880. #ifndef NO_WOLFSSL_STUB
  18881. /* shows the number of accepts attempted by CTX in it's lifetime */
  18882. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  18883. {
  18884. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  18885. (void)ctx;
  18886. return 0;
  18887. }
  18888. #endif
  18889. #ifndef NO_WOLFSSL_STUB
  18890. /* shows the number of connects attempted CTX in it's lifetime */
  18891. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  18892. {
  18893. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  18894. (void)ctx;
  18895. return 0;
  18896. }
  18897. #endif
  18898. #ifndef NO_WOLFSSL_STUB
  18899. /* shows the number of accepts completed by CTX in it's lifetime */
  18900. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  18901. {
  18902. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  18903. (void)ctx;
  18904. return 0;
  18905. }
  18906. #endif
  18907. #ifndef NO_WOLFSSL_STUB
  18908. /* shows the number of connects completed by CTX in it's lifetime */
  18909. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  18910. {
  18911. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  18912. (void)ctx;
  18913. return 0;
  18914. }
  18915. #endif
  18916. #ifndef NO_WOLFSSL_STUB
  18917. /* shows the number of renegotiation accepts attempted by CTX */
  18918. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  18919. {
  18920. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  18921. (void)ctx;
  18922. return 0;
  18923. }
  18924. #endif
  18925. #ifndef NO_WOLFSSL_STUB
  18926. /* shows the number of renegotiation accepts attempted by CTX */
  18927. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  18928. {
  18929. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  18930. (void)ctx;
  18931. return 0;
  18932. }
  18933. #endif
  18934. #ifndef NO_WOLFSSL_STUB
  18935. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  18936. {
  18937. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  18938. (void)ctx;
  18939. return 0;
  18940. }
  18941. #endif
  18942. #ifndef NO_WOLFSSL_STUB
  18943. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  18944. {
  18945. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  18946. (void)ctx;
  18947. return 0;
  18948. }
  18949. #endif
  18950. #ifndef NO_WOLFSSL_STUB
  18951. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  18952. {
  18953. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  18954. (void)ctx;
  18955. return 0;
  18956. }
  18957. #endif
  18958. #ifndef NO_WOLFSSL_STUB
  18959. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  18960. {
  18961. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  18962. (void)ctx;
  18963. return 0;
  18964. }
  18965. #endif
  18966. #ifndef NO_WOLFSSL_STUB
  18967. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  18968. {
  18969. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  18970. (void)ctx;
  18971. return 0;
  18972. }
  18973. #endif
  18974. /* Return the total number of sessions */
  18975. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  18976. {
  18977. word32 total = 0;
  18978. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  18979. (void)ctx;
  18980. #if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE)
  18981. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  18982. WOLFSSL_MSG("Error getting session stats");
  18983. }
  18984. #else
  18985. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  18986. #endif
  18987. return (long)total;
  18988. }
  18989. #ifndef NO_CERTS
  18990. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  18991. {
  18992. byte* chain = NULL;
  18993. int derSz;
  18994. const byte* der;
  18995. int ret;
  18996. DerBuffer *derBuffer = NULL;
  18997. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  18998. if (ctx == NULL || x509 == NULL) {
  18999. WOLFSSL_MSG("Bad Argument");
  19000. return WOLFSSL_FAILURE;
  19001. }
  19002. der = wolfSSL_X509_get_der(x509, &derSz);
  19003. if (der == NULL || derSz <= 0) {
  19004. WOLFSSL_MSG("Error getting X509 DER");
  19005. return WOLFSSL_FAILURE;
  19006. }
  19007. if (ctx->certificate == NULL) {
  19008. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  19009. /* Process buffer makes first certificate the leaf. */
  19010. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  19011. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  19012. if (ret != WOLFSSL_SUCCESS) {
  19013. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  19014. return WOLFSSL_FAILURE;
  19015. }
  19016. }
  19017. else {
  19018. long chainSz = 0;
  19019. int idx = 0;
  19020. /* TODO: Do this elsewhere. */
  19021. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  19022. if (ret != 0) {
  19023. WOLFSSL_MSG("Memory Error");
  19024. return WOLFSSL_FAILURE;
  19025. }
  19026. XMEMCPY(derBuffer->buffer, der, derSz);
  19027. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  19028. GET_VERIFY_SETTING_CTX(ctx));
  19029. if (ret != WOLFSSL_SUCCESS) {
  19030. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  19031. return WOLFSSL_FAILURE;
  19032. }
  19033. /* adding cert to existing chain */
  19034. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  19035. chainSz += ctx->certChain->length;
  19036. }
  19037. chainSz += OPAQUE24_LEN + derSz;
  19038. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  19039. if (chain == NULL) {
  19040. WOLFSSL_MSG("Memory Error");
  19041. return WOLFSSL_FAILURE;
  19042. }
  19043. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  19044. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  19045. idx = ctx->certChain->length;
  19046. }
  19047. c32to24(derSz, chain + idx);
  19048. idx += OPAQUE24_LEN;
  19049. XMEMCPY(chain + idx, der, derSz);
  19050. idx += derSz;
  19051. #ifdef WOLFSSL_TLS13
  19052. ctx->certChainCnt++;
  19053. #endif
  19054. FreeDer(&ctx->certChain);
  19055. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  19056. if (ret == 0) {
  19057. XMEMCPY(ctx->certChain->buffer, chain, idx);
  19058. }
  19059. }
  19060. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  19061. wolfSSL_X509_free(x509);
  19062. if (chain != NULL)
  19063. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  19064. return WOLFSSL_SUCCESS;
  19065. }
  19066. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  19067. {
  19068. if (ctx == NULL || ctx->cm == NULL) {
  19069. return WOLFSSL_FAILURE;
  19070. }
  19071. ctx->cm->ocspIOCtx = arg;
  19072. return WOLFSSL_SUCCESS;
  19073. }
  19074. #endif /* !NO_CERTS */
  19075. int wolfSSL_get_read_ahead(const WOLFSSL* ssl)
  19076. {
  19077. if (ssl == NULL) {
  19078. return WOLFSSL_FAILURE;
  19079. }
  19080. return ssl->readAhead;
  19081. }
  19082. int wolfSSL_set_read_ahead(WOLFSSL* ssl, int v)
  19083. {
  19084. if (ssl == NULL) {
  19085. return WOLFSSL_FAILURE;
  19086. }
  19087. ssl->readAhead = (byte)v;
  19088. return WOLFSSL_SUCCESS;
  19089. }
  19090. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  19091. {
  19092. if (ctx == NULL) {
  19093. return WOLFSSL_FAILURE;
  19094. }
  19095. return ctx->readAhead;
  19096. }
  19097. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  19098. {
  19099. if (ctx == NULL) {
  19100. return WOLFSSL_FAILURE;
  19101. }
  19102. ctx->readAhead = (byte)v;
  19103. return WOLFSSL_SUCCESS;
  19104. }
  19105. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  19106. void* arg)
  19107. {
  19108. if (ctx == NULL) {
  19109. return WOLFSSL_FAILURE;
  19110. }
  19111. ctx->userPRFArg = arg;
  19112. return WOLFSSL_SUCCESS;
  19113. }
  19114. #endif /* OPENSSL_EXTRA */
  19115. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19116. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  19117. {
  19118. WOLFSSL_ENTER("wolfSSL_sk_num");
  19119. if (sk == NULL)
  19120. return 0;
  19121. return (int)sk->num;
  19122. }
  19123. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  19124. {
  19125. WOLFSSL_ENTER("wolfSSL_sk_value");
  19126. for (; sk != NULL && i > 0; i--)
  19127. sk = sk->next;
  19128. if (sk == NULL)
  19129. return NULL;
  19130. switch (sk->type) {
  19131. case STACK_TYPE_X509:
  19132. return (void*)sk->data.x509;
  19133. case STACK_TYPE_GEN_NAME:
  19134. return (void*)sk->data.gn;
  19135. case STACK_TYPE_BIO:
  19136. return (void*)sk->data.bio;
  19137. case STACK_TYPE_OBJ:
  19138. return (void*)sk->data.obj;
  19139. case STACK_TYPE_STRING:
  19140. return (void*)sk->data.string;
  19141. case STACK_TYPE_CIPHER:
  19142. return (void*)&sk->data.cipher;
  19143. case STACK_TYPE_ACCESS_DESCRIPTION:
  19144. return (void*)sk->data.access;
  19145. case STACK_TYPE_X509_EXT:
  19146. return (void*)sk->data.ext;
  19147. case STACK_TYPE_X509_REQ_ATTR:
  19148. return (void*)sk->data.generic;
  19149. case STACK_TYPE_NULL:
  19150. return (void*)sk->data.generic;
  19151. case STACK_TYPE_X509_NAME:
  19152. return (void*)sk->data.name;
  19153. case STACK_TYPE_X509_NAME_ENTRY:
  19154. return (void*)sk->data.name_entry;
  19155. case STACK_TYPE_CONF_VALUE:
  19156. #ifdef OPENSSL_EXTRA
  19157. return (void*)sk->data.conf;
  19158. #else
  19159. return NULL;
  19160. #endif
  19161. case STACK_TYPE_X509_INFO:
  19162. return (void*)sk->data.info;
  19163. case STACK_TYPE_BY_DIR_entry:
  19164. return (void*)sk->data.dir_entry;
  19165. case STACK_TYPE_BY_DIR_hash:
  19166. return (void*)sk->data.dir_hash;
  19167. case STACK_TYPE_X509_OBJ:
  19168. return (void*)sk->data.x509_obj;
  19169. case STACK_TYPE_DIST_POINT:
  19170. return (void*)sk->data.dp;
  19171. case STACK_TYPE_X509_CRL:
  19172. return (void*)sk->data.crl;
  19173. default:
  19174. return (void*)sk->data.generic;
  19175. }
  19176. }
  19177. /* copies over data of "in" to "out" */
  19178. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  19179. {
  19180. if (in == NULL || out == NULL)
  19181. return;
  19182. *out = *in;
  19183. }
  19184. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  19185. {
  19186. WOLFSSL_STACK* ret = NULL;
  19187. WOLFSSL_STACK* last = NULL;
  19188. WOLFSSL_ENTER("wolfSSL_sk_dup");
  19189. while (sk) {
  19190. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  19191. if (!cur) {
  19192. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  19193. goto error;
  19194. }
  19195. if (!ret) {
  19196. /* Set first node */
  19197. ret = cur;
  19198. }
  19199. if (last) {
  19200. last->next = cur;
  19201. }
  19202. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  19203. /* We will allocate new memory for this */
  19204. XMEMSET(&cur->data, 0, sizeof(cur->data));
  19205. cur->next = NULL;
  19206. switch (sk->type) {
  19207. case STACK_TYPE_X509:
  19208. if (!sk->data.x509)
  19209. break;
  19210. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  19211. if (!cur->data.x509) {
  19212. WOLFSSL_MSG("wolfSSL_X509_dup error");
  19213. goto error;
  19214. }
  19215. break;
  19216. case STACK_TYPE_CIPHER:
  19217. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  19218. break;
  19219. case STACK_TYPE_GEN_NAME:
  19220. if (!sk->data.gn)
  19221. break;
  19222. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  19223. if (!cur->data.gn) {
  19224. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  19225. goto error;
  19226. }
  19227. break;
  19228. case STACK_TYPE_OBJ:
  19229. if (!sk->data.obj)
  19230. break;
  19231. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  19232. if (!cur->data.obj) {
  19233. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  19234. goto error;
  19235. }
  19236. break;
  19237. case STACK_TYPE_BIO:
  19238. case STACK_TYPE_STRING:
  19239. case STACK_TYPE_ACCESS_DESCRIPTION:
  19240. case STACK_TYPE_X509_EXT:
  19241. case STACK_TYPE_X509_REQ_ATTR:
  19242. case STACK_TYPE_NULL:
  19243. case STACK_TYPE_X509_NAME:
  19244. case STACK_TYPE_X509_NAME_ENTRY:
  19245. case STACK_TYPE_CONF_VALUE:
  19246. case STACK_TYPE_X509_INFO:
  19247. case STACK_TYPE_BY_DIR_entry:
  19248. case STACK_TYPE_BY_DIR_hash:
  19249. case STACK_TYPE_X509_OBJ:
  19250. case STACK_TYPE_DIST_POINT:
  19251. case STACK_TYPE_X509_CRL:
  19252. default:
  19253. WOLFSSL_MSG("Unsupported stack type");
  19254. goto error;
  19255. }
  19256. sk = sk->next;
  19257. last = cur;
  19258. }
  19259. return ret;
  19260. error:
  19261. if (ret) {
  19262. wolfSSL_sk_GENERAL_NAME_free(ret);
  19263. }
  19264. return NULL;
  19265. }
  19266. WOLFSSL_STACK* wolfSSL_shallow_sk_dup(WOLFSSL_STACK* sk)
  19267. {
  19268. WOLFSSL_STACK* ret = NULL;
  19269. WOLFSSL_STACK** prev = &ret;
  19270. WOLFSSL_ENTER("wolfSSL_shallow_sk_dup");
  19271. for (; sk != NULL; sk = sk->next) {
  19272. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  19273. if (!cur) {
  19274. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  19275. goto error;
  19276. }
  19277. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  19278. cur->next = NULL;
  19279. *prev = cur;
  19280. prev = &cur->next;
  19281. }
  19282. return ret;
  19283. error:
  19284. if (ret) {
  19285. wolfSSL_sk_free(ret);
  19286. }
  19287. return NULL;
  19288. }
  19289. /* Free the just the stack structure */
  19290. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  19291. {
  19292. WOLFSSL_ENTER("wolfSSL_sk_free");
  19293. while (sk != NULL) {
  19294. WOLFSSL_STACK* next = sk->next;
  19295. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  19296. sk = next;
  19297. }
  19298. }
  19299. /* Frees each node in the stack and frees the stack.
  19300. */
  19301. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  19302. void (*f) (void*))
  19303. {
  19304. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  19305. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  19306. }
  19307. /* return 1 on success 0 on fail */
  19308. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  19309. {
  19310. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  19311. return wolfSSL_sk_push(sk, generic);
  19312. }
  19313. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  19314. {
  19315. wolfSSL_sk_free(sk);
  19316. }
  19317. /* Pop off data from the stack. Checks that the type matches the stack type.
  19318. *
  19319. * @param [in, out] sk Stack of objects.
  19320. * @param [in] type Type of stack.
  19321. * @return Object on success.
  19322. * @return NULL when stack is NULL or no nodes left in stack.
  19323. */
  19324. void* wolfssl_sk_pop_type(WOLFSSL_STACK* sk, WOLF_STACK_TYPE type)
  19325. {
  19326. WOLFSSL_STACK* node;
  19327. void* data = NULL;
  19328. /* Check we have a stack passed in of the right type. */
  19329. if ((sk != NULL) && (sk->type == type)) {
  19330. /* Get the next node to become the new first node. */
  19331. node = sk->next;
  19332. /* Get the ASN.1 OBJECT_ID object in the first node. */
  19333. data = sk->data.generic;
  19334. /* Check whether there is a next node. */
  19335. if (node != NULL) {
  19336. /* Move content out of next node into current node. */
  19337. sk->data.obj = node->data.obj;
  19338. sk->next = node->next;
  19339. /* Dispose of node. */
  19340. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  19341. }
  19342. else {
  19343. /* No more nodes - clear out data. */
  19344. sk->data.obj = NULL;
  19345. }
  19346. /* Decrement count as long as we thought we had nodes. */
  19347. if (sk->num > 0) {
  19348. sk->num -= 1;
  19349. }
  19350. }
  19351. return data;
  19352. }
  19353. /* Free all nodes in a stack including the pushed objects */
  19354. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  19355. wolfSSL_sk_freefunc func)
  19356. {
  19357. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  19358. if (sk == NULL) {
  19359. /* pop_free can be called with NULL, do not print bad argument */
  19360. return;
  19361. }
  19362. #if defined(WOLFSSL_QT)
  19363. /* In Qt v15.5, it calls OPENSSL_sk_free(xxx, OPENSSL_sk_free).
  19364. * By using OPENSSL_sk_free for free causes access violation.
  19365. * Therefore, switching free func to wolfSSL_ACCESS_DESCRIPTION_free
  19366. * is needed even the func isn't NULL.
  19367. */
  19368. if (sk->type == STACK_TYPE_ACCESS_DESCRIPTION) {
  19369. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  19370. }
  19371. #endif
  19372. if (func == NULL) {
  19373. switch(sk->type) {
  19374. case STACK_TYPE_ACCESS_DESCRIPTION:
  19375. #if defined(OPENSSL_ALL)
  19376. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  19377. #endif
  19378. break;
  19379. case STACK_TYPE_X509:
  19380. func = (wolfSSL_sk_freefunc)wolfSSL_X509_free;
  19381. break;
  19382. case STACK_TYPE_X509_OBJ:
  19383. #ifdef OPENSSL_ALL
  19384. func = (wolfSSL_sk_freefunc)wolfSSL_X509_OBJECT_free;
  19385. #endif
  19386. break;
  19387. case STACK_TYPE_OBJ:
  19388. func = (wolfSSL_sk_freefunc)wolfSSL_ASN1_OBJECT_free;
  19389. break;
  19390. case STACK_TYPE_DIST_POINT:
  19391. #ifdef OPENSSL_EXTRA
  19392. func = (wolfSSL_sk_freefunc)wolfSSL_DIST_POINT_free;
  19393. #endif
  19394. break;
  19395. case STACK_TYPE_GEN_NAME:
  19396. func = (wolfSSL_sk_freefunc)wolfSSL_GENERAL_NAME_free;
  19397. break;
  19398. case STACK_TYPE_STRING:
  19399. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  19400. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  19401. func = (wolfSSL_sk_freefunc)wolfSSL_WOLFSSL_STRING_free;
  19402. #endif
  19403. break;
  19404. case STACK_TYPE_X509_NAME:
  19405. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  19406. && !defined(WOLFCRYPT_ONLY)
  19407. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_free;
  19408. #endif
  19409. break;
  19410. case STACK_TYPE_X509_NAME_ENTRY:
  19411. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  19412. && !defined(WOLFCRYPT_ONLY)
  19413. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_ENTRY_free;
  19414. #endif
  19415. break;
  19416. case STACK_TYPE_X509_EXT:
  19417. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  19418. func = (wolfSSL_sk_freefunc)wolfSSL_X509_EXTENSION_free;
  19419. #endif
  19420. break;
  19421. case STACK_TYPE_X509_REQ_ATTR:
  19422. #if defined(OPENSSL_ALL) && \
  19423. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  19424. func = (wolfSSL_sk_freefunc)wolfSSL_X509_ATTRIBUTE_free;
  19425. #endif
  19426. break;
  19427. case STACK_TYPE_CONF_VALUE:
  19428. #if defined(OPENSSL_ALL)
  19429. func = (wolfSSL_sk_freefunc)wolfSSL_X509V3_conf_free;
  19430. #endif
  19431. break;
  19432. case STACK_TYPE_X509_INFO:
  19433. #if defined(OPENSSL_ALL)
  19434. func = (wolfSSL_sk_freefunc)wolfSSL_X509_INFO_free;
  19435. #endif
  19436. break;
  19437. case STACK_TYPE_BIO:
  19438. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  19439. func = (wolfSSL_sk_freefunc)wolfSSL_BIO_vfree;
  19440. #endif
  19441. break;
  19442. case STACK_TYPE_BY_DIR_entry:
  19443. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  19444. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_entry_free;
  19445. #endif
  19446. break;
  19447. case STACK_TYPE_BY_DIR_hash:
  19448. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  19449. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_HASH_free;
  19450. #endif
  19451. break;
  19452. case STACK_TYPE_X509_CRL:
  19453. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  19454. func = (wolfSSL_sk_freefunc)wolfSSL_X509_CRL_free;
  19455. #endif
  19456. break;
  19457. case STACK_TYPE_CIPHER:
  19458. case STACK_TYPE_NULL:
  19459. default:
  19460. break;
  19461. }
  19462. }
  19463. while (sk != NULL) {
  19464. WOLFSSL_STACK* next = sk->next;
  19465. if (func != NULL) {
  19466. if (sk->type != STACK_TYPE_CIPHER)
  19467. func(sk->data.generic);
  19468. }
  19469. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  19470. sk = next;
  19471. }
  19472. }
  19473. /* Creates a new stack of the requested type.
  19474. *
  19475. * @param [in] type Type of stack.
  19476. * @return Empty stack on success.
  19477. * @return NULL when dynamic memory allocation fails.
  19478. */
  19479. WOLFSSL_STACK* wolfssl_sk_new_type(WOLF_STACK_TYPE type)
  19480. {
  19481. WOLFSSL_STACK* sk;
  19482. /* Allocate a new stack - first node. */
  19483. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  19484. DYNAMIC_TYPE_OPENSSL);
  19485. if (sk == NULL) {
  19486. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  19487. }
  19488. else {
  19489. /* Clear node and set type. */
  19490. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  19491. sk->type = type;
  19492. }
  19493. return sk;
  19494. }
  19495. /* Creates and returns a new null stack. */
  19496. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  19497. {
  19498. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  19499. return wolfssl_sk_new_type(STACK_TYPE_NULL);
  19500. }
  19501. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  19502. {
  19503. if (sk == NULL)
  19504. return 0;
  19505. return (int)sk->num;
  19506. }
  19507. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19508. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  19509. defined(HAVE_EXT_CACHE))
  19510. /* stunnel 4.28 needs
  19511. *
  19512. * Callback that is called if a session tries to resume but could not find
  19513. * the session to resume it.
  19514. */
  19515. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  19516. WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*))
  19517. {
  19518. if (ctx == NULL)
  19519. return;
  19520. #ifdef HAVE_EXT_CACHE
  19521. ctx->get_sess_cb = f;
  19522. #else
  19523. (void)f;
  19524. #endif
  19525. }
  19526. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  19527. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  19528. {
  19529. if (ctx == NULL)
  19530. return;
  19531. #ifdef HAVE_EXT_CACHE
  19532. ctx->new_sess_cb = f;
  19533. #else
  19534. (void)f;
  19535. #endif
  19536. }
  19537. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  19538. WOLFSSL_SESSION*))
  19539. {
  19540. if (ctx == NULL)
  19541. return;
  19542. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  19543. ctx->rem_sess_cb = f;
  19544. #else
  19545. (void)f;
  19546. #endif
  19547. }
  19548. /*
  19549. *
  19550. * Note: It is expected that the importing and exporting function have been
  19551. * built with the same settings. For example if session tickets was
  19552. * enabled with the wolfSSL library exporting a session then it is
  19553. * expected to be turned on with the wolfSSL library importing the session.
  19554. */
  19555. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  19556. {
  19557. int size = 0;
  19558. #ifdef HAVE_EXT_CACHE
  19559. int idx = 0;
  19560. #ifdef SESSION_CERTS
  19561. int i;
  19562. #endif
  19563. WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION");
  19564. sess = ClientSessionToSession(sess);
  19565. if (sess == NULL) {
  19566. return BAD_FUNC_ARG;
  19567. }
  19568. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  19569. * haveEMS */
  19570. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  19571. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  19572. /* altSessionID */
  19573. size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0);
  19574. #ifdef SESSION_CERTS
  19575. /* Peer chain */
  19576. size += OPAQUE8_LEN;
  19577. for (i = 0; i < sess->chain.count; i++)
  19578. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  19579. #endif
  19580. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  19581. defined(HAVE_SESSION_TICKET))
  19582. /* Protocol version */
  19583. size += OPAQUE16_LEN;
  19584. #endif
  19585. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  19586. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  19587. /* cipher suite */
  19588. size += OPAQUE16_LEN;
  19589. #endif
  19590. #ifndef NO_CLIENT_CACHE
  19591. /* ServerID len | ServerID */
  19592. size += OPAQUE16_LEN + sess->idLen;
  19593. #endif
  19594. #ifdef OPENSSL_EXTRA
  19595. /* session context ID len | session context ID */
  19596. size += OPAQUE8_LEN + sess->sessionCtxSz;
  19597. #endif
  19598. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19599. /* peerVerifyRet */
  19600. size += OPAQUE8_LEN;
  19601. #endif
  19602. #ifdef WOLFSSL_TLS13
  19603. /* namedGroup */
  19604. size += OPAQUE16_LEN;
  19605. #endif
  19606. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  19607. #ifdef WOLFSSL_TLS13
  19608. #ifdef WOLFSSL_32BIT_MILLI_TIME
  19609. /* ticketSeen | ticketAdd */
  19610. size += OPAQUE32_LEN + OPAQUE32_LEN;
  19611. #else
  19612. /* ticketSeen Hi 32 bits | ticketSeen Lo 32 bits | ticketAdd */
  19613. size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE32_LEN;
  19614. #endif
  19615. /* ticketNonce */
  19616. size += OPAQUE8_LEN + sess->ticketNonce.len;
  19617. #endif
  19618. #ifdef WOLFSSL_EARLY_DATA
  19619. size += OPAQUE32_LEN;
  19620. #endif
  19621. #endif
  19622. #ifdef HAVE_SESSION_TICKET
  19623. /* ticket len | ticket */
  19624. size += OPAQUE16_LEN + sess->ticketLen;
  19625. #endif
  19626. if (p != NULL) {
  19627. unsigned char *data;
  19628. if (*p == NULL)
  19629. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  19630. if (*p == NULL)
  19631. return 0;
  19632. data = *p;
  19633. data[idx++] = sess->side;
  19634. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  19635. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  19636. data[idx++] = sess->sessionIDSz;
  19637. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  19638. idx += sess->sessionIDSz;
  19639. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  19640. data[idx++] = (byte)sess->haveEMS;
  19641. data[idx++] = sess->haveAltSessionID ? ID_LEN : 0;
  19642. if (sess->haveAltSessionID) {
  19643. XMEMCPY(data + idx, sess->altSessionID, ID_LEN);
  19644. idx += ID_LEN;
  19645. }
  19646. #ifdef SESSION_CERTS
  19647. data[idx++] = (byte)sess->chain.count;
  19648. for (i = 0; i < sess->chain.count; i++) {
  19649. c16toa((word16)sess->chain.certs[i].length, data + idx);
  19650. idx += OPAQUE16_LEN;
  19651. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  19652. sess->chain.certs[i].length);
  19653. idx += sess->chain.certs[i].length;
  19654. }
  19655. #endif
  19656. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  19657. defined(HAVE_SESSION_TICKET))
  19658. data[idx++] = sess->version.major;
  19659. data[idx++] = sess->version.minor;
  19660. #endif
  19661. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  19662. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  19663. data[idx++] = sess->cipherSuite0;
  19664. data[idx++] = sess->cipherSuite;
  19665. #endif
  19666. #ifndef NO_CLIENT_CACHE
  19667. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  19668. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  19669. idx += sess->idLen;
  19670. #endif
  19671. #ifdef OPENSSL_EXTRA
  19672. data[idx++] = sess->sessionCtxSz;
  19673. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  19674. idx += sess->sessionCtxSz;
  19675. #endif
  19676. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19677. data[idx++] = sess->peerVerifyRet;
  19678. #endif
  19679. #ifdef WOLFSSL_TLS13
  19680. c16toa(sess->namedGroup, data + idx);
  19681. idx += OPAQUE16_LEN;
  19682. #endif
  19683. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  19684. #ifdef WOLFSSL_TLS13
  19685. #ifdef WOLFSSL_32BIT_MILLI_TIME
  19686. c32toa(sess->ticketSeen, data + idx);
  19687. idx += OPAQUE32_LEN;
  19688. #else
  19689. c32toa((word32)(sess->ticketSeen >> 32), data + idx);
  19690. idx += OPAQUE32_LEN;
  19691. c32toa((word32)sess->ticketSeen, data + idx);
  19692. idx += OPAQUE32_LEN;
  19693. #endif
  19694. c32toa(sess->ticketAdd, data + idx);
  19695. idx += OPAQUE32_LEN;
  19696. data[idx++] = sess->ticketNonce.len;
  19697. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  19698. idx += sess->ticketNonce.len;
  19699. #endif
  19700. #ifdef WOLFSSL_EARLY_DATA
  19701. c32toa(sess->maxEarlyDataSz, data + idx);
  19702. idx += OPAQUE32_LEN;
  19703. #endif
  19704. #endif
  19705. #ifdef HAVE_SESSION_TICKET
  19706. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  19707. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  19708. idx += sess->ticketLen;
  19709. #endif
  19710. }
  19711. #endif
  19712. (void)sess;
  19713. (void)p;
  19714. #ifdef HAVE_EXT_CACHE
  19715. (void)idx;
  19716. #endif
  19717. return size;
  19718. }
  19719. /* TODO: no function to free new session.
  19720. *
  19721. * Note: It is expected that the importing and exporting function have been
  19722. * built with the same settings. For example if session tickets was
  19723. * enabled with the wolfSSL library exporting a session then it is
  19724. * expected to be turned on with the wolfSSL library importing the session.
  19725. */
  19726. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  19727. const unsigned char** p, long i)
  19728. {
  19729. WOLFSSL_SESSION* s = NULL;
  19730. int ret = 0;
  19731. #if defined(HAVE_EXT_CACHE)
  19732. int idx;
  19733. byte* data;
  19734. #ifdef SESSION_CERTS
  19735. int j;
  19736. word16 length;
  19737. #endif
  19738. #endif /* HAVE_EXT_CACHE */
  19739. (void)p;
  19740. (void)i;
  19741. (void)ret;
  19742. (void)sess;
  19743. #ifdef HAVE_EXT_CACHE
  19744. if (p == NULL || *p == NULL)
  19745. return NULL;
  19746. s = wolfSSL_SESSION_new();
  19747. if (s == NULL)
  19748. return NULL;
  19749. idx = 0;
  19750. data = (byte*)*p;
  19751. /* side | bornOn | timeout | sessionID len */
  19752. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  19753. ret = BUFFER_ERROR;
  19754. goto end;
  19755. }
  19756. s->side = data[idx++];
  19757. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  19758. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  19759. s->sessionIDSz = data[idx++];
  19760. /* sessionID | secret | haveEMS | haveAltSessionID */
  19761. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) {
  19762. ret = BUFFER_ERROR;
  19763. goto end;
  19764. }
  19765. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  19766. idx += s->sessionIDSz;
  19767. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  19768. s->haveEMS = data[idx++];
  19769. if (data[idx] != ID_LEN && data[idx] != 0) {
  19770. ret = BUFFER_ERROR;
  19771. goto end;
  19772. }
  19773. s->haveAltSessionID = data[idx++] == ID_LEN;
  19774. /* altSessionID */
  19775. if (s->haveAltSessionID) {
  19776. if (i - idx < ID_LEN) {
  19777. ret = BUFFER_ERROR;
  19778. goto end;
  19779. }
  19780. XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN;
  19781. }
  19782. #ifdef SESSION_CERTS
  19783. /* Certificate chain */
  19784. if (i - idx == 0) {
  19785. ret = BUFFER_ERROR;
  19786. goto end;
  19787. }
  19788. s->chain.count = data[idx++];
  19789. for (j = 0; j < s->chain.count; j++) {
  19790. if (i - idx < OPAQUE16_LEN) {
  19791. ret = BUFFER_ERROR;
  19792. goto end;
  19793. }
  19794. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  19795. s->chain.certs[j].length = length;
  19796. if (i - idx < length) {
  19797. ret = BUFFER_ERROR;
  19798. goto end;
  19799. }
  19800. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  19801. idx += length;
  19802. }
  19803. #endif
  19804. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  19805. defined(HAVE_SESSION_TICKET))
  19806. /* Protocol Version */
  19807. if (i - idx < OPAQUE16_LEN) {
  19808. ret = BUFFER_ERROR;
  19809. goto end;
  19810. }
  19811. s->version.major = data[idx++];
  19812. s->version.minor = data[idx++];
  19813. #endif
  19814. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  19815. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  19816. /* Cipher suite */
  19817. if (i - idx < OPAQUE16_LEN) {
  19818. ret = BUFFER_ERROR;
  19819. goto end;
  19820. }
  19821. s->cipherSuite0 = data[idx++];
  19822. s->cipherSuite = data[idx++];
  19823. #endif
  19824. #ifndef NO_CLIENT_CACHE
  19825. /* ServerID len */
  19826. if (i - idx < OPAQUE16_LEN) {
  19827. ret = BUFFER_ERROR;
  19828. goto end;
  19829. }
  19830. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  19831. /* ServerID */
  19832. if (i - idx < s->idLen) {
  19833. ret = BUFFER_ERROR;
  19834. goto end;
  19835. }
  19836. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  19837. #endif
  19838. #ifdef OPENSSL_EXTRA
  19839. /* byte for length of session context ID */
  19840. if (i - idx < OPAQUE8_LEN) {
  19841. ret = BUFFER_ERROR;
  19842. goto end;
  19843. }
  19844. s->sessionCtxSz = data[idx++];
  19845. /* app session context ID */
  19846. if (i - idx < s->sessionCtxSz) {
  19847. ret = BUFFER_ERROR;
  19848. goto end;
  19849. }
  19850. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  19851. #endif
  19852. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19853. /* byte for peerVerifyRet */
  19854. if (i - idx < OPAQUE8_LEN) {
  19855. ret = BUFFER_ERROR;
  19856. goto end;
  19857. }
  19858. s->peerVerifyRet = data[idx++];
  19859. #endif
  19860. #ifdef WOLFSSL_TLS13
  19861. if (i - idx < OPAQUE16_LEN) {
  19862. ret = BUFFER_ERROR;
  19863. goto end;
  19864. }
  19865. ato16(data + idx, &s->namedGroup);
  19866. idx += OPAQUE16_LEN;
  19867. #endif
  19868. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  19869. #ifdef WOLFSSL_TLS13
  19870. if (i - idx < (OPAQUE32_LEN * 2)) {
  19871. ret = BUFFER_ERROR;
  19872. goto end;
  19873. }
  19874. #ifdef WOLFSSL_32BIT_MILLI_TIME
  19875. ato32(data + idx, &s->ticketSeen);
  19876. idx += OPAQUE32_LEN;
  19877. #else
  19878. {
  19879. word32 seenHi, seenLo;
  19880. ato32(data + idx, &seenHi);
  19881. idx += OPAQUE32_LEN;
  19882. ato32(data + idx, &seenLo);
  19883. idx += OPAQUE32_LEN;
  19884. s->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  19885. }
  19886. #endif
  19887. ato32(data + idx, &s->ticketAdd);
  19888. idx += OPAQUE32_LEN;
  19889. if (i - idx < OPAQUE8_LEN) {
  19890. ret = BUFFER_ERROR;
  19891. goto end;
  19892. }
  19893. s->ticketNonce.len = data[idx++];
  19894. if (i - idx < s->ticketNonce.len) {
  19895. ret = BUFFER_ERROR;
  19896. goto end;
  19897. }
  19898. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  19899. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  19900. ret = SessionTicketNoncePopulate(s, data + idx, s->ticketNonce.len);
  19901. if (ret != 0)
  19902. goto end;
  19903. #else
  19904. if (s->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  19905. ret = BUFFER_ERROR;
  19906. goto end;
  19907. }
  19908. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  19909. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  19910. idx += s->ticketNonce.len;
  19911. #endif
  19912. #ifdef WOLFSSL_EARLY_DATA
  19913. if (i - idx < OPAQUE32_LEN) {
  19914. ret = BUFFER_ERROR;
  19915. goto end;
  19916. }
  19917. ato32(data + idx, &s->maxEarlyDataSz);
  19918. idx += OPAQUE32_LEN;
  19919. #endif
  19920. #endif
  19921. #ifdef HAVE_SESSION_TICKET
  19922. /* ticket len */
  19923. if (i - idx < OPAQUE16_LEN) {
  19924. ret = BUFFER_ERROR;
  19925. goto end;
  19926. }
  19927. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  19928. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  19929. if (s->ticketLenAlloc > 0) {
  19930. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  19931. }
  19932. if (s->ticketLen <= SESSION_TICKET_LEN)
  19933. s->ticket = s->staticTicket;
  19934. else {
  19935. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  19936. DYNAMIC_TYPE_SESSION_TICK);
  19937. if (s->ticket == NULL) {
  19938. ret = MEMORY_ERROR;
  19939. goto end;
  19940. }
  19941. s->ticketLenAlloc = (word16)s->ticketLen;
  19942. }
  19943. /* ticket */
  19944. if (i - idx < s->ticketLen) {
  19945. ret = BUFFER_ERROR;
  19946. goto end;
  19947. }
  19948. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  19949. #endif
  19950. (void)idx;
  19951. if (sess != NULL) {
  19952. *sess = s;
  19953. }
  19954. s->isSetup = 1;
  19955. *p += idx;
  19956. end:
  19957. if (ret != 0 && (sess == NULL || *sess != s)) {
  19958. wolfSSL_FreeSession(NULL, s);
  19959. s = NULL;
  19960. }
  19961. #endif /* HAVE_EXT_CACHE */
  19962. return s;
  19963. }
  19964. /* Check if there is a session ticket associated with this WOLFSSL_SESSION.
  19965. *
  19966. * sess - pointer to WOLFSSL_SESSION struct
  19967. *
  19968. * Returns 1 if has session ticket, otherwise 0 */
  19969. int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess)
  19970. {
  19971. WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket");
  19972. #ifdef HAVE_SESSION_TICKET
  19973. sess = ClientSessionToSession(sess);
  19974. if (sess) {
  19975. if ((sess->ticketLen > 0) && (sess->ticket != NULL)) {
  19976. return WOLFSSL_SUCCESS;
  19977. }
  19978. }
  19979. #else
  19980. (void)sess;
  19981. #endif
  19982. return WOLFSSL_FAILURE;
  19983. }
  19984. unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint(
  19985. const WOLFSSL_SESSION* sess)
  19986. {
  19987. WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint");
  19988. sess = ClientSessionToSession(sess);
  19989. if (sess) {
  19990. return sess->timeout;
  19991. }
  19992. return 0;
  19993. }
  19994. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  19995. {
  19996. long timeout = 0;
  19997. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  19998. sess = ClientSessionToSession(sess);
  19999. if (sess)
  20000. timeout = sess->timeout;
  20001. return timeout;
  20002. }
  20003. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  20004. {
  20005. word32 tmptime;
  20006. ses = ClientSessionToSession(ses);
  20007. if (ses == NULL || t < 0) {
  20008. return BAD_FUNC_ARG;
  20009. }
  20010. tmptime = t & 0xFFFFFFFF;
  20011. ses->timeout = tmptime;
  20012. return WOLFSSL_SUCCESS;
  20013. }
  20014. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  20015. {
  20016. long bornOn = 0;
  20017. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  20018. sess = ClientSessionToSession(sess);
  20019. if (sess)
  20020. bornOn = sess->bornOn;
  20021. return bornOn;
  20022. }
  20023. long wolfSSL_SESSION_set_time(WOLFSSL_SESSION *ses, long t)
  20024. {
  20025. ses = ClientSessionToSession(ses);
  20026. if (ses == NULL || t < 0) {
  20027. return 0;
  20028. }
  20029. ses->bornOn = (word32)t;
  20030. return t;
  20031. }
  20032. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  20033. #ifdef OPENSSL_EXTRA
  20034. #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
  20035. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  20036. {
  20037. int ret = WOLFSSL_FATAL_ERROR;
  20038. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  20039. if (ssl != NULL && fname != NULL)
  20040. {
  20041. #ifdef WOLFSSL_SMALL_STACK
  20042. byte staticBuffer[1]; /* force heap usage */
  20043. #else
  20044. byte staticBuffer[FILE_BUFFER_SIZE];
  20045. #endif
  20046. byte* myBuffer = staticBuffer;
  20047. int dynamic = 0;
  20048. XFILE file;
  20049. long sz = 0;
  20050. WOLFSSL_CTX* ctx = ssl->ctx;
  20051. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  20052. DerBuffer* fileDer = NULL;
  20053. file = XFOPEN(fname, "rb");
  20054. if (file == XBADFILE)
  20055. return WOLFSSL_BAD_FILE;
  20056. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  20057. XFCLOSE(file);
  20058. return WOLFSSL_BAD_FILE;
  20059. }
  20060. sz = XFTELL(file);
  20061. if (XFSEEK(file, 0, XSEEK_SET) != 0) {
  20062. XFCLOSE(file);
  20063. return WOLFSSL_BAD_FILE;
  20064. }
  20065. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  20066. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  20067. XFCLOSE(file);
  20068. return WOLFSSL_BAD_FILE;
  20069. }
  20070. if (sz > (long)sizeof(staticBuffer)) {
  20071. WOLFSSL_MSG("Getting dynamic buffer");
  20072. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  20073. dynamic = 1;
  20074. }
  20075. if ((myBuffer != NULL) &&
  20076. (sz > 0) &&
  20077. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  20078. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  20079. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  20080. (fileDer->length != 0) &&
  20081. (fileDer->length == peer_cert->derCert->length) &&
  20082. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  20083. fileDer->length) == 0))
  20084. {
  20085. ret = 0;
  20086. }
  20087. FreeDer(&fileDer);
  20088. if (dynamic)
  20089. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  20090. XFCLOSE(file);
  20091. }
  20092. return ret;
  20093. }
  20094. #endif
  20095. #endif /* OPENSSL_EXTRA */
  20096. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20097. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  20098. #ifndef NO_CERTS
  20099. /* oidCertExtType */
  20100. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  20101. "X509v3 Basic Constraints"},
  20102. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  20103. "X509v3 Subject Alternative Name"},
  20104. { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  20105. "X509v3 CRL Distribution Points"},
  20106. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  20107. "Authority Information Access"},
  20108. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  20109. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  20110. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  20111. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  20112. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  20113. "X509v3 Key Usage"},
  20114. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  20115. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  20116. { NID_ext_key_usage, EXT_KEY_USAGE_OID, oidCertExtType,
  20117. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  20118. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  20119. "nameConstraints", "X509v3 Name Constraints"},
  20120. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  20121. "certificatePolicies", "X509v3 Certificate Policies"},
  20122. /* oidCertAuthInfoType */
  20123. { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP",
  20124. "OCSP"},
  20125. { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  20126. "caIssuers", "CA Issuers"},
  20127. /* oidCertPolicyType */
  20128. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  20129. "X509v3 Any Policy"},
  20130. /* oidCertAltNameType */
  20131. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  20132. /* oidCertKeyUseType */
  20133. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  20134. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  20135. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  20136. "serverAuth", "TLS Web Server Authentication"},
  20137. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  20138. "clientAuth", "TLS Web Client Authentication"},
  20139. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  20140. "OCSPSigning", "OCSP Signing"},
  20141. /* oidCertNameType */
  20142. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  20143. #if !defined(WOLFSSL_CERT_REQ)
  20144. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  20145. #endif
  20146. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  20147. "serialNumber"},
  20148. { NID_userId, NID_userId, oidCertNameType, "UID", "userid"},
  20149. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  20150. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  20151. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  20152. "stateOrProvinceName"},
  20153. { NID_streetAddress, NID_streetAddress, oidCertNameType, "street",
  20154. "streetAddress"},
  20155. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  20156. "organizationName"},
  20157. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  20158. "OU", "organizationalUnitName"},
  20159. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  20160. "emailAddress"},
  20161. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  20162. "domainComponent"},
  20163. { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink",
  20164. "favouriteDrink"},
  20165. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  20166. "businessCategory"},
  20167. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  20168. "jurisdictionCountryName"},
  20169. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  20170. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  20171. { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"},
  20172. { NID_userId, NID_userId, oidCertNameType, "UID", "userId"},
  20173. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_NAME_ALL)
  20174. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  20175. oidCsrAttrType, "challengePassword", "challengePassword"},
  20176. { NID_pkcs9_contentType, PKCS9_CONTENT_TYPE_OID,
  20177. oidCsrAttrType, "contentType", "contentType" },
  20178. { NID_pkcs9_unstructuredName, UNSTRUCTURED_NAME_OID,
  20179. oidCsrAttrType, "unstructuredName", "unstructuredName" },
  20180. { NID_name, NAME_OID, oidCsrAttrType, "name", "name" },
  20181. { NID_surname, SURNAME_OID,
  20182. oidCsrAttrType, "surname", "surname" },
  20183. { NID_givenName, GIVEN_NAME_OID,
  20184. oidCsrAttrType, "givenName", "givenName" },
  20185. { NID_initials, INITIALS_OID,
  20186. oidCsrAttrType, "initials", "initials" },
  20187. { NID_dnQualifier, DNQUALIFIER_OID,
  20188. oidCsrAttrType, "dnQualifer", "dnQualifier" },
  20189. #endif
  20190. #endif
  20191. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  20192. /* oidHashType */
  20193. #ifdef WOLFSSL_MD2
  20194. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  20195. #endif
  20196. #ifdef WOLFSSL_MD5
  20197. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  20198. #endif
  20199. #ifndef NO_SHA
  20200. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  20201. #endif
  20202. #ifdef WOLFSSL_SHA224
  20203. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  20204. #endif
  20205. #ifndef NO_SHA256
  20206. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  20207. #endif
  20208. #ifdef WOLFSSL_SHA384
  20209. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  20210. #endif
  20211. #ifdef WOLFSSL_SHA512
  20212. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  20213. #endif
  20214. #ifdef WOLFSSL_SHA3
  20215. #ifndef WOLFSSL_NOSHA3_224
  20216. { NID_sha3_224, SHA3_224h, oidHashType, "SHA3-224", "sha3-224"},
  20217. #endif
  20218. #ifndef WOLFSSL_NOSHA3_256
  20219. { NID_sha3_256, SHA3_256h, oidHashType, "SHA3-256", "sha3-256"},
  20220. #endif
  20221. #ifndef WOLFSSL_NOSHA3_384
  20222. { NID_sha3_384, SHA3_384h, oidHashType, "SHA3-384", "sha3-384"},
  20223. #endif
  20224. #ifndef WOLFSSL_NOSHA3_512
  20225. { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"},
  20226. #endif
  20227. #endif /* WOLFSSL_SHA3 */
  20228. #ifdef WOLFSSL_SM3
  20229. { NID_sm3, SM3h, oidHashType, "SM3", "sm3"},
  20230. #endif
  20231. /* oidSigType */
  20232. #ifndef NO_DSA
  20233. #ifndef NO_SHA
  20234. { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  20235. { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  20236. "dsa_with_SHA256"},
  20237. #endif
  20238. #endif /* NO_DSA */
  20239. #ifndef NO_RSA
  20240. #ifdef WOLFSSL_MD2
  20241. { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  20242. "md2WithRSAEncryption"},
  20243. #endif
  20244. #ifndef NO_MD5
  20245. { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  20246. "md5WithRSAEncryption"},
  20247. #endif
  20248. #ifndef NO_SHA
  20249. { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  20250. "sha1WithRSAEncryption"},
  20251. #endif
  20252. #ifdef WOLFSSL_SHA224
  20253. { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  20254. "sha224WithRSAEncryption"},
  20255. #endif
  20256. #ifndef NO_SHA256
  20257. { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  20258. "sha256WithRSAEncryption"},
  20259. #endif
  20260. #ifdef WOLFSSL_SHA384
  20261. { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  20262. "sha384WithRSAEncryption"},
  20263. #endif
  20264. #ifdef WOLFSSL_SHA512
  20265. { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  20266. "sha512WithRSAEncryption"},
  20267. #endif
  20268. #ifdef WOLFSSL_SHA3
  20269. #ifndef WOLFSSL_NOSHA3_224
  20270. { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224",
  20271. "sha3-224WithRSAEncryption"},
  20272. #endif
  20273. #ifndef WOLFSSL_NOSHA3_256
  20274. { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256",
  20275. "sha3-256WithRSAEncryption"},
  20276. #endif
  20277. #ifndef WOLFSSL_NOSHA3_384
  20278. { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384",
  20279. "sha3-384WithRSAEncryption"},
  20280. #endif
  20281. #ifndef WOLFSSL_NOSHA3_512
  20282. { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512",
  20283. "sha3-512WithRSAEncryption"},
  20284. #endif
  20285. #endif
  20286. #ifdef WC_RSA_PSS
  20287. { NID_rsassaPss, CTC_RSASSAPSS, oidSigType, "RSASSA-PSS", "rsassaPss" },
  20288. #endif
  20289. #endif /* NO_RSA */
  20290. #ifdef HAVE_ECC
  20291. #ifndef NO_SHA
  20292. { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  20293. #endif
  20294. #ifdef WOLFSSL_SHA224
  20295. { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  20296. #endif
  20297. #ifndef NO_SHA256
  20298. { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  20299. #endif
  20300. #ifdef WOLFSSL_SHA384
  20301. { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  20302. #endif
  20303. #ifdef WOLFSSL_SHA512
  20304. { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  20305. #endif
  20306. #ifdef WOLFSSL_SHA3
  20307. #ifndef WOLFSSL_NOSHA3_224
  20308. { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224",
  20309. "ecdsa_with_SHA3-224"},
  20310. #endif
  20311. #ifndef WOLFSSL_NOSHA3_256
  20312. { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256",
  20313. "ecdsa_with_SHA3-256"},
  20314. #endif
  20315. #ifndef WOLFSSL_NOSHA3_384
  20316. { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384",
  20317. "ecdsa_with_SHA3-384"},
  20318. #endif
  20319. #ifndef WOLFSSL_NOSHA3_512
  20320. { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512",
  20321. "ecdsa_with_SHA3-512"},
  20322. #endif
  20323. #endif
  20324. #endif /* HAVE_ECC */
  20325. /* oidKeyType */
  20326. #ifndef NO_DSA
  20327. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  20328. #endif /* NO_DSA */
  20329. #ifndef NO_RSA
  20330. { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"},
  20331. #ifdef WC_RSA_PSS
  20332. { NID_rsassaPss, RSAPSSk, oidKeyType, "RSASSA-PSS", "rsassaPss"},
  20333. #endif
  20334. #endif /* NO_RSA */
  20335. #ifdef HAVE_ECC
  20336. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  20337. "id-ecPublicKey"},
  20338. #endif /* HAVE_ECC */
  20339. #ifndef NO_DH
  20340. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  20341. #endif
  20342. #ifdef HAVE_ED448
  20343. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  20344. #endif
  20345. #ifdef HAVE_ED25519
  20346. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  20347. #endif
  20348. #ifdef HAVE_PQC
  20349. #ifdef HAVE_FALCON
  20350. { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1",
  20351. "Falcon Level 1"},
  20352. { CTC_FALCON_LEVEL5, FALCON_LEVEL5k, oidKeyType, "Falcon Level 5",
  20353. "Falcon Level 5"},
  20354. #endif /* HAVE_FALCON */
  20355. #ifdef HAVE_DILITHIUM
  20356. { CTC_DILITHIUM_LEVEL2, DILITHIUM_LEVEL2k, oidKeyType,
  20357. "Dilithium Level 2", "Dilithium Level 2"},
  20358. { CTC_DILITHIUM_LEVEL3, DILITHIUM_LEVEL3k, oidKeyType,
  20359. "Dilithium Level 3", "Dilithium Level 3"},
  20360. { CTC_DILITHIUM_LEVEL5, DILITHIUM_LEVEL5k, oidKeyType,
  20361. "Dilithium Level 5", "Dilithium Level 5"},
  20362. #endif /* HAVE_DILITHIUM */
  20363. #endif /* HAVE_PQC */
  20364. /* oidCurveType */
  20365. #ifdef HAVE_ECC
  20366. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  20367. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  20368. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  20369. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  20370. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  20371. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  20372. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  20373. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  20374. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  20375. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  20376. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  20377. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  20378. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  20379. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  20380. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  20381. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  20382. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  20383. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  20384. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  20385. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  20386. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  20387. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  20388. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  20389. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  20390. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  20391. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  20392. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  20393. #ifdef WOLFSSL_SM2
  20394. { NID_sm2, ECC_SM2P256V1_OID, oidCurveType, "sm2", "sm2"},
  20395. #endif
  20396. #endif /* HAVE_ECC */
  20397. /* oidBlkType */
  20398. #ifdef WOLFSSL_AES_128
  20399. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  20400. #endif
  20401. #ifdef WOLFSSL_AES_192
  20402. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  20403. #endif
  20404. #ifdef WOLFSSL_AES_256
  20405. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  20406. #endif
  20407. #ifndef NO_DES3
  20408. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  20409. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  20410. #endif /* !NO_DES3 */
  20411. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  20412. { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, "ChaCha20-Poly1305", "chacha20-poly1305"},
  20413. #endif
  20414. /* oidOcspType */
  20415. #ifdef HAVE_OCSP
  20416. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  20417. "Basic OCSP Response"},
  20418. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  20419. "OCSP Nonce"},
  20420. #endif /* HAVE_OCSP */
  20421. #ifndef NO_PWDBASED
  20422. /* oidKdfType */
  20423. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  20424. /* oidPBEType */
  20425. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  20426. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  20427. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  20428. "pbeWithSHA1AndDES-CBC"},
  20429. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  20430. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  20431. #endif
  20432. /* oidKeyWrapType */
  20433. #ifdef WOLFSSL_AES_128
  20434. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  20435. #endif
  20436. #ifdef WOLFSSL_AES_192
  20437. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  20438. #endif
  20439. #ifdef WOLFSSL_AES_256
  20440. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  20441. #endif
  20442. #ifndef NO_PKCS7
  20443. #ifndef NO_DH
  20444. /* oidCmsKeyAgreeType */
  20445. #ifndef NO_SHA
  20446. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  20447. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  20448. #endif
  20449. #ifdef WOLFSSL_SHA224
  20450. { dhSinglePass_stdDH_sha224kdf_scheme,
  20451. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  20452. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  20453. #endif
  20454. #ifndef NO_SHA256
  20455. { dhSinglePass_stdDH_sha256kdf_scheme,
  20456. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  20457. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  20458. #endif
  20459. #ifdef WOLFSSL_SHA384
  20460. { dhSinglePass_stdDH_sha384kdf_scheme,
  20461. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  20462. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  20463. #endif
  20464. #ifdef WOLFSSL_SHA512
  20465. { dhSinglePass_stdDH_sha512kdf_scheme,
  20466. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  20467. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  20468. #endif
  20469. #endif
  20470. #endif
  20471. #if defined(WOLFSSL_APACHE_HTTPD)
  20472. /* "1.3.6.1.5.5.7.8.7" */
  20473. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  20474. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  20475. /* "1.3.6.1.4.1.311.20.2.3" */
  20476. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  20477. WOLFSSL_LN_MS_UPN },
  20478. /* "1.3.6.1.5.5.7.1.24" */
  20479. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  20480. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  20481. #endif
  20482. #endif /* OPENSSL_EXTRA */
  20483. };
  20484. #define WOLFSSL_OBJECT_INFO_SZ \
  20485. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  20486. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  20487. #endif
  20488. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20489. /* Free the dynamically allocated data.
  20490. *
  20491. * p Pointer to dynamically allocated memory.
  20492. */
  20493. void wolfSSL_OPENSSL_free(void* p)
  20494. {
  20495. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  20496. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  20497. }
  20498. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  20499. #ifdef OPENSSL_EXTRA
  20500. void *wolfSSL_OPENSSL_malloc(size_t a)
  20501. {
  20502. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  20503. }
  20504. int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
  20505. {
  20506. /* 'char' is unsigned on some platforms. */
  20507. return (int)(signed char)HexCharToByte((char)c);
  20508. }
  20509. unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
  20510. {
  20511. unsigned char* targetBuf;
  20512. int srcDigitHigh = 0;
  20513. int srcDigitLow = 0;
  20514. size_t srcLen;
  20515. size_t srcIdx = 0;
  20516. long targetIdx = 0;
  20517. srcLen = XSTRLEN(str);
  20518. targetBuf = (unsigned char*)XMALLOC(srcLen / 2, NULL, DYNAMIC_TYPE_OPENSSL);
  20519. if (targetBuf == NULL) {
  20520. return NULL;
  20521. }
  20522. while (srcIdx < srcLen) {
  20523. if (str[srcIdx] == ':') {
  20524. srcIdx++;
  20525. continue;
  20526. }
  20527. srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  20528. srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  20529. if (srcDigitHigh < 0 || srcDigitLow < 0) {
  20530. WOLFSSL_MSG("Invalid hex character.");
  20531. XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  20532. return NULL;
  20533. }
  20534. targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow);
  20535. }
  20536. if (len != NULL)
  20537. *len = targetIdx;
  20538. return targetBuf;
  20539. }
  20540. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  20541. {
  20542. (void)opts;
  20543. (void)settings;
  20544. return wolfSSL_library_init();
  20545. }
  20546. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  20547. {
  20548. (void)opts;
  20549. (void)settings;
  20550. return wolfSSL_library_init();
  20551. }
  20552. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  20553. int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  20554. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  20555. int maxDerSz)
  20556. {
  20557. int ret, paddingSz;
  20558. word32 idx, cipherInfoSz;
  20559. #ifdef WOLFSSL_SMALL_STACK
  20560. EncryptedInfo* info = NULL;
  20561. #else
  20562. EncryptedInfo info[1];
  20563. #endif
  20564. WOLFSSL_ENTER("EncryptDerKey");
  20565. if (der == NULL || derSz == NULL || cipher == NULL ||
  20566. passwd == NULL || cipherInfo == NULL)
  20567. return BAD_FUNC_ARG;
  20568. #ifdef WOLFSSL_SMALL_STACK
  20569. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  20570. DYNAMIC_TYPE_ENCRYPTEDINFO);
  20571. if (info == NULL) {
  20572. WOLFSSL_MSG("malloc failed");
  20573. return WOLFSSL_FAILURE;
  20574. }
  20575. #endif
  20576. XMEMSET(info, 0, sizeof(EncryptedInfo));
  20577. /* set the cipher name on info */
  20578. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  20579. info->name[NAME_SZ-1] = '\0'; /* null term */
  20580. ret = wc_EncryptedInfoGet(info, info->name);
  20581. if (ret != 0) {
  20582. WOLFSSL_MSG("unsupported cipher");
  20583. #ifdef WOLFSSL_SMALL_STACK
  20584. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20585. #endif
  20586. return WOLFSSL_FAILURE;
  20587. }
  20588. /* Generate a random salt */
  20589. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  20590. WOLFSSL_MSG("generate iv failed");
  20591. #ifdef WOLFSSL_SMALL_STACK
  20592. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20593. #endif
  20594. return WOLFSSL_FAILURE;
  20595. }
  20596. /* add the padding before encryption */
  20597. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  20598. if (paddingSz == 0)
  20599. paddingSz = info->ivSz;
  20600. if (maxDerSz < *derSz + paddingSz) {
  20601. WOLFSSL_MSG("not enough DER buffer allocated");
  20602. #ifdef WOLFSSL_SMALL_STACK
  20603. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20604. #endif
  20605. return WOLFSSL_FAILURE;
  20606. }
  20607. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  20608. (*derSz) += paddingSz;
  20609. /* encrypt buffer */
  20610. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  20611. WOLFSSL_MSG("encrypt key failed");
  20612. #ifdef WOLFSSL_SMALL_STACK
  20613. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20614. #endif
  20615. return WOLFSSL_FAILURE;
  20616. }
  20617. /* create cipher info : 'cipher_name,Salt(hex)' */
  20618. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  20619. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  20620. DYNAMIC_TYPE_STRING);
  20621. if (*cipherInfo == NULL) {
  20622. WOLFSSL_MSG("malloc failed");
  20623. #ifdef WOLFSSL_SMALL_STACK
  20624. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20625. #endif
  20626. return WOLFSSL_FAILURE;
  20627. }
  20628. XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  20629. XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz);
  20630. idx = (word32)XSTRLEN((char*)*cipherInfo);
  20631. cipherInfoSz -= idx;
  20632. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  20633. #ifdef WOLFSSL_SMALL_STACK
  20634. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  20635. #endif
  20636. if (ret != 0) {
  20637. WOLFSSL_MSG("Base16_Encode failed");
  20638. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  20639. return WOLFSSL_FAILURE;
  20640. }
  20641. return WOLFSSL_SUCCESS;
  20642. }
  20643. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  20644. #if !defined(NO_BIO)
  20645. static int pem_write_pubkey(WOLFSSL_EVP_PKEY* key, void* heap, byte** derBuf,
  20646. int* derSz)
  20647. {
  20648. byte* buf = NULL;
  20649. int sz = 0;
  20650. (void)heap;
  20651. if (key == NULL) {
  20652. WOLFSSL_MSG("Bad parameters");
  20653. return WOLFSSL_FAILURE;
  20654. }
  20655. switch (key->type) {
  20656. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  20657. case EVP_PKEY_RSA:
  20658. if ((sz = wolfSSL_RSA_To_Der(key->rsa, &buf, 1, heap))
  20659. < 0) {
  20660. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  20661. break;
  20662. }
  20663. break;
  20664. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  20665. #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  20666. defined(WOLFSSL_CERT_GEN))
  20667. case EVP_PKEY_DSA:
  20668. if (key->dsa == NULL) {
  20669. WOLFSSL_MSG("key->dsa is null");
  20670. break;
  20671. }
  20672. sz = MAX_DSA_PUBKEY_SZ;
  20673. buf = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  20674. if (buf == NULL) {
  20675. WOLFSSL_MSG("malloc failed");
  20676. break;
  20677. }
  20678. /* Key to DER */
  20679. sz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, buf, sz);
  20680. if (sz < 0) {
  20681. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  20682. break;
  20683. }
  20684. break;
  20685. #endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */
  20686. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  20687. case EVP_PKEY_EC:
  20688. {
  20689. if (key->ecc == NULL) {
  20690. WOLFSSL_MSG("key->ecc is null");
  20691. break;
  20692. }
  20693. if ((sz = wolfssl_ec_key_to_pubkey_der(key->ecc, &buf, heap)) <=
  20694. 0) {
  20695. WOLFSSL_MSG("wolfssl_ec_key_to_pubkey_der failed");
  20696. break;
  20697. }
  20698. break;
  20699. }
  20700. #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
  20701. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  20702. case EVP_PKEY_DH:
  20703. WOLFSSL_MSG("Writing DH PUBKEY not supported!");
  20704. break;
  20705. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  20706. default:
  20707. WOLFSSL_MSG("Unknown Key type!");
  20708. break;
  20709. }
  20710. if (buf == NULL || sz <= 0) {
  20711. if (buf != NULL)
  20712. XFREE(buf, heap, DYNAMIC_TYPE_DER);
  20713. return WOLFSSL_FAILURE;
  20714. }
  20715. *derBuf = buf;
  20716. *derSz = sz;
  20717. return WOLFSSL_SUCCESS;
  20718. }
  20719. #endif
  20720. #ifndef NO_BIO
  20721. static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  20722. {
  20723. int ret;
  20724. int derSz = 0;
  20725. byte* derBuf = NULL;
  20726. ret = pem_write_pubkey(key, bio->heap, &derBuf, &derSz);
  20727. if (ret == WOLFSSL_SUCCESS) {
  20728. ret = der_write_to_bio_as_pem(derBuf, derSz, bio, PUBLICKEY_TYPE);
  20729. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  20730. }
  20731. return ret;
  20732. }
  20733. /* Takes a public key and writes it out to a WOLFSSL_BIO
  20734. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  20735. */
  20736. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  20737. {
  20738. int ret;
  20739. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  20740. if ((bio == NULL) || (key == NULL)) {
  20741. ret = WOLFSSL_FAILURE;
  20742. }
  20743. else {
  20744. ret = pem_write_bio_pubkey(bio, key);
  20745. }
  20746. return ret;
  20747. }
  20748. /* Takes a private key and writes it out to a WOLFSSL_BIO
  20749. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  20750. */
  20751. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  20752. const WOLFSSL_EVP_CIPHER* cipher,
  20753. unsigned char* passwd, int len,
  20754. wc_pem_password_cb* cb, void* arg)
  20755. {
  20756. byte* keyDer;
  20757. int type;
  20758. (void)cipher;
  20759. (void)passwd;
  20760. (void)len;
  20761. (void)cb;
  20762. (void)arg;
  20763. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  20764. if (bio == NULL || key == NULL) {
  20765. WOLFSSL_MSG("Bad Function Arguments");
  20766. return WOLFSSL_FAILURE;
  20767. }
  20768. keyDer = (byte*)key->pkey.ptr;
  20769. switch (key->type) {
  20770. #ifndef NO_RSA
  20771. case EVP_PKEY_RSA:
  20772. type = PRIVATEKEY_TYPE;
  20773. break;
  20774. #endif
  20775. #ifndef NO_DSA
  20776. case EVP_PKEY_DSA:
  20777. type = DSA_PRIVATEKEY_TYPE;
  20778. break;
  20779. #endif
  20780. #ifdef HAVE_ECC
  20781. case EVP_PKEY_EC:
  20782. type = ECC_PRIVATEKEY_TYPE;
  20783. break;
  20784. #endif
  20785. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  20786. case EVP_PKEY_DH:
  20787. type = DH_PRIVATEKEY_TYPE;
  20788. break;
  20789. #endif
  20790. default:
  20791. WOLFSSL_MSG("Unknown Key type!");
  20792. type = PRIVATEKEY_TYPE;
  20793. }
  20794. return der_write_to_bio_as_pem(keyDer, key->pkey_sz, bio, type);
  20795. }
  20796. #endif /* !NO_BIO */
  20797. /* Colon separated list of <public key>+<digest> algorithms.
  20798. * Replaces list in context.
  20799. */
  20800. int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list)
  20801. {
  20802. WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list");
  20803. if (ctx == NULL || list == NULL) {
  20804. WOLFSSL_MSG("Bad function arguments");
  20805. return WOLFSSL_FAILURE;
  20806. }
  20807. if (AllocateCtxSuites(ctx) != 0)
  20808. return WOLFSSL_FAILURE;
  20809. return SetSuitesHashSigAlgo(ctx->suites, list);
  20810. }
  20811. /* Colon separated list of <public key>+<digest> algorithms.
  20812. * Replaces list in SSL.
  20813. */
  20814. int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list)
  20815. {
  20816. WOLFSSL_MSG("wolfSSL_set1_sigalg_list");
  20817. if (ssl == NULL || list == NULL) {
  20818. WOLFSSL_MSG("Bad function arguments");
  20819. return WOLFSSL_FAILURE;
  20820. }
  20821. if (AllocateSuites(ssl) != 0)
  20822. return WOLFSSL_FAILURE;
  20823. return SetSuitesHashSigAlgo(ssl->suites, list);
  20824. }
  20825. struct WOLFSSL_HashSigInfo {
  20826. int hashAlgo;
  20827. int sigAlgo;
  20828. int nid;
  20829. } wolfssl_hash_sig_info[] =
  20830. {
  20831. #ifndef NO_RSA
  20832. #ifndef NO_SHA256
  20833. { sha256_mac, rsa_sa_algo, CTC_SHA256wRSA },
  20834. #endif
  20835. #ifdef WOLFSSL_SHA384
  20836. { sha384_mac, rsa_sa_algo, CTC_SHA384wRSA },
  20837. #endif
  20838. #ifdef WOLFSSL_SHA512
  20839. { sha512_mac, rsa_sa_algo, CTC_SHA512wRSA },
  20840. #endif
  20841. #ifdef WOLFSSL_SHA224
  20842. { sha224_mac, rsa_sa_algo, CTC_SHA224wRSA },
  20843. #endif
  20844. #ifndef NO_SHA
  20845. { sha_mac, rsa_sa_algo, CTC_SHAwRSA },
  20846. #endif
  20847. #ifdef WC_RSA_PSS
  20848. #ifndef NO_SHA256
  20849. { sha256_mac, rsa_pss_sa_algo, CTC_SHA256wRSA },
  20850. #endif
  20851. #ifdef WOLFSSL_SHA384
  20852. { sha384_mac, rsa_pss_sa_algo, CTC_SHA384wRSA },
  20853. #endif
  20854. #ifdef WOLFSSL_SHA512
  20855. { sha512_mac, rsa_pss_sa_algo, CTC_SHA512wRSA },
  20856. #endif
  20857. #ifdef WOLFSSL_SHA224
  20858. { sha224_mac, rsa_pss_sa_algo, CTC_SHA224wRSA },
  20859. #endif
  20860. #endif
  20861. #endif
  20862. #ifdef HAVE_ECC
  20863. #ifndef NO_SHA256
  20864. { sha256_mac, ecc_dsa_sa_algo, CTC_SHA256wECDSA },
  20865. #endif
  20866. #ifdef WOLFSSL_SHA384
  20867. { sha384_mac, ecc_dsa_sa_algo, CTC_SHA384wECDSA },
  20868. #endif
  20869. #ifdef WOLFSSL_SHA512
  20870. { sha512_mac, ecc_dsa_sa_algo, CTC_SHA512wECDSA },
  20871. #endif
  20872. #ifdef WOLFSSL_SHA224
  20873. { sha224_mac, ecc_dsa_sa_algo, CTC_SHA224wECDSA },
  20874. #endif
  20875. #ifndef NO_SHA
  20876. { sha_mac, ecc_dsa_sa_algo, CTC_SHAwECDSA },
  20877. #endif
  20878. #endif
  20879. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  20880. { sm3_mac, sm2_sa_algo, CTC_SM3wSM2 },
  20881. #endif
  20882. #ifdef HAVE_ED25519
  20883. { no_mac, ed25519_sa_algo, CTC_ED25519 },
  20884. #endif
  20885. #ifdef HAVE_ED448
  20886. { no_mac, ed448_sa_algo, CTC_ED448 },
  20887. #endif
  20888. #ifdef HAVE_PQC
  20889. #ifdef HAVE_FALCON
  20890. { no_mac, falcon_level1_sa_algo, CTC_FALCON_LEVEL1 },
  20891. { no_mac, falcon_level5_sa_algo, CTC_FALCON_LEVEL5 },
  20892. #endif /* HAVE_FALCON */
  20893. #ifdef HAVE_DILITHIUM
  20894. { no_mac, dilithium_level2_sa_algo, CTC_DILITHIUM_LEVEL2 },
  20895. { no_mac, dilithium_level3_sa_algo, CTC_DILITHIUM_LEVEL3 },
  20896. { no_mac, dilithium_level5_sa_algo, CTC_DILITHIUM_LEVEL5 },
  20897. #endif /* HAVE_DILITHIUM */
  20898. #endif /* HAVE_PQC */
  20899. #ifndef NO_DSA
  20900. #ifndef NO_SHA
  20901. { sha_mac, dsa_sa_algo, CTC_SHAwDSA },
  20902. #endif
  20903. #endif
  20904. };
  20905. #define WOLFSSL_HASH_SIG_INFO_SZ \
  20906. (int)(sizeof(wolfssl_hash_sig_info)/sizeof(*wolfssl_hash_sig_info))
  20907. int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid)
  20908. {
  20909. int i;
  20910. int ret = WOLFSSL_FAILURE;
  20911. WOLFSSL_MSG("wolfSSL_get_signature_nid");
  20912. if (ssl == NULL) {
  20913. WOLFSSL_MSG("Bad function arguments");
  20914. return WOLFSSL_FAILURE;
  20915. }
  20916. for (i = 0; i < WOLFSSL_HASH_SIG_INFO_SZ; i++) {
  20917. if (ssl->options.hashAlgo == wolfssl_hash_sig_info[i].hashAlgo &&
  20918. ssl->options.sigAlgo == wolfssl_hash_sig_info[i].sigAlgo) {
  20919. *nid = wolfssl_hash_sig_info[i].nid;
  20920. ret = WOLFSSL_SUCCESS;
  20921. break;
  20922. }
  20923. }
  20924. return ret;
  20925. }
  20926. #ifdef HAVE_ECC
  20927. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  20928. static int populate_groups(int* groups, int max_count, char *list)
  20929. {
  20930. char *end;
  20931. int count = 0;
  20932. const WOLF_EC_NIST_NAME* nist_name;
  20933. if (!groups || !list) {
  20934. return -1;
  20935. }
  20936. for (end = list; ; list = ++end) {
  20937. int len;
  20938. if (count > max_count) {
  20939. WOLFSSL_MSG("Too many curves in list");
  20940. return -1;
  20941. }
  20942. while (*end != ':' && *end != '\0') end++;
  20943. len = (int)(end - list); /* end points to char after end
  20944. * of curve name so no need for -1 */
  20945. if ((len < kNistCurves_MIN_NAME_LEN) ||
  20946. (len > kNistCurves_MAX_NAME_LEN)) {
  20947. WOLFSSL_MSG("Unrecognized curve name in list");
  20948. return -1;
  20949. }
  20950. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  20951. if (len == nist_name->name_len &&
  20952. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  20953. break;
  20954. }
  20955. }
  20956. if (!nist_name->name) {
  20957. WOLFSSL_MSG("Unrecognized curve name in list");
  20958. return -1;
  20959. }
  20960. groups[count++] = nist_name->nid;
  20961. if (*end == '\0') break;
  20962. }
  20963. return count;
  20964. }
  20965. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  20966. {
  20967. int groups[WOLFSSL_MAX_GROUP_COUNT];
  20968. int count;
  20969. if (!ctx || !list) {
  20970. return WOLFSSL_FAILURE;
  20971. }
  20972. if ((count = populate_groups(groups,
  20973. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  20974. return WOLFSSL_FAILURE;
  20975. }
  20976. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  20977. }
  20978. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  20979. {
  20980. int groups[WOLFSSL_MAX_GROUP_COUNT];
  20981. int count;
  20982. if (!ssl || !list) {
  20983. return WOLFSSL_FAILURE;
  20984. }
  20985. if ((count = populate_groups(groups,
  20986. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  20987. return WOLFSSL_FAILURE;
  20988. }
  20989. return wolfSSL_set1_groups(ssl, groups, count);
  20990. }
  20991. #endif /* WOLFSSL_TLS13 */
  20992. #endif /* HAVE_ECC */
  20993. #ifndef NO_BIO
  20994. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  20995. WOLFSSL_EVP_PKEY** key,
  20996. wc_pem_password_cb* cb,
  20997. void* pass)
  20998. {
  20999. WOLFSSL_EVP_PKEY* pkey = NULL;
  21000. DerBuffer* der = NULL;
  21001. int keyFormat = 0;
  21002. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  21003. if (bio == NULL)
  21004. return pkey;
  21005. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat, &der)
  21006. >= 0) {
  21007. const unsigned char* ptr = der->buffer;
  21008. int type = -1;
  21009. if (keyFormat) {
  21010. /* keyFormat is Key_Sum enum */
  21011. if (keyFormat == RSAk)
  21012. type = EVP_PKEY_RSA;
  21013. else if (keyFormat == ECDSAk)
  21014. type = EVP_PKEY_EC;
  21015. else if (keyFormat == DSAk)
  21016. type = EVP_PKEY_DSA;
  21017. else if (keyFormat == DHk)
  21018. type = EVP_PKEY_DH;
  21019. }
  21020. else {
  21021. /* Default to RSA if format is not set */
  21022. type = EVP_PKEY_RSA;
  21023. }
  21024. /* handle case where reuse is attempted */
  21025. if (key != NULL && *key != NULL)
  21026. pkey = *key;
  21027. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  21028. if (pkey == NULL) {
  21029. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21030. }
  21031. }
  21032. FreeDer(&der);
  21033. if (key != NULL && pkey != NULL)
  21034. *key = pkey;
  21035. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  21036. return pkey;
  21037. }
  21038. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  21039. WOLFSSL_EVP_PKEY **key,
  21040. wc_pem_password_cb *cb,
  21041. void *pass)
  21042. {
  21043. WOLFSSL_EVP_PKEY* pkey = NULL;
  21044. DerBuffer* der = NULL;
  21045. int keyFormat = 0;
  21046. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  21047. if (bio == NULL)
  21048. return pkey;
  21049. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  21050. >= 0) {
  21051. const unsigned char* ptr = der->buffer;
  21052. /* handle case where reuse is attempted */
  21053. if (key != NULL && *key != NULL)
  21054. pkey = *key;
  21055. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  21056. if (pkey == NULL) {
  21057. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21058. }
  21059. }
  21060. FreeDer(&der);
  21061. if (key != NULL && pkey != NULL)
  21062. *key = pkey;
  21063. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  21064. return pkey;
  21065. }
  21066. #endif /* !NO_BIO */
  21067. #if !defined(NO_FILESYSTEM)
  21068. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **key,
  21069. wc_pem_password_cb *cb, void *pass)
  21070. {
  21071. WOLFSSL_EVP_PKEY* pkey = NULL;
  21072. DerBuffer* der = NULL;
  21073. int keyFormat = 0;
  21074. WOLFSSL_ENTER("wolfSSL_PEM_read_PUBKEY");
  21075. if ((pem_read_file_key(fp, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  21076. >= 0) && (der != NULL)) {
  21077. const unsigned char* ptr = der->buffer;
  21078. /* handle case where reuse is attempted */
  21079. if ((key != NULL) && (*key != NULL)) {
  21080. pkey = *key;
  21081. }
  21082. if ((wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length) == NULL) ||
  21083. (pkey == NULL)) {
  21084. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21085. pkey = NULL;
  21086. }
  21087. }
  21088. FreeDer(&der);
  21089. if ((key != NULL) && (pkey != NULL)) {
  21090. *key = pkey;
  21091. }
  21092. WOLFSSL_LEAVE("wolfSSL_PEM_read_PUBKEY", 0);
  21093. return pkey;
  21094. }
  21095. #endif /* NO_FILESYSTEM */
  21096. #endif /* OPENSSL_EXTRA */
  21097. #ifdef WOLFSSL_ALT_CERT_CHAINS
  21098. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  21099. {
  21100. int isUsing = 0;
  21101. if (ssl)
  21102. isUsing = ssl->options.usingAltCertChain;
  21103. return isUsing;
  21104. }
  21105. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  21106. #ifdef SESSION_CERTS
  21107. #ifdef WOLFSSL_ALT_CERT_CHAINS
  21108. /* Get peer's alternate certificate chain */
  21109. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  21110. {
  21111. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  21112. if (ssl)
  21113. return &ssl->session->altChain;
  21114. return 0;
  21115. }
  21116. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  21117. /* Get peer's certificate chain */
  21118. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  21119. {
  21120. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  21121. if (ssl)
  21122. return &ssl->session->chain;
  21123. return 0;
  21124. }
  21125. /* Get peer's certificate chain total count */
  21126. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  21127. {
  21128. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  21129. if (chain)
  21130. return chain->count;
  21131. return 0;
  21132. }
  21133. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  21134. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  21135. {
  21136. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  21137. if (chain)
  21138. return chain->certs[idx].length;
  21139. return 0;
  21140. }
  21141. /* Get peer's ASN.1 DER certificate at index (idx) */
  21142. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  21143. {
  21144. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  21145. if (chain)
  21146. return chain->certs[idx].buffer;
  21147. return 0;
  21148. }
  21149. /* Get peer's wolfSSL X509 certificate at index (idx) */
  21150. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  21151. {
  21152. int ret;
  21153. WOLFSSL_X509* x509 = NULL;
  21154. #ifdef WOLFSSL_SMALL_STACK
  21155. DecodedCert* cert = NULL;
  21156. #else
  21157. DecodedCert cert[1];
  21158. #endif
  21159. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  21160. if (chain != NULL) {
  21161. #ifdef WOLFSSL_SMALL_STACK
  21162. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  21163. DYNAMIC_TYPE_DCERT);
  21164. if (cert != NULL)
  21165. #endif
  21166. {
  21167. InitDecodedCert(cert, chain->certs[idx].buffer,
  21168. chain->certs[idx].length, NULL);
  21169. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  21170. WOLFSSL_MSG("Failed to parse cert");
  21171. }
  21172. else {
  21173. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  21174. DYNAMIC_TYPE_X509);
  21175. if (x509 == NULL) {
  21176. WOLFSSL_MSG("Failed alloc X509");
  21177. }
  21178. else {
  21179. InitX509(x509, 1, NULL);
  21180. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  21181. WOLFSSL_MSG("Failed to copy decoded");
  21182. wolfSSL_X509_free(x509);
  21183. x509 = NULL;
  21184. }
  21185. }
  21186. }
  21187. FreeDecodedCert(cert);
  21188. #ifdef WOLFSSL_SMALL_STACK
  21189. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  21190. #endif
  21191. }
  21192. }
  21193. (void)ret;
  21194. return x509;
  21195. }
  21196. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  21197. enough else return error (-1). If buffer is NULL only calculate
  21198. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  21199. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  21200. unsigned char* buf, int inLen, int* outLen)
  21201. {
  21202. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  21203. const char* header = NULL;
  21204. const char* footer = NULL;
  21205. int headerLen;
  21206. int footerLen;
  21207. int i;
  21208. int err;
  21209. word32 szNeeded = 0;
  21210. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  21211. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  21212. return BAD_FUNC_ARG;
  21213. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  21214. if (err != 0)
  21215. return err;
  21216. headerLen = (int)XSTRLEN(header);
  21217. footerLen = (int)XSTRLEN(footer);
  21218. /* Null output buffer return size needed in outLen */
  21219. if(!buf) {
  21220. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  21221. NULL, &szNeeded) != LENGTH_ONLY_E)
  21222. return WOLFSSL_FAILURE;
  21223. *outLen = szNeeded + headerLen + footerLen;
  21224. return LENGTH_ONLY_E;
  21225. }
  21226. /* don't even try if inLen too short */
  21227. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  21228. return BAD_FUNC_ARG;
  21229. /* header */
  21230. if (XMEMCPY(buf, header, headerLen) == NULL)
  21231. return WOLFSSL_FATAL_ERROR;
  21232. i = headerLen;
  21233. /* body */
  21234. *outLen = inLen; /* input to Base64_Encode */
  21235. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  21236. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  21237. return err;
  21238. i += *outLen;
  21239. /* footer */
  21240. if ( (i + footerLen) > inLen)
  21241. return BAD_FUNC_ARG;
  21242. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  21243. return WOLFSSL_FATAL_ERROR;
  21244. *outLen += headerLen + footerLen;
  21245. return WOLFSSL_SUCCESS;
  21246. #else
  21247. (void)chain;
  21248. (void)idx;
  21249. (void)buf;
  21250. (void)inLen;
  21251. (void)outLen;
  21252. return WOLFSSL_FAILURE;
  21253. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  21254. }
  21255. /* get session ID */
  21256. WOLFSSL_ABI
  21257. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  21258. {
  21259. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  21260. session = ClientSessionToSession(session);
  21261. if (session)
  21262. return session->sessionID;
  21263. return NULL;
  21264. }
  21265. #endif /* SESSION_CERTS */
  21266. #ifdef HAVE_FUZZER
  21267. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  21268. {
  21269. if (ssl) {
  21270. ssl->fuzzerCb = cbf;
  21271. ssl->fuzzerCtx = fCtx;
  21272. }
  21273. }
  21274. #endif
  21275. #ifndef NO_CERTS
  21276. #ifdef HAVE_PK_CALLBACKS
  21277. #ifdef HAVE_ECC
  21278. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  21279. {
  21280. if (ctx)
  21281. ctx->EccKeyGenCb = cb;
  21282. }
  21283. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  21284. {
  21285. if (ssl)
  21286. ssl->EccKeyGenCtx = ctx;
  21287. }
  21288. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  21289. {
  21290. if (ssl)
  21291. return ssl->EccKeyGenCtx;
  21292. return NULL;
  21293. }
  21294. void wolfSSL_CTX_SetEccSignCtx(WOLFSSL_CTX* ctx, void *userCtx)
  21295. {
  21296. if (ctx)
  21297. ctx->EccSignCtx = userCtx;
  21298. }
  21299. void* wolfSSL_CTX_GetEccSignCtx(WOLFSSL_CTX* ctx)
  21300. {
  21301. if (ctx)
  21302. return ctx->EccSignCtx;
  21303. return NULL;
  21304. }
  21305. WOLFSSL_ABI
  21306. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  21307. {
  21308. if (ctx)
  21309. ctx->EccSignCb = cb;
  21310. }
  21311. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  21312. {
  21313. if (ssl)
  21314. ssl->EccSignCtx = ctx;
  21315. }
  21316. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  21317. {
  21318. if (ssl)
  21319. return ssl->EccSignCtx;
  21320. return NULL;
  21321. }
  21322. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  21323. {
  21324. if (ctx)
  21325. ctx->EccVerifyCb = cb;
  21326. }
  21327. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  21328. {
  21329. if (ssl)
  21330. ssl->EccVerifyCtx = ctx;
  21331. }
  21332. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  21333. {
  21334. if (ssl)
  21335. return ssl->EccVerifyCtx;
  21336. return NULL;
  21337. }
  21338. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  21339. {
  21340. if (ctx)
  21341. ctx->EccSharedSecretCb = cb;
  21342. }
  21343. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21344. {
  21345. if (ssl)
  21346. ssl->EccSharedSecretCtx = ctx;
  21347. }
  21348. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  21349. {
  21350. if (ssl)
  21351. return ssl->EccSharedSecretCtx;
  21352. return NULL;
  21353. }
  21354. #endif /* HAVE_ECC */
  21355. #ifdef HAVE_ED25519
  21356. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  21357. {
  21358. if (ctx)
  21359. ctx->Ed25519SignCb = cb;
  21360. }
  21361. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  21362. {
  21363. if (ssl)
  21364. ssl->Ed25519SignCtx = ctx;
  21365. }
  21366. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  21367. {
  21368. if (ssl)
  21369. return ssl->Ed25519SignCtx;
  21370. return NULL;
  21371. }
  21372. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  21373. {
  21374. if (ctx)
  21375. ctx->Ed25519VerifyCb = cb;
  21376. }
  21377. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  21378. {
  21379. if (ssl)
  21380. ssl->Ed25519VerifyCtx = ctx;
  21381. }
  21382. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  21383. {
  21384. if (ssl)
  21385. return ssl->Ed25519VerifyCtx;
  21386. return NULL;
  21387. }
  21388. #endif /* HAVE_ED25519 */
  21389. #ifdef HAVE_CURVE25519
  21390. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  21391. CallbackX25519KeyGen cb)
  21392. {
  21393. if (ctx)
  21394. ctx->X25519KeyGenCb = cb;
  21395. }
  21396. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  21397. {
  21398. if (ssl)
  21399. ssl->X25519KeyGenCtx = ctx;
  21400. }
  21401. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  21402. {
  21403. if (ssl)
  21404. return ssl->X25519KeyGenCtx;
  21405. return NULL;
  21406. }
  21407. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  21408. CallbackX25519SharedSecret cb)
  21409. {
  21410. if (ctx)
  21411. ctx->X25519SharedSecretCb = cb;
  21412. }
  21413. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21414. {
  21415. if (ssl)
  21416. ssl->X25519SharedSecretCtx = ctx;
  21417. }
  21418. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  21419. {
  21420. if (ssl)
  21421. return ssl->X25519SharedSecretCtx;
  21422. return NULL;
  21423. }
  21424. #endif /* HAVE_CURVE25519 */
  21425. #ifdef HAVE_ED448
  21426. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  21427. {
  21428. if (ctx)
  21429. ctx->Ed448SignCb = cb;
  21430. }
  21431. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  21432. {
  21433. if (ssl)
  21434. ssl->Ed448SignCtx = ctx;
  21435. }
  21436. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  21437. {
  21438. if (ssl)
  21439. return ssl->Ed448SignCtx;
  21440. return NULL;
  21441. }
  21442. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  21443. {
  21444. if (ctx)
  21445. ctx->Ed448VerifyCb = cb;
  21446. }
  21447. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  21448. {
  21449. if (ssl)
  21450. ssl->Ed448VerifyCtx = ctx;
  21451. }
  21452. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  21453. {
  21454. if (ssl)
  21455. return ssl->Ed448VerifyCtx;
  21456. return NULL;
  21457. }
  21458. #endif /* HAVE_ED448 */
  21459. #ifdef HAVE_CURVE448
  21460. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  21461. CallbackX448KeyGen cb)
  21462. {
  21463. if (ctx)
  21464. ctx->X448KeyGenCb = cb;
  21465. }
  21466. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  21467. {
  21468. if (ssl)
  21469. ssl->X448KeyGenCtx = ctx;
  21470. }
  21471. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  21472. {
  21473. if (ssl)
  21474. return ssl->X448KeyGenCtx;
  21475. return NULL;
  21476. }
  21477. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  21478. CallbackX448SharedSecret cb)
  21479. {
  21480. if (ctx)
  21481. ctx->X448SharedSecretCb = cb;
  21482. }
  21483. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  21484. {
  21485. if (ssl)
  21486. ssl->X448SharedSecretCtx = ctx;
  21487. }
  21488. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  21489. {
  21490. if (ssl)
  21491. return ssl->X448SharedSecretCtx;
  21492. return NULL;
  21493. }
  21494. #endif /* HAVE_CURVE448 */
  21495. #ifndef NO_RSA
  21496. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  21497. {
  21498. if (ctx)
  21499. ctx->RsaSignCb = cb;
  21500. }
  21501. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  21502. {
  21503. if (ctx)
  21504. ctx->RsaSignCheckCb = cb;
  21505. }
  21506. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  21507. {
  21508. if (ssl)
  21509. ssl->RsaSignCtx = ctx;
  21510. }
  21511. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  21512. {
  21513. if (ssl)
  21514. return ssl->RsaSignCtx;
  21515. return NULL;
  21516. }
  21517. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  21518. {
  21519. if (ctx)
  21520. ctx->RsaVerifyCb = cb;
  21521. }
  21522. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  21523. {
  21524. if (ssl)
  21525. ssl->RsaVerifyCtx = ctx;
  21526. }
  21527. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  21528. {
  21529. if (ssl)
  21530. return ssl->RsaVerifyCtx;
  21531. return NULL;
  21532. }
  21533. #ifdef WC_RSA_PSS
  21534. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  21535. {
  21536. if (ctx)
  21537. ctx->RsaPssSignCb = cb;
  21538. }
  21539. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  21540. {
  21541. if (ctx)
  21542. ctx->RsaPssSignCheckCb = cb;
  21543. }
  21544. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  21545. {
  21546. if (ssl)
  21547. ssl->RsaPssSignCtx = ctx;
  21548. }
  21549. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  21550. {
  21551. if (ssl)
  21552. return ssl->RsaPssSignCtx;
  21553. return NULL;
  21554. }
  21555. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  21556. {
  21557. if (ctx)
  21558. ctx->RsaPssVerifyCb = cb;
  21559. }
  21560. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  21561. {
  21562. if (ssl)
  21563. ssl->RsaPssVerifyCtx = ctx;
  21564. }
  21565. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  21566. {
  21567. if (ssl)
  21568. return ssl->RsaPssVerifyCtx;
  21569. return NULL;
  21570. }
  21571. #endif /* WC_RSA_PSS */
  21572. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  21573. {
  21574. if (ctx)
  21575. ctx->RsaEncCb = cb;
  21576. }
  21577. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  21578. {
  21579. if (ssl)
  21580. ssl->RsaEncCtx = ctx;
  21581. }
  21582. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  21583. {
  21584. if (ssl)
  21585. return ssl->RsaEncCtx;
  21586. return NULL;
  21587. }
  21588. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  21589. {
  21590. if (ctx)
  21591. ctx->RsaDecCb = cb;
  21592. }
  21593. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  21594. {
  21595. if (ssl)
  21596. ssl->RsaDecCtx = ctx;
  21597. }
  21598. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  21599. {
  21600. if (ssl)
  21601. return ssl->RsaDecCtx;
  21602. return NULL;
  21603. }
  21604. #endif /* NO_RSA */
  21605. /* callback for premaster secret generation */
  21606. void wolfSSL_CTX_SetGenPreMasterCb(WOLFSSL_CTX* ctx, CallbackGenPreMaster cb)
  21607. {
  21608. if (ctx)
  21609. ctx->GenPreMasterCb = cb;
  21610. }
  21611. /* Set premaster secret generation callback context */
  21612. void wolfSSL_SetGenPreMasterCtx(WOLFSSL* ssl, void *ctx)
  21613. {
  21614. if (ssl)
  21615. ssl->GenPreMasterCtx = ctx;
  21616. }
  21617. /* Get premaster secret generation callback context */
  21618. void* wolfSSL_GetGenPreMasterCtx(WOLFSSL* ssl)
  21619. {
  21620. if (ssl)
  21621. return ssl->GenPreMasterCtx;
  21622. return NULL;
  21623. }
  21624. /* callback for master secret generation */
  21625. void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb)
  21626. {
  21627. if (ctx)
  21628. ctx->GenMasterCb = cb;
  21629. }
  21630. /* Set master secret generation callback context */
  21631. void wolfSSL_SetGenMasterSecretCtx(WOLFSSL* ssl, void *ctx)
  21632. {
  21633. if (ssl)
  21634. ssl->GenMasterCtx = ctx;
  21635. }
  21636. /* Get master secret generation callback context */
  21637. void* wolfSSL_GetGenMasterSecretCtx(WOLFSSL* ssl)
  21638. {
  21639. if (ssl)
  21640. return ssl->GenMasterCtx;
  21641. return NULL;
  21642. }
  21643. /* callback for session key generation */
  21644. void wolfSSL_CTX_SetGenSessionKeyCb(WOLFSSL_CTX* ctx, CallbackGenSessionKey cb)
  21645. {
  21646. if (ctx)
  21647. ctx->GenSessionKeyCb = cb;
  21648. }
  21649. /* Set session key generation callback context */
  21650. void wolfSSL_SetGenSessionKeyCtx(WOLFSSL* ssl, void *ctx)
  21651. {
  21652. if (ssl)
  21653. ssl->GenSessionKeyCtx = ctx;
  21654. }
  21655. /* Get session key generation callback context */
  21656. void* wolfSSL_GetGenSessionKeyCtx(WOLFSSL* ssl)
  21657. {
  21658. if (ssl)
  21659. return ssl->GenSessionKeyCtx;
  21660. return NULL;
  21661. }
  21662. /* callback for setting encryption keys */
  21663. void wolfSSL_CTX_SetEncryptKeysCb(WOLFSSL_CTX* ctx, CallbackEncryptKeys cb)
  21664. {
  21665. if (ctx)
  21666. ctx->EncryptKeysCb = cb;
  21667. }
  21668. /* Set encryption keys callback context */
  21669. void wolfSSL_SetEncryptKeysCtx(WOLFSSL* ssl, void *ctx)
  21670. {
  21671. if (ssl)
  21672. ssl->EncryptKeysCtx = ctx;
  21673. }
  21674. /* Get encryption keys callback context */
  21675. void* wolfSSL_GetEncryptKeysCtx(WOLFSSL* ssl)
  21676. {
  21677. if (ssl)
  21678. return ssl->EncryptKeysCtx;
  21679. return NULL;
  21680. }
  21681. /* callback for Tls finished */
  21682. /* the callback can be used to build TLS Finished message if enabled */
  21683. void wolfSSL_CTX_SetTlsFinishedCb(WOLFSSL_CTX* ctx, CallbackTlsFinished cb)
  21684. {
  21685. if (ctx)
  21686. ctx->TlsFinishedCb = cb;
  21687. }
  21688. /* Set Tls finished callback context */
  21689. void wolfSSL_SetTlsFinishedCtx(WOLFSSL* ssl, void *ctx)
  21690. {
  21691. if (ssl)
  21692. ssl->TlsFinishedCtx = ctx;
  21693. }
  21694. /* Get Tls finished callback context */
  21695. void* wolfSSL_GetTlsFinishedCtx(WOLFSSL* ssl)
  21696. {
  21697. if (ssl)
  21698. return ssl->TlsFinishedCtx;
  21699. return NULL;
  21700. }
  21701. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  21702. /* callback for verify data */
  21703. void wolfSSL_CTX_SetVerifyMacCb(WOLFSSL_CTX* ctx, CallbackVerifyMac cb)
  21704. {
  21705. if (ctx)
  21706. ctx->VerifyMacCb = cb;
  21707. }
  21708. /* Set set keys callback context */
  21709. void wolfSSL_SetVerifyMacCtx(WOLFSSL* ssl, void *ctx)
  21710. {
  21711. if (ssl)
  21712. ssl->VerifyMacCtx = ctx;
  21713. }
  21714. /* Get set keys callback context */
  21715. void* wolfSSL_GetVerifyMacCtx(WOLFSSL* ssl)
  21716. {
  21717. if (ssl)
  21718. return ssl->VerifyMacCtx;
  21719. return NULL;
  21720. }
  21721. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  21722. void wolfSSL_CTX_SetHKDFExpandLabelCb(WOLFSSL_CTX* ctx,
  21723. CallbackHKDFExpandLabel cb)
  21724. {
  21725. if (ctx)
  21726. ctx->HKDFExpandLabelCb = cb;
  21727. }
  21728. #ifdef WOLFSSL_PUBLIC_ASN
  21729. void wolfSSL_CTX_SetProcessPeerCertCb(WOLFSSL_CTX* ctx,
  21730. CallbackProcessPeerCert cb)
  21731. {
  21732. if (ctx)
  21733. ctx->ProcessPeerCertCb = cb;
  21734. }
  21735. #endif /* WOLFSSL_PUBLIC_ASN */
  21736. void wolfSSL_CTX_SetProcessServerSigKexCb(WOLFSSL_CTX* ctx,
  21737. CallbackProcessServerSigKex cb)
  21738. {
  21739. if (ctx)
  21740. ctx->ProcessServerSigKexCb = cb;
  21741. }
  21742. void wolfSSL_CTX_SetPerformTlsRecordProcessingCb(WOLFSSL_CTX* ctx,
  21743. CallbackPerformTlsRecordProcessing cb)
  21744. {
  21745. if (ctx)
  21746. ctx->PerformTlsRecordProcessingCb = cb;
  21747. }
  21748. #endif /* HAVE_PK_CALLBACKS */
  21749. #endif /* NO_CERTS */
  21750. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  21751. void wolfSSL_CTX_SetDhGenerateKeyPair(WOLFSSL_CTX* ctx,
  21752. CallbackDhGenerateKeyPair cb) {
  21753. if (ctx)
  21754. ctx->DhGenerateKeyPairCb = cb;
  21755. }
  21756. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  21757. {
  21758. if (ctx)
  21759. ctx->DhAgreeCb = cb;
  21760. }
  21761. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  21762. {
  21763. if (ssl)
  21764. ssl->DhAgreeCtx = ctx;
  21765. }
  21766. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  21767. {
  21768. if (ssl)
  21769. return ssl->DhAgreeCtx;
  21770. return NULL;
  21771. }
  21772. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  21773. #if defined(HAVE_PK_CALLBACKS) && defined(HAVE_HKDF)
  21774. void wolfSSL_CTX_SetHKDFExtractCb(WOLFSSL_CTX* ctx, CallbackHKDFExtract cb)
  21775. {
  21776. if (ctx)
  21777. ctx->HkdfExtractCb = cb;
  21778. }
  21779. void wolfSSL_SetHKDFExtractCtx(WOLFSSL* ssl, void *ctx)
  21780. {
  21781. if (ssl)
  21782. ssl->HkdfExtractCtx = ctx;
  21783. }
  21784. void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
  21785. {
  21786. if (ssl)
  21787. return ssl->HkdfExtractCtx;
  21788. return NULL;
  21789. }
  21790. #endif /* HAVE_PK_CALLBACKS && HAVE_HKDF */
  21791. #ifdef WOLFSSL_HAVE_WOLFSCEP
  21792. /* Used by autoconf to see if wolfSCEP is available */
  21793. void wolfSSL_wolfSCEP(void) {}
  21794. #endif
  21795. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  21796. /* Used by autoconf to see if cert service is available */
  21797. void wolfSSL_cert_service(void) {}
  21798. #endif
  21799. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  21800. !defined(WOLFCRYPT_ONLY)
  21801. #ifndef NO_CERTS
  21802. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21803. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21804. #if !defined(NO_FILESYSTEM)
  21805. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp,
  21806. WOLFSSL_EVP_PKEY **key, wc_pem_password_cb *cb, void *pass)
  21807. {
  21808. WOLFSSL_EVP_PKEY* pkey = NULL;
  21809. DerBuffer* der = NULL;
  21810. int keyFormat = 0;
  21811. WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey");
  21812. if (pem_read_file_key(fp, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  21813. &der) >= 0) {
  21814. const unsigned char* ptr = der->buffer;
  21815. int type = -1;
  21816. if (keyFormat) {
  21817. /* keyFormat is Key_Sum enum */
  21818. if (keyFormat == RSAk)
  21819. type = EVP_PKEY_RSA;
  21820. else if (keyFormat == ECDSAk)
  21821. type = EVP_PKEY_EC;
  21822. else if (keyFormat == DSAk)
  21823. type = EVP_PKEY_DSA;
  21824. else if (keyFormat == DHk)
  21825. type = EVP_PKEY_DH;
  21826. }
  21827. else {
  21828. /* Default to RSA if format is not set */
  21829. type = EVP_PKEY_RSA;
  21830. }
  21831. /* handle case where reuse is attempted */
  21832. if (key != NULL && *key != NULL)
  21833. pkey = *key;
  21834. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  21835. if (pkey == NULL) {
  21836. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  21837. }
  21838. }
  21839. FreeDer(&der);
  21840. if (key != NULL && pkey != NULL)
  21841. *key = pkey;
  21842. WOLFSSL_LEAVE("wolfSSL_PEM_read_PrivateKey", 0);
  21843. return pkey;
  21844. }
  21845. #endif
  21846. #endif
  21847. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/
  21848. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21849. #define PEM_BEGIN "-----BEGIN "
  21850. #define PEM_BEGIN_SZ 11
  21851. #define PEM_END "-----END "
  21852. #define PEM_END_SZ 9
  21853. #define PEM_HDR_FIN "-----"
  21854. #define PEM_HDR_FIN_SZ 5
  21855. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  21856. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  21857. #define PEM_HDR_FIN_EOL_SZ 6
  21858. #ifndef NO_BIO
  21859. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  21860. unsigned char **data, long *len)
  21861. {
  21862. int ret = WOLFSSL_SUCCESS;
  21863. char pem[256];
  21864. int pemLen;
  21865. char* p;
  21866. char* nameStr = NULL;
  21867. int nameLen = 0;
  21868. char* headerStr = NULL;
  21869. int headerFound = 0;
  21870. unsigned char* der = NULL;
  21871. word32 derLen = 0;
  21872. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  21873. len == NULL) {
  21874. return WOLFSSL_FAILURE;
  21875. }
  21876. /* Find header line. */
  21877. pem[sizeof(pem) - 1] = '\0';
  21878. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  21879. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  21880. break;
  21881. }
  21882. if (pemLen <= 0)
  21883. ret = WOLFSSL_FAILURE;
  21884. /* Have a header line. */
  21885. if (ret == WOLFSSL_SUCCESS) {
  21886. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  21887. pemLen--;
  21888. pem[pemLen] = '\0';
  21889. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  21890. PEM_HDR_FIN_SZ) != 0) {
  21891. ret = WOLFSSL_FAILURE;
  21892. }
  21893. }
  21894. /* Get out name. */
  21895. if (ret == WOLFSSL_SUCCESS) {
  21896. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  21897. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  21898. DYNAMIC_TYPE_TMP_BUFFER);
  21899. if (nameStr == NULL)
  21900. ret = WOLFSSL_FAILURE;
  21901. }
  21902. if (ret == WOLFSSL_SUCCESS) {
  21903. int headerLen;
  21904. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  21905. nameStr[nameLen] = '\0';
  21906. /* Get header of PEM - encryption header. */
  21907. headerLen = 0;
  21908. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  21909. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  21910. pem[pemLen - 1] == '\n')) {
  21911. pemLen--;
  21912. }
  21913. pem[pemLen++] = '\n';
  21914. pem[pemLen] = '\0';
  21915. /* Header separator is a blank line. */
  21916. if (pem[0] == '\n') {
  21917. headerFound = 1;
  21918. break;
  21919. }
  21920. /* Didn't find a blank line - no header. */
  21921. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  21922. der = (unsigned char*)headerStr;
  21923. derLen = headerLen;
  21924. /* Empty header - empty string. */
  21925. headerStr = (char*)XMALLOC(1, NULL,
  21926. DYNAMIC_TYPE_TMP_BUFFER);
  21927. if (headerStr == NULL)
  21928. ret = WOLFSSL_FAILURE;
  21929. else
  21930. headerStr[0] = '\0';
  21931. break;
  21932. }
  21933. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  21934. DYNAMIC_TYPE_TMP_BUFFER);
  21935. if (p == NULL) {
  21936. ret = WOLFSSL_FAILURE;
  21937. break;
  21938. }
  21939. headerStr = p;
  21940. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  21941. headerLen += pemLen;
  21942. }
  21943. if (pemLen <= 0)
  21944. ret = WOLFSSL_FAILURE;
  21945. }
  21946. /* Get body of PEM - if there was a header */
  21947. if (ret == WOLFSSL_SUCCESS && headerFound) {
  21948. derLen = 0;
  21949. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  21950. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  21951. pem[pemLen - 1] == '\n')) {
  21952. pemLen--;
  21953. }
  21954. pem[pemLen++] = '\n';
  21955. pem[pemLen] = '\0';
  21956. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  21957. break;
  21958. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  21959. DYNAMIC_TYPE_TMP_BUFFER);
  21960. if (p == NULL) {
  21961. ret = WOLFSSL_FAILURE;
  21962. break;
  21963. }
  21964. der = (unsigned char*)p;
  21965. XMEMCPY(der + derLen, pem, pemLen + 1);
  21966. derLen += pemLen;
  21967. }
  21968. if (pemLen <= 0)
  21969. ret = WOLFSSL_FAILURE;
  21970. }
  21971. /* Check trailer. */
  21972. if (ret == WOLFSSL_SUCCESS) {
  21973. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  21974. ret = WOLFSSL_FAILURE;
  21975. }
  21976. if (ret == WOLFSSL_SUCCESS) {
  21977. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  21978. PEM_HDR_FIN_EOL_NEWLINE,
  21979. PEM_HDR_FIN_EOL_SZ) != 0 &&
  21980. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  21981. PEM_HDR_FIN_EOL_NULL_TERM,
  21982. PEM_HDR_FIN_EOL_SZ) != 0) {
  21983. ret = WOLFSSL_FAILURE;
  21984. }
  21985. }
  21986. /* Base64 decode body. */
  21987. if (ret == WOLFSSL_SUCCESS) {
  21988. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  21989. ret = WOLFSSL_FAILURE;
  21990. }
  21991. if (ret == WOLFSSL_SUCCESS) {
  21992. *name = nameStr;
  21993. *header = headerStr;
  21994. *data = der;
  21995. *len = derLen;
  21996. nameStr = NULL;
  21997. headerStr = NULL;
  21998. der = NULL;
  21999. }
  22000. if (nameStr != NULL)
  22001. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22002. if (headerStr != NULL)
  22003. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22004. if (der != NULL)
  22005. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22006. return ret;
  22007. }
  22008. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  22009. const char *header, const unsigned char *data,
  22010. long len)
  22011. {
  22012. int err = 0;
  22013. int outSz = 0;
  22014. int nameLen;
  22015. int headerLen;
  22016. byte* pem = NULL;
  22017. word32 pemLen;
  22018. word32 derLen = (word32)len;
  22019. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  22020. return 0;
  22021. nameLen = (int)XSTRLEN(name);
  22022. headerLen = (int)XSTRLEN(header);
  22023. pemLen = (derLen + 2) / 3 * 4;
  22024. pemLen += (pemLen + 63) / 64;
  22025. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22026. err = pem == NULL;
  22027. if (!err)
  22028. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  22029. if (!err) {
  22030. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  22031. (int)PEM_BEGIN_SZ;
  22032. }
  22033. if (!err)
  22034. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  22035. if (!err) {
  22036. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  22037. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  22038. }
  22039. if (!err && headerLen > 0) {
  22040. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  22041. /* Blank line after a header and before body. */
  22042. if (!err)
  22043. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  22044. headerLen++;
  22045. }
  22046. if (!err)
  22047. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  22048. if (!err)
  22049. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  22050. (int)PEM_END_SZ;
  22051. if (!err)
  22052. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  22053. if (!err) {
  22054. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  22055. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  22056. }
  22057. if (!err) {
  22058. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  22059. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  22060. }
  22061. if (pem != NULL)
  22062. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22063. return outSz;
  22064. }
  22065. #if !defined(NO_FILESYSTEM)
  22066. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  22067. unsigned char **data, long *len)
  22068. {
  22069. int ret;
  22070. WOLFSSL_BIO* bio;
  22071. if (name == NULL || header == NULL || data == NULL || len == NULL)
  22072. return WOLFSSL_FAILURE;
  22073. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  22074. if (bio == NULL)
  22075. return 0;
  22076. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  22077. if (bio != NULL)
  22078. wolfSSL_BIO_free(bio);
  22079. return ret;
  22080. }
  22081. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  22082. const unsigned char *data, long len)
  22083. {
  22084. int ret;
  22085. WOLFSSL_BIO* bio;
  22086. if (name == NULL || header == NULL || data == NULL)
  22087. return 0;
  22088. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  22089. if (bio == NULL)
  22090. return 0;
  22091. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  22092. if (bio != NULL)
  22093. wolfSSL_BIO_free(bio);
  22094. return ret;
  22095. }
  22096. #endif
  22097. #endif /* !NO_BIO */
  22098. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  22099. EncryptedInfo* cipher)
  22100. {
  22101. if (header == NULL || cipher == NULL)
  22102. return WOLFSSL_FAILURE;
  22103. XMEMSET(cipher, 0, sizeof(*cipher));
  22104. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  22105. return WOLFSSL_FAILURE;
  22106. return WOLFSSL_SUCCESS;
  22107. }
  22108. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  22109. long* len, wc_pem_password_cb* callback,
  22110. void* ctx)
  22111. {
  22112. int ret = WOLFSSL_SUCCESS;
  22113. char password[NAME_SZ];
  22114. int passwordSz;
  22115. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  22116. return WOLFSSL_FAILURE;
  22117. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  22118. if (passwordSz < 0)
  22119. ret = WOLFSSL_FAILURE;
  22120. if (ret == WOLFSSL_SUCCESS) {
  22121. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  22122. passwordSz, WC_MD5) != 0) {
  22123. ret = WOLFSSL_FAILURE;
  22124. }
  22125. }
  22126. if (passwordSz > 0)
  22127. XMEMSET(password, 0, passwordSz);
  22128. return ret;
  22129. }
  22130. #ifndef NO_BIO
  22131. /*
  22132. * bp : bio to read X509 from
  22133. * x : x509 to write to
  22134. * cb : password call back for reading PEM
  22135. * u : password
  22136. * _AUX is for working with a trusted X509 certificate
  22137. */
  22138. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  22139. WOLFSSL_X509 **x, wc_pem_password_cb *cb,
  22140. void *u)
  22141. {
  22142. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  22143. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  22144. * and potentially a stack of "other" info. wolfSSL does not store
  22145. * friendly name or private key id yet in WOLFSSL_X509 for human
  22146. * readability and does not support extra trusted/rejected uses for
  22147. * root CA. */
  22148. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  22149. }
  22150. #endif /* !NO_BIO */
  22151. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  22152. #endif /* !NO_CERTS */
  22153. /* NID variables are dependent on compatibility header files currently
  22154. *
  22155. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  22156. * on fail
  22157. */
  22158. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  22159. {
  22160. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  22161. }
  22162. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  22163. WOLFSSL_ASN1_OBJECT* arg_obj)
  22164. {
  22165. word32 oidSz = 0;
  22166. int nid = 0;
  22167. const byte* oid;
  22168. word32 type = 0;
  22169. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  22170. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  22171. word32 objSz = 0;
  22172. const char* sName = NULL;
  22173. int i;
  22174. #ifdef WOLFSSL_DEBUG_OPENSSL
  22175. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj");
  22176. #endif
  22177. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  22178. if (wolfssl_object_info[i].nid == id) {
  22179. nid = id;
  22180. id = wolfssl_object_info[i].id;
  22181. sName = wolfssl_object_info[i].sName;
  22182. type = wolfssl_object_info[i].type;
  22183. break;
  22184. }
  22185. }
  22186. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  22187. WOLFSSL_MSG("NID not in table");
  22188. #ifdef WOLFSSL_QT
  22189. sName = NULL;
  22190. type = id;
  22191. #else
  22192. return NULL;
  22193. #endif
  22194. }
  22195. #ifdef HAVE_ECC
  22196. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  22197. type = oidCurveType;
  22198. }
  22199. #endif /* HAVE_ECC */
  22200. if (sName != NULL) {
  22201. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  22202. WOLFSSL_MSG("Attempted short name is too large");
  22203. return NULL;
  22204. }
  22205. }
  22206. oid = OidFromId(id, type, &oidSz);
  22207. /* set object ID to buffer */
  22208. if (obj == NULL){
  22209. obj = wolfSSL_ASN1_OBJECT_new();
  22210. if (obj == NULL) {
  22211. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  22212. return NULL;
  22213. }
  22214. }
  22215. obj->nid = nid;
  22216. obj->type = id;
  22217. obj->grp = type;
  22218. obj->sName[0] = '\0';
  22219. if (sName != NULL) {
  22220. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  22221. }
  22222. objBuf[0] = ASN_OBJECT_ID; objSz++;
  22223. objSz += SetLength(oidSz, objBuf + 1);
  22224. if (oidSz) {
  22225. XMEMCPY(objBuf + objSz, oid, oidSz);
  22226. objSz += oidSz;
  22227. }
  22228. if (obj->objSz == 0 || objSz != obj->objSz) {
  22229. obj->objSz = objSz;
  22230. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  22231. (obj->obj == NULL)) {
  22232. if (obj->obj != NULL)
  22233. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  22234. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  22235. if (obj->obj == NULL) {
  22236. wolfSSL_ASN1_OBJECT_free(obj);
  22237. return NULL;
  22238. }
  22239. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  22240. }
  22241. else {
  22242. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  22243. }
  22244. }
  22245. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  22246. (void)type;
  22247. return obj;
  22248. }
  22249. static const char* oid_translate_num_to_str(const char* oid)
  22250. {
  22251. const struct oid_dict {
  22252. const char* num;
  22253. const char* desc;
  22254. } oid_dict[] = {
  22255. { "2.5.29.37.0", "Any Extended Key Usage" },
  22256. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  22257. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  22258. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  22259. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  22260. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  22261. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  22262. { NULL, NULL }
  22263. };
  22264. const struct oid_dict* idx;
  22265. for (idx = oid_dict; idx->num != NULL; idx++) {
  22266. if (!XSTRCMP(oid, idx->num)) {
  22267. return idx->desc;
  22268. }
  22269. }
  22270. return NULL;
  22271. }
  22272. static int wolfssl_obj2txt_numeric(char *buf, int bufLen,
  22273. const WOLFSSL_ASN1_OBJECT *a)
  22274. {
  22275. int bufSz;
  22276. int length;
  22277. word32 idx = 0;
  22278. byte tag;
  22279. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  22280. return WOLFSSL_FAILURE;
  22281. }
  22282. if (tag != ASN_OBJECT_ID) {
  22283. WOLFSSL_MSG("Bad ASN1 Object");
  22284. return WOLFSSL_FAILURE;
  22285. }
  22286. if (GetLength((const byte*)a->obj, &idx, &length,
  22287. a->objSz) < 0 || length < 0) {
  22288. return ASN_PARSE_E;
  22289. }
  22290. if (bufLen < MAX_OID_STRING_SZ) {
  22291. bufSz = bufLen - 1;
  22292. }
  22293. else {
  22294. bufSz = MAX_OID_STRING_SZ;
  22295. }
  22296. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  22297. (word32)length)) <= 0) {
  22298. WOLFSSL_MSG("Error decoding OID");
  22299. return WOLFSSL_FAILURE;
  22300. }
  22301. buf[bufSz] = '\0';
  22302. return bufSz;
  22303. }
  22304. /* If no_name is one then use numerical form, otherwise short name.
  22305. *
  22306. * Returns the buffer size on success, WOLFSSL_FAILURE on error
  22307. */
  22308. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, const WOLFSSL_ASN1_OBJECT *a,
  22309. int no_name)
  22310. {
  22311. int bufSz;
  22312. const char* desc;
  22313. const char* name;
  22314. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt");
  22315. if (buf == NULL || bufLen <= 1 || a == NULL) {
  22316. WOLFSSL_MSG("Bad input argument");
  22317. return WOLFSSL_FAILURE;
  22318. }
  22319. if (no_name == 1) {
  22320. return wolfssl_obj2txt_numeric(buf, bufLen, a);
  22321. }
  22322. /* return long name unless using x509small, then return short name */
  22323. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  22324. name = a->sName;
  22325. #else
  22326. name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  22327. #endif
  22328. if (name == NULL) {
  22329. WOLFSSL_MSG("Name not found");
  22330. bufSz = 0;
  22331. }
  22332. else if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  22333. bufSz = (int)XSTRLEN(name);
  22334. }
  22335. else {
  22336. bufSz = bufLen - 1;
  22337. }
  22338. if (bufSz) {
  22339. XMEMCPY(buf, name, bufSz);
  22340. }
  22341. else if (a->type == GEN_DNS || a->type == GEN_EMAIL ||
  22342. a->type == GEN_URI) {
  22343. bufSz = (int)XSTRLEN((const char*)a->obj);
  22344. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  22345. }
  22346. else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) {
  22347. if ((desc = oid_translate_num_to_str(buf))) {
  22348. bufSz = (int)XSTRLEN(desc);
  22349. bufSz = min(bufSz, bufLen - 1);
  22350. XMEMCPY(buf, desc, bufSz);
  22351. }
  22352. }
  22353. else {
  22354. bufSz = 0;
  22355. }
  22356. buf[bufSz] = '\0';
  22357. return bufSz;
  22358. }
  22359. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  22360. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  22361. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  22362. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  22363. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS_SMALL)
  22364. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  22365. * n : NID value of ASN1_OBJECT to search */
  22366. const char* wolfSSL_OBJ_nid2ln(int n)
  22367. {
  22368. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  22369. size_t i;
  22370. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  22371. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  22372. if (obj_info->nid == n) {
  22373. return obj_info->lName;
  22374. }
  22375. }
  22376. WOLFSSL_MSG("NID not found in table");
  22377. return NULL;
  22378. }
  22379. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  22380. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY, WOLFSSL_WPAS_SMALL */
  22381. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  22382. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  22383. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  22384. defined(WOLFSSL_HAPROXY)
  22385. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  22386. {
  22387. int ret;
  22388. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  22389. if (!ctx || !x || !x->derCert) {
  22390. WOLFSSL_MSG("Bad parameter");
  22391. return WOLFSSL_FAILURE;
  22392. }
  22393. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  22394. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  22395. ctx->heap);
  22396. if (ret != 0)
  22397. return WOLFSSL_FAILURE;
  22398. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  22399. x->derCert->length);
  22400. #ifdef KEEP_OUR_CERT
  22401. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  22402. wolfSSL_X509_free(ctx->ourCert);
  22403. }
  22404. #ifndef WOLFSSL_X509_STORE_CERTS
  22405. ctx->ourCert = x;
  22406. if (wolfSSL_X509_up_ref(x) != 1) {
  22407. return WOLFSSL_FAILURE;
  22408. }
  22409. #else
  22410. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  22411. if(ctx->ourCert == NULL){
  22412. return WOLFSSL_FAILURE;
  22413. }
  22414. #endif
  22415. /* We own the cert because either we up its reference counter
  22416. * or we create our own copy of the cert object. */
  22417. ctx->ownOurCert = 1;
  22418. #endif
  22419. /* Update the available options with public keys. */
  22420. switch (x->pubKeyOID) {
  22421. #ifndef NO_RSA
  22422. #ifdef WC_RSA_PSS
  22423. case RSAPSSk:
  22424. #endif
  22425. case RSAk:
  22426. ctx->haveRSA = 1;
  22427. break;
  22428. #endif
  22429. #ifdef HAVE_ED25519
  22430. case ED25519k:
  22431. #endif
  22432. #ifdef HAVE_ED448
  22433. case ED448k:
  22434. #endif
  22435. case ECDSAk:
  22436. ctx->haveECC = 1;
  22437. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22438. ctx->pkCurveOID = x->pkCurveOID;
  22439. #endif
  22440. break;
  22441. }
  22442. return WOLFSSL_SUCCESS;
  22443. }
  22444. static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn,
  22445. byte* cert, word32 certSz, void* heap)
  22446. {
  22447. int ret;
  22448. DerBuffer* inChain = NULL;
  22449. DerBuffer* der = NULL;
  22450. word32 len = 0;
  22451. if (inOutDer == NULL)
  22452. return BAD_FUNC_ARG;
  22453. inChain = *inOutDer;
  22454. if (inChain != NULL)
  22455. len = inChain->length;
  22456. ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE,
  22457. heap);
  22458. if (ret != 0) {
  22459. WOLFSSL_MSG("AllocDer error");
  22460. return ret;
  22461. }
  22462. if (inChain != NULL)
  22463. XMEMCPY(der->buffer, inChain->buffer, len);
  22464. c32to24(certSz, der->buffer + len);
  22465. XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz);
  22466. if (weOwn)
  22467. FreeDer(inOutDer);
  22468. *inOutDer = der;
  22469. return WOLFSSL_SUCCESS;
  22470. }
  22471. /**
  22472. * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it
  22473. * on success
  22474. */
  22475. int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  22476. {
  22477. WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert");
  22478. if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) {
  22479. return WOLFSSL_FAILURE;
  22480. }
  22481. wolfSSL_X509_free(x509);
  22482. return WOLFSSL_SUCCESS;
  22483. }
  22484. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  22485. {
  22486. int ret;
  22487. WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert");
  22488. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  22489. return WOLFSSL_FAILURE;
  22490. }
  22491. if (ctx->certificate == NULL)
  22492. ret = (int)wolfSSL_CTX_use_certificate(ctx, x509);
  22493. else {
  22494. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  22495. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  22496. return WOLFSSL_FAILURE;
  22497. }
  22498. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  22499. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  22500. if (ret == WOLFSSL_SUCCESS) {
  22501. /* push to ctx->certChain */
  22502. ret = PushCertToDerBuffer(&ctx->certChain, 1,
  22503. x509->derCert->buffer, x509->derCert->length, ctx->heap);
  22504. }
  22505. /* Store cert to free it later */
  22506. if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) {
  22507. ctx->x509Chain = wolfSSL_sk_X509_new_null();
  22508. if (ctx->x509Chain == NULL) {
  22509. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  22510. ret = WOLFSSL_FAILURE;
  22511. }
  22512. }
  22513. if (ret == WOLFSSL_SUCCESS &&
  22514. wolfSSL_sk_X509_push(ctx->x509Chain, x509)
  22515. != WOLFSSL_SUCCESS) {
  22516. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  22517. ret = WOLFSSL_FAILURE;
  22518. }
  22519. if (ret != WOLFSSL_SUCCESS)
  22520. wolfSSL_X509_free(x509); /* Decrease ref counter */
  22521. }
  22522. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  22523. }
  22524. #ifdef KEEP_OUR_CERT
  22525. int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  22526. {
  22527. int ret;
  22528. WOLFSSL_ENTER("wolfSSL_add0_chain_cert");
  22529. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  22530. x509->derCert == NULL)
  22531. return WOLFSSL_FAILURE;
  22532. if (ssl->buffers.certificate == NULL) {
  22533. ret = wolfSSL_use_certificate(ssl, x509);
  22534. /* Store cert to free it later */
  22535. if (ret == WOLFSSL_SUCCESS) {
  22536. if (ssl->buffers.weOwnCert)
  22537. wolfSSL_X509_free(ssl->ourCert);
  22538. ssl->ourCert = x509;
  22539. ssl->buffers.weOwnCert = 1;
  22540. }
  22541. }
  22542. else {
  22543. ret = PushCertToDerBuffer(&ssl->buffers.certChain,
  22544. ssl->buffers.weOwnCertChain, x509->derCert->buffer,
  22545. x509->derCert->length, ssl->heap);
  22546. if (ret == WOLFSSL_SUCCESS) {
  22547. ssl->buffers.weOwnCertChain = 1;
  22548. /* Store cert to free it later */
  22549. if (ssl->ourCertChain == NULL) {
  22550. ssl->ourCertChain = wolfSSL_sk_X509_new_null();
  22551. if (ssl->ourCertChain == NULL) {
  22552. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  22553. return WOLFSSL_FAILURE;
  22554. }
  22555. }
  22556. if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509)
  22557. != WOLFSSL_SUCCESS) {
  22558. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  22559. return WOLFSSL_FAILURE;
  22560. }
  22561. }
  22562. }
  22563. return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  22564. }
  22565. int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  22566. {
  22567. int ret;
  22568. WOLFSSL_ENTER("wolfSSL_add1_chain_cert");
  22569. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  22570. x509->derCert == NULL)
  22571. return WOLFSSL_FAILURE;
  22572. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  22573. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  22574. return WOLFSSL_FAILURE;
  22575. }
  22576. ret = wolfSSL_add0_chain_cert(ssl, x509);
  22577. /* Decrease ref counter on error */
  22578. if (ret != WOLFSSL_SUCCESS)
  22579. wolfSSL_X509_free(x509);
  22580. return ret;
  22581. }
  22582. #endif
  22583. /* Return the corresponding short name for the nid <n>.
  22584. * or NULL if short name can't be found.
  22585. */
  22586. const char * wolfSSL_OBJ_nid2sn(int n) {
  22587. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  22588. size_t i;
  22589. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  22590. if (n == NID_md5) {
  22591. /* NID_surname == NID_md5 and NID_surname comes before NID_md5 in
  22592. * wolfssl_object_info. As a result, the loop below will incorrectly
  22593. * return "SN" instead of "MD5." NID_surname isn't the true OpenSSL
  22594. * NID, but other functions rely on this table and modifying it to
  22595. * conform with OpenSSL's NIDs isn't trivial. */
  22596. return "MD5";
  22597. }
  22598. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  22599. if (obj_info->nid == n) {
  22600. return obj_info->sName;
  22601. }
  22602. }
  22603. WOLFSSL_MSG_EX("SN not found (nid:%d)",n);
  22604. return NULL;
  22605. }
  22606. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22607. int wolfSSL_OBJ_sn2nid(const char *sn) {
  22608. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  22609. if (sn == NULL)
  22610. return NID_undef;
  22611. return wc_OBJ_sn2nid(sn);
  22612. }
  22613. #endif
  22614. size_t wolfSSL_OBJ_length(const WOLFSSL_ASN1_OBJECT* o)
  22615. {
  22616. size_t ret = 0;
  22617. int err = 0;
  22618. word32 idx = 0;
  22619. int len = 0;
  22620. WOLFSSL_ENTER("wolfSSL_OBJ_length");
  22621. if (o == NULL || o->obj == NULL) {
  22622. WOLFSSL_MSG("Bad argument.");
  22623. err = 1;
  22624. }
  22625. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  22626. WOLFSSL_MSG("Error parsing ASN.1 header.");
  22627. err = 1;
  22628. }
  22629. if (err == 0) {
  22630. ret = len;
  22631. }
  22632. WOLFSSL_LEAVE("wolfSSL_OBJ_length", (int)ret);
  22633. return ret;
  22634. }
  22635. const unsigned char* wolfSSL_OBJ_get0_data(const WOLFSSL_ASN1_OBJECT* o)
  22636. {
  22637. const unsigned char* ret = NULL;
  22638. int err = 0;
  22639. word32 idx = 0;
  22640. int len = 0;
  22641. WOLFSSL_ENTER("wolfSSL_OBJ_get0_data");
  22642. if (o == NULL || o->obj == NULL) {
  22643. WOLFSSL_MSG("Bad argument.");
  22644. err = 1;
  22645. }
  22646. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  22647. WOLFSSL_MSG("Error parsing ASN.1 header.");
  22648. err = 1;
  22649. }
  22650. if (err == 0) {
  22651. ret = o->obj + idx;
  22652. }
  22653. return ret;
  22654. }
  22655. /* Gets the NID value that corresponds with the ASN1 object.
  22656. *
  22657. * o ASN1 object to get NID of
  22658. *
  22659. * Return NID on success and a negative value on failure
  22660. */
  22661. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  22662. {
  22663. word32 oid = 0;
  22664. word32 idx = 0;
  22665. int ret;
  22666. #ifdef WOLFSSL_DEBUG_OPENSSL
  22667. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  22668. #endif
  22669. if (o == NULL) {
  22670. return -1;
  22671. }
  22672. #ifdef WOLFSSL_QT
  22673. if (o->grp == oidCertExtType) {
  22674. /* If nid is an unknown extension, return NID_undef */
  22675. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  22676. return NID_undef;
  22677. }
  22678. #endif
  22679. if (o->nid > 0)
  22680. return o->nid;
  22681. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  22682. if (ret == ASN_OBJECT_ID_E) {
  22683. /* Put ASN object tag in front and try again */
  22684. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  22685. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22686. if (!buf) {
  22687. WOLFSSL_MSG("malloc error");
  22688. return -1;
  22689. }
  22690. idx = SetObjectId(o->objSz, buf);
  22691. XMEMCPY(buf + idx, o->obj, o->objSz);
  22692. idx = 0;
  22693. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  22694. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22695. if (ret < 0) {
  22696. WOLFSSL_MSG("Issue getting OID of object");
  22697. return -1;
  22698. }
  22699. }
  22700. else {
  22701. WOLFSSL_MSG("Issue getting OID of object");
  22702. return -1;
  22703. }
  22704. }
  22705. return oid2nid(oid, o->grp);
  22706. }
  22707. /* Return the corresponding NID for the long name <ln>
  22708. * or NID_undef if NID can't be found.
  22709. */
  22710. int wolfSSL_OBJ_ln2nid(const char *ln)
  22711. {
  22712. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  22713. size_t lnlen;
  22714. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  22715. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  22716. /* Accept input like "/commonName=" */
  22717. if (ln[0] == '/') {
  22718. ln++;
  22719. lnlen--;
  22720. }
  22721. if (lnlen) {
  22722. size_t i;
  22723. if (ln[lnlen-1] == '=') {
  22724. lnlen--;
  22725. }
  22726. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  22727. if (lnlen == XSTRLEN(obj_info->lName) &&
  22728. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  22729. return obj_info->nid;
  22730. }
  22731. }
  22732. }
  22733. }
  22734. return NID_undef;
  22735. }
  22736. /* compares two objects, return 0 if equal */
  22737. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  22738. const WOLFSSL_ASN1_OBJECT* b)
  22739. {
  22740. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  22741. if (a && b && a->obj && b->obj) {
  22742. if (a->objSz == b->objSz) {
  22743. return XMEMCMP(a->obj, b->obj, a->objSz);
  22744. }
  22745. else if (a->type == EXT_KEY_USAGE_OID ||
  22746. b->type == EXT_KEY_USAGE_OID) {
  22747. /* Special case for EXT_KEY_USAGE_OID so that
  22748. * cmp will be treated as a substring search */
  22749. /* Used in libest to check for id-kp-cmcRA in
  22750. * EXT_KEY_USAGE extension */
  22751. unsigned int idx;
  22752. const byte* s; /* shorter */
  22753. unsigned int sLen;
  22754. const byte* l; /* longer */
  22755. unsigned int lLen;
  22756. if (a->objSz > b->objSz) {
  22757. s = b->obj; sLen = b->objSz;
  22758. l = a->obj; lLen = a->objSz;
  22759. }
  22760. else {
  22761. s = a->obj; sLen = a->objSz;
  22762. l = b->obj; lLen = b->objSz;
  22763. }
  22764. for (idx = 0; idx <= lLen - sLen; idx++) {
  22765. if (XMEMCMP(l + idx, s, sLen) == 0) {
  22766. /* Found substring */
  22767. return 0;
  22768. }
  22769. }
  22770. }
  22771. }
  22772. return WOLFSSL_FATAL_ERROR;
  22773. }
  22774. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  22775. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  22776. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  22777. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  22778. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  22779. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  22780. /* Gets the NID value that is related to the OID string passed in. Example
  22781. * string would be "2.5.29.14" for subject key ID.
  22782. *
  22783. * returns NID value on success and NID_undef on error
  22784. */
  22785. int wolfSSL_OBJ_txt2nid(const char* s)
  22786. {
  22787. unsigned int i;
  22788. #ifdef WOLFSSL_CERT_EXT
  22789. int ret;
  22790. unsigned int sum = 0;
  22791. unsigned int outSz = MAX_OID_SZ;
  22792. unsigned char out[MAX_OID_SZ];
  22793. #endif
  22794. WOLFSSL_ENTER("wolfSSL_OBJ_txt2nid");
  22795. if (s == NULL) {
  22796. return NID_undef;
  22797. }
  22798. #ifdef WOLFSSL_CERT_EXT
  22799. ret = EncodePolicyOID(out, &outSz, s, NULL);
  22800. if (ret == 0) {
  22801. /* sum OID */
  22802. for (i = 0; i < outSz; i++) {
  22803. sum += out[i];
  22804. }
  22805. }
  22806. #endif /* WOLFSSL_CERT_EXT */
  22807. /* get the group that the OID's sum is in
  22808. * @TODO possible conflict with multiples */
  22809. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  22810. int len;
  22811. #ifdef WOLFSSL_CERT_EXT
  22812. if (ret == 0) {
  22813. if (wolfssl_object_info[i].id == (int)sum) {
  22814. return wolfssl_object_info[i].nid;
  22815. }
  22816. }
  22817. #endif
  22818. /* try as a short name */
  22819. len = (int)XSTRLEN(s);
  22820. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  22821. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  22822. return wolfssl_object_info[i].nid;
  22823. }
  22824. /* try as a long name */
  22825. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  22826. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  22827. return wolfssl_object_info[i].nid;
  22828. }
  22829. }
  22830. return NID_undef;
  22831. }
  22832. #endif
  22833. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  22834. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  22835. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  22836. defined(WOLFSSL_HAPROXY)
  22837. /* Creates new ASN1_OBJECT from short name, long name, or text
  22838. * representation of oid. If no_name is 0, then short name, long name, and
  22839. * numerical value of oid are interpreted. If no_name is 1, then only the
  22840. * numerical value of the oid is interpreted.
  22841. *
  22842. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  22843. */
  22844. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  22845. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  22846. {
  22847. int i, ret;
  22848. int nid = NID_undef;
  22849. unsigned int outSz = MAX_OID_SZ;
  22850. unsigned char out[MAX_OID_SZ];
  22851. WOLFSSL_ASN1_OBJECT* obj;
  22852. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  22853. if (s == NULL)
  22854. return NULL;
  22855. /* If s is numerical value, try to sum oid */
  22856. ret = EncodePolicyOID(out, &outSz, s, NULL);
  22857. if (ret == 0 && outSz > 0) {
  22858. /* If numerical encode succeeded then just
  22859. * create object from that because sums are
  22860. * not unique and can cause confusion. */
  22861. obj = wolfSSL_ASN1_OBJECT_new();
  22862. if (obj == NULL) {
  22863. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  22864. return NULL;
  22865. }
  22866. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  22867. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  22868. DYNAMIC_TYPE_ASN1);
  22869. if (obj->obj == NULL) {
  22870. wolfSSL_ASN1_OBJECT_free(obj);
  22871. return NULL;
  22872. }
  22873. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  22874. i = SetObjectId(outSz, (byte*)obj->obj);
  22875. XMEMCPY((byte*)obj->obj + i, out, outSz);
  22876. obj->objSz = i + outSz;
  22877. return obj;
  22878. }
  22879. /* TODO: update short names in wolfssl_object_info and check OID sums
  22880. are correct */
  22881. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  22882. /* Short name, long name, and numerical value are interpreted */
  22883. if (no_name == 0 &&
  22884. ((XSTRCMP(s, wolfssl_object_info[i].sName) == 0) ||
  22885. (XSTRCMP(s, wolfssl_object_info[i].lName) == 0)))
  22886. {
  22887. nid = wolfssl_object_info[i].nid;
  22888. }
  22889. }
  22890. if (nid != NID_undef)
  22891. return wolfSSL_OBJ_nid2obj(nid);
  22892. return NULL;
  22893. }
  22894. #endif
  22895. /* compatibility function. Its intended use is to remove OID's from an
  22896. * internal table that have been added with OBJ_create. wolfSSL manages its
  22897. * own internal OID values and does not currently support OBJ_create. */
  22898. void wolfSSL_OBJ_cleanup(void)
  22899. {
  22900. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup");
  22901. }
  22902. #ifndef NO_WOLFSSL_STUB
  22903. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  22904. {
  22905. (void)oid;
  22906. (void)sn;
  22907. (void)ln;
  22908. WOLFSSL_STUB("wolfSSL_OBJ_create");
  22909. return WOLFSSL_FAILURE;
  22910. }
  22911. #endif
  22912. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  22913. {
  22914. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22915. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  22916. ssl->options.verifyDepth = (byte)depth;
  22917. #endif
  22918. }
  22919. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  22920. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  22921. #ifdef OPENSSL_EXTRA
  22922. /* wolfSSL uses negative values for error states. This function returns an
  22923. * unsigned type so the value returned is the absolute value of the error.
  22924. */
  22925. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  22926. {
  22927. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  22928. (void)line;
  22929. (void)file;
  22930. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  22931. {
  22932. int ret;
  22933. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  22934. WOLFSSL_MSG("Issue peeking at error node in queue");
  22935. return 0;
  22936. }
  22937. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) \
  22938. || defined(WOLFSSL_HAPROXY)
  22939. if (ret == -ASN_NO_PEM_HEADER)
  22940. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  22941. #endif
  22942. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  22943. if (ret == ASN1_R_HEADER_TOO_LONG) {
  22944. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  22945. }
  22946. #endif
  22947. return (unsigned long)ret;
  22948. }
  22949. #else
  22950. return (unsigned long)(0 - NOT_COMPILED_IN);
  22951. #endif
  22952. }
  22953. #ifndef NO_CERTS
  22954. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  22955. {
  22956. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  22957. if (ctx == NULL || pkey == NULL) {
  22958. return WOLFSSL_FAILURE;
  22959. }
  22960. switch (pkey->type) {
  22961. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && !defined(NO_RSA)
  22962. case EVP_PKEY_RSA:
  22963. WOLFSSL_MSG("populating RSA key");
  22964. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS)
  22965. return WOLFSSL_FAILURE;
  22966. break;
  22967. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  22968. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  22969. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  22970. case EVP_PKEY_DSA:
  22971. break;
  22972. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  22973. #ifdef HAVE_ECC
  22974. case EVP_PKEY_EC:
  22975. WOLFSSL_MSG("populating ECC key");
  22976. if (ECC_populate_EVP_PKEY(pkey, pkey->ecc)
  22977. != WOLFSSL_SUCCESS)
  22978. return WOLFSSL_FAILURE;
  22979. break;
  22980. #endif
  22981. default:
  22982. return WOLFSSL_FAILURE;
  22983. }
  22984. if (pkey->pkey.ptr != NULL) {
  22985. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  22986. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  22987. (const unsigned char*)pkey->pkey.ptr,
  22988. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  22989. }
  22990. WOLFSSL_MSG("wolfSSL private key not set");
  22991. return BAD_FUNC_ARG;
  22992. }
  22993. #endif /* !NO_CERTS */
  22994. #endif /* OPENSSL_EXTRA */
  22995. #if defined(HAVE_EX_DATA) && \
  22996. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  22997. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  22998. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  22999. defined(WOLFSSL_WPAS_SMALL)
  23000. CRYPTO_EX_cb_ctx* crypto_ex_cb_ctx_session = NULL;
  23001. static int crypto_ex_cb_new(CRYPTO_EX_cb_ctx** dst, long ctx_l, void* ctx_ptr,
  23002. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  23003. WOLFSSL_CRYPTO_EX_free* free_func)
  23004. {
  23005. CRYPTO_EX_cb_ctx* new_ctx = (CRYPTO_EX_cb_ctx*)XMALLOC(
  23006. sizeof(CRYPTO_EX_cb_ctx), NULL, DYNAMIC_TYPE_OPENSSL);
  23007. if (new_ctx == NULL)
  23008. return -1;
  23009. new_ctx->ctx_l = ctx_l;
  23010. new_ctx->ctx_ptr = ctx_ptr;
  23011. new_ctx->new_func = new_func;
  23012. new_ctx->free_func = free_func;
  23013. new_ctx->dup_func = dup_func;
  23014. new_ctx->next = NULL;
  23015. /* Push to end of list */
  23016. while (*dst != NULL)
  23017. dst = &(*dst)->next;
  23018. *dst = new_ctx;
  23019. return 0;
  23020. }
  23021. void crypto_ex_cb_free(CRYPTO_EX_cb_ctx* cb_ctx)
  23022. {
  23023. while (cb_ctx != NULL) {
  23024. CRYPTO_EX_cb_ctx* next = cb_ctx->next;
  23025. XFREE(cb_ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23026. cb_ctx = next;
  23027. }
  23028. }
  23029. void crypto_ex_cb_setup_new_data(void *new_obj, CRYPTO_EX_cb_ctx* cb_ctx,
  23030. WOLFSSL_CRYPTO_EX_DATA* ex_data)
  23031. {
  23032. int idx = 0;
  23033. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23034. if (cb_ctx->new_func != NULL)
  23035. cb_ctx->new_func(new_obj, NULL, ex_data, idx, cb_ctx->ctx_l,
  23036. cb_ctx->ctx_ptr);
  23037. }
  23038. }
  23039. int crypto_ex_cb_dup_data(const WOLFSSL_CRYPTO_EX_DATA *in,
  23040. WOLFSSL_CRYPTO_EX_DATA *out, CRYPTO_EX_cb_ctx* cb_ctx)
  23041. {
  23042. int idx = 0;
  23043. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23044. if (cb_ctx->dup_func != NULL) {
  23045. void* ptr = wolfSSL_CRYPTO_get_ex_data(in, idx);
  23046. if (!cb_ctx->dup_func(out, in,
  23047. &ptr, idx,
  23048. cb_ctx->ctx_l, cb_ctx->ctx_ptr)) {
  23049. return WOLFSSL_FAILURE;
  23050. }
  23051. wolfSSL_CRYPTO_set_ex_data(out, idx, ptr);
  23052. }
  23053. }
  23054. return WOLFSSL_SUCCESS;
  23055. }
  23056. void crypto_ex_cb_free_data(void *obj, CRYPTO_EX_cb_ctx* cb_ctx,
  23057. WOLFSSL_CRYPTO_EX_DATA* ex_data)
  23058. {
  23059. int idx = 0;
  23060. for (; cb_ctx != NULL; idx++, cb_ctx = cb_ctx->next) {
  23061. if (cb_ctx->free_func != NULL)
  23062. cb_ctx->free_func(obj, NULL, ex_data, idx, cb_ctx->ctx_l,
  23063. cb_ctx->ctx_ptr);
  23064. }
  23065. }
  23066. /**
  23067. * get_ex_new_index is a helper function for the following
  23068. * xx_get_ex_new_index functions:
  23069. * - wolfSSL_CRYPTO_get_ex_new_index
  23070. * - wolfSSL_CTX_get_ex_new_index
  23071. * - wolfSSL_get_ex_new_index
  23072. * Issues a unique index number for the specified class-index.
  23073. * Returns an index number greater or equal to zero on success,
  23074. * -1 on failure.
  23075. */
  23076. int wolfssl_get_ex_new_index(int class_index, long ctx_l, void* ctx_ptr,
  23077. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  23078. WOLFSSL_CRYPTO_EX_free* free_func)
  23079. {
  23080. /* index counter for each class index*/
  23081. static int ctx_idx = 0;
  23082. static int ssl_idx = 0;
  23083. static int ssl_session_idx = 0;
  23084. static int x509_idx = 0;
  23085. int idx = -1;
  23086. switch(class_index) {
  23087. case WOLF_CRYPTO_EX_INDEX_SSL:
  23088. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23089. dup_func, free_func);
  23090. idx = ssl_idx++;
  23091. break;
  23092. case WOLF_CRYPTO_EX_INDEX_SSL_CTX:
  23093. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23094. dup_func, free_func);
  23095. idx = ctx_idx++;
  23096. break;
  23097. case WOLF_CRYPTO_EX_INDEX_X509:
  23098. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(ctx_l, ctx_ptr, new_func,
  23099. dup_func, free_func);
  23100. idx = x509_idx++;
  23101. break;
  23102. case WOLF_CRYPTO_EX_INDEX_SSL_SESSION:
  23103. if (crypto_ex_cb_new(&crypto_ex_cb_ctx_session, ctx_l, ctx_ptr,
  23104. new_func, dup_func, free_func) != 0)
  23105. return -1;
  23106. idx = ssl_session_idx++;
  23107. break;
  23108. /* following class indexes are not supoprted */
  23109. case WOLF_CRYPTO_EX_INDEX_X509_STORE:
  23110. case WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX:
  23111. case WOLF_CRYPTO_EX_INDEX_DH:
  23112. case WOLF_CRYPTO_EX_INDEX_DSA:
  23113. case WOLF_CRYPTO_EX_INDEX_EC_KEY:
  23114. case WOLF_CRYPTO_EX_INDEX_RSA:
  23115. case WOLF_CRYPTO_EX_INDEX_ENGINE:
  23116. case WOLF_CRYPTO_EX_INDEX_UI:
  23117. case WOLF_CRYPTO_EX_INDEX_BIO:
  23118. case WOLF_CRYPTO_EX_INDEX_APP:
  23119. case WOLF_CRYPTO_EX_INDEX_UI_METHOD:
  23120. case WOLF_CRYPTO_EX_INDEX_DRBG:
  23121. default:
  23122. break;
  23123. }
  23124. if (idx >= MAX_EX_DATA)
  23125. return -1;
  23126. return idx;
  23127. }
  23128. #endif /* HAVE_EX_DATA || WOLFSSL_WPAS_SMALL */
  23129. #if defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL)
  23130. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  23131. {
  23132. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  23133. #ifdef HAVE_EX_DATA
  23134. if(ctx != NULL) {
  23135. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  23136. }
  23137. #else
  23138. (void)ctx;
  23139. (void)idx;
  23140. #endif
  23141. return NULL;
  23142. }
  23143. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg,
  23144. WOLFSSL_CRYPTO_EX_new* new_func,
  23145. WOLFSSL_CRYPTO_EX_dup* dup_func,
  23146. WOLFSSL_CRYPTO_EX_free* free_func)
  23147. {
  23148. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  23149. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX, idx, arg,
  23150. new_func, dup_func, free_func);
  23151. }
  23152. /* Return the index that can be used for the WOLFSSL structure to store
  23153. * application data.
  23154. *
  23155. */
  23156. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  23157. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  23158. WOLFSSL_CRYPTO_EX_free* cb3)
  23159. {
  23160. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  23161. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL, argValue, arg,
  23162. cb1, cb2, cb3);
  23163. }
  23164. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  23165. {
  23166. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  23167. #ifdef HAVE_EX_DATA
  23168. if (ctx != NULL)
  23169. {
  23170. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  23171. }
  23172. #else
  23173. (void)ctx;
  23174. (void)idx;
  23175. (void)data;
  23176. #endif
  23177. return WOLFSSL_FAILURE;
  23178. }
  23179. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  23180. int wolfSSL_CTX_set_ex_data_with_cleanup(
  23181. WOLFSSL_CTX* ctx,
  23182. int idx,
  23183. void* data,
  23184. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  23185. {
  23186. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data_with_cleanup");
  23187. if (ctx != NULL)
  23188. {
  23189. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  23190. cleanup_routine);
  23191. }
  23192. return WOLFSSL_FAILURE;
  23193. }
  23194. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  23195. #endif /* defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL) */
  23196. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23197. /* Returns char* to app data stored in ex[0].
  23198. *
  23199. * ssl WOLFSSL structure to get app data from
  23200. */
  23201. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  23202. {
  23203. /* checkout exdata stuff... */
  23204. WOLFSSL_ENTER("wolfSSL_get_app_data");
  23205. return wolfSSL_get_ex_data(ssl, 0);
  23206. }
  23207. /* Set ex array 0 to have app data
  23208. *
  23209. * ssl WOLFSSL struct to set app data in
  23210. * arg data to be stored
  23211. *
  23212. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  23213. */
  23214. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  23215. WOLFSSL_ENTER("wolfSSL_set_app_data");
  23216. return wolfSSL_set_ex_data(ssl, 0, arg);
  23217. }
  23218. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  23219. #if defined(HAVE_EX_DATA) || defined(OPENSSL_EXTRA) || \
  23220. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  23221. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  23222. {
  23223. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  23224. #ifdef HAVE_EX_DATA
  23225. if (ssl != NULL)
  23226. {
  23227. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  23228. }
  23229. #else
  23230. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  23231. (void)ssl;
  23232. (void)idx;
  23233. (void)data;
  23234. #endif
  23235. return WOLFSSL_FAILURE;
  23236. }
  23237. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  23238. int wolfSSL_set_ex_data_with_cleanup(
  23239. WOLFSSL* ssl,
  23240. int idx,
  23241. void* data,
  23242. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  23243. {
  23244. WOLFSSL_ENTER("wolfSSL_set_ex_data_with_cleanup");
  23245. if (ssl != NULL)
  23246. {
  23247. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ssl->ex_data, idx, data,
  23248. cleanup_routine);
  23249. }
  23250. return WOLFSSL_FAILURE;
  23251. }
  23252. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  23253. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  23254. {
  23255. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  23256. #ifdef HAVE_EX_DATA
  23257. if (ssl != NULL) {
  23258. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  23259. }
  23260. #else
  23261. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  23262. (void)ssl;
  23263. (void)idx;
  23264. #endif
  23265. return 0;
  23266. }
  23267. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  23268. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  23269. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  23270. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  23271. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  23272. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  23273. {
  23274. int pSz, gSz;
  23275. byte *p, *g;
  23276. int ret=0;
  23277. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  23278. if(!ctx || !dh)
  23279. return BAD_FUNC_ARG;
  23280. /* Get needed size for p and g */
  23281. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  23282. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  23283. if(pSz <= 0 || gSz <= 0)
  23284. return WOLFSSL_FATAL_ERROR;
  23285. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23286. if(!p)
  23287. return MEMORY_E;
  23288. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23289. if(!g) {
  23290. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23291. return MEMORY_E;
  23292. }
  23293. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  23294. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  23295. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  23296. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  23297. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23298. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23299. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  23300. }
  23301. #endif /* OPENSSL_EXTRA && !NO_DH */
  23302. /* returns the enum value associated with handshake state
  23303. *
  23304. * ssl the WOLFSSL structure to get state of
  23305. */
  23306. int wolfSSL_get_state(const WOLFSSL* ssl)
  23307. {
  23308. WOLFSSL_ENTER("wolfSSL_get_state");
  23309. if (ssl == NULL) {
  23310. WOLFSSL_MSG("Null argument passed in");
  23311. return WOLFSSL_FAILURE;
  23312. }
  23313. return ssl->options.handShakeState;
  23314. }
  23315. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  23316. #ifdef OPENSSL_EXTRA
  23317. void wolfSSL_certs_clear(WOLFSSL* ssl)
  23318. {
  23319. WOLFSSL_ENTER("wolfSSL_certs_clear");
  23320. if (ssl == NULL)
  23321. return;
  23322. /* ctx still owns certificate, certChain, key, dh, and cm */
  23323. if (ssl->buffers.weOwnCert)
  23324. FreeDer(&ssl->buffers.certificate);
  23325. ssl->buffers.certificate = NULL;
  23326. if (ssl->buffers.weOwnCertChain)
  23327. FreeDer(&ssl->buffers.certChain);
  23328. ssl->buffers.certChain = NULL;
  23329. #ifdef WOLFSSL_TLS13
  23330. ssl->buffers.certChainCnt = 0;
  23331. #endif
  23332. if (ssl->buffers.weOwnKey)
  23333. FreeDer(&ssl->buffers.key);
  23334. ssl->buffers.key = NULL;
  23335. ssl->buffers.keyType = 0;
  23336. ssl->buffers.keyId = 0;
  23337. ssl->buffers.keyLabel = 0;
  23338. ssl->buffers.keySz = 0;
  23339. ssl->buffers.keyDevId = 0;
  23340. }
  23341. #endif
  23342. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  23343. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  23344. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  23345. {
  23346. WOLFSSL_ENTER("wolfSSL_ctrl");
  23347. if (ssl == NULL)
  23348. return BAD_FUNC_ARG;
  23349. switch (cmd) {
  23350. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  23351. #ifdef HAVE_SNI
  23352. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  23353. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  23354. if (pt == NULL) {
  23355. WOLFSSL_MSG("Passed in NULL Host Name.");
  23356. break;
  23357. }
  23358. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  23359. #endif /* HAVE_SNI */
  23360. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  23361. default:
  23362. WOLFSSL_MSG("Case not implemented.");
  23363. }
  23364. (void)opt;
  23365. (void)pt;
  23366. return WOLFSSL_FAILURE;
  23367. }
  23368. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  23369. {
  23370. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  23371. long ctrl_opt;
  23372. #endif
  23373. long ret = WOLFSSL_SUCCESS;
  23374. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  23375. if (ctx == NULL)
  23376. return WOLFSSL_FAILURE;
  23377. switch (cmd) {
  23378. case SSL_CTRL_CHAIN:
  23379. #ifdef SESSION_CERTS
  23380. {
  23381. /*
  23382. * We don't care about opt here because a copy of the certificate is
  23383. * stored anyway so increasing the reference counter is not necessary.
  23384. * Just check to make sure that it is set to one of the correct values.
  23385. */
  23386. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  23387. WOLFSSL_X509* x509;
  23388. int i;
  23389. if (opt != 0 && opt != 1) {
  23390. ret = WOLFSSL_FAILURE;
  23391. break;
  23392. }
  23393. /* Clear certificate chain */
  23394. FreeDer(&ctx->certChain);
  23395. if (sk) {
  23396. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  23397. x509 = wolfSSL_sk_X509_value(sk, i);
  23398. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  23399. if (wolfSSL_X509_up_ref(x509) != 1) {
  23400. WOLFSSL_MSG("Error increasing reference count");
  23401. continue;
  23402. }
  23403. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  23404. WOLFSSL_SUCCESS) {
  23405. WOLFSSL_MSG("Error adding certificate to context");
  23406. /* Decrease reference count on failure */
  23407. wolfSSL_X509_free(x509);
  23408. }
  23409. }
  23410. }
  23411. /* Free previous chain */
  23412. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  23413. ctx->x509Chain = sk;
  23414. if (sk && opt == 1) {
  23415. /* up all refs when opt == 1 */
  23416. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  23417. x509 = wolfSSL_sk_X509_value(sk, i);
  23418. if (wolfSSL_X509_up_ref(x509) != 1) {
  23419. WOLFSSL_MSG("Error increasing reference count");
  23420. continue;
  23421. }
  23422. }
  23423. }
  23424. }
  23425. #else
  23426. WOLFSSL_MSG("Session certificates not compiled in");
  23427. ret = WOLFSSL_FAILURE;
  23428. #endif
  23429. break;
  23430. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  23431. case SSL_CTRL_OPTIONS:
  23432. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  23433. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  23434. #ifdef WOLFSSL_QT
  23435. /* Set whether to use client or server cipher preference */
  23436. if ((ctrl_opt & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE)
  23437. == WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  23438. WOLFSSL_MSG("Using Server's Cipher Preference.");
  23439. ctx->useClientOrder = FALSE;
  23440. } else {
  23441. WOLFSSL_MSG("Using Client's Cipher Preference.");
  23442. ctx->useClientOrder = TRUE;
  23443. }
  23444. #endif /* WOLFSSL_QT */
  23445. return ctrl_opt;
  23446. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  23447. case SSL_CTRL_EXTRA_CHAIN_CERT:
  23448. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  23449. if (pt == NULL) {
  23450. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  23451. ret = WOLFSSL_FAILURE;
  23452. break;
  23453. }
  23454. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  23455. #ifndef NO_DH
  23456. case SSL_CTRL_SET_TMP_DH:
  23457. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  23458. if (pt == NULL) {
  23459. WOLFSSL_MSG("Passed in DH pointer NULL.");
  23460. ret = WOLFSSL_FAILURE;
  23461. break;
  23462. }
  23463. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  23464. #endif
  23465. #ifdef HAVE_ECC
  23466. case SSL_CTRL_SET_TMP_ECDH:
  23467. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  23468. if (pt == NULL) {
  23469. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  23470. ret = WOLFSSL_FAILURE;
  23471. break;
  23472. }
  23473. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  23474. #endif
  23475. case SSL_CTRL_MODE:
  23476. wolfSSL_CTX_set_mode(ctx,opt);
  23477. break;
  23478. case SSL_CTRL_SET_MIN_PROTO_VERSION:
  23479. WOLFSSL_MSG("set min proto version");
  23480. return wolfSSL_CTX_set_min_proto_version(ctx, (int)opt);
  23481. case SSL_CTRL_SET_MAX_PROTO_VERSION:
  23482. WOLFSSL_MSG("set max proto version");
  23483. return wolfSSL_CTX_set_max_proto_version(ctx, (int)opt);
  23484. case SSL_CTRL_GET_MIN_PROTO_VERSION:
  23485. WOLFSSL_MSG("get min proto version");
  23486. return wolfSSL_CTX_get_min_proto_version(ctx);
  23487. case SSL_CTRL_GET_MAX_PROTO_VERSION:
  23488. WOLFSSL_MSG("get max proto version");
  23489. return wolfSSL_CTX_get_max_proto_version(ctx);
  23490. default:
  23491. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  23492. ret = WOLFSSL_FAILURE;
  23493. break;
  23494. }
  23495. (void)ctx;
  23496. (void)cmd;
  23497. (void)opt;
  23498. (void)pt;
  23499. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  23500. return ret;
  23501. }
  23502. #ifndef WOLFSSL_NO_STUB
  23503. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  23504. {
  23505. (void) ctx;
  23506. (void) cmd;
  23507. (void) fp;
  23508. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  23509. return WOLFSSL_FAILURE;
  23510. }
  23511. #endif /* WOLFSSL_NO_STUB */
  23512. #ifndef NO_WOLFSSL_STUB
  23513. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  23514. {
  23515. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0L, NULL);
  23516. }
  23517. #endif
  23518. /* Returns the verifyCallback from the ssl structure if successful.
  23519. Returns NULL otherwise. */
  23520. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  23521. {
  23522. WOLFSSL_ENTER("wolfSSL_get_verify_callback");
  23523. if (ssl) {
  23524. return ssl->verifyCallback;
  23525. }
  23526. return NULL;
  23527. }
  23528. /* Adds the ASN1 certificate to the user ctx.
  23529. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  23530. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  23531. const unsigned char *der)
  23532. {
  23533. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1");
  23534. if (der != NULL && ctx != NULL) {
  23535. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  23536. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  23537. return WOLFSSL_SUCCESS;
  23538. }
  23539. }
  23540. return WOLFSSL_FAILURE;
  23541. }
  23542. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  23543. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  23544. /* Adds the rsa private key to the user ctx.
  23545. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  23546. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  23547. {
  23548. int ret;
  23549. int derSize;
  23550. unsigned char *maxDerBuf;
  23551. unsigned char* key = NULL;
  23552. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey");
  23553. if (ctx == NULL || rsa == NULL) {
  23554. WOLFSSL_MSG("one or more inputs were NULL");
  23555. return BAD_FUNC_ARG;
  23556. }
  23557. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23558. if (maxDerBuf == NULL) {
  23559. WOLFSSL_MSG("Malloc failure");
  23560. return MEMORY_E;
  23561. }
  23562. key = maxDerBuf;
  23563. /* convert RSA struct to der encoded buffer and get the size */
  23564. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  23565. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  23566. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23567. return WOLFSSL_FAILURE;
  23568. }
  23569. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  23570. derSize, SSL_FILETYPE_ASN1);
  23571. if (ret != WOLFSSL_SUCCESS) {
  23572. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  23573. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23574. return WOLFSSL_FAILURE;
  23575. }
  23576. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23577. return ret;
  23578. }
  23579. #endif /* NO_RSA && !HAVE_FAST_RSA */
  23580. #ifndef NO_BIO
  23581. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  23582. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  23583. is a failure.*/
  23584. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  23585. WOLFSSL_EVP_PKEY** out)
  23586. {
  23587. unsigned char* mem = NULL;
  23588. int memSz = 0;
  23589. WOLFSSL_EVP_PKEY* key = NULL;
  23590. unsigned char* extraBioMem = NULL;
  23591. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio");
  23592. if (bio == NULL) {
  23593. return NULL;
  23594. }
  23595. (void)out;
  23596. memSz = wolfSSL_BIO_get_len(bio);
  23597. if (memSz <= 0) {
  23598. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  23599. return NULL;
  23600. }
  23601. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23602. if (mem == NULL) {
  23603. WOLFSSL_MSG("Malloc failure");
  23604. return NULL;
  23605. }
  23606. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  23607. int extraBioMemSz;
  23608. int derLength;
  23609. /* Determines key type and returns the new private EVP_PKEY object */
  23610. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  23611. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  23612. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23613. return NULL;
  23614. }
  23615. /* Write extra data back into bio object if necessary. */
  23616. derLength = key->pkey_sz;
  23617. extraBioMemSz = (memSz - derLength);
  23618. if (extraBioMemSz > 0) {
  23619. int i;
  23620. int j = 0;
  23621. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  23622. DYNAMIC_TYPE_TMP_BUFFER);
  23623. if (extraBioMem == NULL) {
  23624. WOLFSSL_MSG("Malloc failure");
  23625. XFREE((unsigned char*)extraBioMem, bio->heap,
  23626. DYNAMIC_TYPE_TMP_BUFFER);
  23627. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23628. return NULL;
  23629. }
  23630. for (i = derLength; i < memSz; i++) {
  23631. *(extraBioMem + j) = *(mem + i);
  23632. j++;
  23633. }
  23634. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  23635. if (wolfSSL_BIO_get_len(bio) <= 0) {
  23636. WOLFSSL_MSG("Failed to write memory to bio");
  23637. XFREE((unsigned char*)extraBioMem, bio->heap,
  23638. DYNAMIC_TYPE_TMP_BUFFER);
  23639. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23640. return NULL;
  23641. }
  23642. XFREE((unsigned char*)extraBioMem, bio->heap,
  23643. DYNAMIC_TYPE_TMP_BUFFER);
  23644. }
  23645. if (out != NULL) {
  23646. *out = key;
  23647. }
  23648. }
  23649. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23650. return key;
  23651. }
  23652. #endif /* !NO_BIO */
  23653. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  23654. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \
  23655. defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL)
  23656. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  23657. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  23658. * on fail */
  23659. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  23660. unsigned char** in, long inSz)
  23661. {
  23662. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP");
  23663. return d2iGenericKey(out, (const unsigned char**)in, inSz, 1);
  23664. }
  23665. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/
  23666. /* stunnel compatibility functions*/
  23667. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  23668. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  23669. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  23670. void wolfSSL_ERR_remove_thread_state(void* pid)
  23671. {
  23672. (void) pid;
  23673. return;
  23674. }
  23675. #ifndef NO_FILESYSTEM
  23676. /***TBD ***/
  23677. void wolfSSL_print_all_errors_fp(XFILE fp)
  23678. {
  23679. (void)fp;
  23680. }
  23681. #endif /* !NO_FILESYSTEM */
  23682. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  23683. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  23684. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  23685. defined(HAVE_EX_DATA)
  23686. #if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
  23687. static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx,
  23688. void* data, byte get, void** getRet, int* setRet)
  23689. {
  23690. int row;
  23691. int i;
  23692. int error = 0;
  23693. SessionRow* sessRow = NULL;
  23694. const byte* id;
  23695. byte foundCache = 0;
  23696. if (getRet != NULL)
  23697. *getRet = NULL;
  23698. if (setRet != NULL)
  23699. *setRet = WOLFSSL_FAILURE;
  23700. id = session->sessionID;
  23701. if (session->haveAltSessionID)
  23702. id = session->altSessionID;
  23703. row = (int)(HashObject(id, ID_LEN, &error) % SESSION_ROWS);
  23704. if (error != 0) {
  23705. WOLFSSL_MSG("Hash session failed");
  23706. return;
  23707. }
  23708. sessRow = &SessionCache[row];
  23709. if (get)
  23710. error = SESSION_ROW_RD_LOCK(sessRow);
  23711. else
  23712. error = SESSION_ROW_WR_LOCK(sessRow);
  23713. if (error != 0) {
  23714. WOLFSSL_MSG("Session row lock failed");
  23715. return;
  23716. }
  23717. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  23718. WOLFSSL_SESSION* cacheSession;
  23719. #ifdef SESSION_CACHE_DYNAMIC_MEM
  23720. cacheSession = sessRow->Sessions[i];
  23721. #else
  23722. cacheSession = &sessRow->Sessions[i];
  23723. #endif
  23724. if (cacheSession &&
  23725. XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0
  23726. && session->side == cacheSession->side
  23727. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  23728. && (IsAtLeastTLSv1_3(session->version) ==
  23729. IsAtLeastTLSv1_3(cacheSession->version))
  23730. #endif
  23731. ) {
  23732. if (get) {
  23733. if (getRet) {
  23734. *getRet = wolfSSL_CRYPTO_get_ex_data(
  23735. &cacheSession->ex_data, idx);
  23736. }
  23737. }
  23738. else {
  23739. if (setRet) {
  23740. *setRet = wolfSSL_CRYPTO_set_ex_data(
  23741. &cacheSession->ex_data, idx, data);
  23742. }
  23743. }
  23744. foundCache = 1;
  23745. break;
  23746. }
  23747. }
  23748. SESSION_ROW_UNLOCK(sessRow);
  23749. /* If we don't have a session in cache then clear the ex_data and
  23750. * own it */
  23751. if (!foundCache) {
  23752. XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA));
  23753. session->ownExData = 1;
  23754. if (!get) {
  23755. *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx,
  23756. data);
  23757. }
  23758. }
  23759. }
  23760. #endif
  23761. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  23762. {
  23763. int ret = WOLFSSL_FAILURE;
  23764. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  23765. #ifdef HAVE_EX_DATA
  23766. session = ClientSessionToSession(session);
  23767. if (session != NULL) {
  23768. #ifndef NO_SESSION_CACHE
  23769. if (!session->ownExData) {
  23770. /* Need to update in cache */
  23771. SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret);
  23772. }
  23773. else
  23774. #endif
  23775. {
  23776. ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  23777. }
  23778. }
  23779. #else
  23780. (void)session;
  23781. (void)idx;
  23782. (void)data;
  23783. #endif
  23784. return ret;
  23785. }
  23786. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  23787. int wolfSSL_SESSION_set_ex_data_with_cleanup(
  23788. WOLFSSL_SESSION* session,
  23789. int idx,
  23790. void* data,
  23791. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  23792. {
  23793. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup");
  23794. session = ClientSessionToSession(session);
  23795. if(session != NULL) {
  23796. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx,
  23797. data, cleanup_routine);
  23798. }
  23799. return WOLFSSL_FAILURE;
  23800. }
  23801. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  23802. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  23803. {
  23804. void* ret = NULL;
  23805. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  23806. #ifdef HAVE_EX_DATA
  23807. session = ClientSessionToSession(session);
  23808. if (session != NULL) {
  23809. #ifndef NO_SESSION_CACHE
  23810. if (!session->ownExData) {
  23811. /* Need to retrieve the data from the session cache */
  23812. SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL,
  23813. 1, &ret, NULL);
  23814. }
  23815. else
  23816. #endif
  23817. {
  23818. ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  23819. }
  23820. }
  23821. #else
  23822. (void)session;
  23823. (void)idx;
  23824. #endif
  23825. return ret;
  23826. }
  23827. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */
  23828. /* Note: This is a huge section of API's - through
  23829. * wolfSSL_X509_OBJECT_get0_X509_CRL */
  23830. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \
  23831. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  23832. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  23833. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))
  23834. #ifdef HAVE_EX_DATA
  23835. int wolfSSL_SESSION_get_ex_new_index(long ctx_l,void* ctx_ptr,
  23836. WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func,
  23837. WOLFSSL_CRYPTO_EX_free* free_func)
  23838. {
  23839. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  23840. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, ctx_l,
  23841. ctx_ptr, new_func, dup_func, free_func);
  23842. }
  23843. #endif
  23844. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY) && \
  23845. !defined(WOLFSSL_STATIC_MEMORY)
  23846. static wolfSSL_OSSL_Malloc_cb ossl_malloc = NULL;
  23847. static wolfSSL_OSSL_Free_cb ossl_free = NULL;
  23848. static wolfSSL_OSSL_Realloc_cb ossl_realloc = NULL;
  23849. static void* OSSL_Malloc(size_t size)
  23850. {
  23851. if (ossl_malloc != NULL)
  23852. return ossl_malloc(size, NULL, 0);
  23853. else
  23854. return NULL;
  23855. }
  23856. static void OSSL_Free(void *ptr)
  23857. {
  23858. if (ossl_free != NULL)
  23859. ossl_free(ptr, NULL, 0);
  23860. }
  23861. static void* OSSL_Realloc(void *ptr, size_t size)
  23862. {
  23863. if (ossl_realloc != NULL)
  23864. return ossl_realloc(ptr, size, NULL, 0);
  23865. else
  23866. return NULL;
  23867. }
  23868. #endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY &&
  23869. * !WOLFSSL_STATIC_MEMORY */
  23870. int wolfSSL_CRYPTO_set_mem_functions(
  23871. wolfSSL_OSSL_Malloc_cb m,
  23872. wolfSSL_OSSL_Realloc_cb r,
  23873. wolfSSL_OSSL_Free_cb f)
  23874. {
  23875. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
  23876. #ifdef WOLFSSL_DEBUG_MEMORY
  23877. WOLFSSL_MSG("mem functions will receive function name instead of "
  23878. "file name");
  23879. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)m, (wolfSSL_Free_cb)f,
  23880. (wolfSSL_Realloc_cb)r) == 0)
  23881. return WOLFSSL_SUCCESS;
  23882. #else
  23883. WOLFSSL_MSG("wolfSSL was compiled without WOLFSSL_DEBUG_MEMORY mem "
  23884. "functions will receive a NULL file name and 0 for the "
  23885. "line number.");
  23886. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)OSSL_Malloc,
  23887. (wolfSSL_Free_cb)OSSL_Free, (wolfSSL_Realloc_cb)OSSL_Realloc) == 0) {
  23888. ossl_malloc = m;
  23889. ossl_free = f;
  23890. ossl_realloc = r;
  23891. return WOLFSSL_SUCCESS;
  23892. }
  23893. #endif
  23894. else
  23895. return WOLFSSL_FAILURE;
  23896. #else
  23897. (void)m;
  23898. (void)r;
  23899. (void)f;
  23900. WOLFSSL_MSG("wolfSSL allocator callback functions not compiled in");
  23901. return WOLFSSL_FAILURE;
  23902. #endif
  23903. }
  23904. int wolfSSL_ERR_load_ERR_strings(void)
  23905. {
  23906. return WOLFSSL_SUCCESS;
  23907. }
  23908. void wolfSSL_ERR_load_crypto_strings(void)
  23909. {
  23910. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  23911. /* Do nothing */
  23912. return;
  23913. }
  23914. int wolfSSL_FIPS_mode(void)
  23915. {
  23916. #ifdef HAVE_FIPS
  23917. return 1;
  23918. #else
  23919. return 0;
  23920. #endif
  23921. }
  23922. int wolfSSL_FIPS_mode_set(int r)
  23923. {
  23924. #ifdef HAVE_FIPS
  23925. if (r == 0) {
  23926. WOLFSSL_MSG("Cannot disable FIPS at runtime.");
  23927. return WOLFSSL_FAILURE;
  23928. }
  23929. return WOLFSSL_SUCCESS;
  23930. #else
  23931. if (r == 0) {
  23932. return WOLFSSL_SUCCESS;
  23933. }
  23934. WOLFSSL_MSG("Cannot enable FIPS. This isn't the wolfSSL FIPS code.");
  23935. return WOLFSSL_FAILURE;
  23936. #endif
  23937. }
  23938. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  23939. {
  23940. int ret = WOLFSSL_FAILURE;
  23941. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  23942. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  23943. (void)alg_bits;
  23944. if (c!= NULL)
  23945. ret = c->bits;
  23946. #else
  23947. if (c != NULL && c->ssl != NULL) {
  23948. ret = 8 * c->ssl->specs.key_size;
  23949. if (alg_bits != NULL) {
  23950. *alg_bits = ret;
  23951. }
  23952. }
  23953. #endif
  23954. return ret;
  23955. }
  23956. /* returns value less than 0 on fail to match
  23957. * On a successful match the priority level found is returned
  23958. */
  23959. int wolfSSL_sk_SSL_CIPHER_find(
  23960. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  23961. {
  23962. WOLFSSL_STACK* next;
  23963. int i, sz;
  23964. if (sk == NULL || toFind == NULL) {
  23965. return WOLFSSL_FATAL_ERROR;
  23966. }
  23967. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  23968. next = sk;
  23969. for (i = 0; i < sz && next != NULL; i++) {
  23970. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  23971. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  23972. return sz - i; /* reverse because stack pushed highest on first */
  23973. }
  23974. next = next->next;
  23975. }
  23976. return WOLFSSL_FATAL_ERROR;
  23977. }
  23978. /* free's all nodes in the stack and there data */
  23979. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  23980. {
  23981. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_free");
  23982. wolfSSL_sk_free(sk);
  23983. }
  23984. #ifdef HAVE_SNI
  23985. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  23986. {
  23987. int ret;
  23988. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  23989. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  23990. host_name, (word16)XSTRLEN(host_name));
  23991. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  23992. return ret;
  23993. }
  23994. #ifndef NO_WOLFSSL_SERVER
  23995. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  23996. {
  23997. void * serverName = NULL;
  23998. if (ssl == NULL)
  23999. return NULL;
  24000. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  24001. return (const char *)serverName;
  24002. }
  24003. #endif /* NO_WOLFSSL_SERVER */
  24004. #endif /* HAVE_SNI */
  24005. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  24006. {
  24007. int ret;
  24008. /* This method requires some explanation. Its sibling is
  24009. * int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  24010. * which re-inits the WOLFSSL* with all settings in the new CTX.
  24011. * That one is the right one to use *before* a handshake is started.
  24012. *
  24013. * This method was added by OpenSSL to be used *during* the handshake, e.g.
  24014. * when a server inspects the SNI in a ClientHello callback and
  24015. * decides which set of certificates to use.
  24016. *
  24017. * Since, at the time the SNI callback is run, some decisions on
  24018. * Extensions or the ServerHello might already have been taken, this
  24019. * method is very restricted in what it does:
  24020. * - changing the server certificate(s)
  24021. * - changing the server id for session handling
  24022. * and everything else in WOLFSSL* needs to remain untouched.
  24023. */
  24024. WOLFSSL_ENTER("wolfSSL_set_SSL_CTX");
  24025. if (ssl == NULL || ctx == NULL)
  24026. return NULL;
  24027. if (ssl->ctx == ctx)
  24028. return ssl->ctx;
  24029. wolfSSL_RefInc(&ctx->ref, &ret);
  24030. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  24031. if (ret != 0) {
  24032. /* can only fail on serious stuff, like mutex not working
  24033. * or ctx refcount out of whack. */
  24034. return NULL;
  24035. }
  24036. #else
  24037. (void)ret;
  24038. #endif
  24039. if (ssl->ctx != NULL)
  24040. wolfSSL_CTX_free(ssl->ctx);
  24041. ssl->ctx = ctx;
  24042. #ifndef NO_CERTS
  24043. /* ctx owns certificate, certChain and key */
  24044. ssl->buffers.certificate = ctx->certificate;
  24045. ssl->buffers.certChain = ctx->certChain;
  24046. #ifdef WOLFSSL_TLS13
  24047. ssl->buffers.certChainCnt = ctx->certChainCnt;
  24048. #endif
  24049. ssl->buffers.key = ctx->privateKey;
  24050. ssl->buffers.keyType = ctx->privateKeyType;
  24051. ssl->buffers.keyId = ctx->privateKeyId;
  24052. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  24053. ssl->buffers.keySz = ctx->privateKeySz;
  24054. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  24055. /* flags indicating what certs/keys are available */
  24056. ssl->options.haveRSA = ctx->haveRSA;
  24057. ssl->options.haveDH = ctx->haveDH;
  24058. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  24059. ssl->options.haveECC = ctx->haveECC;
  24060. ssl->options.haveStaticECC = ctx->haveStaticECC;
  24061. ssl->options.haveFalconSig = ctx->haveFalconSig;
  24062. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  24063. #endif
  24064. #ifdef OPENSSL_EXTRA
  24065. /* copy over application session context ID */
  24066. ssl->sessionCtxSz = ctx->sessionCtxSz;
  24067. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  24068. #endif
  24069. return ssl->ctx;
  24070. }
  24071. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  24072. {
  24073. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  24074. if(ctx)
  24075. return ctx->verifyCallback;
  24076. return NULL;
  24077. }
  24078. #ifdef HAVE_SNI
  24079. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  24080. {
  24081. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  24082. if (ctx)
  24083. ctx->sniRecvCb = cb;
  24084. }
  24085. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  24086. CallbackSniRecv cb)
  24087. {
  24088. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  24089. if (ctx) {
  24090. ctx->sniRecvCb = cb;
  24091. return WOLFSSL_SUCCESS;
  24092. }
  24093. return WOLFSSL_FAILURE;
  24094. }
  24095. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  24096. {
  24097. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  24098. if (ctx) {
  24099. ctx->sniRecvCbArg = arg;
  24100. return WOLFSSL_SUCCESS;
  24101. }
  24102. return WOLFSSL_FAILURE;
  24103. }
  24104. #endif /* HAVE_SNI */
  24105. #ifndef NO_BIO
  24106. void wolfSSL_ERR_load_BIO_strings(void) {
  24107. WOLFSSL_ENTER("wolfSSL_ERR_load_BIO_strings");
  24108. /* do nothing */
  24109. }
  24110. #endif
  24111. #ifndef NO_WOLFSSL_STUB
  24112. /* Set THREADID callback, return 1 on success, 0 on error */
  24113. int wolfSSL_THREADID_set_callback(
  24114. void(*threadid_func)(WOLFSSL_CRYPTO_THREADID*))
  24115. {
  24116. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  24117. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  24118. (void)threadid_func;
  24119. return 1;
  24120. }
  24121. #endif
  24122. #ifndef NO_WOLFSSL_STUB
  24123. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  24124. {
  24125. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  24126. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  24127. (void)id;
  24128. (void)val;
  24129. return;
  24130. }
  24131. #endif
  24132. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  24133. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  24134. * HAVE_SBLIM_SFCB)) */
  24135. #if defined(OPENSSL_EXTRA)
  24136. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  24137. {
  24138. if (!a || !b)
  24139. return 0;
  24140. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  24141. }
  24142. unsigned long wolfSSL_ERR_peek_last_error(void)
  24143. {
  24144. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  24145. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  24146. {
  24147. int ret;
  24148. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  24149. WOLFSSL_MSG("Issue peeking at error node in queue");
  24150. return 0;
  24151. }
  24152. if (ret == -ASN_NO_PEM_HEADER)
  24153. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  24154. #if defined(WOLFSSL_PYTHON)
  24155. if (ret == ASN1_R_HEADER_TOO_LONG)
  24156. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  24157. #endif
  24158. return (unsigned long)ret;
  24159. }
  24160. #else
  24161. return (unsigned long)(0 - NOT_COMPILED_IN);
  24162. #endif
  24163. }
  24164. #endif /* OPENSSL_EXTRA */
  24165. int wolfSSL_version(WOLFSSL* ssl)
  24166. {
  24167. WOLFSSL_ENTER("wolfSSL_version");
  24168. if (ssl->version.major == SSLv3_MAJOR) {
  24169. switch (ssl->version.minor) {
  24170. case SSLv3_MINOR :
  24171. return SSL3_VERSION;
  24172. case TLSv1_MINOR :
  24173. return TLS1_VERSION;
  24174. case TLSv1_1_MINOR :
  24175. return TLS1_1_VERSION;
  24176. case TLSv1_2_MINOR :
  24177. return TLS1_2_VERSION;
  24178. case TLSv1_3_MINOR :
  24179. return TLS1_3_VERSION;
  24180. default:
  24181. return WOLFSSL_FAILURE;
  24182. }
  24183. }
  24184. else if (ssl->version.major == DTLS_MAJOR) {
  24185. switch (ssl->version.minor) {
  24186. case DTLS_MINOR :
  24187. return DTLS1_VERSION;
  24188. case DTLSv1_2_MINOR :
  24189. return DTLS1_2_VERSION;
  24190. case DTLSv1_3_MINOR:
  24191. return DTLS1_3_VERSION;
  24192. default:
  24193. return WOLFSSL_FAILURE;
  24194. }
  24195. }
  24196. return WOLFSSL_FAILURE;
  24197. }
  24198. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  24199. {
  24200. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  24201. return ssl->ctx;
  24202. }
  24203. #if defined(OPENSSL_ALL) || \
  24204. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  24205. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  24206. const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess,
  24207. unsigned int* idLen)
  24208. {
  24209. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  24210. sess = ClientSessionToSession(sess);
  24211. if (sess == NULL || idLen == NULL) {
  24212. WOLFSSL_MSG("Bad func args. Please provide idLen");
  24213. return NULL;
  24214. }
  24215. #ifdef HAVE_SESSION_TICKET
  24216. if (sess->haveAltSessionID) {
  24217. *idLen = ID_LEN;
  24218. return sess->altSessionID;
  24219. }
  24220. #endif
  24221. *idLen = sess->sessionIDSz;
  24222. return sess->sessionID;
  24223. }
  24224. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  24225. !defined(NO_FILESYSTEM)
  24226. #ifndef NO_BIO
  24227. #if defined(SESSION_CERTS) || \
  24228. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  24229. /* returns a pointer to the protocol used by the session */
  24230. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  24231. {
  24232. in = ClientSessionToSession(in);
  24233. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  24234. }
  24235. #endif
  24236. /* returns true (non 0) if the session has EMS (extended master secret) */
  24237. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  24238. {
  24239. in = ClientSessionToSession(in);
  24240. if (in == NULL)
  24241. return 0;
  24242. return in->haveEMS;
  24243. }
  24244. #if defined(HAVE_SESSION_TICKET)
  24245. /* prints out the ticket to bio passed in
  24246. * return WOLFSSL_SUCCESS on success
  24247. */
  24248. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  24249. const WOLFSSL_SESSION* in, const char* tab)
  24250. {
  24251. unsigned short i, j, z, sz;
  24252. short tag = 0;
  24253. byte* pt;
  24254. in = ClientSessionToSession(in);
  24255. if (in == NULL || bio == NULL) {
  24256. return BAD_FUNC_ARG;
  24257. }
  24258. sz = in->ticketLen;
  24259. pt = in->ticket;
  24260. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  24261. return WOLFSSL_FAILURE;
  24262. for (i = 0; i < sz;) {
  24263. char asc[16];
  24264. if (sz - i < 16) {
  24265. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  24266. return WOLFSSL_FAILURE;
  24267. }
  24268. else {
  24269. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  24270. return WOLFSSL_FAILURE;
  24271. }
  24272. for (j = 0; i < sz && j < 8; j++,i++) {
  24273. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24274. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  24275. return WOLFSSL_FAILURE;
  24276. }
  24277. if (i < sz) {
  24278. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24279. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  24280. return WOLFSSL_FAILURE;
  24281. j++;
  24282. i++;
  24283. }
  24284. for (; i < sz && j < 16; j++,i++) {
  24285. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  24286. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  24287. return WOLFSSL_FAILURE;
  24288. }
  24289. /* pad out spacing */
  24290. for (z = j; z < 17; z++) {
  24291. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  24292. return WOLFSSL_FAILURE;
  24293. }
  24294. for (z = 0; z < j; z++) {
  24295. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  24296. return WOLFSSL_FAILURE;
  24297. }
  24298. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  24299. return WOLFSSL_FAILURE;
  24300. tag += 16;
  24301. }
  24302. return WOLFSSL_SUCCESS;
  24303. }
  24304. #endif /* HAVE_SESSION_TICKET */
  24305. /* prints out the session information in human readable form
  24306. * return WOLFSSL_SUCCESS on success
  24307. */
  24308. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session)
  24309. {
  24310. const unsigned char* pt;
  24311. unsigned char buf[SECRET_LEN];
  24312. unsigned int sz = 0, i;
  24313. int ret;
  24314. session = ClientSessionToSession(session);
  24315. if (session == NULL) {
  24316. return WOLFSSL_FAILURE;
  24317. }
  24318. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  24319. return WOLFSSL_FAILURE;
  24320. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  24321. defined(HAVE_SESSION_TICKET))
  24322. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  24323. wolfSSL_SESSION_get_protocol(session)) <= 0)
  24324. return WOLFSSL_FAILURE;
  24325. #endif
  24326. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  24327. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  24328. return WOLFSSL_FAILURE;
  24329. pt = wolfSSL_SESSION_get_id(session, &sz);
  24330. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  24331. return WOLFSSL_FAILURE;
  24332. for (i = 0; i < sz; i++) {
  24333. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  24334. return WOLFSSL_FAILURE;
  24335. }
  24336. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  24337. return WOLFSSL_FAILURE;
  24338. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  24339. return WOLFSSL_FAILURE;
  24340. ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf));
  24341. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  24342. return WOLFSSL_FAILURE;
  24343. if (ret > 0) {
  24344. sz = (unsigned int)ret;
  24345. for (i = 0; i < sz; i++) {
  24346. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  24347. return WOLFSSL_FAILURE;
  24348. }
  24349. }
  24350. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  24351. return WOLFSSL_FAILURE;
  24352. /* @TODO PSK identity hint and SRP */
  24353. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  24354. return WOLFSSL_FAILURE;
  24355. #ifdef HAVE_SESSION_TICKET
  24356. if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS)
  24357. return WOLFSSL_FAILURE;
  24358. #endif
  24359. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  24360. defined(HAVE_EXT_CACHE))
  24361. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  24362. wolfSSL_SESSION_get_time(session)) <= 0)
  24363. return WOLFSSL_FAILURE;
  24364. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  24365. wolfSSL_SESSION_get_timeout(session)) <= 0)
  24366. return WOLFSSL_FAILURE;
  24367. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  24368. /* @TODO verify return code print */
  24369. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  24370. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  24371. return WOLFSSL_FAILURE;
  24372. return WOLFSSL_SUCCESS;
  24373. }
  24374. #endif /* !NO_BIO */
  24375. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  24376. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  24377. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  24378. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  24379. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  24380. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  24381. int mode = 0;
  24382. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  24383. if (!ssl) {
  24384. return WOLFSSL_FAILURE;
  24385. }
  24386. if (ssl->options.verifyNone) {
  24387. mode = WOLFSSL_VERIFY_NONE;
  24388. }
  24389. else {
  24390. if (ssl->options.verifyPeer) {
  24391. mode |= WOLFSSL_VERIFY_PEER;
  24392. }
  24393. if (ssl->options.failNoCert) {
  24394. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  24395. }
  24396. if (ssl->options.failNoCertxPSK) {
  24397. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  24398. }
  24399. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  24400. if (ssl->options.verifyPostHandshake) {
  24401. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  24402. }
  24403. #endif
  24404. }
  24405. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  24406. return mode;
  24407. }
  24408. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  24409. {
  24410. int mode = 0;
  24411. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  24412. if (!ctx) {
  24413. return WOLFSSL_FAILURE;
  24414. }
  24415. if (ctx->verifyNone) {
  24416. mode = WOLFSSL_VERIFY_NONE;
  24417. }
  24418. else {
  24419. if (ctx->verifyPeer) {
  24420. mode |= WOLFSSL_VERIFY_PEER;
  24421. }
  24422. if (ctx->failNoCert) {
  24423. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  24424. }
  24425. if (ctx->failNoCertxPSK) {
  24426. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  24427. }
  24428. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  24429. if (ctx->verifyPostHandshake) {
  24430. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  24431. }
  24432. #endif
  24433. }
  24434. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  24435. return mode;
  24436. }
  24437. #endif
  24438. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  24439. /* return 1 if success, 0 if error
  24440. * output keys are little endian format
  24441. */
  24442. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  24443. unsigned char *pub, unsigned int *pubSz)
  24444. {
  24445. #ifndef WOLFSSL_KEY_GEN
  24446. WOLFSSL_MSG("No Key Gen built in");
  24447. (void) priv;
  24448. (void) privSz;
  24449. (void) pub;
  24450. (void) pubSz;
  24451. return WOLFSSL_FAILURE;
  24452. #else /* WOLFSSL_KEY_GEN */
  24453. int ret = WOLFSSL_FAILURE;
  24454. int initTmpRng = 0;
  24455. WC_RNG *rng = NULL;
  24456. #ifdef WOLFSSL_SMALL_STACK
  24457. WC_RNG *tmpRNG = NULL;
  24458. #else
  24459. WC_RNG tmpRNG[1];
  24460. #endif
  24461. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  24462. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  24463. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  24464. WOLFSSL_MSG("Bad arguments");
  24465. return WOLFSSL_FAILURE;
  24466. }
  24467. #ifdef WOLFSSL_SMALL_STACK
  24468. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24469. if (tmpRNG == NULL)
  24470. return WOLFSSL_FAILURE;
  24471. #endif
  24472. if (wc_InitRng(tmpRNG) == 0) {
  24473. rng = tmpRNG;
  24474. initTmpRng = 1;
  24475. }
  24476. else {
  24477. WOLFSSL_MSG("Bad RNG Init, trying global");
  24478. if (initGlobalRNG == 0)
  24479. WOLFSSL_MSG("Global RNG no Init");
  24480. else
  24481. rng = &globalRNG;
  24482. }
  24483. if (rng) {
  24484. curve25519_key key;
  24485. if (wc_curve25519_init(&key) != MP_OKAY)
  24486. WOLFSSL_MSG("wc_curve25519_init failed");
  24487. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  24488. WOLFSSL_MSG("wc_curve25519_make_key failed");
  24489. /* export key pair */
  24490. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  24491. pubSz, EC25519_LITTLE_ENDIAN)
  24492. != MP_OKAY)
  24493. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  24494. else
  24495. ret = WOLFSSL_SUCCESS;
  24496. wc_curve25519_free(&key);
  24497. }
  24498. if (initTmpRng)
  24499. wc_FreeRng(tmpRNG);
  24500. #ifdef WOLFSSL_SMALL_STACK
  24501. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24502. #endif
  24503. return ret;
  24504. #endif /* WOLFSSL_KEY_GEN */
  24505. }
  24506. /* return 1 if success, 0 if error
  24507. * input and output keys are little endian format
  24508. */
  24509. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  24510. const unsigned char *priv, unsigned int privSz,
  24511. const unsigned char *pub, unsigned int pubSz)
  24512. {
  24513. #ifndef WOLFSSL_KEY_GEN
  24514. WOLFSSL_MSG("No Key Gen built in");
  24515. (void) shared;
  24516. (void) sharedSz;
  24517. (void) priv;
  24518. (void) privSz;
  24519. (void) pub;
  24520. (void) pubSz;
  24521. return WOLFSSL_FAILURE;
  24522. #else /* WOLFSSL_KEY_GEN */
  24523. int ret = WOLFSSL_FAILURE;
  24524. curve25519_key privkey, pubkey;
  24525. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  24526. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  24527. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  24528. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  24529. WOLFSSL_MSG("Bad arguments");
  24530. return WOLFSSL_FAILURE;
  24531. }
  24532. /* import private key */
  24533. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  24534. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  24535. return ret;
  24536. }
  24537. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  24538. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  24539. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  24540. wc_curve25519_free(&privkey);
  24541. return ret;
  24542. }
  24543. /* import public key */
  24544. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  24545. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  24546. wc_curve25519_free(&privkey);
  24547. return ret;
  24548. }
  24549. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  24550. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  24551. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  24552. wc_curve25519_free(&privkey);
  24553. wc_curve25519_free(&pubkey);
  24554. return ret;
  24555. }
  24556. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  24557. shared, sharedSz,
  24558. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  24559. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  24560. else
  24561. ret = WOLFSSL_SUCCESS;
  24562. wc_curve25519_free(&privkey);
  24563. wc_curve25519_free(&pubkey);
  24564. return ret;
  24565. #endif /* WOLFSSL_KEY_GEN */
  24566. }
  24567. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  24568. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  24569. /* return 1 if success, 0 if error
  24570. * output keys are little endian format
  24571. */
  24572. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  24573. unsigned char *pub, unsigned int *pubSz)
  24574. {
  24575. #ifndef WOLFSSL_KEY_GEN
  24576. WOLFSSL_MSG("No Key Gen built in");
  24577. (void) priv;
  24578. (void) privSz;
  24579. (void) pub;
  24580. (void) pubSz;
  24581. return WOLFSSL_FAILURE;
  24582. #elif !defined(HAVE_ED25519_KEY_EXPORT)
  24583. WOLFSSL_MSG("No ED25519 key export built in");
  24584. (void) priv;
  24585. (void) privSz;
  24586. (void) pub;
  24587. (void) pubSz;
  24588. return WOLFSSL_FAILURE;
  24589. #else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  24590. int ret = WOLFSSL_FAILURE;
  24591. int initTmpRng = 0;
  24592. WC_RNG *rng = NULL;
  24593. #ifdef WOLFSSL_SMALL_STACK
  24594. WC_RNG *tmpRNG = NULL;
  24595. #else
  24596. WC_RNG tmpRNG[1];
  24597. #endif
  24598. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  24599. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  24600. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  24601. WOLFSSL_MSG("Bad arguments");
  24602. return WOLFSSL_FAILURE;
  24603. }
  24604. #ifdef WOLFSSL_SMALL_STACK
  24605. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24606. if (tmpRNG == NULL)
  24607. return WOLFSSL_FATAL_ERROR;
  24608. #endif
  24609. if (wc_InitRng(tmpRNG) == 0) {
  24610. rng = tmpRNG;
  24611. initTmpRng = 1;
  24612. }
  24613. else {
  24614. WOLFSSL_MSG("Bad RNG Init, trying global");
  24615. if (initGlobalRNG == 0)
  24616. WOLFSSL_MSG("Global RNG no Init");
  24617. else
  24618. rng = &globalRNG;
  24619. }
  24620. if (rng) {
  24621. ed25519_key key;
  24622. if (wc_ed25519_init(&key) != MP_OKAY)
  24623. WOLFSSL_MSG("wc_ed25519_init failed");
  24624. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  24625. WOLFSSL_MSG("wc_ed25519_make_key failed");
  24626. /* export private key */
  24627. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  24628. WOLFSSL_MSG("wc_ed25519_export_key failed");
  24629. else
  24630. ret = WOLFSSL_SUCCESS;
  24631. wc_ed25519_free(&key);
  24632. }
  24633. if (initTmpRng)
  24634. wc_FreeRng(tmpRNG);
  24635. #ifdef WOLFSSL_SMALL_STACK
  24636. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24637. #endif
  24638. return ret;
  24639. #endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  24640. }
  24641. /* return 1 if success, 0 if error
  24642. * input and output keys are little endian format
  24643. * priv is a buffer containing private and public part of key
  24644. */
  24645. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  24646. const unsigned char *priv, unsigned int privSz,
  24647. unsigned char *sig, unsigned int *sigSz)
  24648. {
  24649. #if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  24650. #if !defined(HAVE_ED25519_SIGN)
  24651. WOLFSSL_MSG("No ED25519 sign built in");
  24652. #elif !defined(WOLFSSL_KEY_GEN)
  24653. WOLFSSL_MSG("No Key Gen built in");
  24654. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  24655. WOLFSSL_MSG("No ED25519 Key import built in");
  24656. #endif
  24657. (void) msg;
  24658. (void) msgSz;
  24659. (void) priv;
  24660. (void) privSz;
  24661. (void) sig;
  24662. (void) sigSz;
  24663. return WOLFSSL_FAILURE;
  24664. #else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  24665. ed25519_key key;
  24666. int ret = WOLFSSL_FAILURE;
  24667. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  24668. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  24669. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  24670. WOLFSSL_MSG("Bad arguments");
  24671. return WOLFSSL_FAILURE;
  24672. }
  24673. /* import key */
  24674. if (wc_ed25519_init(&key) != MP_OKAY) {
  24675. WOLFSSL_MSG("wc_curve25519_init failed");
  24676. return ret;
  24677. }
  24678. if (wc_ed25519_import_private_key(priv, privSz/2,
  24679. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  24680. &key) != MP_OKAY){
  24681. WOLFSSL_MSG("wc_ed25519_import_private failed");
  24682. wc_ed25519_free(&key);
  24683. return ret;
  24684. }
  24685. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  24686. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  24687. else
  24688. ret = WOLFSSL_SUCCESS;
  24689. wc_ed25519_free(&key);
  24690. return ret;
  24691. #endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  24692. }
  24693. /* return 1 if success, 0 if error
  24694. * input and output keys are little endian format
  24695. * pub is a buffer containing public part of key
  24696. */
  24697. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  24698. const unsigned char *pub, unsigned int pubSz,
  24699. const unsigned char *sig, unsigned int sigSz)
  24700. {
  24701. #if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  24702. #if !defined(HAVE_ED25519_VERIFY)
  24703. WOLFSSL_MSG("No ED25519 verify built in");
  24704. #elif !defined(WOLFSSL_KEY_GEN)
  24705. WOLFSSL_MSG("No Key Gen built in");
  24706. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  24707. WOLFSSL_MSG("No ED25519 Key import built in");
  24708. #endif
  24709. (void) msg;
  24710. (void) msgSz;
  24711. (void) pub;
  24712. (void) pubSz;
  24713. (void) sig;
  24714. (void) sigSz;
  24715. return WOLFSSL_FAILURE;
  24716. #else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  24717. ed25519_key key;
  24718. int ret = WOLFSSL_FAILURE, check = 0;
  24719. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  24720. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  24721. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  24722. WOLFSSL_MSG("Bad arguments");
  24723. return WOLFSSL_FAILURE;
  24724. }
  24725. /* import key */
  24726. if (wc_ed25519_init(&key) != MP_OKAY) {
  24727. WOLFSSL_MSG("wc_curve25519_init failed");
  24728. return ret;
  24729. }
  24730. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  24731. WOLFSSL_MSG("wc_ed25519_import_public failed");
  24732. wc_ed25519_free(&key);
  24733. return ret;
  24734. }
  24735. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  24736. &check, &key)) != MP_OKAY) {
  24737. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  24738. }
  24739. else if (!check)
  24740. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  24741. else
  24742. ret = WOLFSSL_SUCCESS;
  24743. wc_ed25519_free(&key);
  24744. return ret;
  24745. #endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  24746. }
  24747. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  24748. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  24749. /* return 1 if success, 0 if error
  24750. * output keys are little endian format
  24751. */
  24752. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  24753. unsigned char *pub, unsigned int *pubSz)
  24754. {
  24755. #ifndef WOLFSSL_KEY_GEN
  24756. WOLFSSL_MSG("No Key Gen built in");
  24757. (void) priv;
  24758. (void) privSz;
  24759. (void) pub;
  24760. (void) pubSz;
  24761. return WOLFSSL_FAILURE;
  24762. #else /* WOLFSSL_KEY_GEN */
  24763. int ret = WOLFSSL_FAILURE;
  24764. int initTmpRng = 0;
  24765. WC_RNG *rng = NULL;
  24766. #ifdef WOLFSSL_SMALL_STACK
  24767. WC_RNG *tmpRNG = NULL;
  24768. #else
  24769. WC_RNG tmpRNG[1];
  24770. #endif
  24771. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  24772. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  24773. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  24774. WOLFSSL_MSG("Bad arguments");
  24775. return WOLFSSL_FAILURE;
  24776. }
  24777. #ifdef WOLFSSL_SMALL_STACK
  24778. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24779. if (tmpRNG == NULL)
  24780. return WOLFSSL_FAILURE;
  24781. #endif
  24782. if (wc_InitRng(tmpRNG) == 0) {
  24783. rng = tmpRNG;
  24784. initTmpRng = 1;
  24785. }
  24786. else {
  24787. WOLFSSL_MSG("Bad RNG Init, trying global");
  24788. if (initGlobalRNG == 0)
  24789. WOLFSSL_MSG("Global RNG no Init");
  24790. else
  24791. rng = &globalRNG;
  24792. }
  24793. if (rng) {
  24794. curve448_key key;
  24795. if (wc_curve448_init(&key) != MP_OKAY)
  24796. WOLFSSL_MSG("wc_curve448_init failed");
  24797. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  24798. WOLFSSL_MSG("wc_curve448_make_key failed");
  24799. /* export key pair */
  24800. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  24801. EC448_LITTLE_ENDIAN)
  24802. != MP_OKAY)
  24803. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  24804. else
  24805. ret = WOLFSSL_SUCCESS;
  24806. wc_curve448_free(&key);
  24807. }
  24808. if (initTmpRng)
  24809. wc_FreeRng(tmpRNG);
  24810. #ifdef WOLFSSL_SMALL_STACK
  24811. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24812. #endif
  24813. return ret;
  24814. #endif /* WOLFSSL_KEY_GEN */
  24815. }
  24816. /* return 1 if success, 0 if error
  24817. * input and output keys are little endian format
  24818. */
  24819. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  24820. const unsigned char *priv, unsigned int privSz,
  24821. const unsigned char *pub, unsigned int pubSz)
  24822. {
  24823. #ifndef WOLFSSL_KEY_GEN
  24824. WOLFSSL_MSG("No Key Gen built in");
  24825. (void) shared;
  24826. (void) sharedSz;
  24827. (void) priv;
  24828. (void) privSz;
  24829. (void) pub;
  24830. (void) pubSz;
  24831. return WOLFSSL_FAILURE;
  24832. #else /* WOLFSSL_KEY_GEN */
  24833. int ret = WOLFSSL_FAILURE;
  24834. curve448_key privkey, pubkey;
  24835. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  24836. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  24837. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  24838. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  24839. WOLFSSL_MSG("Bad arguments");
  24840. return WOLFSSL_FAILURE;
  24841. }
  24842. /* import private key */
  24843. if (wc_curve448_init(&privkey) != MP_OKAY) {
  24844. WOLFSSL_MSG("wc_curve448_init privkey failed");
  24845. return ret;
  24846. }
  24847. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  24848. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  24849. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  24850. wc_curve448_free(&privkey);
  24851. return ret;
  24852. }
  24853. /* import public key */
  24854. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  24855. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  24856. wc_curve448_free(&privkey);
  24857. return ret;
  24858. }
  24859. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  24860. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  24861. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  24862. wc_curve448_free(&privkey);
  24863. wc_curve448_free(&pubkey);
  24864. return ret;
  24865. }
  24866. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  24867. EC448_LITTLE_ENDIAN) != MP_OKAY)
  24868. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  24869. else
  24870. ret = WOLFSSL_SUCCESS;
  24871. wc_curve448_free(&privkey);
  24872. wc_curve448_free(&pubkey);
  24873. return ret;
  24874. #endif /* WOLFSSL_KEY_GEN */
  24875. }
  24876. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  24877. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  24878. /* return 1 if success, 0 if error
  24879. * output keys are little endian format
  24880. */
  24881. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  24882. unsigned char *pub, unsigned int *pubSz)
  24883. {
  24884. #ifndef WOLFSSL_KEY_GEN
  24885. WOLFSSL_MSG("No Key Gen built in");
  24886. (void) priv;
  24887. (void) privSz;
  24888. (void) pub;
  24889. (void) pubSz;
  24890. return WOLFSSL_FAILURE;
  24891. #elif !defined(HAVE_ED448_KEY_EXPORT)
  24892. WOLFSSL_MSG("No ED448 key export built in");
  24893. (void) priv;
  24894. (void) privSz;
  24895. (void) pub;
  24896. (void) pubSz;
  24897. return WOLFSSL_FAILURE;
  24898. #else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  24899. int ret = WOLFSSL_FAILURE;
  24900. int initTmpRng = 0;
  24901. WC_RNG *rng = NULL;
  24902. #ifdef WOLFSSL_SMALL_STACK
  24903. WC_RNG *tmpRNG = NULL;
  24904. #else
  24905. WC_RNG tmpRNG[1];
  24906. #endif
  24907. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  24908. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  24909. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  24910. WOLFSSL_MSG("Bad arguments");
  24911. return WOLFSSL_FAILURE;
  24912. }
  24913. #ifdef WOLFSSL_SMALL_STACK
  24914. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24915. if (tmpRNG == NULL)
  24916. return WOLFSSL_FATAL_ERROR;
  24917. #endif
  24918. if (wc_InitRng(tmpRNG) == 0) {
  24919. rng = tmpRNG;
  24920. initTmpRng = 1;
  24921. }
  24922. else {
  24923. WOLFSSL_MSG("Bad RNG Init, trying global");
  24924. if (initGlobalRNG == 0)
  24925. WOLFSSL_MSG("Global RNG no Init");
  24926. else
  24927. rng = &globalRNG;
  24928. }
  24929. if (rng) {
  24930. ed448_key key;
  24931. if (wc_ed448_init(&key) != MP_OKAY)
  24932. WOLFSSL_MSG("wc_ed448_init failed");
  24933. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  24934. WOLFSSL_MSG("wc_ed448_make_key failed");
  24935. /* export private key */
  24936. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  24937. WOLFSSL_MSG("wc_ed448_export_key failed");
  24938. else
  24939. ret = WOLFSSL_SUCCESS;
  24940. wc_ed448_free(&key);
  24941. }
  24942. if (initTmpRng)
  24943. wc_FreeRng(tmpRNG);
  24944. #ifdef WOLFSSL_SMALL_STACK
  24945. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24946. #endif
  24947. return ret;
  24948. #endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  24949. }
  24950. /* return 1 if success, 0 if error
  24951. * input and output keys are little endian format
  24952. * priv is a buffer containing private and public part of key
  24953. */
  24954. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  24955. const unsigned char *priv, unsigned int privSz,
  24956. unsigned char *sig, unsigned int *sigSz)
  24957. {
  24958. #if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  24959. #if !defined(HAVE_ED448_SIGN)
  24960. WOLFSSL_MSG("No ED448 sign built in");
  24961. #elif !defined(WOLFSSL_KEY_GEN)
  24962. WOLFSSL_MSG("No Key Gen built in");
  24963. #elif !defined(HAVE_ED448_KEY_IMPORT)
  24964. WOLFSSL_MSG("No ED448 Key import built in");
  24965. #endif
  24966. (void) msg;
  24967. (void) msgSz;
  24968. (void) priv;
  24969. (void) privSz;
  24970. (void) sig;
  24971. (void) sigSz;
  24972. return WOLFSSL_FAILURE;
  24973. #else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  24974. ed448_key key;
  24975. int ret = WOLFSSL_FAILURE;
  24976. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  24977. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  24978. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  24979. WOLFSSL_MSG("Bad arguments");
  24980. return WOLFSSL_FAILURE;
  24981. }
  24982. /* import key */
  24983. if (wc_ed448_init(&key) != MP_OKAY) {
  24984. WOLFSSL_MSG("wc_curve448_init failed");
  24985. return ret;
  24986. }
  24987. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  24988. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  24989. WOLFSSL_MSG("wc_ed448_import_private failed");
  24990. wc_ed448_free(&key);
  24991. return ret;
  24992. }
  24993. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  24994. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  24995. else
  24996. ret = WOLFSSL_SUCCESS;
  24997. wc_ed448_free(&key);
  24998. return ret;
  24999. #endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  25000. }
  25001. /* return 1 if success, 0 if error
  25002. * input and output keys are little endian format
  25003. * pub is a buffer containing public part of key
  25004. */
  25005. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  25006. const unsigned char *pub, unsigned int pubSz,
  25007. const unsigned char *sig, unsigned int sigSz)
  25008. {
  25009. #if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  25010. #if !defined(HAVE_ED448_VERIFY)
  25011. WOLFSSL_MSG("No ED448 verify built in");
  25012. #elif !defined(WOLFSSL_KEY_GEN)
  25013. WOLFSSL_MSG("No Key Gen built in");
  25014. #elif !defined(HAVE_ED448_KEY_IMPORT)
  25015. WOLFSSL_MSG("No ED448 Key import built in");
  25016. #endif
  25017. (void) msg;
  25018. (void) msgSz;
  25019. (void) pub;
  25020. (void) pubSz;
  25021. (void) sig;
  25022. (void) sigSz;
  25023. return WOLFSSL_FAILURE;
  25024. #else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  25025. ed448_key key;
  25026. int ret = WOLFSSL_FAILURE, check = 0;
  25027. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  25028. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  25029. sig == NULL || sigSz != ED448_SIG_SIZE) {
  25030. WOLFSSL_MSG("Bad arguments");
  25031. return WOLFSSL_FAILURE;
  25032. }
  25033. /* import key */
  25034. if (wc_ed448_init(&key) != MP_OKAY) {
  25035. WOLFSSL_MSG("wc_curve448_init failed");
  25036. return ret;
  25037. }
  25038. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  25039. WOLFSSL_MSG("wc_ed448_import_public failed");
  25040. wc_ed448_free(&key);
  25041. return ret;
  25042. }
  25043. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  25044. &key, NULL, 0)) != MP_OKAY) {
  25045. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  25046. }
  25047. else if (!check)
  25048. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  25049. else
  25050. ret = WOLFSSL_SUCCESS;
  25051. wc_ed448_free(&key);
  25052. return ret;
  25053. #endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */
  25054. }
  25055. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  25056. #ifdef WOLFSSL_JNI
  25057. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  25058. {
  25059. WOLFSSL_ENTER("wolfSSL_set_jobject");
  25060. if (ssl != NULL)
  25061. {
  25062. ssl->jObjectRef = objPtr;
  25063. return WOLFSSL_SUCCESS;
  25064. }
  25065. return WOLFSSL_FAILURE;
  25066. }
  25067. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  25068. {
  25069. WOLFSSL_ENTER("wolfSSL_get_jobject");
  25070. if (ssl != NULL)
  25071. return ssl->jObjectRef;
  25072. return NULL;
  25073. }
  25074. #endif /* WOLFSSL_JNI */
  25075. #ifdef WOLFSSL_ASYNC_CRYPT
  25076. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  25077. WOLF_EVENT_FLAG flags, int* eventCount)
  25078. {
  25079. if (ctx == NULL) {
  25080. return BAD_FUNC_ARG;
  25081. }
  25082. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  25083. events, maxEvents, flags, eventCount);
  25084. }
  25085. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  25086. {
  25087. int ret, eventCount = 0;
  25088. WOLF_EVENT* events[1];
  25089. if (ssl == NULL) {
  25090. return BAD_FUNC_ARG;
  25091. }
  25092. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  25093. events, sizeof(events)/sizeof(events[0]), flags, &eventCount);
  25094. if (ret == 0) {
  25095. ret = eventCount;
  25096. }
  25097. return ret;
  25098. }
  25099. #endif /* WOLFSSL_ASYNC_CRYPT */
  25100. #ifdef OPENSSL_EXTRA
  25101. static int peek_ignore_err(int err)
  25102. {
  25103. switch(err) {
  25104. case -WANT_READ:
  25105. case -WANT_WRITE:
  25106. case -ZERO_RETURN:
  25107. case -WOLFSSL_ERROR_ZERO_RETURN:
  25108. case -SOCKET_PEER_CLOSED_E:
  25109. case -SOCKET_ERROR_E:
  25110. return 1;
  25111. default:
  25112. return 0;
  25113. }
  25114. }
  25115. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  25116. const char **data, int *flags)
  25117. {
  25118. unsigned long err;
  25119. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  25120. err = wc_PeekErrorNodeLineData(file, line, data, flags, peek_ignore_err);
  25121. if (err == -ASN_NO_PEM_HEADER)
  25122. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  25123. #ifdef OPENSSL_ALL
  25124. /* PARSE_ERROR is returned if an HTTP request is detected. */
  25125. else if (err == -SSL_R_HTTP_REQUEST)
  25126. return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST;
  25127. #endif
  25128. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  25129. else if (err == ASN1_R_HEADER_TOO_LONG)
  25130. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  25131. #endif
  25132. return err;
  25133. }
  25134. #endif
  25135. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  25136. #if !defined(WOLFSSL_USER_IO)
  25137. /* converts an IPv6 or IPv4 address into an octet string for use with rfc3280
  25138. * example input would be "127.0.0.1" and the returned value would be 7F000001
  25139. */
  25140. WOLFSSL_ASN1_STRING* wolfSSL_a2i_IPADDRESS(const char* ipa)
  25141. {
  25142. int ipaSz = WOLFSSL_IP4_ADDR_LEN;
  25143. char buf[WOLFSSL_IP6_ADDR_LEN + 1]; /* plus 1 for terminator */
  25144. int af = WOLFSSL_IP4;
  25145. WOLFSSL_ASN1_STRING *ret = NULL;
  25146. if (ipa == NULL)
  25147. return NULL;
  25148. if (XSTRSTR(ipa, ":") != NULL) {
  25149. af = WOLFSSL_IP6;
  25150. ipaSz = WOLFSSL_IP6_ADDR_LEN;
  25151. }
  25152. buf[WOLFSSL_IP6_ADDR_LEN] = '\0';
  25153. if (XINET_PTON(af, ipa, (void*)buf) != 1) {
  25154. WOLFSSL_MSG("Error parsing IP address");
  25155. return NULL;
  25156. }
  25157. ret = wolfSSL_ASN1_STRING_new();
  25158. if (ret != NULL) {
  25159. if (wolfSSL_ASN1_STRING_set(ret, buf, ipaSz) != WOLFSSL_SUCCESS) {
  25160. WOLFSSL_MSG("Error setting the string");
  25161. wolfSSL_ASN1_STRING_free(ret);
  25162. ret = NULL;
  25163. }
  25164. }
  25165. return ret;
  25166. }
  25167. #endif /* !WOLFSSL_USER_IO */
  25168. /* Is the specified cipher suite a fake one used an an extension proxy? */
  25169. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  25170. {
  25171. (void)suite0;
  25172. (void)suite;
  25173. #ifdef HAVE_RENEGOTIATION_INDICATION
  25174. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  25175. return 1;
  25176. #endif
  25177. return 0;
  25178. }
  25179. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  25180. byte suite)
  25181. {
  25182. const CipherSuiteInfo* cipher_names = GetCipherNames();
  25183. int cipherSz = GetCipherNamesSize();
  25184. int i;
  25185. for (i = 0; i < cipherSz; i++)
  25186. if (cipher_names[i].cipherSuite0 == suite0 &&
  25187. cipher_names[i].cipherSuite == suite)
  25188. break;
  25189. if (i == cipherSz)
  25190. return 1;
  25191. /* Check min version */
  25192. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  25193. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  25194. cipher_names[i].minor >= TLSv1_MINOR)
  25195. /* 1.0 ciphersuites are in general available in 1.1 and
  25196. * 1.1 ciphersuites are in general available in 1.2 */
  25197. return 0;
  25198. return 1;
  25199. }
  25200. /* Check max version */
  25201. switch (cipher_names[i].minor) {
  25202. case SSLv3_MINOR :
  25203. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  25204. case TLSv1_MINOR :
  25205. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  25206. case TLSv1_1_MINOR :
  25207. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  25208. case TLSv1_2_MINOR :
  25209. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  25210. case TLSv1_3_MINOR :
  25211. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  25212. default:
  25213. WOLFSSL_MSG("Unrecognized minor version");
  25214. return 1;
  25215. }
  25216. }
  25217. /* returns a pointer to internal cipher suite list. Should not be free'd by
  25218. * caller.
  25219. */
  25220. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  25221. {
  25222. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  25223. const Suites* suites;
  25224. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25225. const CipherSuiteInfo* cipher_names = GetCipherNames();
  25226. int cipherSz = GetCipherNamesSize();
  25227. #endif
  25228. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  25229. if (ssl == NULL)
  25230. return NULL;
  25231. suites = WOLFSSL_SUITES(ssl);
  25232. if (suites == NULL)
  25233. return NULL;
  25234. /* check if stack needs populated */
  25235. if (ssl->suitesStack == NULL) {
  25236. int i;
  25237. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25238. int j;
  25239. /* higher priority of cipher suite will be on top of stack */
  25240. for (i = suites->suiteSz - 2; i >=0; i-=2) {
  25241. #else
  25242. for (i = 0; i < suites->suiteSz; i+=2) {
  25243. #endif
  25244. WOLFSSL_STACK* add;
  25245. /* A couple of suites are placeholders for special options,
  25246. * skip those. */
  25247. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  25248. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  25249. suites->suites[i+1])) {
  25250. continue;
  25251. }
  25252. add = wolfSSL_sk_new_node(ssl->heap);
  25253. if (add != NULL) {
  25254. add->type = STACK_TYPE_CIPHER;
  25255. add->data.cipher.cipherSuite0 = suites->suites[i];
  25256. add->data.cipher.cipherSuite = suites->suites[i+1];
  25257. add->data.cipher.ssl = ssl;
  25258. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  25259. for (j = 0; j < cipherSz; j++) {
  25260. if (cipher_names[j].cipherSuite0 ==
  25261. add->data.cipher.cipherSuite0 &&
  25262. cipher_names[j].cipherSuite ==
  25263. add->data.cipher.cipherSuite) {
  25264. add->data.cipher.offset = j;
  25265. break;
  25266. }
  25267. }
  25268. #endif
  25269. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  25270. /* in_stack is checked in wolfSSL_CIPHER_description */
  25271. add->data.cipher.in_stack = 1;
  25272. #endif
  25273. add->next = ret;
  25274. if (ret != NULL) {
  25275. add->num = ret->num + 1;
  25276. }
  25277. else {
  25278. add->num = 1;
  25279. }
  25280. ret = add;
  25281. }
  25282. }
  25283. ((WOLFSSL*)ssl)->suitesStack = ret;
  25284. }
  25285. return ssl->suitesStack;
  25286. }
  25287. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  25288. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  25289. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK)
  25290. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  25291. {
  25292. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  25293. if (ctx == NULL)
  25294. return 0;
  25295. return ctx->timeout;
  25296. }
  25297. /* returns the time in seconds of the current timeout */
  25298. long wolfSSL_get_timeout(WOLFSSL* ssl)
  25299. {
  25300. WOLFSSL_ENTER("wolfSSL_get_timeout");
  25301. if (ssl == NULL)
  25302. return 0;
  25303. return ssl->timeout;
  25304. }
  25305. #endif
  25306. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  25307. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  25308. #ifdef HAVE_ECC
  25309. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  25310. {
  25311. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  25312. if (ctx == NULL || ecdh == NULL)
  25313. return BAD_FUNC_ARG;
  25314. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  25315. return WOLFSSL_SUCCESS;
  25316. }
  25317. #endif
  25318. #ifndef NO_SESSION_CACHE
  25319. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  25320. {
  25321. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25322. int rem_called = FALSE;
  25323. #endif
  25324. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  25325. s = ClientSessionToSession(s);
  25326. if (ctx == NULL || s == NULL)
  25327. return BAD_FUNC_ARG;
  25328. #ifdef HAVE_EXT_CACHE
  25329. if (!ctx->internalCacheOff)
  25330. #endif
  25331. {
  25332. const byte* id;
  25333. WOLFSSL_SESSION *sess = NULL;
  25334. word32 row = 0;
  25335. int ret;
  25336. id = s->sessionID;
  25337. if (s->haveAltSessionID)
  25338. id = s->altSessionID;
  25339. ret = TlsSessionCacheGetAndWrLock(id, &sess, &row, ctx->method->side);
  25340. if (ret == 0 && sess != NULL) {
  25341. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25342. if (sess->rem_sess_cb != NULL) {
  25343. rem_called = TRUE;
  25344. }
  25345. #endif
  25346. /* Call this before changing ownExData so that calls to ex_data
  25347. * don't try to access the SessionCache again. */
  25348. EvictSessionFromCache(sess);
  25349. #ifdef HAVE_EX_DATA
  25350. if (sess->ownExData) {
  25351. /* Most recent version of ex data is in cache. Copy it
  25352. * over so the user can free it. */
  25353. XMEMCPY(&s->ex_data, &sess->ex_data,
  25354. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  25355. s->ownExData = 1;
  25356. sess->ownExData = 0;
  25357. }
  25358. #endif
  25359. #ifdef SESSION_CACHE_DYNAMIC_MEM
  25360. {
  25361. /* Find and clear entry. Row is locked so we are good to go. */
  25362. int idx;
  25363. for (idx = 0; idx < SESSIONS_PER_ROW; idx++) {
  25364. if (sess == SessionCache[row].Sessions[idx]) {
  25365. XFREE(sess, sess->heap, DYNAMIC_TYPE_SESSION);
  25366. SessionCache[row].Sessions[idx] = NULL;
  25367. break;
  25368. }
  25369. }
  25370. }
  25371. #endif
  25372. TlsSessionCacheUnlockRow(row);
  25373. }
  25374. }
  25375. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  25376. if (ctx->rem_sess_cb != NULL && !rem_called) {
  25377. ctx->rem_sess_cb(ctx, s);
  25378. }
  25379. #endif
  25380. /* s cannot be resumed at this point */
  25381. s->timeout = 0;
  25382. return 0;
  25383. }
  25384. #endif /* !NO_SESSION_CACHE */
  25385. #ifndef NO_BIO
  25386. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  25387. {
  25388. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  25389. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  25390. * The setting buffer size doesn't do anything so return NULL for both.
  25391. */
  25392. if (s == NULL)
  25393. return NULL;
  25394. return s->biord;
  25395. }
  25396. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  25397. {
  25398. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  25399. (void)s;
  25400. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  25401. * The setting buffer size doesn't do anything so return NULL for both.
  25402. */
  25403. if (s == NULL)
  25404. return NULL;
  25405. return s->biowr;
  25406. }
  25407. #endif /* !NO_BIO */
  25408. int wolfSSL_SSL_do_handshake_internal(WOLFSSL *s)
  25409. {
  25410. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake_internal");
  25411. if (s == NULL)
  25412. return WOLFSSL_FAILURE;
  25413. if (s->options.side == WOLFSSL_CLIENT_END) {
  25414. #ifndef NO_WOLFSSL_CLIENT
  25415. return wolfSSL_connect(s);
  25416. #else
  25417. WOLFSSL_MSG("Client not compiled in");
  25418. return WOLFSSL_FAILURE;
  25419. #endif
  25420. }
  25421. #ifndef NO_WOLFSSL_SERVER
  25422. return wolfSSL_accept(s);
  25423. #else
  25424. WOLFSSL_MSG("Server not compiled in");
  25425. return WOLFSSL_FAILURE;
  25426. #endif
  25427. }
  25428. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  25429. {
  25430. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  25431. #ifdef WOLFSSL_QUIC
  25432. if (WOLFSSL_IS_QUIC(s)) {
  25433. return wolfSSL_quic_do_handshake(s);
  25434. }
  25435. #endif
  25436. return wolfSSL_SSL_do_handshake_internal(s);
  25437. }
  25438. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  25439. int wolfSSL_SSL_in_init(const WOLFSSL *ssl)
  25440. #else
  25441. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  25442. #endif
  25443. {
  25444. WOLFSSL_ENTER("wolfSSL_SSL_in_init");
  25445. return !wolfSSL_is_init_finished(ssl);
  25446. }
  25447. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  25448. {
  25449. WOLFSSL_ENTER("wolfSSL_SSL_in_connect_init");
  25450. if (ssl == NULL)
  25451. return WOLFSSL_FAILURE;
  25452. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  25453. return ssl->options.connectState > CONNECT_BEGIN &&
  25454. ssl->options.connectState < SECOND_REPLY_DONE;
  25455. }
  25456. return ssl->options.acceptState > ACCEPT_BEGIN &&
  25457. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  25458. }
  25459. #ifndef NO_SESSION_CACHE
  25460. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  25461. {
  25462. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  25463. return ssl->session;
  25464. }
  25465. #endif /* NO_SESSION_CACHE */
  25466. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  25467. /* Expected return values from implementations of OpenSSL ticket key callback.
  25468. */
  25469. #define TICKET_KEY_CB_RET_FAILURE (-1)
  25470. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  25471. #define TICKET_KEY_CB_RET_OK 1
  25472. #define TICKET_KEY_CB_RET_RENEW 2
  25473. /* Implementation of session ticket encryption/decryption using OpenSSL
  25474. * callback to initialize the cipher and HMAC.
  25475. *
  25476. * ssl The SSL/TLS object.
  25477. * keyName The key name - used to identify the key to be used.
  25478. * iv The IV to use.
  25479. * mac The MAC of the encrypted data.
  25480. * enc Encrypt ticket.
  25481. * encTicket The ticket data.
  25482. * encTicketLen The length of the ticket data.
  25483. * encLen The encrypted/decrypted ticket length - output length.
  25484. * ctx Ignored. Application specific data.
  25485. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  25486. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  25487. * WOLFSSL_TICKET_RET_FATAL on error.
  25488. */
  25489. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  25490. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  25491. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  25492. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  25493. int enc, unsigned char* encTicket,
  25494. int encTicketLen, int* encLen, void* ctx)
  25495. {
  25496. byte digest[WC_MAX_DIGEST_SIZE];
  25497. #ifdef WOLFSSL_SMALL_STACK
  25498. WOLFSSL_EVP_CIPHER_CTX *evpCtx;
  25499. #else
  25500. WOLFSSL_EVP_CIPHER_CTX evpCtx[1];
  25501. #endif
  25502. WOLFSSL_HMAC_CTX hmacCtx;
  25503. unsigned int mdSz = 0;
  25504. int len = 0;
  25505. int ret = WOLFSSL_TICKET_RET_FATAL;
  25506. int res;
  25507. int totalSz = 0;
  25508. (void)ctx;
  25509. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  25510. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncWrapCb == NULL) {
  25511. WOLFSSL_MSG("Bad parameter");
  25512. return WOLFSSL_TICKET_RET_FATAL;
  25513. }
  25514. #ifdef WOLFSSL_SMALL_STACK
  25515. evpCtx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(sizeof(*evpCtx), ssl->heap,
  25516. DYNAMIC_TYPE_TMP_BUFFER);
  25517. if (evpCtx == NULL) {
  25518. WOLFSSL_MSG("out of memory");
  25519. return WOLFSSL_TICKET_RET_FATAL;
  25520. }
  25521. #endif
  25522. /* Initialize the cipher and HMAC. */
  25523. wolfSSL_EVP_CIPHER_CTX_init(evpCtx);
  25524. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  25525. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  25526. #ifdef WOLFSSL_SMALL_STACK
  25527. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  25528. #endif
  25529. return WOLFSSL_TICKET_RET_FATAL;
  25530. }
  25531. res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
  25532. iv, evpCtx, &hmacCtx, enc);
  25533. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  25534. WOLFSSL_MSG("Ticket callback error");
  25535. ret = WOLFSSL_TICKET_RET_FATAL;
  25536. goto end;
  25537. }
  25538. if (wolfSSL_HMAC_size(&hmacCtx) > WOLFSSL_TICKET_MAC_SZ) {
  25539. WOLFSSL_MSG("Ticket cipher MAC size error");
  25540. goto end;
  25541. }
  25542. if (enc)
  25543. {
  25544. /* Encrypt in place. */
  25545. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  25546. encTicket, encTicketLen))
  25547. goto end;
  25548. totalSz = len;
  25549. if (totalSz > *encLen)
  25550. goto end;
  25551. if (!wolfSSL_EVP_EncryptFinal(evpCtx, &encTicket[len], &len))
  25552. goto end;
  25553. /* Total length of encrypted data. */
  25554. totalSz += len;
  25555. if (totalSz > *encLen)
  25556. goto end;
  25557. /* HMAC the encrypted data into the parameter 'mac'. */
  25558. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, totalSz))
  25559. goto end;
  25560. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  25561. goto end;
  25562. }
  25563. else
  25564. {
  25565. /* HMAC the encrypted data and compare it to the passed in data. */
  25566. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  25567. goto end;
  25568. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  25569. goto end;
  25570. if (XMEMCMP(mac, digest, mdSz) != 0)
  25571. goto end;
  25572. /* Decrypt the ticket data in place. */
  25573. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  25574. encTicket, encTicketLen))
  25575. goto end;
  25576. totalSz = len;
  25577. if (totalSz > encTicketLen)
  25578. goto end;
  25579. if (!wolfSSL_EVP_DecryptFinal(evpCtx, &encTicket[len], &len))
  25580. goto end;
  25581. /* Total length of decrypted data. */
  25582. totalSz += len;
  25583. if (totalSz > encTicketLen)
  25584. goto end;
  25585. }
  25586. *encLen = totalSz;
  25587. if (res == TICKET_KEY_CB_RET_RENEW && !IsAtLeastTLSv1_3(ssl->version)
  25588. && !enc)
  25589. ret = WOLFSSL_TICKET_RET_CREATE;
  25590. else
  25591. ret = WOLFSSL_TICKET_RET_OK;
  25592. end:
  25593. (void)wc_HmacFree(&hmacCtx.hmac);
  25594. #ifdef WOLFSSL_SMALL_STACK
  25595. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  25596. #endif
  25597. return ret;
  25598. }
  25599. /* Set the callback to use when encrypting/decrypting tickets.
  25600. *
  25601. * ctx The SSL/TLS context object.
  25602. * cb The OpenSSL session ticket callback.
  25603. * returns WOLFSSL_SUCCESS to indicate success.
  25604. */
  25605. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  25606. {
  25607. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  25608. * callback.
  25609. */
  25610. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  25611. ctx->ticketEncWrapCb = cb;
  25612. return WOLFSSL_SUCCESS;
  25613. }
  25614. #endif /* HAVE_SESSION_TICKET */
  25615. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  25616. OPENSSL_EXTRA || HAVE_LIGHTY */
  25617. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  25618. !defined(NO_WOLFSSL_SERVER)
  25619. /* Serialize the session ticket encryption keys.
  25620. *
  25621. * @param [in] ctx SSL/TLS context object.
  25622. * @param [in] keys Buffer to hold session ticket keys.
  25623. * @param [in] keylen Length of buffer.
  25624. * @return WOLFSSL_SUCCESS on success.
  25625. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  25626. * correct length.
  25627. */
  25628. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  25629. unsigned char *keys, int keylen)
  25630. {
  25631. if (ctx == NULL || keys == NULL) {
  25632. return WOLFSSL_FAILURE;
  25633. }
  25634. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  25635. return WOLFSSL_FAILURE;
  25636. }
  25637. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  25638. keys += WOLFSSL_TICKET_NAME_SZ;
  25639. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  25640. keys += WOLFSSL_TICKET_KEY_SZ;
  25641. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  25642. keys += WOLFSSL_TICKET_KEY_SZ;
  25643. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  25644. keys += OPAQUE32_LEN;
  25645. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  25646. return WOLFSSL_SUCCESS;
  25647. }
  25648. /* Deserialize the session ticket encryption keys.
  25649. *
  25650. * @param [in] ctx SSL/TLS context object.
  25651. * @param [in] keys Session ticket keys.
  25652. * @param [in] keylen Length of data.
  25653. * @return WOLFSSL_SUCCESS on success.
  25654. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  25655. * correct length.
  25656. */
  25657. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  25658. unsigned char *keys, int keylen)
  25659. {
  25660. if (ctx == NULL || keys == NULL) {
  25661. return WOLFSSL_FAILURE;
  25662. }
  25663. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  25664. return WOLFSSL_FAILURE;
  25665. }
  25666. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  25667. keys += WOLFSSL_TICKET_NAME_SZ;
  25668. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  25669. keys += WOLFSSL_TICKET_KEY_SZ;
  25670. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  25671. keys += WOLFSSL_TICKET_KEY_SZ;
  25672. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  25673. keys += OPAQUE32_LEN;
  25674. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  25675. return WOLFSSL_SUCCESS;
  25676. }
  25677. #endif
  25678. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  25679. #ifdef HAVE_OCSP
  25680. /* Not an OpenSSL API. */
  25681. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  25682. {
  25683. *response = ssl->ocspResp;
  25684. return ssl->ocspRespSz;
  25685. }
  25686. /* Not an OpenSSL API. */
  25687. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  25688. {
  25689. return ssl->url;
  25690. }
  25691. /* Not an OpenSSL API. */
  25692. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  25693. {
  25694. if (ssl == NULL)
  25695. return WOLFSSL_FAILURE;
  25696. ssl->url = url;
  25697. return WOLFSSL_SUCCESS;
  25698. }
  25699. #endif /* OCSP */
  25700. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  25701. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  25702. int wolfSSL_get_ocsp_producedDate(
  25703. WOLFSSL *ssl,
  25704. byte *producedDate,
  25705. size_t producedDate_space,
  25706. int *producedDateFormat)
  25707. {
  25708. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  25709. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  25710. return BAD_FUNC_ARG;
  25711. if ((producedDate == NULL) || (producedDateFormat == NULL))
  25712. return BAD_FUNC_ARG;
  25713. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  25714. return BUFFER_E;
  25715. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  25716. *producedDateFormat = ssl->ocspProducedDateFormat;
  25717. return 0;
  25718. }
  25719. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  25720. int idx = 0;
  25721. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  25722. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  25723. return BAD_FUNC_ARG;
  25724. if (produced_tm == NULL)
  25725. return BAD_FUNC_ARG;
  25726. if (ExtractDate(ssl->ocspProducedDate,
  25727. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  25728. return 0;
  25729. else
  25730. return ASN_PARSE_E;
  25731. }
  25732. #endif
  25733. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  25734. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  25735. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  25736. {
  25737. word32 idx;
  25738. word32 length;
  25739. WOLFSSL_STACK* node;
  25740. WOLFSSL_STACK* last = NULL;
  25741. if (ctx == NULL || chain == NULL) {
  25742. chain = NULL;
  25743. return WOLFSSL_FAILURE;
  25744. }
  25745. if (ctx->x509Chain != NULL) {
  25746. *chain = ctx->x509Chain;
  25747. return WOLFSSL_SUCCESS;
  25748. }
  25749. /* If there are no chains then success! */
  25750. *chain = NULL;
  25751. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  25752. return WOLFSSL_SUCCESS;
  25753. }
  25754. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  25755. for (idx = 0; idx < ctx->certChain->length; ) {
  25756. node = wolfSSL_sk_X509_new_null();
  25757. if (node == NULL)
  25758. return WOLFSSL_FAILURE;
  25759. node->next = NULL;
  25760. /* 3 byte length | X509 DER data */
  25761. ato24(ctx->certChain->buffer + idx, &length);
  25762. idx += 3;
  25763. /* Create a new X509 from DER encoded data. */
  25764. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  25765. length);
  25766. if (node->data.x509 == NULL) {
  25767. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  25768. /* Return as much of the chain as we created. */
  25769. ctx->x509Chain = *chain;
  25770. return WOLFSSL_FAILURE;
  25771. }
  25772. idx += length;
  25773. /* Add object to the end of the stack. */
  25774. if (last == NULL) {
  25775. node->num = 1;
  25776. *chain = node;
  25777. }
  25778. else {
  25779. (*chain)->num++;
  25780. last->next = node;
  25781. }
  25782. last = node;
  25783. }
  25784. ctx->x509Chain = *chain;
  25785. return WOLFSSL_SUCCESS;
  25786. }
  25787. int wolfSSL_CTX_get_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb* cb)
  25788. {
  25789. if (ctx == NULL || ctx->cm == NULL || cb == NULL)
  25790. return WOLFSSL_FAILURE;
  25791. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  25792. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  25793. if (ctx->cm->ocsp_stapling == NULL)
  25794. return WOLFSSL_FAILURE;
  25795. *cb = ctx->cm->ocsp_stapling->statusCb;
  25796. #else
  25797. (void)cb;
  25798. *cb = NULL;
  25799. #endif
  25800. return WOLFSSL_SUCCESS;
  25801. }
  25802. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb cb)
  25803. {
  25804. if (ctx == NULL || ctx->cm == NULL)
  25805. return WOLFSSL_FAILURE;
  25806. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  25807. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  25808. /* Ensure stapling is on for callback to be used. */
  25809. wolfSSL_CTX_EnableOCSPStapling(ctx);
  25810. if (ctx->cm->ocsp_stapling == NULL)
  25811. return WOLFSSL_FAILURE;
  25812. ctx->cm->ocsp_stapling->statusCb = cb;
  25813. #else
  25814. (void)cb;
  25815. #endif
  25816. return WOLFSSL_SUCCESS;
  25817. }
  25818. int wolfSSL_CTX_get0_chain_certs(WOLFSSL_CTX *ctx,
  25819. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  25820. {
  25821. WOLFSSL_ENTER("wolfSSL_CTX_get0_chain_certs");
  25822. if (ctx == NULL || sk == NULL) {
  25823. WOLFSSL_MSG("Bad parameter");
  25824. return WOLFSSL_FAILURE;
  25825. }
  25826. /* This function should return ctx->x509Chain if it is populated, otherwise
  25827. it should be populated from ctx->certChain. This matches the behavior of
  25828. wolfSSL_CTX_get_extra_chain_certs, so it is used directly. */
  25829. return wolfSSL_CTX_get_extra_chain_certs(ctx, sk);
  25830. }
  25831. #ifdef KEEP_OUR_CERT
  25832. int wolfSSL_get0_chain_certs(WOLFSSL *ssl,
  25833. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  25834. {
  25835. WOLFSSL_ENTER("wolfSSL_get0_chain_certs");
  25836. if (ssl == NULL || sk == NULL) {
  25837. WOLFSSL_MSG("Bad parameter");
  25838. return WOLFSSL_FAILURE;
  25839. }
  25840. *sk = ssl->ourCertChain;
  25841. return WOLFSSL_SUCCESS;
  25842. }
  25843. #endif
  25844. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  25845. {
  25846. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  25847. if (ret) {
  25848. ret->type = STACK_TYPE_STRING;
  25849. }
  25850. return ret;
  25851. }
  25852. void wolfSSL_WOLFSSL_STRING_free(WOLFSSL_STRING s)
  25853. {
  25854. WOLFSSL_ENTER("wolfSSL_WOLFSSL_STRING_free");
  25855. if (s != NULL)
  25856. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  25857. }
  25858. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  25859. {
  25860. WOLFSSL_STACK* tmp;
  25861. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  25862. if (sk == NULL)
  25863. return;
  25864. /* parse through stack freeing each node */
  25865. while (sk) {
  25866. tmp = sk->next;
  25867. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  25868. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  25869. sk = tmp;
  25870. }
  25871. }
  25872. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  25873. int idx)
  25874. {
  25875. for (; idx > 0 && strings != NULL; idx--)
  25876. strings = strings->next;
  25877. if (strings == NULL)
  25878. return NULL;
  25879. return strings->data.string;
  25880. }
  25881. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  25882. {
  25883. if (strings)
  25884. return (int)strings->num;
  25885. return 0;
  25886. }
  25887. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  25888. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  25889. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) || \
  25890. defined(WOLFSSL_QUIC)
  25891. #ifdef HAVE_ALPN
  25892. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  25893. unsigned int *len)
  25894. {
  25895. word16 nameLen;
  25896. if (ssl != NULL && data != NULL && len != NULL) {
  25897. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  25898. *len = nameLen;
  25899. }
  25900. }
  25901. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  25902. const unsigned char *in, unsigned int inLen,
  25903. const unsigned char *clientNames,
  25904. unsigned int clientLen)
  25905. {
  25906. unsigned int i, j;
  25907. byte lenIn, lenClient;
  25908. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  25909. return OPENSSL_NPN_UNSUPPORTED;
  25910. for (i = 0; i < inLen; i += lenIn) {
  25911. lenIn = in[i++];
  25912. for (j = 0; j < clientLen; j += lenClient) {
  25913. lenClient = clientNames[j++];
  25914. if (lenIn != lenClient)
  25915. continue;
  25916. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  25917. *out = (unsigned char *)(in + i);
  25918. *outLen = lenIn;
  25919. return OPENSSL_NPN_NEGOTIATED;
  25920. }
  25921. }
  25922. }
  25923. *out = (unsigned char *)clientNames + 1;
  25924. *outLen = clientNames[0];
  25925. return OPENSSL_NPN_NO_OVERLAP;
  25926. }
  25927. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  25928. int (*cb) (WOLFSSL *ssl,
  25929. const unsigned char **out,
  25930. unsigned char *outlen,
  25931. const unsigned char *in,
  25932. unsigned int inlen,
  25933. void *arg), void *arg)
  25934. {
  25935. if (ctx != NULL) {
  25936. ctx->alpnSelect = cb;
  25937. ctx->alpnSelectArg = arg;
  25938. }
  25939. }
  25940. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  25941. int (*cb) (WOLFSSL *ssl,
  25942. const unsigned char
  25943. **out,
  25944. unsigned int *outlen,
  25945. void *arg), void *arg)
  25946. {
  25947. (void)s;
  25948. (void)cb;
  25949. (void)arg;
  25950. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  25951. }
  25952. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  25953. int (*cb) (WOLFSSL *ssl,
  25954. unsigned char **out,
  25955. unsigned char *outlen,
  25956. const unsigned char *in,
  25957. unsigned int inlen,
  25958. void *arg), void *arg)
  25959. {
  25960. (void)s;
  25961. (void)cb;
  25962. (void)arg;
  25963. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  25964. }
  25965. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  25966. unsigned *len)
  25967. {
  25968. (void)s;
  25969. (void)data;
  25970. (void)len;
  25971. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  25972. }
  25973. #endif /* HAVE_ALPN */
  25974. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  25975. #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
  25976. int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, word16 curve_id)
  25977. {
  25978. if (curve_id >= WOLFSSL_FFDHE_START) {
  25979. /* DH parameters are never disabled. */
  25980. return 0;
  25981. }
  25982. if (curve_id > WOLFSSL_ECC_MAX_AVAIL) {
  25983. WOLFSSL_MSG("Curve id out of supported range");
  25984. /* Disabled if not in valid range. */
  25985. return 1;
  25986. }
  25987. if (curve_id >= 32) {
  25988. /* 0 is for invalid and 1-14 aren't used otherwise. */
  25989. return (ssl->disabledCurves & (1 << (curve_id - 32))) != 0;
  25990. }
  25991. return (ssl->disabledCurves & (1 << curve_id)) != 0;
  25992. }
  25993. #if (defined(HAVE_ECC) || \
  25994. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  25995. static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
  25996. {
  25997. int idx, start = 0, len, i, ret = WOLFSSL_FAILURE;
  25998. word16 curve;
  25999. word32 disabled;
  26000. char name[MAX_CURVE_NAME_SZ];
  26001. byte groups_len = 0;
  26002. #ifdef WOLFSSL_SMALL_STACK
  26003. void *heap = ssl? ssl->heap : ctx ? ctx->heap : NULL;
  26004. int *groups;
  26005. #else
  26006. int groups[WOLFSSL_MAX_GROUP_COUNT];
  26007. #endif
  26008. #ifdef WOLFSSL_SMALL_STACK
  26009. groups = (int*)XMALLOC(sizeof(int)*WOLFSSL_MAX_GROUP_COUNT,
  26010. heap, DYNAMIC_TYPE_TMP_BUFFER);
  26011. if (groups == NULL) {
  26012. ret = MEMORY_E;
  26013. goto leave;
  26014. }
  26015. #endif
  26016. for (idx = 1; names[idx-1] != '\0'; idx++) {
  26017. if (names[idx] != ':' && names[idx] != '\0')
  26018. continue;
  26019. len = idx - start;
  26020. if (len > MAX_CURVE_NAME_SZ - 1)
  26021. goto leave;
  26022. XMEMCPY(name, names + start, len);
  26023. name[len++] = 0;
  26024. /* Use XSTRNCMP to avoid valgrind error. */
  26025. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  26026. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  26027. (XSTRNCMP(name, "P-256", len) == 0))
  26028. {
  26029. curve = WOLFSSL_ECC_SECP256R1;
  26030. }
  26031. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  26032. (XSTRNCMP(name, "P-384", len) == 0))
  26033. {
  26034. curve = WOLFSSL_ECC_SECP384R1;
  26035. }
  26036. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  26037. (XSTRNCMP(name, "P-521", len) == 0))
  26038. {
  26039. curve = WOLFSSL_ECC_SECP521R1;
  26040. }
  26041. #ifdef WOLFSSL_SM2
  26042. else if ((XSTRNCMP(name, "sm2p256v1", len) == 0) ||
  26043. (XSTRNCMP(name, "SM2", len) == 0))
  26044. {
  26045. curve = WOLFSSL_ECC_SM2P256V1;
  26046. }
  26047. #endif
  26048. #ifdef HAVE_CURVE25519
  26049. else if (XSTRNCMP(name, "X25519", len) == 0)
  26050. {
  26051. curve = WOLFSSL_ECC_X25519;
  26052. }
  26053. #endif
  26054. #ifdef HAVE_CURVE448
  26055. else if (XSTRNCMP(name, "X448", len) == 0)
  26056. {
  26057. curve = WOLFSSL_ECC_X448;
  26058. }
  26059. #endif
  26060. else {
  26061. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  26062. int nret;
  26063. const ecc_set_type *eccSet;
  26064. nret = wc_ecc_get_curve_idx_from_name(name);
  26065. if (nret < 0) {
  26066. WOLFSSL_MSG("Could not find name in set");
  26067. goto leave;
  26068. }
  26069. eccSet = wc_ecc_get_curve_params(ret);
  26070. if (eccSet == NULL) {
  26071. WOLFSSL_MSG("NULL set returned");
  26072. goto leave;
  26073. }
  26074. curve = GetCurveByOID(eccSet->oidSum);
  26075. #else
  26076. WOLFSSL_MSG("API not present to search farther using name");
  26077. goto leave;
  26078. #endif
  26079. }
  26080. if (curve >= WOLFSSL_ECC_MAX_AVAIL) {
  26081. WOLFSSL_MSG("curve value is not supported");
  26082. goto leave;
  26083. }
  26084. for (i = 0; i < groups_len; ++i) {
  26085. if (groups[i] == curve) {
  26086. /* silently drop duplicates */
  26087. break;
  26088. }
  26089. }
  26090. if (i >= groups_len) {
  26091. if (groups_len >= WOLFSSL_MAX_GROUP_COUNT) {
  26092. WOLFSSL_MSG_EX("setting %d or more supported "
  26093. "curves is not permitted", groups_len);
  26094. goto leave;
  26095. }
  26096. groups[groups_len++] = (int)curve;
  26097. }
  26098. start = idx + 1;
  26099. }
  26100. /* Disable all curves so that only the ones the user wants are enabled. */
  26101. disabled = 0xFFFFFFFFUL;
  26102. for (i = 0; i < groups_len; ++i) {
  26103. /* Switch the bit to off and therefore is enabled. */
  26104. curve = (word16)groups[i];
  26105. if (curve >= 32) {
  26106. /* 0 is for invalid and 1-14 aren't used otherwise. */
  26107. disabled &= ~(1U << (curve - 32));
  26108. }
  26109. else {
  26110. disabled &= ~(1U << curve);
  26111. }
  26112. #ifdef HAVE_SUPPORTED_CURVES
  26113. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_OLD_SET_CURVES_LIST)
  26114. /* using the wolfSSL API to set the groups, this will populate
  26115. * (ssl|ctx)->groups and reset any TLSX_SUPPORTED_GROUPS.
  26116. * The order in (ssl|ctx)->groups will then be respected
  26117. * when TLSX_KEY_SHARE needs to be established */
  26118. if ((ssl && wolfSSL_set_groups(ssl, groups, groups_len)
  26119. != WOLFSSL_SUCCESS)
  26120. || (ctx && wolfSSL_CTX_set_groups(ctx, groups, groups_len)
  26121. != WOLFSSL_SUCCESS)) {
  26122. WOLFSSL_MSG("Unable to set supported curve");
  26123. goto leave;
  26124. }
  26125. #elif !defined(NO_WOLFSSL_CLIENT)
  26126. /* set the supported curve so client TLS extension contains only the
  26127. * desired curves */
  26128. if ((ssl && wolfSSL_UseSupportedCurve(ssl, curve) != WOLFSSL_SUCCESS)
  26129. || (ctx && wolfSSL_CTX_UseSupportedCurve(ctx, curve)
  26130. != WOLFSSL_SUCCESS)) {
  26131. WOLFSSL_MSG("Unable to set supported curve");
  26132. goto leave;
  26133. }
  26134. #endif
  26135. #endif /* HAVE_SUPPORTED_CURVES */
  26136. }
  26137. if (ssl)
  26138. ssl->disabledCurves = disabled;
  26139. else
  26140. ctx->disabledCurves = disabled;
  26141. ret = WOLFSSL_SUCCESS;
  26142. leave:
  26143. #ifdef WOLFSSL_SMALL_STACK
  26144. if (groups)
  26145. XFREE((void*)groups, heap, DYNAMIC_TYPE_TMP_BUFFER);
  26146. #endif
  26147. return ret;
  26148. }
  26149. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  26150. {
  26151. if (ctx == NULL || names == NULL) {
  26152. WOLFSSL_MSG("ctx or names was NULL");
  26153. return WOLFSSL_FAILURE;
  26154. }
  26155. return set_curves_list(NULL, ctx, names);
  26156. }
  26157. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  26158. {
  26159. if (ssl == NULL || names == NULL) {
  26160. WOLFSSL_MSG("ssl or names was NULL");
  26161. return WOLFSSL_FAILURE;
  26162. }
  26163. return set_curves_list(ssl, NULL, names);
  26164. }
  26165. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) */
  26166. #endif /* OPENSSL_EXTRA || HAVE_CURL */
  26167. #ifdef OPENSSL_EXTRA
  26168. /* Sets a callback for when sending and receiving protocol messages.
  26169. * This callback is copied to all WOLFSSL objects created from the ctx.
  26170. *
  26171. * ctx WOLFSSL_CTX structure to set callback in
  26172. * cb callback to use
  26173. *
  26174. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE with error case
  26175. */
  26176. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  26177. {
  26178. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback");
  26179. if (ctx == NULL) {
  26180. WOLFSSL_MSG("Null ctx passed in");
  26181. return WOLFSSL_FAILURE;
  26182. }
  26183. ctx->protoMsgCb = cb;
  26184. return WOLFSSL_SUCCESS;
  26185. }
  26186. /* Sets a callback for when sending and receiving protocol messages.
  26187. *
  26188. * ssl WOLFSSL structure to set callback in
  26189. * cb callback to use
  26190. *
  26191. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE with error case
  26192. */
  26193. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  26194. {
  26195. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  26196. if (ssl == NULL) {
  26197. return WOLFSSL_FAILURE;
  26198. }
  26199. if (cb != NULL) {
  26200. ssl->toInfoOn = 1;
  26201. }
  26202. ssl->protoMsgCb = cb;
  26203. return WOLFSSL_SUCCESS;
  26204. }
  26205. /* set the user argument to pass to the msg callback when called
  26206. * return WOLFSSL_SUCCESS on success */
  26207. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  26208. {
  26209. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback_arg");
  26210. if (ctx == NULL) {
  26211. WOLFSSL_MSG("Null WOLFSSL_CTX passed in");
  26212. return WOLFSSL_FAILURE;
  26213. }
  26214. ctx->protoMsgCtx = arg;
  26215. return WOLFSSL_SUCCESS;
  26216. }
  26217. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  26218. {
  26219. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  26220. if (ssl == NULL)
  26221. return WOLFSSL_FAILURE;
  26222. ssl->protoMsgCtx = arg;
  26223. return WOLFSSL_SUCCESS;
  26224. }
  26225. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  26226. {
  26227. void *ret;
  26228. (void)file;
  26229. (void)line;
  26230. if (data == NULL || siz >= INT_MAX)
  26231. return NULL;
  26232. ret = OPENSSL_malloc(siz);
  26233. if (ret == NULL) {
  26234. return NULL;
  26235. }
  26236. return XMEMCPY(ret, data, siz);
  26237. }
  26238. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  26239. {
  26240. if (ptr)
  26241. ForceZero(ptr, (word32)len);
  26242. }
  26243. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  26244. unsigned int p_len)
  26245. {
  26246. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  26247. if (ctx == NULL)
  26248. return BAD_FUNC_ARG;
  26249. if (ctx->alpn_cli_protos != NULL) {
  26250. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  26251. }
  26252. ctx->alpn_cli_protos = (const unsigned char*)XMALLOC(p_len,
  26253. ctx->heap, DYNAMIC_TYPE_OPENSSL);
  26254. if (ctx->alpn_cli_protos == NULL) {
  26255. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26256. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26257. * the function reverses the return value convention.
  26258. */
  26259. return 1;
  26260. #else
  26261. return WOLFSSL_FAILURE;
  26262. #endif
  26263. }
  26264. XMEMCPY((void*)ctx->alpn_cli_protos, p, p_len);
  26265. ctx->alpn_cli_protos_len = p_len;
  26266. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26267. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26268. * the function reverses the return value convention.
  26269. */
  26270. return 0;
  26271. #else
  26272. return WOLFSSL_SUCCESS;
  26273. #endif
  26274. }
  26275. #ifdef HAVE_ALPN
  26276. #ifndef NO_BIO
  26277. /* Sets the ALPN extension protos
  26278. *
  26279. * example format is
  26280. * unsigned char p[] = {
  26281. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  26282. * };
  26283. *
  26284. * returns WOLFSSL_SUCCESS on success */
  26285. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  26286. const unsigned char* p, unsigned int p_len)
  26287. {
  26288. WOLFSSL_BIO* bio;
  26289. char* pt = NULL;
  26290. unsigned int sz;
  26291. unsigned int idx = 0;
  26292. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  26293. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  26294. if (ssl == NULL || p_len <= 1) {
  26295. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26296. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26297. * the function reverses the return value convention.
  26298. */
  26299. return 1;
  26300. #else
  26301. return WOLFSSL_FAILURE;
  26302. #endif
  26303. }
  26304. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  26305. if (bio == NULL) {
  26306. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26307. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26308. * the function reverses the return value convention.
  26309. */
  26310. return 1;
  26311. #else
  26312. return WOLFSSL_FAILURE;
  26313. #endif
  26314. }
  26315. /* convert into comma separated list */
  26316. while (idx < p_len - 1) {
  26317. unsigned int i;
  26318. sz = p[idx++];
  26319. if (idx + sz > p_len) {
  26320. WOLFSSL_MSG("Bad list format");
  26321. wolfSSL_BIO_free(bio);
  26322. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26323. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26324. * the function reverses the return value convention.
  26325. */
  26326. return 1;
  26327. #else
  26328. return WOLFSSL_FAILURE;
  26329. #endif
  26330. }
  26331. if (sz > 0) {
  26332. for (i = 0; i < sz; i++) {
  26333. wolfSSL_BIO_write(bio, &p[idx++], 1);
  26334. }
  26335. if (idx < p_len - 1)
  26336. wolfSSL_BIO_write(bio, ",", 1);
  26337. }
  26338. }
  26339. wolfSSL_BIO_write(bio, "\0", 1);
  26340. /* clears out all current ALPN extensions set */
  26341. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  26342. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  26343. wolfSSL_UseALPN(ssl, pt, sz, (byte) alpn_opt);
  26344. }
  26345. wolfSSL_BIO_free(bio);
  26346. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  26347. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  26348. * the function reverses the return value convention.
  26349. */
  26350. return 0;
  26351. #else
  26352. return WOLFSSL_SUCCESS;
  26353. #endif
  26354. }
  26355. #endif /* !NO_BIO */
  26356. #endif /* HAVE_ALPN */
  26357. #endif /* OPENSSL_EXTRA */
  26358. #if defined(OPENSSL_EXTRA)
  26359. #ifndef NO_BIO
  26360. #define WOLFSSL_BIO_INCLUDED
  26361. #include "src/bio.c"
  26362. #endif
  26363. word32 nid2oid(int nid, int grp)
  26364. {
  26365. /* get OID type */
  26366. switch (grp) {
  26367. /* oidHashType */
  26368. case oidHashType:
  26369. switch (nid) {
  26370. #ifdef WOLFSSL_MD2
  26371. case NID_md2:
  26372. return MD2h;
  26373. #endif
  26374. #ifndef NO_MD5
  26375. case NID_md5:
  26376. return MD5h;
  26377. #endif
  26378. #ifndef NO_SHA
  26379. case NID_sha1:
  26380. return SHAh;
  26381. #endif
  26382. case NID_sha224:
  26383. return SHA224h;
  26384. #ifndef NO_SHA256
  26385. case NID_sha256:
  26386. return SHA256h;
  26387. #endif
  26388. #ifdef WOLFSSL_SHA384
  26389. case NID_sha384:
  26390. return SHA384h;
  26391. #endif
  26392. #ifdef WOLFSSL_SHA512
  26393. case NID_sha512:
  26394. return SHA512h;
  26395. #endif
  26396. #ifndef WOLFSSL_NOSHA3_224
  26397. case NID_sha3_224:
  26398. return SHA3_224h;
  26399. #endif
  26400. #ifndef WOLFSSL_NOSHA3_256
  26401. case NID_sha3_256:
  26402. return SHA3_256h;
  26403. #endif
  26404. #ifndef WOLFSSL_NOSHA3_384
  26405. case NID_sha3_384:
  26406. return SHA3_384h;
  26407. #endif
  26408. #ifndef WOLFSSL_NOSHA3_512
  26409. case NID_sha3_512:
  26410. return SHA3_512h;
  26411. #endif
  26412. }
  26413. break;
  26414. /* oidSigType */
  26415. case oidSigType:
  26416. switch (nid) {
  26417. #ifndef NO_DSA
  26418. case NID_dsaWithSHA1:
  26419. return CTC_SHAwDSA;
  26420. case NID_dsa_with_SHA256:
  26421. return CTC_SHA256wDSA;
  26422. #endif /* NO_DSA */
  26423. #ifndef NO_RSA
  26424. case NID_md2WithRSAEncryption:
  26425. return CTC_MD2wRSA;
  26426. case NID_md5WithRSAEncryption:
  26427. return CTC_MD5wRSA;
  26428. case NID_sha1WithRSAEncryption:
  26429. return CTC_SHAwRSA;
  26430. case NID_sha224WithRSAEncryption:
  26431. return CTC_SHA224wRSA;
  26432. case NID_sha256WithRSAEncryption:
  26433. return CTC_SHA256wRSA;
  26434. case NID_sha384WithRSAEncryption:
  26435. return CTC_SHA384wRSA;
  26436. case NID_sha512WithRSAEncryption:
  26437. return CTC_SHA512wRSA;
  26438. #ifdef WOLFSSL_SHA3
  26439. case NID_RSA_SHA3_224:
  26440. return CTC_SHA3_224wRSA;
  26441. case NID_RSA_SHA3_256:
  26442. return CTC_SHA3_256wRSA;
  26443. case NID_RSA_SHA3_384:
  26444. return CTC_SHA3_384wRSA;
  26445. case NID_RSA_SHA3_512:
  26446. return CTC_SHA3_512wRSA;
  26447. #endif
  26448. #endif /* NO_RSA */
  26449. #ifdef HAVE_ECC
  26450. case NID_ecdsa_with_SHA1:
  26451. return CTC_SHAwECDSA;
  26452. case NID_ecdsa_with_SHA224:
  26453. return CTC_SHA224wECDSA;
  26454. case NID_ecdsa_with_SHA256:
  26455. return CTC_SHA256wECDSA;
  26456. case NID_ecdsa_with_SHA384:
  26457. return CTC_SHA384wECDSA;
  26458. case NID_ecdsa_with_SHA512:
  26459. return CTC_SHA512wECDSA;
  26460. #ifdef WOLFSSL_SHA3
  26461. case NID_ecdsa_with_SHA3_224:
  26462. return CTC_SHA3_224wECDSA;
  26463. case NID_ecdsa_with_SHA3_256:
  26464. return CTC_SHA3_256wECDSA;
  26465. case NID_ecdsa_with_SHA3_384:
  26466. return CTC_SHA3_384wECDSA;
  26467. case NID_ecdsa_with_SHA3_512:
  26468. return CTC_SHA3_512wECDSA;
  26469. #endif
  26470. #endif /* HAVE_ECC */
  26471. }
  26472. break;
  26473. /* oidKeyType */
  26474. case oidKeyType:
  26475. switch (nid) {
  26476. #ifndef NO_DSA
  26477. case NID_dsa:
  26478. return DSAk;
  26479. #endif /* NO_DSA */
  26480. #ifndef NO_RSA
  26481. case NID_rsaEncryption:
  26482. return RSAk;
  26483. #endif /* NO_RSA */
  26484. #ifdef HAVE_ECC
  26485. case NID_X9_62_id_ecPublicKey:
  26486. return ECDSAk;
  26487. #endif /* HAVE_ECC */
  26488. }
  26489. break;
  26490. #ifdef HAVE_ECC
  26491. case oidCurveType:
  26492. switch (nid) {
  26493. case NID_X9_62_prime192v1:
  26494. return ECC_SECP192R1_OID;
  26495. case NID_X9_62_prime192v2:
  26496. return ECC_PRIME192V2_OID;
  26497. case NID_X9_62_prime192v3:
  26498. return ECC_PRIME192V3_OID;
  26499. case NID_X9_62_prime239v1:
  26500. return ECC_PRIME239V1_OID;
  26501. case NID_X9_62_prime239v2:
  26502. return ECC_PRIME239V2_OID;
  26503. case NID_X9_62_prime239v3:
  26504. return ECC_PRIME239V3_OID;
  26505. case NID_X9_62_prime256v1:
  26506. return ECC_SECP256R1_OID;
  26507. case NID_secp112r1:
  26508. return ECC_SECP112R1_OID;
  26509. case NID_secp112r2:
  26510. return ECC_SECP112R2_OID;
  26511. case NID_secp128r1:
  26512. return ECC_SECP128R1_OID;
  26513. case NID_secp128r2:
  26514. return ECC_SECP128R2_OID;
  26515. case NID_secp160r1:
  26516. return ECC_SECP160R1_OID;
  26517. case NID_secp160r2:
  26518. return ECC_SECP160R2_OID;
  26519. case NID_secp224r1:
  26520. return ECC_SECP224R1_OID;
  26521. case NID_secp384r1:
  26522. return ECC_SECP384R1_OID;
  26523. case NID_secp521r1:
  26524. return ECC_SECP521R1_OID;
  26525. case NID_secp160k1:
  26526. return ECC_SECP160K1_OID;
  26527. case NID_secp192k1:
  26528. return ECC_SECP192K1_OID;
  26529. case NID_secp224k1:
  26530. return ECC_SECP224K1_OID;
  26531. case NID_secp256k1:
  26532. return ECC_SECP256K1_OID;
  26533. case NID_brainpoolP160r1:
  26534. return ECC_BRAINPOOLP160R1_OID;
  26535. case NID_brainpoolP192r1:
  26536. return ECC_BRAINPOOLP192R1_OID;
  26537. case NID_brainpoolP224r1:
  26538. return ECC_BRAINPOOLP224R1_OID;
  26539. case NID_brainpoolP256r1:
  26540. return ECC_BRAINPOOLP256R1_OID;
  26541. case NID_brainpoolP320r1:
  26542. return ECC_BRAINPOOLP320R1_OID;
  26543. case NID_brainpoolP384r1:
  26544. return ECC_BRAINPOOLP384R1_OID;
  26545. case NID_brainpoolP512r1:
  26546. return ECC_BRAINPOOLP512R1_OID;
  26547. }
  26548. break;
  26549. #endif /* HAVE_ECC */
  26550. /* oidBlkType */
  26551. case oidBlkType:
  26552. switch (nid) {
  26553. #ifdef WOLFSSL_AES_128
  26554. case AES128CBCb:
  26555. return AES128CBCb;
  26556. #endif
  26557. #ifdef WOLFSSL_AES_192
  26558. case AES192CBCb:
  26559. return AES192CBCb;
  26560. #endif
  26561. #ifdef WOLFSSL_AES_256
  26562. case AES256CBCb:
  26563. return AES256CBCb;
  26564. #endif
  26565. #ifndef NO_DES3
  26566. case NID_des:
  26567. return DESb;
  26568. case NID_des3:
  26569. return DES3b;
  26570. #endif
  26571. }
  26572. break;
  26573. #ifdef HAVE_OCSP
  26574. case oidOcspType:
  26575. switch (nid) {
  26576. case NID_id_pkix_OCSP_basic:
  26577. return OCSP_BASIC_OID;
  26578. case OCSP_NONCE_OID:
  26579. return OCSP_NONCE_OID;
  26580. }
  26581. break;
  26582. #endif /* HAVE_OCSP */
  26583. /* oidCertExtType */
  26584. case oidCertExtType:
  26585. switch (nid) {
  26586. case NID_basic_constraints:
  26587. return BASIC_CA_OID;
  26588. case NID_subject_alt_name:
  26589. return ALT_NAMES_OID;
  26590. case NID_crl_distribution_points:
  26591. return CRL_DIST_OID;
  26592. case NID_info_access:
  26593. return AUTH_INFO_OID;
  26594. case NID_authority_key_identifier:
  26595. return AUTH_KEY_OID;
  26596. case NID_subject_key_identifier:
  26597. return SUBJ_KEY_OID;
  26598. case NID_inhibit_any_policy:
  26599. return INHIBIT_ANY_OID;
  26600. case NID_key_usage:
  26601. return KEY_USAGE_OID;
  26602. case NID_name_constraints:
  26603. return NAME_CONS_OID;
  26604. case NID_certificate_policies:
  26605. return CERT_POLICY_OID;
  26606. case NID_ext_key_usage:
  26607. return EXT_KEY_USAGE_OID;
  26608. }
  26609. break;
  26610. /* oidCertAuthInfoType */
  26611. case oidCertAuthInfoType:
  26612. switch (nid) {
  26613. case NID_ad_OCSP:
  26614. return AIA_OCSP_OID;
  26615. case NID_ad_ca_issuers:
  26616. return AIA_CA_ISSUER_OID;
  26617. }
  26618. break;
  26619. /* oidCertPolicyType */
  26620. case oidCertPolicyType:
  26621. switch (nid) {
  26622. case NID_any_policy:
  26623. return CP_ANY_OID;
  26624. }
  26625. break;
  26626. /* oidCertAltNameType */
  26627. case oidCertAltNameType:
  26628. switch (nid) {
  26629. case NID_hw_name_oid:
  26630. return HW_NAME_OID;
  26631. }
  26632. break;
  26633. /* oidCertKeyUseType */
  26634. case oidCertKeyUseType:
  26635. switch (nid) {
  26636. case NID_anyExtendedKeyUsage:
  26637. return EKU_ANY_OID;
  26638. case EKU_SERVER_AUTH_OID:
  26639. return EKU_SERVER_AUTH_OID;
  26640. case EKU_CLIENT_AUTH_OID:
  26641. return EKU_CLIENT_AUTH_OID;
  26642. case EKU_OCSP_SIGN_OID:
  26643. return EKU_OCSP_SIGN_OID;
  26644. }
  26645. break;
  26646. /* oidKdfType */
  26647. case oidKdfType:
  26648. switch (nid) {
  26649. case PBKDF2_OID:
  26650. return PBKDF2_OID;
  26651. }
  26652. break;
  26653. /* oidPBEType */
  26654. case oidPBEType:
  26655. switch (nid) {
  26656. case PBE_SHA1_RC4_128:
  26657. return PBE_SHA1_RC4_128;
  26658. case PBE_SHA1_DES:
  26659. return PBE_SHA1_DES;
  26660. case PBE_SHA1_DES3:
  26661. return PBE_SHA1_DES3;
  26662. }
  26663. break;
  26664. /* oidKeyWrapType */
  26665. case oidKeyWrapType:
  26666. switch (nid) {
  26667. #ifdef WOLFSSL_AES_128
  26668. case AES128_WRAP:
  26669. return AES128_WRAP;
  26670. #endif
  26671. #ifdef WOLFSSL_AES_192
  26672. case AES192_WRAP:
  26673. return AES192_WRAP;
  26674. #endif
  26675. #ifdef WOLFSSL_AES_256
  26676. case AES256_WRAP:
  26677. return AES256_WRAP;
  26678. #endif
  26679. }
  26680. break;
  26681. /* oidCmsKeyAgreeType */
  26682. case oidCmsKeyAgreeType:
  26683. switch (nid) {
  26684. #ifndef NO_SHA
  26685. case dhSinglePass_stdDH_sha1kdf_scheme:
  26686. return dhSinglePass_stdDH_sha1kdf_scheme;
  26687. #endif
  26688. #ifdef WOLFSSL_SHA224
  26689. case dhSinglePass_stdDH_sha224kdf_scheme:
  26690. return dhSinglePass_stdDH_sha224kdf_scheme;
  26691. #endif
  26692. #ifndef NO_SHA256
  26693. case dhSinglePass_stdDH_sha256kdf_scheme:
  26694. return dhSinglePass_stdDH_sha256kdf_scheme;
  26695. #endif
  26696. #ifdef WOLFSSL_SHA384
  26697. case dhSinglePass_stdDH_sha384kdf_scheme:
  26698. return dhSinglePass_stdDH_sha384kdf_scheme;
  26699. #endif
  26700. #ifdef WOLFSSL_SHA512
  26701. case dhSinglePass_stdDH_sha512kdf_scheme:
  26702. return dhSinglePass_stdDH_sha512kdf_scheme;
  26703. #endif
  26704. }
  26705. break;
  26706. /* oidCmsKeyAgreeType */
  26707. #ifdef WOLFSSL_CERT_REQ
  26708. case oidCsrAttrType:
  26709. switch (nid) {
  26710. case NID_pkcs9_contentType:
  26711. return PKCS9_CONTENT_TYPE_OID;
  26712. case NID_pkcs9_challengePassword:
  26713. return CHALLENGE_PASSWORD_OID;
  26714. case NID_serialNumber:
  26715. return SERIAL_NUMBER_OID;
  26716. case NID_userId:
  26717. return USER_ID_OID;
  26718. case NID_surname:
  26719. return SURNAME_OID;
  26720. }
  26721. break;
  26722. #endif
  26723. default:
  26724. WOLFSSL_MSG("NID not in table");
  26725. /* MSVC warns without the cast */
  26726. return (word32)-1;
  26727. }
  26728. /* MSVC warns without the cast */
  26729. return (word32)-1;
  26730. }
  26731. int oid2nid(word32 oid, int grp)
  26732. {
  26733. size_t i;
  26734. /* get OID type */
  26735. switch (grp) {
  26736. /* oidHashType */
  26737. case oidHashType:
  26738. switch (oid) {
  26739. #ifdef WOLFSSL_MD2
  26740. case MD2h:
  26741. return NID_md2;
  26742. #endif
  26743. #ifndef NO_MD5
  26744. case MD5h:
  26745. return NID_md5;
  26746. #endif
  26747. #ifndef NO_SHA
  26748. case SHAh:
  26749. return NID_sha1;
  26750. #endif
  26751. case SHA224h:
  26752. return NID_sha224;
  26753. #ifndef NO_SHA256
  26754. case SHA256h:
  26755. return NID_sha256;
  26756. #endif
  26757. #ifdef WOLFSSL_SHA384
  26758. case SHA384h:
  26759. return NID_sha384;
  26760. #endif
  26761. #ifdef WOLFSSL_SHA512
  26762. case SHA512h:
  26763. return NID_sha512;
  26764. #endif
  26765. }
  26766. break;
  26767. /* oidSigType */
  26768. case oidSigType:
  26769. switch (oid) {
  26770. #ifndef NO_DSA
  26771. case CTC_SHAwDSA:
  26772. return NID_dsaWithSHA1;
  26773. case CTC_SHA256wDSA:
  26774. return NID_dsa_with_SHA256;
  26775. #endif /* NO_DSA */
  26776. #ifndef NO_RSA
  26777. case CTC_MD2wRSA:
  26778. return NID_md2WithRSAEncryption;
  26779. case CTC_MD5wRSA:
  26780. return NID_md5WithRSAEncryption;
  26781. case CTC_SHAwRSA:
  26782. return NID_sha1WithRSAEncryption;
  26783. case CTC_SHA224wRSA:
  26784. return NID_sha224WithRSAEncryption;
  26785. case CTC_SHA256wRSA:
  26786. return NID_sha256WithRSAEncryption;
  26787. case CTC_SHA384wRSA:
  26788. return NID_sha384WithRSAEncryption;
  26789. case CTC_SHA512wRSA:
  26790. return NID_sha512WithRSAEncryption;
  26791. #ifdef WOLFSSL_SHA3
  26792. case CTC_SHA3_224wRSA:
  26793. return NID_RSA_SHA3_224;
  26794. case CTC_SHA3_256wRSA:
  26795. return NID_RSA_SHA3_256;
  26796. case CTC_SHA3_384wRSA:
  26797. return NID_RSA_SHA3_384;
  26798. case CTC_SHA3_512wRSA:
  26799. return NID_RSA_SHA3_512;
  26800. #endif
  26801. #ifdef WC_RSA_PSS
  26802. case CTC_RSASSAPSS:
  26803. return NID_rsassaPss;
  26804. #endif
  26805. #endif /* NO_RSA */
  26806. #ifdef HAVE_ECC
  26807. case CTC_SHAwECDSA:
  26808. return NID_ecdsa_with_SHA1;
  26809. case CTC_SHA224wECDSA:
  26810. return NID_ecdsa_with_SHA224;
  26811. case CTC_SHA256wECDSA:
  26812. return NID_ecdsa_with_SHA256;
  26813. case CTC_SHA384wECDSA:
  26814. return NID_ecdsa_with_SHA384;
  26815. case CTC_SHA512wECDSA:
  26816. return NID_ecdsa_with_SHA512;
  26817. #ifdef WOLFSSL_SHA3
  26818. case CTC_SHA3_224wECDSA:
  26819. return NID_ecdsa_with_SHA3_224;
  26820. case CTC_SHA3_256wECDSA:
  26821. return NID_ecdsa_with_SHA3_256;
  26822. case CTC_SHA3_384wECDSA:
  26823. return NID_ecdsa_with_SHA3_384;
  26824. case CTC_SHA3_512wECDSA:
  26825. return NID_ecdsa_with_SHA3_512;
  26826. #endif
  26827. #endif /* HAVE_ECC */
  26828. }
  26829. break;
  26830. /* oidKeyType */
  26831. case oidKeyType:
  26832. switch (oid) {
  26833. #ifndef NO_DSA
  26834. case DSAk:
  26835. return NID_dsa;
  26836. #endif /* NO_DSA */
  26837. #ifndef NO_RSA
  26838. case RSAk:
  26839. return NID_rsaEncryption;
  26840. #ifdef WC_RSA_PSS
  26841. case RSAPSSk:
  26842. return NID_rsassaPss;
  26843. #endif
  26844. #endif /* NO_RSA */
  26845. #ifdef HAVE_ECC
  26846. case ECDSAk:
  26847. return NID_X9_62_id_ecPublicKey;
  26848. #endif /* HAVE_ECC */
  26849. }
  26850. break;
  26851. #ifdef HAVE_ECC
  26852. case oidCurveType:
  26853. switch (oid) {
  26854. case ECC_SECP192R1_OID:
  26855. return NID_X9_62_prime192v1;
  26856. case ECC_PRIME192V2_OID:
  26857. return NID_X9_62_prime192v2;
  26858. case ECC_PRIME192V3_OID:
  26859. return NID_X9_62_prime192v3;
  26860. case ECC_PRIME239V1_OID:
  26861. return NID_X9_62_prime239v1;
  26862. case ECC_PRIME239V2_OID:
  26863. return NID_X9_62_prime239v2;
  26864. case ECC_PRIME239V3_OID:
  26865. return NID_X9_62_prime239v3;
  26866. case ECC_SECP256R1_OID:
  26867. return NID_X9_62_prime256v1;
  26868. case ECC_SECP112R1_OID:
  26869. return NID_secp112r1;
  26870. case ECC_SECP112R2_OID:
  26871. return NID_secp112r2;
  26872. case ECC_SECP128R1_OID:
  26873. return NID_secp128r1;
  26874. case ECC_SECP128R2_OID:
  26875. return NID_secp128r2;
  26876. case ECC_SECP160R1_OID:
  26877. return NID_secp160r1;
  26878. case ECC_SECP160R2_OID:
  26879. return NID_secp160r2;
  26880. case ECC_SECP224R1_OID:
  26881. return NID_secp224r1;
  26882. case ECC_SECP384R1_OID:
  26883. return NID_secp384r1;
  26884. case ECC_SECP521R1_OID:
  26885. return NID_secp521r1;
  26886. case ECC_SECP160K1_OID:
  26887. return NID_secp160k1;
  26888. case ECC_SECP192K1_OID:
  26889. return NID_secp192k1;
  26890. case ECC_SECP224K1_OID:
  26891. return NID_secp224k1;
  26892. case ECC_SECP256K1_OID:
  26893. return NID_secp256k1;
  26894. case ECC_BRAINPOOLP160R1_OID:
  26895. return NID_brainpoolP160r1;
  26896. case ECC_BRAINPOOLP192R1_OID:
  26897. return NID_brainpoolP192r1;
  26898. case ECC_BRAINPOOLP224R1_OID:
  26899. return NID_brainpoolP224r1;
  26900. case ECC_BRAINPOOLP256R1_OID:
  26901. return NID_brainpoolP256r1;
  26902. case ECC_BRAINPOOLP320R1_OID:
  26903. return NID_brainpoolP320r1;
  26904. case ECC_BRAINPOOLP384R1_OID:
  26905. return NID_brainpoolP384r1;
  26906. case ECC_BRAINPOOLP512R1_OID:
  26907. return NID_brainpoolP512r1;
  26908. }
  26909. break;
  26910. #endif /* HAVE_ECC */
  26911. /* oidBlkType */
  26912. case oidBlkType:
  26913. switch (oid) {
  26914. #ifdef WOLFSSL_AES_128
  26915. case AES128CBCb:
  26916. return AES128CBCb;
  26917. #endif
  26918. #ifdef WOLFSSL_AES_192
  26919. case AES192CBCb:
  26920. return AES192CBCb;
  26921. #endif
  26922. #ifdef WOLFSSL_AES_256
  26923. case AES256CBCb:
  26924. return AES256CBCb;
  26925. #endif
  26926. #ifndef NO_DES3
  26927. case DESb:
  26928. return NID_des;
  26929. case DES3b:
  26930. return NID_des3;
  26931. #endif
  26932. }
  26933. break;
  26934. #ifdef HAVE_OCSP
  26935. case oidOcspType:
  26936. switch (oid) {
  26937. case OCSP_BASIC_OID:
  26938. return NID_id_pkix_OCSP_basic;
  26939. case OCSP_NONCE_OID:
  26940. return OCSP_NONCE_OID;
  26941. }
  26942. break;
  26943. #endif /* HAVE_OCSP */
  26944. /* oidCertExtType */
  26945. case oidCertExtType:
  26946. switch (oid) {
  26947. case BASIC_CA_OID:
  26948. return NID_basic_constraints;
  26949. case ALT_NAMES_OID:
  26950. return NID_subject_alt_name;
  26951. case CRL_DIST_OID:
  26952. return NID_crl_distribution_points;
  26953. case AUTH_INFO_OID:
  26954. return NID_info_access;
  26955. case AUTH_KEY_OID:
  26956. return NID_authority_key_identifier;
  26957. case SUBJ_KEY_OID:
  26958. return NID_subject_key_identifier;
  26959. case INHIBIT_ANY_OID:
  26960. return NID_inhibit_any_policy;
  26961. case KEY_USAGE_OID:
  26962. return NID_key_usage;
  26963. case NAME_CONS_OID:
  26964. return NID_name_constraints;
  26965. case CERT_POLICY_OID:
  26966. return NID_certificate_policies;
  26967. case EXT_KEY_USAGE_OID:
  26968. return NID_ext_key_usage;
  26969. }
  26970. break;
  26971. /* oidCertAuthInfoType */
  26972. case oidCertAuthInfoType:
  26973. switch (oid) {
  26974. case AIA_OCSP_OID:
  26975. return NID_ad_OCSP;
  26976. case AIA_CA_ISSUER_OID:
  26977. return NID_ad_ca_issuers;
  26978. }
  26979. break;
  26980. /* oidCertPolicyType */
  26981. case oidCertPolicyType:
  26982. switch (oid) {
  26983. case CP_ANY_OID:
  26984. return NID_any_policy;
  26985. }
  26986. break;
  26987. /* oidCertAltNameType */
  26988. case oidCertAltNameType:
  26989. switch (oid) {
  26990. case HW_NAME_OID:
  26991. return NID_hw_name_oid;
  26992. }
  26993. break;
  26994. /* oidCertKeyUseType */
  26995. case oidCertKeyUseType:
  26996. switch (oid) {
  26997. case EKU_ANY_OID:
  26998. return NID_anyExtendedKeyUsage;
  26999. case EKU_SERVER_AUTH_OID:
  27000. return EKU_SERVER_AUTH_OID;
  27001. case EKU_CLIENT_AUTH_OID:
  27002. return EKU_CLIENT_AUTH_OID;
  27003. case EKU_OCSP_SIGN_OID:
  27004. return EKU_OCSP_SIGN_OID;
  27005. }
  27006. break;
  27007. /* oidKdfType */
  27008. case oidKdfType:
  27009. switch (oid) {
  27010. case PBKDF2_OID:
  27011. return PBKDF2_OID;
  27012. }
  27013. break;
  27014. /* oidPBEType */
  27015. case oidPBEType:
  27016. switch (oid) {
  27017. case PBE_SHA1_RC4_128:
  27018. return PBE_SHA1_RC4_128;
  27019. case PBE_SHA1_DES:
  27020. return PBE_SHA1_DES;
  27021. case PBE_SHA1_DES3:
  27022. return PBE_SHA1_DES3;
  27023. }
  27024. break;
  27025. /* oidKeyWrapType */
  27026. case oidKeyWrapType:
  27027. switch (oid) {
  27028. #ifdef WOLFSSL_AES_128
  27029. case AES128_WRAP:
  27030. return AES128_WRAP;
  27031. #endif
  27032. #ifdef WOLFSSL_AES_192
  27033. case AES192_WRAP:
  27034. return AES192_WRAP;
  27035. #endif
  27036. #ifdef WOLFSSL_AES_256
  27037. case AES256_WRAP:
  27038. return AES256_WRAP;
  27039. #endif
  27040. }
  27041. break;
  27042. /* oidCmsKeyAgreeType */
  27043. case oidCmsKeyAgreeType:
  27044. switch (oid) {
  27045. #ifndef NO_SHA
  27046. case dhSinglePass_stdDH_sha1kdf_scheme:
  27047. return dhSinglePass_stdDH_sha1kdf_scheme;
  27048. #endif
  27049. #ifdef WOLFSSL_SHA224
  27050. case dhSinglePass_stdDH_sha224kdf_scheme:
  27051. return dhSinglePass_stdDH_sha224kdf_scheme;
  27052. #endif
  27053. #ifndef NO_SHA256
  27054. case dhSinglePass_stdDH_sha256kdf_scheme:
  27055. return dhSinglePass_stdDH_sha256kdf_scheme;
  27056. #endif
  27057. #ifdef WOLFSSL_SHA384
  27058. case dhSinglePass_stdDH_sha384kdf_scheme:
  27059. return dhSinglePass_stdDH_sha384kdf_scheme;
  27060. #endif
  27061. #ifdef WOLFSSL_SHA512
  27062. case dhSinglePass_stdDH_sha512kdf_scheme:
  27063. return dhSinglePass_stdDH_sha512kdf_scheme;
  27064. #endif
  27065. }
  27066. break;
  27067. #ifdef WOLFSSL_CERT_REQ
  27068. case oidCsrAttrType:
  27069. switch (oid) {
  27070. case PKCS9_CONTENT_TYPE_OID:
  27071. return NID_pkcs9_contentType;
  27072. case CHALLENGE_PASSWORD_OID:
  27073. return NID_pkcs9_challengePassword;
  27074. case SERIAL_NUMBER_OID:
  27075. return NID_serialNumber;
  27076. case USER_ID_OID:
  27077. return NID_userId;
  27078. }
  27079. break;
  27080. #endif
  27081. default:
  27082. WOLFSSL_MSG("OID not in table");
  27083. }
  27084. /* If not found in above switch then try the table */
  27085. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  27086. if (wolfssl_object_info[i].id == (int)oid) {
  27087. return wolfssl_object_info[i].nid;
  27088. }
  27089. }
  27090. return -1;
  27091. }
  27092. /* frees all nodes in the current threads error queue
  27093. *
  27094. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  27095. * current threads queue will be free'd.
  27096. */
  27097. void wolfSSL_ERR_remove_state(unsigned long id)
  27098. {
  27099. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  27100. (void)id;
  27101. if (wc_ERR_remove_state() != 0) {
  27102. WOLFSSL_MSG("Error with removing the state");
  27103. }
  27104. }
  27105. #endif /* OPENSSL_EXTRA */
  27106. #ifdef OPENSSL_ALL
  27107. #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8)
  27108. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  27109. WOLFSSL_EVP_PKEY* pkey,
  27110. const WOLFSSL_EVP_CIPHER* enc,
  27111. char* passwd, int passwdSz,
  27112. wc_pem_password_cb* cb, void* ctx)
  27113. {
  27114. int ret = 0;
  27115. char password[NAME_SZ];
  27116. byte* key = NULL;
  27117. word32 keySz;
  27118. byte* pem = NULL;
  27119. int pemSz = 0;
  27120. int type = PKCS8_PRIVATEKEY_TYPE;
  27121. const byte* curveOid;
  27122. word32 oidSz;
  27123. if (bio == NULL || pkey == NULL)
  27124. return -1;
  27125. keySz = pkey->pkey_sz + 128;
  27126. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27127. if (key == NULL)
  27128. ret = MEMORY_E;
  27129. if (ret == 0 && enc != NULL && passwd == NULL) {
  27130. passwdSz = cb(password, sizeof(password), 1, ctx);
  27131. if (passwdSz < 0)
  27132. ret = WOLFSSL_FAILURE;
  27133. passwd = password;
  27134. }
  27135. if (ret == 0 && enc != NULL) {
  27136. WC_RNG rng;
  27137. ret = wc_InitRng(&rng);
  27138. if (ret == 0) {
  27139. int encAlgId = 0;
  27140. #ifndef NO_DES3
  27141. if (enc == EVP_DES_CBC)
  27142. encAlgId = DESb;
  27143. else if (enc == EVP_DES_EDE3_CBC)
  27144. encAlgId = DES3b;
  27145. else
  27146. #endif
  27147. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  27148. #ifdef WOLFSSL_AES_256
  27149. if (enc == EVP_AES_256_CBC)
  27150. encAlgId = AES256CBCb;
  27151. else
  27152. #endif
  27153. #endif
  27154. ret = -1;
  27155. if (ret == 0) {
  27156. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  27157. &keySz, passwd, passwdSz, PKCS5, PBES2,
  27158. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  27159. &rng, NULL);
  27160. if (ret > 0) {
  27161. keySz = ret;
  27162. ret = 0;
  27163. }
  27164. }
  27165. wc_FreeRng(&rng);
  27166. }
  27167. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  27168. }
  27169. if (ret == 0 && enc == NULL) {
  27170. int algId;
  27171. type = PKCS8_PRIVATEKEY_TYPE;
  27172. #ifdef HAVE_ECC
  27173. if (pkey->type == EVP_PKEY_EC) {
  27174. algId = ECDSAk;
  27175. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  27176. &oidSz);
  27177. }
  27178. else
  27179. #endif
  27180. {
  27181. algId = RSAk;
  27182. curveOid = NULL;
  27183. oidSz = 0;
  27184. }
  27185. #ifdef HAVE_ECC
  27186. if (ret >= 0)
  27187. #endif
  27188. {
  27189. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  27190. pkey->pkey_sz, algId, curveOid, oidSz);
  27191. keySz = ret;
  27192. }
  27193. }
  27194. if (password == passwd)
  27195. XMEMSET(password, 0, passwdSz);
  27196. if (ret >= 0) {
  27197. pemSz = 2 * keySz + 2 * 64;
  27198. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27199. if (pem == NULL)
  27200. ret = MEMORY_E;
  27201. }
  27202. if (ret >= 0)
  27203. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  27204. if (key != NULL)
  27205. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27206. if (ret >= 0) {
  27207. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  27208. ret = -1;
  27209. }
  27210. if (pem != NULL)
  27211. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27212. return ret < 0 ? 0 : ret;
  27213. }
  27214. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  27215. int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey,
  27216. const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz,
  27217. wc_pem_password_cb* cb, void* ctx)
  27218. {
  27219. int ret = WOLFSSL_SUCCESS;
  27220. BIO *b;
  27221. WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey");
  27222. b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE);
  27223. if (b == NULL) {
  27224. ret = WOLFSSL_FAILURE;
  27225. }
  27226. if (ret == WOLFSSL_SUCCESS) {
  27227. ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd,
  27228. passwdSz, cb, ctx);
  27229. }
  27230. wolfSSL_BIO_free(b);
  27231. return ret;
  27232. }
  27233. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  27234. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  27235. {
  27236. int ret = 0;
  27237. byte* mem = NULL;
  27238. ret = wolfSSL_BIO_get_len(bio);
  27239. if (ret > 0) {
  27240. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27241. if (mem == NULL) {
  27242. WOLFSSL_MSG("Memory error");
  27243. ret = MEMORY_E;
  27244. }
  27245. if (ret >= 0) {
  27246. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  27247. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27248. ret = MEMORY_E;
  27249. mem = NULL;
  27250. }
  27251. }
  27252. }
  27253. *data = mem;
  27254. return ret;
  27255. }
  27256. /* DER data is PKCS#8 encrypted. */
  27257. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  27258. WOLFSSL_EVP_PKEY** pkey,
  27259. wc_pem_password_cb* cb,
  27260. void* ctx)
  27261. {
  27262. int ret;
  27263. byte* der;
  27264. int len;
  27265. byte* p;
  27266. word32 algId;
  27267. WOLFSSL_EVP_PKEY* key;
  27268. if ((len = bio_get_data(bio, &der)) < 0)
  27269. return NULL;
  27270. if (cb != NULL) {
  27271. char password[NAME_SZ];
  27272. int passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  27273. if (passwordSz < 0) {
  27274. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27275. return NULL;
  27276. }
  27277. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27278. wc_MemZero_Add("wolfSSL_d2i_PKCS8PrivateKey_bio password", password,
  27279. passwordSz);
  27280. #endif
  27281. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  27282. if (ret < 0) {
  27283. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27284. return NULL;
  27285. }
  27286. ForceZero(password, passwordSz);
  27287. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27288. wc_MemZero_Check(password, passwordSz);
  27289. #endif
  27290. }
  27291. p = der;
  27292. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  27293. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  27294. return key;
  27295. }
  27296. #endif /* !NO_BIO && !NO_PWDBASED && HAVE_PKCS8 */
  27297. /* Detect which type of key it is before decoding. */
  27298. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  27299. const unsigned char** pp,
  27300. long length)
  27301. {
  27302. int ret;
  27303. WOLFSSL_EVP_PKEY* key = NULL;
  27304. const byte* der = *pp;
  27305. word32 idx = 0;
  27306. int len = 0;
  27307. int cnt = 0;
  27308. word32 algId;
  27309. word32 keyLen = (word32)length;
  27310. /* Take off PKCS#8 wrapper if found. */
  27311. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  27312. der += idx;
  27313. keyLen = len;
  27314. }
  27315. idx = 0;
  27316. len = 0;
  27317. /* Use the number of elements in the outer sequence to determine key type.
  27318. */
  27319. ret = GetSequence(der, &idx, &len, keyLen);
  27320. if (ret >= 0) {
  27321. word32 end = idx + len;
  27322. while (ret >= 0 && idx < end) {
  27323. /* Skip type */
  27324. idx++;
  27325. /* Get length and skip over - keeping count */
  27326. len = 0;
  27327. ret = GetLength(der, &idx, &len, keyLen);
  27328. if (ret >= 0) {
  27329. if (idx + len > end)
  27330. ret = ASN_PARSE_E;
  27331. else {
  27332. idx += len;
  27333. cnt++;
  27334. }
  27335. }
  27336. }
  27337. }
  27338. if (ret >= 0) {
  27339. int type;
  27340. /* ECC includes version, private[, curve][, public key] */
  27341. if (cnt >= 2 && cnt <= 4)
  27342. type = EVP_PKEY_EC;
  27343. else
  27344. type = EVP_PKEY_RSA;
  27345. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  27346. *pp = der;
  27347. }
  27348. return key;
  27349. }
  27350. #endif /* OPENSSL_ALL */
  27351. #ifdef WOLFSSL_STATIC_EPHEMERAL
  27352. int wolfSSL_StaticEphemeralKeyLoad(WOLFSSL* ssl, int keyAlgo, void* keyPtr)
  27353. {
  27354. int ret;
  27355. word32 idx = 0;
  27356. DerBuffer* der = NULL;
  27357. if (ssl == NULL || ssl->ctx == NULL || keyPtr == NULL) {
  27358. return BAD_FUNC_ARG;
  27359. }
  27360. #ifndef SINGLE_THREADED
  27361. if (!ssl->ctx->staticKELockInit) {
  27362. return BUFFER_E; /* no keys set */
  27363. }
  27364. ret = wc_LockMutex(&ssl->ctx->staticKELock);
  27365. if (ret != 0) {
  27366. return ret;
  27367. }
  27368. #endif
  27369. ret = BUFFER_E; /* set default error */
  27370. switch (keyAlgo) {
  27371. #ifndef NO_DH
  27372. case WC_PK_TYPE_DH:
  27373. if (ssl != NULL)
  27374. der = ssl->staticKE.dhKey;
  27375. if (der == NULL)
  27376. der = ssl->ctx->staticKE.dhKey;
  27377. if (der != NULL) {
  27378. DhKey* key = (DhKey*)keyPtr;
  27379. WOLFSSL_MSG("Using static DH key");
  27380. ret = wc_DhKeyDecode(der->buffer, &idx, key, der->length);
  27381. }
  27382. break;
  27383. #endif
  27384. #ifdef HAVE_ECC
  27385. case WC_PK_TYPE_ECDH:
  27386. if (ssl != NULL)
  27387. der = ssl->staticKE.ecKey;
  27388. if (der == NULL)
  27389. der = ssl->ctx->staticKE.ecKey;
  27390. if (der != NULL) {
  27391. ecc_key* key = (ecc_key*)keyPtr;
  27392. WOLFSSL_MSG("Using static ECDH key");
  27393. ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length);
  27394. }
  27395. break;
  27396. #endif
  27397. #ifdef HAVE_CURVE25519
  27398. case WC_PK_TYPE_CURVE25519:
  27399. if (ssl != NULL)
  27400. der = ssl->staticKE.x25519Key;
  27401. if (der == NULL)
  27402. der = ssl->ctx->staticKE.x25519Key;
  27403. if (der != NULL) {
  27404. curve25519_key* key = (curve25519_key*)keyPtr;
  27405. WOLFSSL_MSG("Using static X25519 key");
  27406. ret = wc_Curve25519PrivateKeyDecode(der->buffer, &idx, key,
  27407. der->length);
  27408. }
  27409. break;
  27410. #endif
  27411. #ifdef HAVE_CURVE448
  27412. case WC_PK_TYPE_CURVE448:
  27413. if (ssl != NULL)
  27414. der = ssl->staticKE.x448Key;
  27415. if (der == NULL)
  27416. der = ssl->ctx->staticKE.x448Key;
  27417. if (der != NULL) {
  27418. curve448_key* key = (curve448_key*)keyPtr;
  27419. WOLFSSL_MSG("Using static X448 key");
  27420. ret = wc_Curve448PrivateKeyDecode(der->buffer, &idx, key,
  27421. der->length);
  27422. }
  27423. break;
  27424. #endif
  27425. default:
  27426. /* not supported */
  27427. ret = NOT_COMPILED_IN;
  27428. break;
  27429. }
  27430. #ifndef SINGLE_THREADED
  27431. wc_UnLockMutex(&ssl->ctx->staticKELock);
  27432. #endif
  27433. return ret;
  27434. }
  27435. static int SetStaticEphemeralKey(WOLFSSL_CTX* ctx,
  27436. StaticKeyExchangeInfo_t* staticKE, int keyAlgo, const char* key,
  27437. unsigned int keySz, int format, void* heap)
  27438. {
  27439. int ret = 0;
  27440. DerBuffer* der = NULL;
  27441. byte* keyBuf = NULL;
  27442. #ifndef NO_FILESYSTEM
  27443. const char* keyFile = NULL;
  27444. #endif
  27445. /* allow empty key to free buffer */
  27446. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  27447. return BAD_FUNC_ARG;
  27448. }
  27449. WOLFSSL_ENTER("SetStaticEphemeralKey");
  27450. /* if just free'ing key then skip loading */
  27451. if (key != NULL) {
  27452. #ifndef NO_FILESYSTEM
  27453. /* load file from filesystem */
  27454. if (key != NULL && keySz == 0) {
  27455. size_t keyBufSz = 0;
  27456. keyFile = (const char*)key;
  27457. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  27458. if (ret != 0) {
  27459. return ret;
  27460. }
  27461. keySz = (unsigned int)keyBufSz;
  27462. }
  27463. else
  27464. #endif
  27465. {
  27466. /* use as key buffer directly */
  27467. keyBuf = (byte*)key;
  27468. }
  27469. if (format == WOLFSSL_FILETYPE_PEM) {
  27470. #ifdef WOLFSSL_PEM_TO_DER
  27471. int keyFormat = 0;
  27472. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  27473. heap, NULL, &keyFormat);
  27474. /* auto detect key type */
  27475. if (ret == 0 && keyAlgo == WC_PK_TYPE_NONE) {
  27476. if (keyFormat == ECDSAk)
  27477. keyAlgo = WC_PK_TYPE_ECDH;
  27478. else if (keyFormat == X25519k)
  27479. keyAlgo = WC_PK_TYPE_CURVE25519;
  27480. else
  27481. keyAlgo = WC_PK_TYPE_DH;
  27482. }
  27483. #else
  27484. ret = NOT_COMPILED_IN;
  27485. #endif
  27486. }
  27487. else {
  27488. /* Detect PK type (if required) */
  27489. #ifdef HAVE_ECC
  27490. if (keyAlgo == WC_PK_TYPE_NONE) {
  27491. word32 idx = 0;
  27492. ecc_key eccKey;
  27493. ret = wc_ecc_init_ex(&eccKey, heap, INVALID_DEVID);
  27494. if (ret == 0) {
  27495. ret = wc_EccPrivateKeyDecode(keyBuf, &idx, &eccKey, keySz);
  27496. if (ret == 0)
  27497. keyAlgo = WC_PK_TYPE_ECDH;
  27498. wc_ecc_free(&eccKey);
  27499. }
  27500. }
  27501. #endif
  27502. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
  27503. if (keyAlgo == WC_PK_TYPE_NONE) {
  27504. word32 idx = 0;
  27505. DhKey dhKey;
  27506. ret = wc_InitDhKey_ex(&dhKey, heap, INVALID_DEVID);
  27507. if (ret == 0) {
  27508. ret = wc_DhKeyDecode(keyBuf, &idx, &dhKey, keySz);
  27509. if (ret == 0)
  27510. keyAlgo = WC_PK_TYPE_DH;
  27511. wc_FreeDhKey(&dhKey);
  27512. }
  27513. }
  27514. #endif
  27515. #ifdef HAVE_CURVE25519
  27516. if (keyAlgo == WC_PK_TYPE_NONE) {
  27517. word32 idx = 0;
  27518. curve25519_key x25519Key;
  27519. ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID);
  27520. if (ret == 0) {
  27521. ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key,
  27522. keySz);
  27523. if (ret == 0)
  27524. keyAlgo = WC_PK_TYPE_CURVE25519;
  27525. wc_curve25519_free(&x25519Key);
  27526. }
  27527. }
  27528. #endif
  27529. #ifdef HAVE_CURVE448
  27530. if (keyAlgo == WC_PK_TYPE_NONE) {
  27531. word32 idx = 0;
  27532. curve448_key x448Key;
  27533. ret = wc_curve448_init(&x448Key);
  27534. if (ret == 0) {
  27535. ret = wc_Curve448PrivateKeyDecode(keyBuf, &idx, &x448Key,
  27536. keySz);
  27537. if (ret == 0)
  27538. keyAlgo = WC_PK_TYPE_CURVE448;
  27539. wc_curve448_free(&x448Key);
  27540. }
  27541. }
  27542. #endif
  27543. if (keyAlgo != WC_PK_TYPE_NONE) {
  27544. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  27545. if (ret == 0) {
  27546. XMEMCPY(der->buffer, keyBuf, keySz);
  27547. }
  27548. }
  27549. }
  27550. }
  27551. #ifndef NO_FILESYSTEM
  27552. /* done with keyFile buffer */
  27553. if (keyFile && keyBuf) {
  27554. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  27555. }
  27556. #endif
  27557. #ifndef SINGLE_THREADED
  27558. if (ret == 0 && !ctx->staticKELockInit) {
  27559. ret = wc_InitMutex(&ctx->staticKELock);
  27560. if (ret == 0) {
  27561. ctx->staticKELockInit = 1;
  27562. }
  27563. }
  27564. #endif
  27565. if (ret == 0
  27566. #ifndef SINGLE_THREADED
  27567. && (ret = wc_LockMutex(&ctx->staticKELock)) == 0
  27568. #endif
  27569. ) {
  27570. switch (keyAlgo) {
  27571. #ifndef NO_DH
  27572. case WC_PK_TYPE_DH:
  27573. FreeDer(&staticKE->dhKey);
  27574. staticKE->dhKey = der; der = NULL;
  27575. break;
  27576. #endif
  27577. #ifdef HAVE_ECC
  27578. case WC_PK_TYPE_ECDH:
  27579. FreeDer(&staticKE->ecKey);
  27580. staticKE->ecKey = der; der = NULL;
  27581. break;
  27582. #endif
  27583. #ifdef HAVE_CURVE25519
  27584. case WC_PK_TYPE_CURVE25519:
  27585. FreeDer(&staticKE->x25519Key);
  27586. staticKE->x25519Key = der; der = NULL;
  27587. break;
  27588. #endif
  27589. #ifdef HAVE_CURVE448
  27590. case WC_PK_TYPE_CURVE448:
  27591. FreeDer(&staticKE->x448Key);
  27592. staticKE->x448Key = der; der = NULL;
  27593. break;
  27594. #endif
  27595. default:
  27596. /* not supported */
  27597. ret = NOT_COMPILED_IN;
  27598. break;
  27599. }
  27600. #ifndef SINGLE_THREADED
  27601. wc_UnLockMutex(&ctx->staticKELock);
  27602. #endif
  27603. }
  27604. if (ret != 0) {
  27605. FreeDer(&der);
  27606. }
  27607. (void)ctx; /* not used for single threaded */
  27608. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  27609. return ret;
  27610. }
  27611. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  27612. const char* key, unsigned int keySz, int format)
  27613. {
  27614. if (ctx == NULL) {
  27615. return BAD_FUNC_ARG;
  27616. }
  27617. return SetStaticEphemeralKey(ctx, &ctx->staticKE, keyAlgo,
  27618. key, keySz, format, ctx->heap);
  27619. }
  27620. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  27621. const char* key, unsigned int keySz, int format)
  27622. {
  27623. if (ssl == NULL || ssl->ctx == NULL) {
  27624. return BAD_FUNC_ARG;
  27625. }
  27626. return SetStaticEphemeralKey(ssl->ctx, &ssl->staticKE, keyAlgo,
  27627. key, keySz, format, ssl->heap);
  27628. }
  27629. static int GetStaticEphemeralKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  27630. int keyAlgo, const unsigned char** key, unsigned int* keySz)
  27631. {
  27632. int ret = 0;
  27633. DerBuffer* der = NULL;
  27634. if (key) *key = NULL;
  27635. if (keySz) *keySz = 0;
  27636. #ifndef SINGLE_THREADED
  27637. if (ctx->staticKELockInit &&
  27638. (ret = wc_LockMutex(&ctx->staticKELock)) != 0) {
  27639. return ret;
  27640. }
  27641. #endif
  27642. switch (keyAlgo) {
  27643. #ifndef NO_DH
  27644. case WC_PK_TYPE_DH:
  27645. if (ssl != NULL)
  27646. der = ssl->staticKE.dhKey;
  27647. if (der == NULL)
  27648. der = ctx->staticKE.dhKey;
  27649. break;
  27650. #endif
  27651. #ifdef HAVE_ECC
  27652. case WC_PK_TYPE_ECDH:
  27653. if (ssl != NULL)
  27654. der = ssl->staticKE.ecKey;
  27655. if (der == NULL)
  27656. der = ctx->staticKE.ecKey;
  27657. break;
  27658. #endif
  27659. #ifdef HAVE_CURVE25519
  27660. case WC_PK_TYPE_CURVE25519:
  27661. if (ssl != NULL)
  27662. der = ssl->staticKE.x25519Key;
  27663. if (der == NULL)
  27664. der = ctx->staticKE.x25519Key;
  27665. break;
  27666. #endif
  27667. #ifdef HAVE_CURVE448
  27668. case WC_PK_TYPE_CURVE448:
  27669. if (ssl != NULL)
  27670. der = ssl->staticKE.x448Key;
  27671. if (der == NULL)
  27672. der = ctx->staticKE.x448Key;
  27673. break;
  27674. #endif
  27675. default:
  27676. /* not supported */
  27677. ret = NOT_COMPILED_IN;
  27678. break;
  27679. }
  27680. if (der) {
  27681. if (key)
  27682. *key = der->buffer;
  27683. if (keySz)
  27684. *keySz = der->length;
  27685. }
  27686. #ifndef SINGLE_THREADED
  27687. wc_UnLockMutex(&ctx->staticKELock);
  27688. #endif
  27689. return ret;
  27690. }
  27691. /* returns pointer to currently loaded static ephemeral as ASN.1 */
  27692. /* this can be converted to PEM using wc_DerToPem */
  27693. int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  27694. const unsigned char** key, unsigned int* keySz)
  27695. {
  27696. if (ctx == NULL) {
  27697. return BAD_FUNC_ARG;
  27698. }
  27699. return GetStaticEphemeralKey(ctx, NULL, keyAlgo, key, keySz);
  27700. }
  27701. int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  27702. const unsigned char** key, unsigned int* keySz)
  27703. {
  27704. if (ssl == NULL || ssl->ctx == NULL) {
  27705. return BAD_FUNC_ARG;
  27706. }
  27707. return GetStaticEphemeralKey(ssl->ctx, ssl, keyAlgo, key, keySz);
  27708. }
  27709. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  27710. #if defined(OPENSSL_EXTRA)
  27711. /* wolfSSL_THREADID_current is provided as a compat API with
  27712. * CRYPTO_THREADID_current to register current thread id into given id object.
  27713. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  27714. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  27715. * like as existing wolfSSL_THREADID_set_numeric.
  27716. */
  27717. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  27718. {
  27719. (void)id;
  27720. return;
  27721. }
  27722. /* wolfSSL_THREADID_hash is provided as a compatible API with
  27723. * CRYPTO_THREADID_hash which returns a hash value calculated from the
  27724. * specified thread id. However, CRYPTO_THREADID_hash API has been
  27725. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  27726. * This API only works as a stub to returns 0. This behavior is
  27727. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  27728. */
  27729. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  27730. {
  27731. (void)id;
  27732. return 0UL;
  27733. }
  27734. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  27735. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  27736. * Since this functionality is enabled by default in wolfSSL,
  27737. * this API exists as a stub.
  27738. */
  27739. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  27740. {
  27741. (void)ctx;
  27742. (void)onoff;
  27743. return WOLFSSL_SUCCESS;
  27744. }
  27745. /**
  27746. * set security level (wolfSSL doesn't support security level)
  27747. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  27748. * @param level security level
  27749. */
  27750. void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
  27751. {
  27752. WOLFSSL_ENTER("wolfSSL_CTX_set_security_level");
  27753. (void)ctx;
  27754. (void)level;
  27755. }
  27756. /**
  27757. * get security level (wolfSSL doesn't support security level)
  27758. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  27759. * @return always 0(level 0)
  27760. */
  27761. int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
  27762. {
  27763. WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
  27764. (void)ctx;
  27765. return 0;
  27766. }
  27767. /**
  27768. * Determine whether a WOLFSSL_SESSION object can be used for resumption
  27769. * @param s a pointer to WOLFSSL_SESSION structure
  27770. * @return return 1 if session is resumable, otherwise 0.
  27771. */
  27772. int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s)
  27773. {
  27774. s = ClientSessionToSession(s);
  27775. if (s == NULL)
  27776. return 0;
  27777. #ifdef HAVE_SESSION_TICKET
  27778. if (s->ticketLen > 0)
  27779. return 1;
  27780. #endif
  27781. if (s->sessionIDSz > 0)
  27782. return 1;
  27783. return 0;
  27784. }
  27785. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  27786. /*
  27787. * This API accepts a user callback which puts key-log records into
  27788. * a KEY LOGFILE. The callback is stored into a CTX and propagated to
  27789. * each SSL object on its creation timing.
  27790. */
  27791. void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb)
  27792. {
  27793. WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
  27794. /* stores the callback into WOLFSSL_CTX */
  27795. if (ctx != NULL) {
  27796. ctx->keyLogCb = cb;
  27797. }
  27798. }
  27799. wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
  27800. const WOLFSSL_CTX* ctx)
  27801. {
  27802. WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
  27803. if (ctx != NULL)
  27804. return ctx->keyLogCb;
  27805. else
  27806. return NULL;
  27807. }
  27808. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  27809. #endif /* OPENSSL_EXTRA */
  27810. #ifndef NO_CERT
  27811. #define WOLFSSL_X509_INCLUDED
  27812. #include "src/x509.c"
  27813. #endif
  27814. /*******************************************************************************
  27815. * START OF standard C library wrapping APIs
  27816. ******************************************************************************/
  27817. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  27818. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  27819. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  27820. #ifndef NO_WOLFSSL_STUB
  27821. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  27822. void *(*r) (void *, size_t, const char *,
  27823. int), void (*f) (void *))
  27824. {
  27825. (void) m;
  27826. (void) r;
  27827. (void) f;
  27828. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  27829. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  27830. return WOLFSSL_FAILURE;
  27831. }
  27832. #endif
  27833. #endif
  27834. #if defined(OPENSSL_EXTRA)
  27835. /**
  27836. * free allocated memory resource
  27837. * @param str a pointer to resource to be freed
  27838. * @param file dummy argument
  27839. * @param line dummy argument
  27840. */
  27841. void wolfSSL_CRYPTO_free(void *str, const char *file, int line)
  27842. {
  27843. (void)file;
  27844. (void)line;
  27845. XFREE(str, 0, DYNAMIC_TYPE_TMP_BUFFER);
  27846. }
  27847. /**
  27848. * allocate memory with size of num
  27849. * @param num size of memory allocation to be malloced
  27850. * @param file dummy argument
  27851. * @param line dummy argument
  27852. * @return a pointer to allocated memory on succssesful, otherwise NULL
  27853. */
  27854. void *wolfSSL_CRYPTO_malloc(size_t num, const char *file, int line)
  27855. {
  27856. (void)file;
  27857. (void)line;
  27858. return XMALLOC(num, 0, DYNAMIC_TYPE_TMP_BUFFER);
  27859. }
  27860. #endif
  27861. /*******************************************************************************
  27862. * END OF standard C library wrapping APIs
  27863. ******************************************************************************/
  27864. /*******************************************************************************
  27865. * START OF EX_DATA APIs
  27866. ******************************************************************************/
  27867. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  27868. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  27869. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  27870. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  27871. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  27872. }
  27873. #endif
  27874. #ifdef HAVE_EX_DATA
  27875. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  27876. {
  27877. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  27878. #ifdef MAX_EX_DATA
  27879. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  27880. return ex_data->ex_data[idx];
  27881. }
  27882. #else
  27883. (void)ex_data;
  27884. (void)idx;
  27885. #endif
  27886. return NULL;
  27887. }
  27888. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  27889. {
  27890. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  27891. #ifdef MAX_EX_DATA
  27892. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  27893. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  27894. if (ex_data->ex_data_cleanup_routines[idx]) {
  27895. if (ex_data->ex_data[idx])
  27896. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  27897. ex_data->ex_data_cleanup_routines[idx] = NULL;
  27898. }
  27899. #endif
  27900. ex_data->ex_data[idx] = data;
  27901. return WOLFSSL_SUCCESS;
  27902. }
  27903. #else
  27904. (void)ex_data;
  27905. (void)idx;
  27906. (void)data;
  27907. #endif
  27908. return WOLFSSL_FAILURE;
  27909. }
  27910. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  27911. int wolfSSL_CRYPTO_set_ex_data_with_cleanup(
  27912. WOLFSSL_CRYPTO_EX_DATA* ex_data,
  27913. int idx,
  27914. void *data,
  27915. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  27916. {
  27917. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data_with_cleanup");
  27918. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  27919. if (ex_data->ex_data_cleanup_routines[idx] && ex_data->ex_data[idx])
  27920. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  27921. ex_data->ex_data[idx] = data;
  27922. ex_data->ex_data_cleanup_routines[idx] = cleanup_routine;
  27923. return WOLFSSL_SUCCESS;
  27924. }
  27925. return WOLFSSL_FAILURE;
  27926. }
  27927. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  27928. /**
  27929. * Issues unique index for the class specified by class_index.
  27930. * Other parameter except class_index are ignored.
  27931. * Currently, following class_index are accepted:
  27932. * - WOLF_CRYPTO_EX_INDEX_SSL
  27933. * - WOLF_CRYPTO_EX_INDEX_SSL_CTX
  27934. * - WOLF_CRYPTO_EX_INDEX_X509
  27935. * @param class_index index one of CRYPTO_EX_INDEX_xxx
  27936. * @param argp parameters to be saved
  27937. * @param argl parameters to be saved
  27938. * @param new_func a pointer to WOLFSSL_CRYPTO_EX_new
  27939. * @param dup_func a pointer to WOLFSSL_CRYPTO_EX_dup
  27940. * @param free_func a pointer to WOLFSSL_CRYPTO_EX_free
  27941. * @return index value grater or equal to zero on success, -1 on failure.
  27942. */
  27943. int wolfSSL_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
  27944. WOLFSSL_CRYPTO_EX_new* new_func,
  27945. WOLFSSL_CRYPTO_EX_dup* dup_func,
  27946. WOLFSSL_CRYPTO_EX_free* free_func)
  27947. {
  27948. WOLFSSL_ENTER("wolfSSL_CRYPTO_get_ex_new_index");
  27949. return wolfssl_get_ex_new_index(class_index, argl, argp, new_func,
  27950. dup_func, free_func);
  27951. }
  27952. #endif /* HAVE_EX_DATA */
  27953. /*******************************************************************************
  27954. * END OF EX_DATA APIs
  27955. ******************************************************************************/
  27956. /*******************************************************************************
  27957. * START OF BUF_MEM API
  27958. ******************************************************************************/
  27959. #if defined(OPENSSL_EXTRA)
  27960. /* Begin functions for openssl/buffer.h */
  27961. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  27962. {
  27963. WOLFSSL_BUF_MEM* buf;
  27964. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  27965. DYNAMIC_TYPE_OPENSSL);
  27966. if (buf) {
  27967. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  27968. }
  27969. return buf;
  27970. }
  27971. /* non-compat API returns length of buffer on success */
  27972. int wolfSSL_BUF_MEM_grow_ex(WOLFSSL_BUF_MEM* buf, size_t len,
  27973. char zeroFill)
  27974. {
  27975. int len_int = (int)len;
  27976. int mx;
  27977. char* tmp;
  27978. /* verify provided arguments */
  27979. if (buf == NULL || len_int < 0) {
  27980. return 0; /* BAD_FUNC_ARG; */
  27981. }
  27982. /* check to see if fits in existing length */
  27983. if (buf->length > len) {
  27984. buf->length = len;
  27985. return len_int;
  27986. }
  27987. /* check to see if fits in max buffer */
  27988. if (buf->max >= len) {
  27989. if (buf->data != NULL && zeroFill) {
  27990. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  27991. }
  27992. buf->length = len;
  27993. return len_int;
  27994. }
  27995. /* expand size, to handle growth */
  27996. mx = (len_int + 3) / 3 * 4;
  27997. /* use realloc */
  27998. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  27999. if (tmp == NULL) {
  28000. return 0; /* ERR_R_MALLOC_FAILURE; */
  28001. }
  28002. buf->data = tmp;
  28003. buf->max = mx;
  28004. if (zeroFill)
  28005. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  28006. buf->length = len;
  28007. return len_int;
  28008. }
  28009. /* returns length of buffer on success */
  28010. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  28011. {
  28012. return wolfSSL_BUF_MEM_grow_ex(buf, len, 1);
  28013. }
  28014. /* non-compat API returns length of buffer on success */
  28015. int wolfSSL_BUF_MEM_resize(WOLFSSL_BUF_MEM* buf, size_t len)
  28016. {
  28017. char* tmp;
  28018. int mx;
  28019. /* verify provided arguments */
  28020. if (buf == NULL || len == 0 || (int)len <= 0) {
  28021. return 0; /* BAD_FUNC_ARG; */
  28022. }
  28023. if (len == buf->length)
  28024. return (int)len;
  28025. if (len > buf->length)
  28026. return wolfSSL_BUF_MEM_grow_ex(buf, len, 0);
  28027. /* expand size, to handle growth */
  28028. mx = ((int)len + 3) / 3 * 4;
  28029. /* We want to shrink the internal buffer */
  28030. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  28031. if (tmp == NULL)
  28032. return 0;
  28033. buf->data = tmp;
  28034. buf->length = len;
  28035. buf->max = mx;
  28036. return (int)len;
  28037. }
  28038. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  28039. {
  28040. if (buf) {
  28041. if (buf->data) {
  28042. XFREE(buf->data, NULL, DYNAMIC_TYPE_OPENSSL);
  28043. buf->data = NULL;
  28044. }
  28045. buf->max = 0;
  28046. buf->length = 0;
  28047. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  28048. }
  28049. }
  28050. /* End Functions for openssl/buffer.h */
  28051. #endif /* OPENSSL_EXTRA */
  28052. /*******************************************************************************
  28053. * END OF BUF_MEM API
  28054. ******************************************************************************/
  28055. #define WOLFSSL_CONF_INCLUDED
  28056. #include <src/conf.c>
  28057. /*******************************************************************************
  28058. * START OF RAND API
  28059. ******************************************************************************/
  28060. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  28061. static int wolfSSL_RAND_InitMutex(void)
  28062. {
  28063. if (gRandMethodsInit == 0) {
  28064. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  28065. WOLFSSL_MSG("Bad Init Mutex rand methods");
  28066. return BAD_MUTEX_E;
  28067. }
  28068. gRandMethodsInit = 1;
  28069. }
  28070. return 0;
  28071. }
  28072. #endif
  28073. #ifdef OPENSSL_EXTRA
  28074. /* Checks if the global RNG has been created. If not then one is created.
  28075. *
  28076. * Returns WOLFSSL_SUCCESS when no error is encountered.
  28077. */
  28078. int wolfSSL_RAND_Init(void)
  28079. {
  28080. int ret = WOLFSSL_FAILURE;
  28081. #ifdef HAVE_GLOBAL_RNG
  28082. if (wc_LockMutex(&globalRNGMutex) == 0) {
  28083. if (initGlobalRNG == 0) {
  28084. ret = wc_InitRng(&globalRNG);
  28085. if (ret == 0) {
  28086. initGlobalRNG = 1;
  28087. ret = WOLFSSL_SUCCESS;
  28088. }
  28089. }
  28090. else {
  28091. /* GlobalRNG is already initialized */
  28092. ret = WOLFSSL_SUCCESS;
  28093. }
  28094. wc_UnLockMutex(&globalRNGMutex);
  28095. }
  28096. #endif
  28097. return ret;
  28098. }
  28099. /* WOLFSSL_SUCCESS on ok */
  28100. int wolfSSL_RAND_seed(const void* seed, int len)
  28101. {
  28102. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28103. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28104. if (gRandMethods && gRandMethods->seed) {
  28105. int ret = gRandMethods->seed(seed, len);
  28106. wc_UnLockMutex(&gRandMethodMutex);
  28107. return ret;
  28108. }
  28109. wc_UnLockMutex(&gRandMethodMutex);
  28110. }
  28111. #else
  28112. (void)seed;
  28113. (void)len;
  28114. #endif
  28115. /* Make sure global shared RNG (globalRNG) is initialized */
  28116. return wolfSSL_RAND_Init();
  28117. }
  28118. /* Returns the path for reading seed data from.
  28119. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  28120. *
  28121. * Note uses stdlib by default unless XGETENV macro is overwritten
  28122. *
  28123. * fname buffer to hold path
  28124. * len length of fname buffer
  28125. *
  28126. * Returns a pointer to fname on success and NULL on failure
  28127. */
  28128. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  28129. {
  28130. #ifndef NO_FILESYSTEM
  28131. char* rt;
  28132. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  28133. if (fname == NULL) {
  28134. return NULL;
  28135. }
  28136. XMEMSET(fname, 0, len);
  28137. /* if access to stdlib.h */
  28138. if ((rt = XGETENV("RANDFILE")) != NULL) {
  28139. if (len > XSTRLEN(rt)) {
  28140. XMEMCPY(fname, rt, XSTRLEN(rt));
  28141. }
  28142. else {
  28143. WOLFSSL_MSG("RANDFILE too large for buffer");
  28144. rt = NULL;
  28145. }
  28146. }
  28147. /* $RANDFILE was not set or is too large, check $HOME */
  28148. if (rt == NULL) {
  28149. char ap[] = "/.rnd";
  28150. WOLFSSL_MSG("Environment variable RANDFILE not set");
  28151. if ((rt = XGETENV("HOME")) == NULL) {
  28152. WOLFSSL_MSG("Environment variable HOME not set");
  28153. return NULL;
  28154. }
  28155. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  28156. fname[0] = '\0';
  28157. XSTRNCAT(fname, rt, len);
  28158. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  28159. return fname;
  28160. }
  28161. else {
  28162. WOLFSSL_MSG("HOME too large for buffer");
  28163. return NULL;
  28164. }
  28165. }
  28166. return fname;
  28167. #else
  28168. /* no filesystem defined */
  28169. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  28170. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  28171. (void)fname;
  28172. (void)len;
  28173. return NULL;
  28174. #endif
  28175. }
  28176. /* Writes 1024 bytes from the RNG to the given file name.
  28177. *
  28178. * fname name of file to write to
  28179. *
  28180. * Returns the number of bytes written
  28181. */
  28182. int wolfSSL_RAND_write_file(const char* fname)
  28183. {
  28184. int bytes = 0;
  28185. WOLFSSL_ENTER("wolfSSL_RAND_write_file");
  28186. if (fname == NULL) {
  28187. return WOLFSSL_FAILURE;
  28188. }
  28189. #ifndef NO_FILESYSTEM
  28190. {
  28191. #ifndef WOLFSSL_SMALL_STACK
  28192. unsigned char buf[1024];
  28193. #else
  28194. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  28195. DYNAMIC_TYPE_TMP_BUFFER);
  28196. if (buf == NULL) {
  28197. WOLFSSL_MSG("malloc failed");
  28198. return WOLFSSL_FAILURE;
  28199. }
  28200. #endif
  28201. bytes = 1024; /* default size of buf */
  28202. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  28203. WOLFSSL_MSG("No RNG to use");
  28204. #ifdef WOLFSSL_SMALL_STACK
  28205. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28206. #endif
  28207. return 0;
  28208. }
  28209. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  28210. WOLFSSL_MSG("Error generating random buffer");
  28211. bytes = 0;
  28212. }
  28213. else {
  28214. XFILE f;
  28215. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28216. wc_MemZero_Add("wolfSSL_RAND_write_file buf", buf, bytes);
  28217. #endif
  28218. f = XFOPEN(fname, "wb");
  28219. if (f == XBADFILE) {
  28220. WOLFSSL_MSG("Error opening the file");
  28221. bytes = 0;
  28222. }
  28223. else {
  28224. size_t bytes_written = XFWRITE(buf, 1, bytes, f);
  28225. bytes = (int)bytes_written;
  28226. XFCLOSE(f);
  28227. }
  28228. }
  28229. ForceZero(buf, bytes);
  28230. #ifdef WOLFSSL_SMALL_STACK
  28231. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28232. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  28233. wc_MemZero_Check(buf, sizeof(buf));
  28234. #endif
  28235. }
  28236. #endif
  28237. return bytes;
  28238. }
  28239. #ifndef FREERTOS_TCP
  28240. /* These constant values are protocol values made by egd */
  28241. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  28242. defined(HAVE_HASHDRBG) && !defined(NETOS) && defined(HAVE_SYS_UN_H)
  28243. #define WOLFSSL_EGD_NBLOCK 0x01
  28244. #include <sys/un.h>
  28245. #endif
  28246. /* This collects entropy from the path nm and seeds the global PRNG with it.
  28247. *
  28248. * nm is the file path to the egd server
  28249. *
  28250. * Returns the number of bytes read.
  28251. */
  28252. int wolfSSL_RAND_egd(const char* nm)
  28253. {
  28254. #ifdef WOLFSSL_EGD_NBLOCK
  28255. struct sockaddr_un rem;
  28256. int fd;
  28257. int ret = WOLFSSL_SUCCESS;
  28258. word32 bytes = 0;
  28259. word32 idx = 0;
  28260. #ifndef WOLFSSL_SMALL_STACK
  28261. unsigned char buf[256];
  28262. #else
  28263. unsigned char* buf;
  28264. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28265. if (buf == NULL) {
  28266. WOLFSSL_MSG("Not enough memory");
  28267. return WOLFSSL_FATAL_ERROR;
  28268. }
  28269. #endif
  28270. XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
  28271. if (nm == NULL) {
  28272. #ifdef WOLFSSL_SMALL_STACK
  28273. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28274. #endif
  28275. return WOLFSSL_FATAL_ERROR;
  28276. }
  28277. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  28278. if (fd < 0) {
  28279. WOLFSSL_MSG("Error creating socket");
  28280. #ifdef WOLFSSL_SMALL_STACK
  28281. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28282. #endif
  28283. return WOLFSSL_FATAL_ERROR;
  28284. }
  28285. rem.sun_family = AF_UNIX;
  28286. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  28287. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  28288. /* connect to egd server */
  28289. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un)) == -1) {
  28290. WOLFSSL_MSG("error connecting to egd server");
  28291. ret = WOLFSSL_FATAL_ERROR;
  28292. }
  28293. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28294. if (ret == WOLFSSL_SUCCESS) {
  28295. wc_MemZero_Add("wolfSSL_RAND_egd buf", buf, 256);
  28296. }
  28297. #endif
  28298. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  28299. buf[idx] = WOLFSSL_EGD_NBLOCK;
  28300. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  28301. ret = (int)write(fd, buf + idx, 2);
  28302. if (ret != 2) {
  28303. if (errno == EAGAIN) {
  28304. ret = WOLFSSL_SUCCESS;
  28305. continue;
  28306. }
  28307. WOLFSSL_MSG("error requesting entropy from egd server");
  28308. ret = WOLFSSL_FATAL_ERROR;
  28309. break;
  28310. }
  28311. /* attempting to read */
  28312. buf[idx] = 0;
  28313. ret = (int)read(fd, buf + idx, 256 - bytes);
  28314. if (ret == 0) {
  28315. WOLFSSL_MSG("error reading entropy from egd server");
  28316. ret = WOLFSSL_FATAL_ERROR;
  28317. break;
  28318. }
  28319. if (ret > 0 && buf[idx] > 0) {
  28320. bytes += buf[idx]; /* egd stores amount sent in first byte */
  28321. if (bytes + idx > 255 || buf[idx] > ret) {
  28322. WOLFSSL_MSG("Buffer error");
  28323. ret = WOLFSSL_FATAL_ERROR;
  28324. break;
  28325. }
  28326. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  28327. idx = bytes;
  28328. ret = WOLFSSL_SUCCESS;
  28329. if (bytes >= 255) {
  28330. break;
  28331. }
  28332. }
  28333. else {
  28334. if (errno == EAGAIN || errno == EINTR) {
  28335. WOLFSSL_MSG("EGD would read");
  28336. ret = WOLFSSL_SUCCESS; /* try again */
  28337. }
  28338. else if (buf[idx] == 0) {
  28339. /* if egd returned 0 then there is no more entropy to be had.
  28340. Do not try more reads. */
  28341. ret = WOLFSSL_SUCCESS;
  28342. break;
  28343. }
  28344. else {
  28345. WOLFSSL_MSG("Error with read");
  28346. ret = WOLFSSL_FATAL_ERROR;
  28347. }
  28348. }
  28349. }
  28350. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  28351. /* call to check global RNG is created */
  28352. if (wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  28353. WOLFSSL_MSG("Error with initializing global RNG structure");
  28354. ret = WOLFSSL_FATAL_ERROR;
  28355. }
  28356. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  28357. != 0) {
  28358. WOLFSSL_MSG("Error with reseeding DRBG structure");
  28359. ret = WOLFSSL_FATAL_ERROR;
  28360. }
  28361. #ifdef SHOW_SECRETS
  28362. else { /* print out entropy found only when no error occurred */
  28363. word32 i;
  28364. printf("EGD Entropy = ");
  28365. for (i = 0; i < bytes; i++) {
  28366. printf("%02X", buf[i]);
  28367. }
  28368. printf("\n");
  28369. }
  28370. #endif
  28371. }
  28372. ForceZero(buf, bytes);
  28373. #ifdef WOLFSSL_SMALL_STACK
  28374. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28375. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  28376. wc_MemZero_Check(buf, 256);
  28377. #endif
  28378. close(fd);
  28379. if (ret == WOLFSSL_SUCCESS) {
  28380. return bytes;
  28381. }
  28382. else {
  28383. return ret;
  28384. }
  28385. #else
  28386. WOLFSSL_MSG("Type of socket needed is not available");
  28387. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  28388. (void)nm;
  28389. return WOLFSSL_FATAL_ERROR;
  28390. #endif /* WOLFSSL_EGD_NBLOCK */
  28391. }
  28392. #endif /* !FREERTOS_TCP */
  28393. void wolfSSL_RAND_Cleanup(void)
  28394. {
  28395. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28396. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28397. if (gRandMethods && gRandMethods->cleanup)
  28398. gRandMethods->cleanup();
  28399. wc_UnLockMutex(&gRandMethodMutex);
  28400. }
  28401. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  28402. gRandMethodsInit = 0;
  28403. #endif
  28404. #ifdef HAVE_GLOBAL_RNG
  28405. if (wc_LockMutex(&globalRNGMutex) == 0) {
  28406. if (initGlobalRNG) {
  28407. wc_FreeRng(&globalRNG);
  28408. initGlobalRNG = 0;
  28409. }
  28410. wc_UnLockMutex(&globalRNGMutex);
  28411. }
  28412. #endif
  28413. }
  28414. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  28415. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  28416. {
  28417. int ret;
  28418. int hash;
  28419. byte secret[DRBG_SEED_LEN]; /* secret length arbitrarily chosen */
  28420. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28421. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28422. if (gRandMethods && gRandMethods->pseudorand) {
  28423. ret = gRandMethods->pseudorand(buf, num);
  28424. wc_UnLockMutex(&gRandMethodMutex);
  28425. return ret;
  28426. }
  28427. wc_UnLockMutex(&gRandMethodMutex);
  28428. }
  28429. #endif
  28430. #ifdef WOLFSSL_HAVE_PRF
  28431. #ifndef NO_SHA256
  28432. hash = WC_SHA256;
  28433. #elif defined(WOLFSSL_SHA384)
  28434. hash = WC_SHA384;
  28435. #elif !defined(NO_SHA)
  28436. hash = WC_SHA;
  28437. #elif !defined(NO_MD5)
  28438. hash = WC_MD5;
  28439. #endif
  28440. /* get secret value from source of entropy */
  28441. ret = wolfSSL_RAND_bytes(secret, DRBG_SEED_LEN);
  28442. /* uses input buffer to seed for pseudo random number generation, each
  28443. * thread will potentially have different results this way */
  28444. if (ret == WOLFSSL_SUCCESS) {
  28445. PRIVATE_KEY_UNLOCK();
  28446. ret = wc_PRF(buf, num, secret, DRBG_SEED_LEN, (const byte*)buf, num,
  28447. hash, NULL, INVALID_DEVID);
  28448. PRIVATE_KEY_LOCK();
  28449. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  28450. }
  28451. #else
  28452. /* fall back to just doing wolfSSL_RAND_bytes if PRF not avialbale */
  28453. ret = wolfSSL_RAND_bytes(buf, num);
  28454. (void)hash;
  28455. (void)secret;
  28456. #endif
  28457. return ret;
  28458. }
  28459. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  28460. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  28461. {
  28462. int ret = 0;
  28463. WC_RNG* rng = NULL;
  28464. #ifdef WOLFSSL_SMALL_STACK
  28465. WC_RNG* tmpRNG = NULL;
  28466. #else
  28467. WC_RNG tmpRNG[1];
  28468. #endif
  28469. int initTmpRng = 0;
  28470. #ifdef HAVE_GLOBAL_RNG
  28471. int used_global = 0;
  28472. #endif
  28473. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  28474. /* sanity check */
  28475. if (buf == NULL || num < 0)
  28476. /* return code compliant with OpenSSL */
  28477. return 0;
  28478. /* if a RAND callback has been set try and use it */
  28479. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28480. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28481. if (gRandMethods && gRandMethods->bytes) {
  28482. ret = gRandMethods->bytes(buf, num);
  28483. wc_UnLockMutex(&gRandMethodMutex);
  28484. return ret;
  28485. }
  28486. wc_UnLockMutex(&gRandMethodMutex);
  28487. }
  28488. #endif
  28489. #ifdef HAVE_GLOBAL_RNG
  28490. if (initGlobalRNG) {
  28491. if (wc_LockMutex(&globalRNGMutex) != 0) {
  28492. WOLFSSL_MSG("Bad Lock Mutex rng");
  28493. return ret;
  28494. }
  28495. rng = &globalRNG;
  28496. used_global = 1;
  28497. }
  28498. else
  28499. #endif
  28500. {
  28501. #ifdef WOLFSSL_SMALL_STACK
  28502. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28503. if (tmpRNG == NULL)
  28504. return ret;
  28505. #endif
  28506. if (wc_InitRng(tmpRNG) == 0) {
  28507. rng = tmpRNG;
  28508. initTmpRng = 1;
  28509. }
  28510. }
  28511. if (rng) {
  28512. /* handles size greater than RNG_MAX_BLOCK_LEN */
  28513. int blockCount = num / RNG_MAX_BLOCK_LEN;
  28514. while (blockCount--) {
  28515. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  28516. if (ret != 0) {
  28517. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  28518. break;
  28519. }
  28520. num -= RNG_MAX_BLOCK_LEN;
  28521. buf += RNG_MAX_BLOCK_LEN;
  28522. }
  28523. if (ret == 0 && num)
  28524. ret = wc_RNG_GenerateBlock(rng, buf, num);
  28525. if (ret != 0)
  28526. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  28527. else
  28528. ret = WOLFSSL_SUCCESS;
  28529. }
  28530. #ifdef HAVE_GLOBAL_RNG
  28531. if (used_global == 1)
  28532. wc_UnLockMutex(&globalRNGMutex);
  28533. #endif
  28534. if (initTmpRng)
  28535. wc_FreeRng(tmpRNG);
  28536. #ifdef WOLFSSL_SMALL_STACK
  28537. if (tmpRNG)
  28538. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28539. #endif
  28540. return ret;
  28541. }
  28542. int wolfSSL_RAND_poll(void)
  28543. {
  28544. byte entropy[16];
  28545. int ret = 0;
  28546. word32 entropy_sz = 16;
  28547. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  28548. if (initGlobalRNG == 0){
  28549. WOLFSSL_MSG("Global RNG no Init");
  28550. return WOLFSSL_FAILURE;
  28551. }
  28552. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  28553. if (ret != 0){
  28554. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  28555. ret = WOLFSSL_FAILURE;
  28556. }else
  28557. ret = WOLFSSL_SUCCESS;
  28558. return ret;
  28559. }
  28560. /* If a valid struct is provided with function pointers, will override
  28561. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  28562. pointer is passed in, it will cancel any previous function overrides.
  28563. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  28564. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  28565. {
  28566. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28567. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28568. gRandMethods = methods;
  28569. wc_UnLockMutex(&gRandMethodMutex);
  28570. return WOLFSSL_SUCCESS;
  28571. }
  28572. #else
  28573. (void)methods;
  28574. #endif
  28575. return WOLFSSL_FAILURE;
  28576. }
  28577. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  28578. int wolfSSL_RAND_status(void)
  28579. {
  28580. int ret = WOLFSSL_SUCCESS;
  28581. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28582. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28583. if (gRandMethods && gRandMethods->status)
  28584. ret = gRandMethods->status();
  28585. wc_UnLockMutex(&gRandMethodMutex);
  28586. }
  28587. else {
  28588. ret = WOLFSSL_FAILURE;
  28589. }
  28590. #else
  28591. /* wolfCrypt provides enough seed internally, so return success */
  28592. #endif
  28593. return ret;
  28594. }
  28595. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  28596. {
  28597. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  28598. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  28599. if (gRandMethods && gRandMethods->add) {
  28600. /* callback has return code, but RAND_add does not */
  28601. (void)gRandMethods->add(add, len, entropy);
  28602. }
  28603. wc_UnLockMutex(&gRandMethodMutex);
  28604. }
  28605. #else
  28606. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  28607. to take control */
  28608. (void)add;
  28609. (void)len;
  28610. (void)entropy;
  28611. #endif
  28612. }
  28613. #endif /* OPENSSL_EXTRA */
  28614. /*******************************************************************************
  28615. * END OF RAND API
  28616. ******************************************************************************/
  28617. /*******************************************************************************
  28618. * START OF EVP_CIPHER API
  28619. ******************************************************************************/
  28620. #ifdef OPENSSL_EXTRA
  28621. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  28622. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  28623. {
  28624. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  28625. if (ctx == NULL) {
  28626. WOLFSSL_MSG("Bad function argument");
  28627. return WOLFSSL_FATAL_ERROR;
  28628. }
  28629. switch (ctx->cipherType) {
  28630. #ifndef NO_AES
  28631. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  28632. case AES_128_CBC_TYPE :
  28633. case AES_192_CBC_TYPE :
  28634. case AES_256_CBC_TYPE :
  28635. WOLFSSL_MSG("AES CBC");
  28636. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  28637. break;
  28638. #endif
  28639. #ifdef HAVE_AESGCM
  28640. case AES_128_GCM_TYPE :
  28641. case AES_192_GCM_TYPE :
  28642. case AES_256_GCM_TYPE :
  28643. WOLFSSL_MSG("AES GCM");
  28644. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  28645. break;
  28646. #endif /* HAVE_AESGCM */
  28647. #ifdef HAVE_AESCCM
  28648. case AES_128_CCM_TYPE :
  28649. case AES_192_CCM_TYPE :
  28650. case AES_256_CCM_TYPE :
  28651. WOLFSSL_MSG("AES CCM");
  28652. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, ctx->ivSz);
  28653. break;
  28654. #endif /* HAVE_AESCCM */
  28655. #ifdef HAVE_AES_ECB
  28656. case AES_128_ECB_TYPE :
  28657. case AES_192_ECB_TYPE :
  28658. case AES_256_ECB_TYPE :
  28659. WOLFSSL_MSG("AES ECB");
  28660. break;
  28661. #endif
  28662. #ifdef WOLFSSL_AES_COUNTER
  28663. case AES_128_CTR_TYPE :
  28664. case AES_192_CTR_TYPE :
  28665. case AES_256_CTR_TYPE :
  28666. WOLFSSL_MSG("AES CTR");
  28667. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  28668. break;
  28669. #endif /* WOLFSSL_AES_COUNTER */
  28670. #ifdef WOLFSSL_AES_CFB
  28671. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  28672. case AES_128_CFB1_TYPE:
  28673. case AES_192_CFB1_TYPE:
  28674. case AES_256_CFB1_TYPE:
  28675. WOLFSSL_MSG("AES CFB1");
  28676. break;
  28677. case AES_128_CFB8_TYPE:
  28678. case AES_192_CFB8_TYPE:
  28679. case AES_256_CFB8_TYPE:
  28680. WOLFSSL_MSG("AES CFB8");
  28681. break;
  28682. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  28683. case AES_128_CFB128_TYPE:
  28684. case AES_192_CFB128_TYPE:
  28685. case AES_256_CFB128_TYPE:
  28686. WOLFSSL_MSG("AES CFB128");
  28687. break;
  28688. #endif /* WOLFSSL_AES_CFB */
  28689. #if defined(WOLFSSL_AES_OFB)
  28690. case AES_128_OFB_TYPE:
  28691. case AES_192_OFB_TYPE:
  28692. case AES_256_OFB_TYPE:
  28693. WOLFSSL_MSG("AES OFB");
  28694. break;
  28695. #endif /* WOLFSSL_AES_OFB */
  28696. #ifdef WOLFSSL_AES_XTS
  28697. case AES_128_XTS_TYPE:
  28698. case AES_256_XTS_TYPE:
  28699. WOLFSSL_MSG("AES XTS");
  28700. break;
  28701. #endif /* WOLFSSL_AES_XTS */
  28702. #endif /* NO_AES */
  28703. #ifdef HAVE_ARIA
  28704. case ARIA_128_GCM_TYPE :
  28705. case ARIA_192_GCM_TYPE :
  28706. case ARIA_256_GCM_TYPE :
  28707. WOLFSSL_MSG("ARIA GCM");
  28708. XMEMCPY(ctx->iv, &ctx->cipher.aria.nonce, ARIA_BLOCK_SIZE);
  28709. break;
  28710. #endif /* HAVE_ARIA */
  28711. #ifndef NO_DES3
  28712. case DES_CBC_TYPE :
  28713. WOLFSSL_MSG("DES CBC");
  28714. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  28715. break;
  28716. case DES_EDE3_CBC_TYPE :
  28717. WOLFSSL_MSG("DES EDE3 CBC");
  28718. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  28719. break;
  28720. #endif
  28721. #ifdef WOLFSSL_DES_ECB
  28722. case DES_ECB_TYPE :
  28723. WOLFSSL_MSG("DES ECB");
  28724. break;
  28725. case DES_EDE3_ECB_TYPE :
  28726. WOLFSSL_MSG("DES3 ECB");
  28727. break;
  28728. #endif
  28729. case ARC4_TYPE :
  28730. WOLFSSL_MSG("ARC4");
  28731. break;
  28732. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  28733. case CHACHA20_POLY1305_TYPE:
  28734. break;
  28735. #endif
  28736. #ifdef HAVE_CHACHA
  28737. case CHACHA20_TYPE:
  28738. break;
  28739. #endif
  28740. #ifdef WOLFSSL_SM4_ECB
  28741. case SM4_ECB_TYPE:
  28742. break;
  28743. #endif
  28744. #ifdef WOLFSSL_SM4_CBC
  28745. case SM4_CBC_TYPE:
  28746. WOLFSSL_MSG("SM4 CBC");
  28747. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  28748. break;
  28749. #endif
  28750. #ifdef WOLFSSL_SM4_CTR
  28751. case SM4_CTR_TYPE:
  28752. WOLFSSL_MSG("SM4 CTR");
  28753. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  28754. break;
  28755. #endif
  28756. #ifdef WOLFSSL_SM4_GCM
  28757. case SM4_GCM_TYPE:
  28758. WOLFSSL_MSG("SM4 GCM");
  28759. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  28760. break;
  28761. #endif
  28762. #ifdef WOLFSSL_SM4_CCM
  28763. case SM4_CCM_TYPE:
  28764. WOLFSSL_MSG("SM4 CCM");
  28765. XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE);
  28766. break;
  28767. #endif
  28768. case NULL_CIPHER_TYPE :
  28769. WOLFSSL_MSG("NULL");
  28770. break;
  28771. default: {
  28772. WOLFSSL_MSG("bad type");
  28773. return WOLFSSL_FATAL_ERROR;
  28774. }
  28775. }
  28776. return WOLFSSL_SUCCESS;
  28777. }
  28778. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  28779. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  28780. {
  28781. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  28782. if (ctx == NULL) {
  28783. WOLFSSL_MSG("Bad function argument");
  28784. return WOLFSSL_FATAL_ERROR;
  28785. }
  28786. switch (ctx->cipherType) {
  28787. #ifndef NO_AES
  28788. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  28789. case AES_128_CBC_TYPE :
  28790. case AES_192_CBC_TYPE :
  28791. case AES_256_CBC_TYPE :
  28792. WOLFSSL_MSG("AES CBC");
  28793. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  28794. break;
  28795. #endif
  28796. #ifdef HAVE_AESGCM
  28797. case AES_128_GCM_TYPE :
  28798. case AES_192_GCM_TYPE :
  28799. case AES_256_GCM_TYPE :
  28800. WOLFSSL_MSG("AES GCM");
  28801. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  28802. break;
  28803. #endif
  28804. #ifdef HAVE_AES_ECB
  28805. case AES_128_ECB_TYPE :
  28806. case AES_192_ECB_TYPE :
  28807. case AES_256_ECB_TYPE :
  28808. WOLFSSL_MSG("AES ECB");
  28809. break;
  28810. #endif
  28811. #ifdef WOLFSSL_AES_COUNTER
  28812. case AES_128_CTR_TYPE :
  28813. case AES_192_CTR_TYPE :
  28814. case AES_256_CTR_TYPE :
  28815. WOLFSSL_MSG("AES CTR");
  28816. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  28817. break;
  28818. #endif
  28819. #endif /* NO_AES */
  28820. #ifdef HAVE_ARIA
  28821. case ARIA_128_GCM_TYPE :
  28822. case ARIA_192_GCM_TYPE :
  28823. case ARIA_256_GCM_TYPE :
  28824. WOLFSSL_MSG("ARIA GCM");
  28825. XMEMCPY(&ctx->cipher.aria.nonce, ctx->iv, ARIA_BLOCK_SIZE);
  28826. break;
  28827. #endif /* HAVE_ARIA */
  28828. #ifndef NO_DES3
  28829. case DES_CBC_TYPE :
  28830. WOLFSSL_MSG("DES CBC");
  28831. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  28832. break;
  28833. case DES_EDE3_CBC_TYPE :
  28834. WOLFSSL_MSG("DES EDE3 CBC");
  28835. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  28836. break;
  28837. #endif
  28838. #ifdef WOLFSSL_DES_ECB
  28839. case DES_ECB_TYPE :
  28840. WOLFSSL_MSG("DES ECB");
  28841. break;
  28842. case DES_EDE3_ECB_TYPE :
  28843. WOLFSSL_MSG("DES3 ECB");
  28844. break;
  28845. #endif
  28846. case ARC4_TYPE :
  28847. WOLFSSL_MSG("ARC4");
  28848. break;
  28849. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  28850. case CHACHA20_POLY1305_TYPE:
  28851. break;
  28852. #endif
  28853. #ifdef HAVE_CHACHA
  28854. case CHACHA20_TYPE:
  28855. break;
  28856. #endif
  28857. #ifdef WOLFSSL_SM4_ECB
  28858. case SM4_ECB_TYPE:
  28859. break;
  28860. #endif
  28861. #ifdef WOLFSSL_SM4_CBC
  28862. case SM4_CBC_TYPE:
  28863. WOLFSSL_MSG("SM4 CBC");
  28864. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  28865. break;
  28866. #endif
  28867. #ifdef WOLFSSL_SM4_CTR
  28868. case SM4_CTR_TYPE:
  28869. WOLFSSL_MSG("SM4 CTR");
  28870. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  28871. break;
  28872. #endif
  28873. #ifdef WOLFSSL_SM4_GCM
  28874. case SM4_GCM_TYPE:
  28875. WOLFSSL_MSG("SM4 GCM");
  28876. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  28877. break;
  28878. #endif
  28879. #ifdef WOLFSSL_SM4_CCM
  28880. case SM4_CCM_TYPE:
  28881. WOLFSSL_MSG("SM4 CCM");
  28882. XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz);
  28883. break;
  28884. #endif
  28885. case NULL_CIPHER_TYPE :
  28886. WOLFSSL_MSG("NULL");
  28887. break;
  28888. default: {
  28889. WOLFSSL_MSG("bad type");
  28890. return WOLFSSL_FATAL_ERROR;
  28891. }
  28892. }
  28893. return WOLFSSL_SUCCESS;
  28894. }
  28895. #ifndef NO_DES3
  28896. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  28897. unsigned char* iv, int len)
  28898. {
  28899. (void)len;
  28900. WOLFSSL_MSG("wolfSSL_3des_iv");
  28901. if (ctx == NULL || iv == NULL) {
  28902. WOLFSSL_MSG("Bad function argument");
  28903. return;
  28904. }
  28905. if (doset)
  28906. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  28907. else
  28908. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  28909. }
  28910. #endif /* NO_DES3 */
  28911. #ifndef NO_AES
  28912. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  28913. unsigned char* iv, int len)
  28914. {
  28915. (void)len;
  28916. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  28917. if (ctx == NULL || iv == NULL) {
  28918. WOLFSSL_MSG("Bad function argument");
  28919. return;
  28920. }
  28921. if (doset)
  28922. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  28923. else
  28924. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  28925. }
  28926. #endif /* NO_AES */
  28927. #endif /* OPENSSL_EXTRA */
  28928. /*******************************************************************************
  28929. * END OF EVP_CIPHER API
  28930. ******************************************************************************/
  28931. #ifndef NO_CERTS
  28932. #define WOLFSSL_X509_STORE_INCLUDED
  28933. #include <src/x509_str.c>
  28934. /*******************************************************************************
  28935. * START OF PKCS7 APIs
  28936. ******************************************************************************/
  28937. #ifdef HAVE_PKCS7
  28938. #ifdef OPENSSL_ALL
  28939. PKCS7* wolfSSL_PKCS7_new(void)
  28940. {
  28941. WOLFSSL_PKCS7* pkcs7;
  28942. int ret = 0;
  28943. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL,
  28944. DYNAMIC_TYPE_PKCS7);
  28945. if (pkcs7 != NULL) {
  28946. XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7));
  28947. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  28948. }
  28949. if (ret != 0 && pkcs7 != NULL) {
  28950. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  28951. pkcs7 = NULL;
  28952. }
  28953. return (PKCS7*)pkcs7;
  28954. }
  28955. /******************************************************************************
  28956. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  28957. *
  28958. * RETURNS:
  28959. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  28960. */
  28961. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  28962. {
  28963. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  28964. PKCS7* pkcs7 = NULL;
  28965. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  28966. return NULL;
  28967. pkcs7->contentOID = SIGNED_DATA;
  28968. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  28969. if (pkcs7) {
  28970. wolfSSL_PKCS7_free(pkcs7);
  28971. return NULL;
  28972. }
  28973. }
  28974. return pkcs7;
  28975. }
  28976. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  28977. {
  28978. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  28979. if (p7 != NULL) {
  28980. if (p7->data != NULL)
  28981. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  28982. wc_PKCS7_Free(&p7->pkcs7);
  28983. if (p7->certs)
  28984. wolfSSL_sk_pop_free(p7->certs, NULL);
  28985. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  28986. }
  28987. }
  28988. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  28989. {
  28990. wolfSSL_PKCS7_free(p7);
  28991. return;
  28992. }
  28993. /**
  28994. * Convert DER/ASN.1 encoded signedData structure to internal PKCS7
  28995. * structure. Note, does not support detached content.
  28996. *
  28997. * p7 - pointer to set to address of newly created PKCS7 structure on return
  28998. * in - pointer to pointer of DER/ASN.1 data
  28999. * len - length of input data, bytes
  29000. *
  29001. * Returns newly allocated and populated PKCS7 structure or NULL on error.
  29002. */
  29003. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  29004. {
  29005. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  29006. }
  29007. /* This internal function is only decoding and setting up the PKCS7 struct. It
  29008. * does not verify the PKCS7 signature.
  29009. *
  29010. * RETURNS:
  29011. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  29012. */
  29013. static PKCS7* wolfSSL_d2i_PKCS7_only(PKCS7** p7, const unsigned char** in,
  29014. int len, byte* content, word32 contentSz)
  29015. {
  29016. WOLFSSL_PKCS7* pkcs7 = NULL;
  29017. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  29018. if (in == NULL || *in == NULL || len < 0)
  29019. return NULL;
  29020. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  29021. return NULL;
  29022. pkcs7->len = len;
  29023. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  29024. if (pkcs7->data == NULL) {
  29025. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29026. return NULL;
  29027. }
  29028. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  29029. if (content != NULL) {
  29030. pkcs7->pkcs7.content = content;
  29031. pkcs7->pkcs7.contentSz = contentSz;
  29032. }
  29033. if (p7 != NULL)
  29034. *p7 = (PKCS7*)pkcs7;
  29035. *in += pkcs7->len;
  29036. return (PKCS7*)pkcs7;
  29037. }
  29038. /*****************************************************************************
  29039. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  29040. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  29041. * is stored as the PKCS7 object's content, to support detached signatures.
  29042. * @param content The content which is signed, in case the signature is
  29043. * detached. Ignored if NULL.
  29044. * @param contentSz The size of the passed in content.
  29045. *
  29046. * RETURNS:
  29047. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  29048. */
  29049. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  29050. byte* content, word32 contentSz)
  29051. {
  29052. WOLFSSL_PKCS7* pkcs7 = NULL;
  29053. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  29054. if (in == NULL || *in == NULL || len < 0)
  29055. return NULL;
  29056. pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_d2i_PKCS7_only(p7, in, len, content,
  29057. contentSz);
  29058. if (pkcs7 != NULL) {
  29059. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  29060. != 0) {
  29061. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  29062. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29063. if (p7 != NULL) {
  29064. *p7 = NULL;
  29065. }
  29066. return NULL;
  29067. }
  29068. }
  29069. return (PKCS7*)pkcs7;
  29070. }
  29071. /**
  29072. * This API was added as a helper function for libest. It
  29073. * extracts a stack of certificates from the pkcs7 object.
  29074. * @param pkcs7 PKCS7 parameter object
  29075. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  29076. */
  29077. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  29078. {
  29079. int i;
  29080. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29081. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  29082. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  29083. if (!p7) {
  29084. WOLFSSL_MSG("Bad parameter");
  29085. return NULL;
  29086. }
  29087. if (p7->certs)
  29088. return p7->certs;
  29089. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  29090. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  29091. p7->pkcs7.certSz[i]);
  29092. if (!ret)
  29093. ret = wolfSSL_sk_X509_new_null();
  29094. if (x509) {
  29095. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  29096. wolfSSL_X509_free(x509);
  29097. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  29098. goto error;
  29099. }
  29100. }
  29101. else {
  29102. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  29103. goto error;
  29104. }
  29105. }
  29106. /* Save stack to free later */
  29107. if (p7->certs)
  29108. wolfSSL_sk_pop_free(p7->certs, NULL);
  29109. p7->certs = ret;
  29110. return ret;
  29111. error:
  29112. if (ret) {
  29113. wolfSSL_sk_pop_free(ret, NULL);
  29114. }
  29115. return NULL;
  29116. }
  29117. /**
  29118. * Return stack of signers contained in PKCS7 cert.
  29119. * Notes:
  29120. * - Currently only PKCS#7 messages with a single signer cert is supported.
  29121. * - Returned WOLFSSL_STACK must be freed by caller.
  29122. *
  29123. * pkcs7 - PKCS7 struct to retrieve signer certs from.
  29124. * certs - currently unused
  29125. * flags - flags to control function behavior.
  29126. *
  29127. * Return WOLFSSL_STACK of signers on success, NULL on error.
  29128. */
  29129. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  29130. int flags)
  29131. {
  29132. WOLFSSL_X509* x509 = NULL;
  29133. WOLFSSL_STACK* signers = NULL;
  29134. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29135. if (p7 == NULL)
  29136. return NULL;
  29137. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  29138. * is supported.
  29139. */
  29140. if (flags & PKCS7_NOINTERN) {
  29141. WOLFSSL_MSG("PKCS7_NOINTERN flag not supported");
  29142. return NULL;
  29143. }
  29144. signers = wolfSSL_sk_X509_new_null();
  29145. if (signers == NULL)
  29146. return NULL;
  29147. if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert,
  29148. p7->pkcs7.singleCertSz) == NULL) {
  29149. wolfSSL_sk_X509_pop_free(signers, NULL);
  29150. return NULL;
  29151. }
  29152. if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) {
  29153. wolfSSL_sk_X509_pop_free(signers, NULL);
  29154. return NULL;
  29155. }
  29156. (void)certs;
  29157. return signers;
  29158. }
  29159. #ifndef NO_BIO
  29160. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  29161. {
  29162. WOLFSSL_PKCS7* pkcs7;
  29163. int ret;
  29164. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  29165. if (bio == NULL)
  29166. return NULL;
  29167. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  29168. return NULL;
  29169. pkcs7->len = wolfSSL_BIO_get_len(bio);
  29170. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  29171. if (pkcs7->data == NULL) {
  29172. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29173. return NULL;
  29174. }
  29175. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  29176. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29177. return NULL;
  29178. }
  29179. /* pkcs7->len may change if using b64 for example */
  29180. pkcs7->len = ret;
  29181. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  29182. != 0) {
  29183. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  29184. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  29185. return NULL;
  29186. }
  29187. if (p7 != NULL)
  29188. *p7 = (PKCS7*)pkcs7;
  29189. return (PKCS7*)pkcs7;
  29190. }
  29191. int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out)
  29192. {
  29193. byte* output = NULL;
  29194. int localBuf = 0;
  29195. int len;
  29196. WC_RNG rng;
  29197. int ret = WOLFSSL_FAILURE;
  29198. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7");
  29199. if (!out || !p7) {
  29200. WOLFSSL_MSG("Bad parameter");
  29201. return WOLFSSL_FAILURE;
  29202. }
  29203. if (!p7->rng) {
  29204. if (wc_InitRng(&rng) != 0) {
  29205. WOLFSSL_MSG("wc_InitRng error");
  29206. return WOLFSSL_FAILURE;
  29207. }
  29208. p7->rng = &rng; /* cppcheck-suppress autoVariables
  29209. */
  29210. }
  29211. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  29212. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  29213. goto cleanup;
  29214. }
  29215. if (*out == NULL) {
  29216. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29217. if (!output) {
  29218. WOLFSSL_MSG("malloc error");
  29219. goto cleanup;
  29220. }
  29221. localBuf = 1;
  29222. }
  29223. else {
  29224. output = *out;
  29225. }
  29226. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  29227. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  29228. goto cleanup;
  29229. }
  29230. ret = len;
  29231. cleanup:
  29232. if (p7->rng == &rng) {
  29233. wc_FreeRng(&rng);
  29234. p7->rng = NULL;
  29235. }
  29236. if (ret == WOLFSSL_FAILURE && localBuf && output)
  29237. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29238. if (ret != WOLFSSL_FAILURE)
  29239. *out = output;
  29240. return ret;
  29241. }
  29242. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  29243. {
  29244. byte* output = NULL;
  29245. int len;
  29246. int ret = WOLFSSL_FAILURE;
  29247. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  29248. if (!bio || !p7) {
  29249. WOLFSSL_MSG("Bad parameter");
  29250. return WOLFSSL_FAILURE;
  29251. }
  29252. if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) {
  29253. WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error");
  29254. goto cleanup;
  29255. }
  29256. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  29257. WOLFSSL_MSG("wolfSSL_BIO_write error");
  29258. goto cleanup;
  29259. }
  29260. ret = WOLFSSL_SUCCESS;
  29261. cleanup:
  29262. if (output)
  29263. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29264. return ret;
  29265. }
  29266. /**
  29267. * Creates and returns a PKCS7 signedData structure.
  29268. *
  29269. * Inner content type is set to DATA to match OpenSSL behavior.
  29270. *
  29271. * signer - certificate to sign bundle with
  29272. * pkey - private key matching signer
  29273. * certs - optional additional set of certificates to include
  29274. * in - input data to be signed
  29275. * flags - optional set of flags to control sign behavior
  29276. *
  29277. * PKCS7_BINARY - Do not translate input data to MIME canonical
  29278. * format (\r\n line endings), thus preventing corruption of
  29279. * binary content.
  29280. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  29281. * PKCS7_DETACHED - Set signature detached, omit content from output bundle.
  29282. * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data.
  29283. *
  29284. * Flags not currently supported:
  29285. * PKCS7_NOCERTS - Do not include the signer cert in the output bundle.
  29286. * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up,
  29287. * then signers etc to be added separately before
  29288. * calling PKCS7_final().
  29289. *
  29290. * Returns valid PKCS7 structure pointer, or NULL if an error occurred.
  29291. */
  29292. PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey,
  29293. WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags)
  29294. {
  29295. int err = 0;
  29296. WOLFSSL_PKCS7* p7 = NULL;
  29297. WOLFSSL_STACK* cert = certs;
  29298. WOLFSSL_ENTER("wolfSSL_PKCS7_sign");
  29299. if (flags & PKCS7_NOCERTS) {
  29300. WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported");
  29301. err = 1;
  29302. }
  29303. if (flags & PKCS7_PARTIAL) {
  29304. WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported");
  29305. err = 1;
  29306. }
  29307. if ((err == 0) && (signer == NULL || signer->derCert == NULL ||
  29308. signer->derCert->length == 0)) {
  29309. WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete");
  29310. err = 1;
  29311. }
  29312. if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL ||
  29313. pkey->pkey_sz <= 0)) {
  29314. WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete");
  29315. err = 1;
  29316. }
  29317. if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) {
  29318. WOLFSSL_MSG("input data required unless PKCS7_STREAM used");
  29319. err = 1;
  29320. }
  29321. if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) {
  29322. WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7");
  29323. err = 1;
  29324. }
  29325. /* load signer certificate */
  29326. if (err == 0) {
  29327. if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer,
  29328. signer->derCert->length) != 0) {
  29329. WOLFSSL_MSG("Failed to load signer certificate");
  29330. err = 1;
  29331. }
  29332. }
  29333. /* set signer private key, data types, defaults */
  29334. if (err == 0) {
  29335. p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr;
  29336. p7->pkcs7.privateKeySz = pkey->pkey_sz;
  29337. p7->pkcs7.contentOID = DATA; /* inner content default is DATA */
  29338. p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */
  29339. p7->type = SIGNED_DATA; /* PKCS7_final switches on type */
  29340. }
  29341. /* add additional chain certs if provided */
  29342. while (cert && (err == 0)) {
  29343. if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) {
  29344. if (wc_PKCS7_AddCertificate(&p7->pkcs7,
  29345. cert->data.x509->derCert->buffer,
  29346. cert->data.x509->derCert->length) != 0) {
  29347. WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate");
  29348. err = 1;
  29349. }
  29350. }
  29351. cert = cert->next;
  29352. }
  29353. if ((err == 0) && (flags & PKCS7_DETACHED)) {
  29354. if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) {
  29355. WOLFSSL_MSG("Failed to set signature detached");
  29356. err = 1;
  29357. }
  29358. }
  29359. if ((err == 0) && (flags & PKCS7_STREAM)) {
  29360. /* if streaming, return before finalizing */
  29361. return (PKCS7*)p7;
  29362. }
  29363. if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) {
  29364. WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final");
  29365. err = 1;
  29366. }
  29367. if ((err != 0) && (p7 != NULL)) {
  29368. wolfSSL_PKCS7_free((PKCS7*)p7);
  29369. p7 = NULL;
  29370. }
  29371. return (PKCS7*)p7;
  29372. }
  29373. #ifdef HAVE_SMIME
  29374. #ifndef MAX_MIME_LINE_LEN
  29375. #define MAX_MIME_LINE_LEN 1024
  29376. #endif
  29377. /**
  29378. * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n),
  29379. * used by PKCS7_final().
  29380. *
  29381. * in - input WOLFSSL_BIO to be converted
  29382. * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted
  29383. *
  29384. * Return 0 on success, negative on error
  29385. */
  29386. static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out)
  29387. {
  29388. int ret = 0;
  29389. int lineLen = 0;
  29390. word32 canonLineLen = 0;
  29391. char* canonLine = NULL;
  29392. #ifdef WOLFSSL_SMALL_STACK
  29393. char* line = NULL;
  29394. #else
  29395. char line[MAX_MIME_LINE_LEN];
  29396. #endif
  29397. if (in == NULL || out == NULL) {
  29398. return BAD_FUNC_ARG;
  29399. }
  29400. #ifdef WOLFSSL_SMALL_STACK
  29401. line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap,
  29402. DYNAMIC_TYPE_TMP_BUFFER);
  29403. if (line == NULL) {
  29404. return MEMORY_E;
  29405. }
  29406. #endif
  29407. XMEMSET(line, 0, MAX_MIME_LINE_LEN);
  29408. while ((lineLen = wolfSSL_BIO_gets(in, line, MAX_MIME_LINE_LEN)) > 0) {
  29409. if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') {
  29410. canonLineLen = (word32)lineLen;
  29411. if ((canonLine = wc_MIME_single_canonicalize(
  29412. line, &canonLineLen)) == NULL) {
  29413. ret = -1;
  29414. break;
  29415. }
  29416. /* remove trailing null */
  29417. if (canonLineLen >= 1 && canonLine[canonLineLen-1] == '\0') {
  29418. canonLineLen--;
  29419. }
  29420. if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) {
  29421. ret = -1;
  29422. break;
  29423. }
  29424. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  29425. canonLine = NULL;
  29426. }
  29427. else {
  29428. /* no line ending in current line, write direct to out */
  29429. if (wolfSSL_BIO_write(out, line, lineLen) < 0) {
  29430. ret = -1;
  29431. break;
  29432. }
  29433. }
  29434. }
  29435. if (canonLine != NULL) {
  29436. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  29437. }
  29438. #ifdef WOLFSSL_SMALL_STACK
  29439. XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29440. #endif
  29441. return ret;
  29442. }
  29443. #endif /* HAVE_SMIME */
  29444. /* Used by both PKCS7_final() and PKCS7_verify() */
  29445. static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n";
  29446. /**
  29447. * Finalize PKCS7 structure, currently supports signedData only.
  29448. *
  29449. * Does not generate final bundle (ie: signedData), but finalizes
  29450. * the PKCS7 structure in preparation for a output function to be called next.
  29451. *
  29452. * pkcs7 - initialized PKCS7 structure, populated with signer, etc
  29453. * in - input data
  29454. * flags - flags to control PKCS7 behavior. Other flags except those noted
  29455. * below are ignored:
  29456. *
  29457. * PKCS7_BINARY - Do not translate input data to MIME canonical
  29458. * format (\r\n line endings), thus preventing corruption of
  29459. * binary content.
  29460. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  29461. *
  29462. * Returns 1 on success, 0 on error
  29463. */
  29464. int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags)
  29465. {
  29466. int ret = 1;
  29467. int memSz = 0;
  29468. unsigned char* mem = NULL;
  29469. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29470. WOLFSSL_BIO* data = NULL;
  29471. WOLFSSL_ENTER("wolfSSL_PKCS7_final");
  29472. if (p7 == NULL || in == NULL) {
  29473. WOLFSSL_MSG("Bad input args to PKCS7_final");
  29474. ret = 0;
  29475. }
  29476. if (ret == 1) {
  29477. if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) {
  29478. WOLFSSL_MSG("Error in wolfSSL_BIO_new");
  29479. ret = 0;
  29480. }
  29481. }
  29482. /* prepend Content-Type header if PKCS7_TEXT */
  29483. if ((ret == 1) && (flags & PKCS7_TEXT)) {
  29484. if (wolfSSL_BIO_write(data, contTypeText,
  29485. (int)XSTR_SIZEOF(contTypeText)) < 0) {
  29486. WOLFSSL_MSG("Error prepending Content-Type header");
  29487. ret = 0;
  29488. }
  29489. }
  29490. /* convert line endings to CRLF if !PKCS7_BINARY */
  29491. if (ret == 1) {
  29492. if (flags & PKCS7_BINARY) {
  29493. /* no CRLF conversion, direct copy content */
  29494. if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) {
  29495. ret = 0;
  29496. }
  29497. if (ret == 1) {
  29498. mem = (unsigned char*)XMALLOC(memSz, in->heap,
  29499. DYNAMIC_TYPE_TMP_BUFFER);
  29500. if (mem == NULL) {
  29501. WOLFSSL_MSG("Failed to allocate memory for input data");
  29502. ret = 0;
  29503. }
  29504. }
  29505. if (ret == 1) {
  29506. if (wolfSSL_BIO_read(in, mem, memSz) != memSz) {
  29507. WOLFSSL_MSG("Error reading from input BIO");
  29508. ret = 0;
  29509. }
  29510. else if (wolfSSL_BIO_write(data, mem, memSz) < 0) {
  29511. ret = 0;
  29512. }
  29513. }
  29514. if (mem != NULL) {
  29515. XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29516. }
  29517. }
  29518. else {
  29519. #ifdef HAVE_SMIME
  29520. /* convert content line endings to CRLF */
  29521. if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) {
  29522. WOLFSSL_MSG("Error converting line endings to CRLF");
  29523. ret = 0;
  29524. }
  29525. else {
  29526. p7->pkcs7.contentCRLF = 1;
  29527. }
  29528. #else
  29529. WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built "
  29530. "with HAVE_SMIME");
  29531. ret = 0;
  29532. #endif
  29533. }
  29534. }
  29535. if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) {
  29536. WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data");
  29537. ret = 0;
  29538. }
  29539. if (ret == 1) {
  29540. if (p7->data != NULL) {
  29541. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  29542. }
  29543. p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7);
  29544. if (p7->data == NULL) {
  29545. ret = 0;
  29546. }
  29547. else {
  29548. XMEMCPY(p7->data, mem, memSz);
  29549. p7->len = memSz;
  29550. }
  29551. }
  29552. if (ret == 1) {
  29553. p7->pkcs7.content = p7->data;
  29554. p7->pkcs7.contentSz = p7->len;
  29555. }
  29556. if (data != NULL) {
  29557. wolfSSL_BIO_free(data);
  29558. }
  29559. return ret;
  29560. }
  29561. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  29562. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags)
  29563. {
  29564. int i, ret = 0;
  29565. unsigned char* mem = NULL;
  29566. int memSz = 0;
  29567. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  29568. int contTypeLen;
  29569. WOLFSSL_X509* signer = NULL;
  29570. WOLFSSL_STACK* signers = NULL;
  29571. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  29572. if (pkcs7 == NULL)
  29573. return WOLFSSL_FAILURE;
  29574. if (in != NULL) {
  29575. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  29576. return WOLFSSL_FAILURE;
  29577. p7->pkcs7.content = mem;
  29578. p7->pkcs7.contentSz = memSz;
  29579. }
  29580. /* certs is the list of certificates to find the cert with issuer/serial. */
  29581. (void)certs;
  29582. /* store is the certificate store to use to verify signer certificate
  29583. * associated with the signers.
  29584. */
  29585. (void)store;
  29586. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  29587. if (ret != 0)
  29588. return WOLFSSL_FAILURE;
  29589. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  29590. /* Verify signer certificates */
  29591. if (store == NULL || store->cm == NULL) {
  29592. WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set");
  29593. return WOLFSSL_FAILURE;
  29594. }
  29595. signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags);
  29596. if (signers == NULL) {
  29597. WOLFSSL_MSG("No signers found to verify");
  29598. return WOLFSSL_FAILURE;
  29599. }
  29600. for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) {
  29601. signer = wolfSSL_sk_X509_value(signers, i);
  29602. if (wolfSSL_CertManagerVerifyBuffer(store->cm,
  29603. signer->derCert->buffer,
  29604. signer->derCert->length,
  29605. WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
  29606. WOLFSSL_MSG("Failed to verify signer certificate");
  29607. wolfSSL_sk_X509_pop_free(signers, NULL);
  29608. return WOLFSSL_FAILURE;
  29609. }
  29610. }
  29611. wolfSSL_sk_X509_pop_free(signers, NULL);
  29612. }
  29613. if (flags & PKCS7_TEXT) {
  29614. /* strip MIME header for text/plain, otherwise error */
  29615. contTypeLen = XSTR_SIZEOF(contTypeText);
  29616. if ((p7->pkcs7.contentSz < (word32)contTypeLen) ||
  29617. (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) {
  29618. WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT");
  29619. return WOLFSSL_FAILURE;
  29620. }
  29621. p7->pkcs7.content += contTypeLen;
  29622. p7->pkcs7.contentSz -= contTypeLen;
  29623. }
  29624. if (out != NULL) {
  29625. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  29626. }
  29627. WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS);
  29628. return WOLFSSL_SUCCESS;
  29629. }
  29630. /**
  29631. * This API was added as a helper function for libest. It
  29632. * encodes a stack of certificates to pkcs7 format.
  29633. * @param pkcs7 PKCS7 parameter object
  29634. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  29635. * @param out Output bio
  29636. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  29637. */
  29638. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  29639. WOLFSSL_BIO* out)
  29640. {
  29641. int ret;
  29642. WOLFSSL_PKCS7* p7;
  29643. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  29644. if (!pkcs7 || !certs || !out) {
  29645. WOLFSSL_MSG("Bad parameter");
  29646. return WOLFSSL_FAILURE;
  29647. }
  29648. p7 = (WOLFSSL_PKCS7*)pkcs7;
  29649. /* take ownership of certs */
  29650. p7->certs = certs;
  29651. /* TODO: takes ownership even on failure below but not on above failure. */
  29652. if (pkcs7->certList) {
  29653. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  29654. "struct");
  29655. return WOLFSSL_FAILURE;
  29656. }
  29657. if (certs) {
  29658. /* Save some of the values */
  29659. int hashOID = pkcs7->hashOID;
  29660. byte version = pkcs7->version;
  29661. if (!certs->data.x509 || !certs->data.x509->derCert) {
  29662. WOLFSSL_MSG("Missing cert");
  29663. return WOLFSSL_FAILURE;
  29664. }
  29665. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  29666. certs->data.x509->derCert->length) != 0) {
  29667. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  29668. return WOLFSSL_FAILURE;
  29669. }
  29670. certs = certs->next;
  29671. pkcs7->hashOID = hashOID;
  29672. pkcs7->version = version;
  29673. }
  29674. /* Add the certs to the PKCS7 struct */
  29675. while (certs) {
  29676. if (!certs->data.x509 || !certs->data.x509->derCert) {
  29677. WOLFSSL_MSG("Missing cert");
  29678. return WOLFSSL_FAILURE;
  29679. }
  29680. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  29681. certs->data.x509->derCert->length) != 0) {
  29682. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  29683. return WOLFSSL_FAILURE;
  29684. }
  29685. certs = certs->next;
  29686. }
  29687. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  29688. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  29689. return WOLFSSL_FAILURE;
  29690. }
  29691. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  29692. return ret;
  29693. }
  29694. /******************************************************************************
  29695. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  29696. *
  29697. * RETURNS:
  29698. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  29699. */
  29700. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  29701. {
  29702. #ifdef WOLFSSL_SMALL_STACK
  29703. byte* outputHead;
  29704. byte* outputFoot;
  29705. #else
  29706. byte outputHead[2048];
  29707. byte outputFoot[2048];
  29708. #endif
  29709. word32 outputHeadSz = 2048;
  29710. word32 outputFootSz = 2048;
  29711. word32 outputSz = 0;
  29712. byte* output = NULL;
  29713. byte* pem = NULL;
  29714. int pemSz = -1;
  29715. enum wc_HashType hashType;
  29716. byte hashBuf[WC_MAX_DIGEST_SIZE];
  29717. word32 hashSz = -1;
  29718. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7");
  29719. if (bio == NULL || p7 == NULL)
  29720. return WOLFSSL_FAILURE;
  29721. #ifdef WOLFSSL_SMALL_STACK
  29722. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap,
  29723. DYNAMIC_TYPE_TMP_BUFFER);
  29724. if (outputHead == NULL)
  29725. return MEMORY_E;
  29726. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap,
  29727. DYNAMIC_TYPE_TMP_BUFFER);
  29728. if (outputFoot == NULL)
  29729. goto error;
  29730. #endif
  29731. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  29732. XMEMSET(outputHead, 0, outputHeadSz);
  29733. XMEMSET(outputFoot, 0, outputFootSz);
  29734. hashType = wc_OidGetHash(p7->hashOID);
  29735. hashSz = wc_HashGetDigestSize(hashType);
  29736. if (hashSz > WC_MAX_DIGEST_SIZE)
  29737. goto error;
  29738. /* only SIGNED_DATA is supported */
  29739. switch (p7->contentOID) {
  29740. case SIGNED_DATA:
  29741. break;
  29742. default:
  29743. WOLFSSL_MSG("Unknown PKCS#7 Type");
  29744. goto error;
  29745. };
  29746. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  29747. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  29748. goto error;
  29749. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  29750. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29751. if (!output)
  29752. goto error;
  29753. XMEMSET(output, 0, outputSz);
  29754. outputSz = 0;
  29755. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  29756. outputSz += outputHeadSz;
  29757. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  29758. outputSz += p7->contentSz;
  29759. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  29760. outputSz += outputFootSz;
  29761. /* get PEM size */
  29762. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  29763. if (pemSz < 0)
  29764. goto error;
  29765. pemSz++; /* for '\0'*/
  29766. /* create PEM buffer and convert from DER to PEM*/
  29767. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER))
  29768. == NULL)
  29769. goto error;
  29770. XMEMSET(pem, 0, pemSz);
  29771. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  29772. goto error;
  29773. }
  29774. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  29775. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29776. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29777. #ifdef WOLFSSL_SMALL_STACK
  29778. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29779. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29780. #endif
  29781. return WOLFSSL_SUCCESS;
  29782. }
  29783. error:
  29784. #ifdef WOLFSSL_SMALL_STACK
  29785. if (outputHead) {
  29786. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29787. }
  29788. if (outputFoot) {
  29789. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29790. }
  29791. #endif
  29792. if (output) {
  29793. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29794. }
  29795. if (pem) {
  29796. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29797. }
  29798. return WOLFSSL_FAILURE;
  29799. }
  29800. #ifdef HAVE_SMIME
  29801. /*****************************************************************************
  29802. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  29803. * a PKCS7 object. In case of a multipart message, stores the signed data in
  29804. * bcont.
  29805. *
  29806. * RETURNS:
  29807. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  29808. */
  29809. PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  29810. WOLFSSL_BIO** bcont)
  29811. {
  29812. MimeHdr* allHdrs = NULL;
  29813. MimeHdr* curHdr = NULL;
  29814. MimeParam* curParam = NULL;
  29815. int inLen = 0;
  29816. byte* bcontMem = NULL;
  29817. int bcontMemSz = 0;
  29818. int sectionLen = 0;
  29819. int ret = -1;
  29820. char* section = NULL;
  29821. char* canonLine = NULL;
  29822. char* canonSection = NULL;
  29823. PKCS7* pkcs7 = NULL;
  29824. word32 outLen = 0;
  29825. word32 canonLineLen = 0;
  29826. byte* out = NULL;
  29827. byte* outHead = NULL;
  29828. int canonPos = 0;
  29829. int lineLen = 0;
  29830. int remainLen = 0;
  29831. byte isEnd = 0;
  29832. size_t canonSize = 0;
  29833. size_t boundLen = 0;
  29834. char* boundary = NULL;
  29835. static const char kContType[] = "Content-Type";
  29836. static const char kCTE[] = "Content-Transfer-Encoding";
  29837. static const char kMultSigned[] = "multipart/signed";
  29838. static const char kAppPkcsSign[] = "application/pkcs7-signature";
  29839. static const char kAppXPkcsSign[] = "application/x-pkcs7-signature";
  29840. static const char kAppPkcs7Mime[] = "application/pkcs7-mime";
  29841. static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime";
  29842. WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7");
  29843. if (in == NULL || bcont == NULL) {
  29844. goto error;
  29845. }
  29846. inLen = wolfSSL_BIO_get_len(in);
  29847. if (inLen <= 0) {
  29848. goto error;
  29849. }
  29850. remainLen = wolfSSL_BIO_get_len(in);
  29851. if (remainLen <= 0) {
  29852. goto error;
  29853. }
  29854. section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  29855. if (section == NULL) {
  29856. goto error;
  29857. }
  29858. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  29859. if (lineLen <= 0) {
  29860. goto error;
  29861. }
  29862. while (isEnd == 0 && remainLen > 0) {
  29863. sectionLen += lineLen;
  29864. remainLen -= lineLen;
  29865. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  29866. if (lineLen <= 0) {
  29867. goto error;
  29868. }
  29869. /* Line with just newline signals end of headers. */
  29870. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  29871. "\r\n", 2)) ||
  29872. (lineLen==1 && (section[sectionLen] == '\r' ||
  29873. section[sectionLen] == '\n'))) {
  29874. isEnd = 1;
  29875. }
  29876. }
  29877. section[sectionLen] = '\0';
  29878. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  29879. if (ret < 0) {
  29880. WOLFSSL_MSG("Parsing MIME headers failed.");
  29881. goto error;
  29882. }
  29883. isEnd = 0;
  29884. section[0] = '\0';
  29885. sectionLen = 0;
  29886. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  29887. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  29888. XSTR_SIZEOF(kMultSigned))) {
  29889. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  29890. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  29891. XSTR_SIZEOF(kAppPkcsSign)) ||
  29892. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  29893. XSTR_SIZEOF(kAppXPkcsSign)))) {
  29894. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  29895. if (curParam == NULL) {
  29896. goto error;
  29897. }
  29898. boundLen = XSTRLEN(curParam->value) + 2;
  29899. boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  29900. if (boundary == NULL) {
  29901. goto error;
  29902. }
  29903. XMEMSET(boundary, 0, (word32)(boundLen+1));
  29904. boundary[0] = boundary[1] = '-';
  29905. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  29906. /* Parse up to first boundary, ignore everything here. */
  29907. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  29908. if (lineLen <= 0) {
  29909. goto error;
  29910. }
  29911. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  29912. remainLen > 0) {
  29913. sectionLen += lineLen;
  29914. remainLen -= lineLen;
  29915. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  29916. remainLen);
  29917. if (lineLen <= 0) {
  29918. goto error;
  29919. }
  29920. }
  29921. section[0] = '\0';
  29922. sectionLen = 0;
  29923. canonSize = remainLen + 1;
  29924. canonSection = (char*)XMALLOC(canonSize, NULL,
  29925. DYNAMIC_TYPE_PKCS7);
  29926. if (canonSection == NULL) {
  29927. goto error;
  29928. }
  29929. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  29930. if (lineLen < 0) {
  29931. goto error;
  29932. }
  29933. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  29934. remainLen > 0) {
  29935. canonLineLen = lineLen;
  29936. canonLine = wc_MIME_single_canonicalize(&section[sectionLen],
  29937. &canonLineLen);
  29938. if (canonLine == NULL) {
  29939. goto error;
  29940. }
  29941. /* If line endings were added, the initial length may be
  29942. * exceeded. */
  29943. if ((canonPos + canonLineLen) >= canonSize) {
  29944. canonSize = canonPos + canonLineLen;
  29945. canonSection = (char*)XREALLOC(canonSection, canonSize,
  29946. NULL, DYNAMIC_TYPE_PKCS7);
  29947. if (canonSection == NULL) {
  29948. goto error;
  29949. }
  29950. }
  29951. XMEMCPY(&canonSection[canonPos], canonLine,
  29952. (int)canonLineLen - 1);
  29953. canonPos += canonLineLen - 1;
  29954. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  29955. canonLine = NULL;
  29956. sectionLen += lineLen;
  29957. remainLen -= lineLen;
  29958. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  29959. remainLen);
  29960. if (lineLen <= 0) {
  29961. goto error;
  29962. }
  29963. }
  29964. if (canonPos > 0) {
  29965. canonPos--;
  29966. }
  29967. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  29968. if (canonSection[canonPos] == '\n') {
  29969. if (canonPos > 0) {
  29970. canonPos--;
  29971. }
  29972. }
  29973. if (canonSection[canonPos] == '\r') {
  29974. if (canonPos > 0) {
  29975. canonPos--;
  29976. }
  29977. }
  29978. canonSection[canonPos+1] = '\0';
  29979. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  29980. ret = wolfSSL_BIO_write(*bcont, canonSection,
  29981. canonPos + 1);
  29982. if (ret != (canonPos+1)) {
  29983. goto error;
  29984. }
  29985. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem))
  29986. < 0) {
  29987. goto error;
  29988. }
  29989. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  29990. canonSection = NULL;
  29991. wc_MIME_free_hdrs(allHdrs);
  29992. allHdrs = NULL;
  29993. section[0] = '\0';
  29994. sectionLen = 0;
  29995. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  29996. if (lineLen <= 0) {
  29997. goto error;
  29998. }
  29999. while (isEnd == 0 && remainLen > 0) {
  30000. sectionLen += lineLen;
  30001. remainLen -= lineLen;
  30002. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30003. remainLen);
  30004. if (lineLen <= 0) {
  30005. goto error;
  30006. }
  30007. /* Line with just newline signals end of headers. */
  30008. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  30009. "\r\n", 2)) ||
  30010. (lineLen==1 && (section[sectionLen] == '\r' ||
  30011. section[sectionLen] == '\n'))) {
  30012. isEnd = 1;
  30013. }
  30014. }
  30015. section[sectionLen] = '\0';
  30016. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  30017. if (ret < 0) {
  30018. WOLFSSL_MSG("Parsing MIME headers failed.");
  30019. goto error;
  30020. }
  30021. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  30022. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  30023. XSTR_SIZEOF(kAppPkcsSign)) &&
  30024. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  30025. XSTR_SIZEOF(kAppXPkcsSign)))) {
  30026. WOLFSSL_MSG("S/MIME headers not found inside "
  30027. "multipart message.\n");
  30028. goto error;
  30029. }
  30030. section[0] = '\0';
  30031. sectionLen = 0;
  30032. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  30033. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  30034. remainLen > 0) {
  30035. sectionLen += lineLen;
  30036. remainLen -= lineLen;
  30037. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  30038. remainLen);
  30039. if (lineLen <= 0) {
  30040. goto error;
  30041. }
  30042. }
  30043. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  30044. boundary = NULL;
  30045. }
  30046. }
  30047. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  30048. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  30049. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  30050. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  30051. sectionLen = wolfSSL_BIO_get_len(in);
  30052. if (sectionLen <= 0) {
  30053. goto error;
  30054. }
  30055. ret = wolfSSL_BIO_read(in, section, sectionLen);
  30056. if (ret < 0 || ret != sectionLen) {
  30057. WOLFSSL_MSG("Error reading input BIO.");
  30058. goto error;
  30059. }
  30060. }
  30061. else {
  30062. WOLFSSL_MSG("S/MIME headers not found.");
  30063. goto error;
  30064. }
  30065. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  30066. if (curHdr == NULL) {
  30067. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  30068. "assuming base64 encoding.");
  30069. }
  30070. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  30071. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  30072. "currently supported.\n");
  30073. goto error;
  30074. }
  30075. if (section == NULL || sectionLen <= 0) {
  30076. goto error;
  30077. }
  30078. outLen = ((sectionLen*3+3)/4)+1;
  30079. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  30080. outHead = out;
  30081. if (outHead == NULL) {
  30082. goto error;
  30083. }
  30084. /* Strip trailing newlines. */
  30085. while ((sectionLen > 0) &&
  30086. (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) {
  30087. sectionLen--;
  30088. }
  30089. section[sectionLen] = '\0';
  30090. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  30091. if (ret < 0) {
  30092. WOLFSSL_MSG("Error base64 decoding S/MIME message.");
  30093. goto error;
  30094. }
  30095. pkcs7 = wolfSSL_d2i_PKCS7_only(NULL, (const unsigned char**)&out, outLen,
  30096. bcontMem, bcontMemSz);
  30097. wc_MIME_free_hdrs(allHdrs);
  30098. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  30099. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  30100. return pkcs7;
  30101. error:
  30102. wc_MIME_free_hdrs(allHdrs);
  30103. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  30104. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  30105. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  30106. if (canonSection != NULL)
  30107. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  30108. if (canonLine != NULL)
  30109. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  30110. if (bcont) {
  30111. wolfSSL_BIO_free(*bcont);
  30112. *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */
  30113. }
  30114. return NULL;
  30115. }
  30116. /* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent.
  30117. * Returns hash algorithm string or "unknown" if not found */
  30118. static const char* wolfSSL_SMIME_HashOIDToString(int hashOID)
  30119. {
  30120. switch (hashOID) {
  30121. case MD5h:
  30122. return "md5";
  30123. case SHAh:
  30124. return "sha1";
  30125. case SHA224h:
  30126. return "sha-224";
  30127. case SHA256h:
  30128. return "sha-256";
  30129. case SHA384h:
  30130. return "sha-384";
  30131. case SHA512h:
  30132. return "sha-512";
  30133. case SHA3_224h:
  30134. return "sha3-224";
  30135. case SHA3_384h:
  30136. return "sha3-384";
  30137. case SHA3_512h:
  30138. return "sha3-512";
  30139. default:
  30140. break;
  30141. }
  30142. return "unknown";
  30143. }
  30144. /* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string.
  30145. * RFC2633 only defines signed-data, enveloped-data, certs-only.
  30146. * Returns string on success, NULL on unknown type. */
  30147. static const char* wolfSSL_SMIME_PKCS7TypeToString(int type)
  30148. {
  30149. switch (type) {
  30150. case SIGNED_DATA:
  30151. return "signed-data";
  30152. case ENVELOPED_DATA:
  30153. return "enveloped-data";
  30154. default:
  30155. break;
  30156. }
  30157. return NULL;
  30158. }
  30159. /**
  30160. * Convert PKCS7 structure to SMIME format, adding necessary headers.
  30161. *
  30162. * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure
  30163. * should be set up beforehand with PKCS7_sign/final/etc. Output is always
  30164. * Base64 encoded.
  30165. *
  30166. * out - output BIO for SMIME formatted data to be placed
  30167. * pkcs7 - input PKCS7 structure, initialized and set up
  30168. * in - input content to be encoded into PKCS7
  30169. * flags - flags to control behavior of PKCS7 generation
  30170. *
  30171. * Returns 1 on success, 0 or negative on failure
  30172. */
  30173. int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in,
  30174. int flags)
  30175. {
  30176. int i;
  30177. int ret = 1;
  30178. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  30179. byte* p7out = NULL;
  30180. int len = 0;
  30181. char boundary[33]; /* 32 chars + \0 */
  30182. byte* sigBase64 = NULL;
  30183. word32 sigBase64Len = 0;
  30184. const char* p7TypeString = NULL;
  30185. static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  30186. if (out == NULL || p7 == NULL) {
  30187. WOLFSSL_MSG("Bad function arguments");
  30188. return 0;
  30189. }
  30190. if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 ||
  30191. p7->pkcs7.contentCRLF == 0)) {
  30192. /* store and adjust content line endings for CRLF if needed */
  30193. if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) {
  30194. ret = 0;
  30195. }
  30196. }
  30197. if (ret > 0) {
  30198. /* Generate signedData bundle, DER in output (dynamic) */
  30199. if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) {
  30200. WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7");
  30201. ret = 0;
  30202. }
  30203. }
  30204. /* Base64 encode signedData bundle */
  30205. if (ret > 0) {
  30206. if (Base64_Encode(p7out, len, NULL, &sigBase64Len) != LENGTH_ONLY_E) {
  30207. ret = 0;
  30208. }
  30209. else {
  30210. sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL,
  30211. DYNAMIC_TYPE_TMP_BUFFER);
  30212. if (sigBase64 == NULL) {
  30213. ret = 0;
  30214. }
  30215. }
  30216. }
  30217. if (ret > 0) {
  30218. XMEMSET(sigBase64, 0, sigBase64Len);
  30219. if (Base64_Encode(p7out, len, sigBase64, &sigBase64Len) < 0) {
  30220. WOLFSSL_MSG("Error in Base64_Encode of signature");
  30221. ret = 0;
  30222. }
  30223. }
  30224. /* build up SMIME message */
  30225. if (ret > 0) {
  30226. if (flags & PKCS7_DETACHED) {
  30227. /* generate random boundary */
  30228. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  30229. WOLFSSL_MSG("No RNG to use");
  30230. ret = 0;
  30231. }
  30232. /* no need to generate random byte for null terminator (size-1) */
  30233. if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary,
  30234. sizeof(boundary) - 1 ) != 0)) {
  30235. WOLFSSL_MSG("Error in wc_RNG_GenerateBlock");
  30236. ret = 0;
  30237. }
  30238. if (ret > 0) {
  30239. for (i = 0; i < (int)sizeof(boundary) - 1; i++) {
  30240. boundary[i] =
  30241. alphanum[boundary[i] % XSTR_SIZEOF(alphanum)];
  30242. }
  30243. boundary[sizeof(boundary)-1] = 0;
  30244. }
  30245. if (ret > 0) {
  30246. /* S/MIME header beginning */
  30247. ret = wolfSSL_BIO_printf(out,
  30248. "MIME-Version: 1.0\n"
  30249. "Content-Type: multipart/signed; "
  30250. "protocol=\"application/x-pkcs7-signature\"; "
  30251. "micalg=\"%s\"; "
  30252. "boundary=\"----%s\"\n\n"
  30253. "This is an S/MIME signed message\n\n"
  30254. "------%s\n",
  30255. wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID),
  30256. boundary, boundary);
  30257. }
  30258. if (ret > 0) {
  30259. /* S/MIME content */
  30260. ret = wolfSSL_BIO_write(out,
  30261. p7->pkcs7.content, p7->pkcs7.contentSz);
  30262. }
  30263. if (ret > 0) {
  30264. /* S/SMIME header end boundary */
  30265. ret = wolfSSL_BIO_printf(out,
  30266. "\n------%s\n", boundary);
  30267. }
  30268. if (ret > 0) {
  30269. /* Signature and header */
  30270. ret = wolfSSL_BIO_printf(out,
  30271. "Content-Type: application/x-pkcs7-signature; "
  30272. "name=\"smime.p7s\"\n"
  30273. "Content-Transfer-Encoding: base64\n"
  30274. "Content-Disposition: attachment; "
  30275. "filename=\"smime.p7s\"\n\n"
  30276. "%.*s\n" /* Base64 encoded signature */
  30277. "------%s--\n\n",
  30278. sigBase64Len, sigBase64,
  30279. boundary);
  30280. }
  30281. }
  30282. else {
  30283. p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type);
  30284. if (p7TypeString == NULL) {
  30285. WOLFSSL_MSG("Unsupported PKCS7 SMIME type");
  30286. ret = 0;
  30287. }
  30288. if (ret > 0) {
  30289. /* not detached */
  30290. ret = wolfSSL_BIO_printf(out,
  30291. "MIME-Version: 1.0\n"
  30292. "Content-Disposition: attachment; "
  30293. "filename=\"smime.p7m\"\n"
  30294. "Content-Type: application/x-pkcs7-mime; "
  30295. "smime-type=%s; name=\"smime.p7m\"\n"
  30296. "Content-Transfer-Encoding: base64\n\n"
  30297. "%.*s\n" /* signature */,
  30298. p7TypeString, sigBase64Len, sigBase64);
  30299. }
  30300. }
  30301. }
  30302. if (p7out != NULL) {
  30303. XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30304. }
  30305. if (sigBase64 != NULL) {
  30306. XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30307. }
  30308. if (ret > 0) {
  30309. return WOLFSSL_SUCCESS;
  30310. }
  30311. return WOLFSSL_FAILURE;
  30312. }
  30313. #endif /* HAVE_SMIME */
  30314. #endif /* !NO_BIO */
  30315. #endif /* OPENSSL_ALL */
  30316. #endif /* HAVE_PKCS7 */
  30317. /*******************************************************************************
  30318. * END OF PKCS7 APIs
  30319. ******************************************************************************/
  30320. /*******************************************************************************
  30321. * START OF PKCS12 APIs
  30322. ******************************************************************************/
  30323. #ifdef OPENSSL_EXTRA
  30324. /* no-op function. Was initially used for adding encryption algorithms available
  30325. * for PKCS12 */
  30326. void wolfSSL_PKCS12_PBE_add(void)
  30327. {
  30328. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  30329. }
  30330. #if !defined(NO_FILESYSTEM)
  30331. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp,
  30332. WOLFSSL_X509_PKCS12 **pkcs12)
  30333. {
  30334. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  30335. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12,
  30336. PKCS12_TYPE);
  30337. }
  30338. #endif /* !NO_FILESYSTEM */
  30339. #endif /* OPENSSL_EXTRA */
  30340. #if defined(HAVE_PKCS12)
  30341. #ifdef OPENSSL_EXTRA
  30342. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  30343. #ifndef NO_BIO
  30344. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  30345. {
  30346. WC_PKCS12* localPkcs12 = NULL;
  30347. unsigned char* mem = NULL;
  30348. long memSz;
  30349. int ret = -1;
  30350. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  30351. if (bio == NULL) {
  30352. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  30353. return NULL;
  30354. }
  30355. memSz = wolfSSL_BIO_get_len(bio);
  30356. if (memSz <= 0) {
  30357. return NULL;
  30358. }
  30359. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30360. if (mem == NULL) {
  30361. return NULL;
  30362. }
  30363. if (mem != NULL) {
  30364. localPkcs12 = wc_PKCS12_new();
  30365. if (localPkcs12 == NULL) {
  30366. WOLFSSL_MSG("Memory error");
  30367. }
  30368. }
  30369. if (mem != NULL && localPkcs12 != NULL) {
  30370. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  30371. ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12);
  30372. if (ret < 0) {
  30373. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  30374. }
  30375. }
  30376. else {
  30377. WOLFSSL_MSG("Failed to get data from bio struct");
  30378. }
  30379. }
  30380. /* cleanup */
  30381. if (mem != NULL)
  30382. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30383. if (ret < 0 && localPkcs12 != NULL) {
  30384. wc_PKCS12_free(localPkcs12);
  30385. localPkcs12 = NULL;
  30386. }
  30387. if (pkcs12 != NULL)
  30388. *pkcs12 = localPkcs12;
  30389. return localPkcs12;
  30390. }
  30391. /* Converts the PKCS12 to DER format and outputs it into bio.
  30392. *
  30393. * bio is the structure to hold output DER
  30394. * pkcs12 structure to create DER from
  30395. *
  30396. * return 1 for success or 0 if an error occurs
  30397. */
  30398. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  30399. {
  30400. int ret = WOLFSSL_FAILURE;
  30401. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  30402. if ((bio != NULL) && (pkcs12 != NULL)) {
  30403. word32 certSz = 0;
  30404. byte *certDer = NULL;
  30405. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  30406. if ((certSz > 0) && (certDer != NULL)) {
  30407. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  30408. ret = WOLFSSL_SUCCESS;
  30409. }
  30410. }
  30411. if (certDer != NULL) {
  30412. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  30413. }
  30414. }
  30415. return ret;
  30416. }
  30417. #endif /* !NO_BIO */
  30418. /* Creates a new WC_PKCS12 structure
  30419. *
  30420. * pass password to use
  30421. * name friendlyName to use
  30422. * pkey private key to go into PKCS12 bundle
  30423. * cert certificate to go into PKCS12 bundle
  30424. * ca extra certificates that can be added to bundle. Can be NULL
  30425. * keyNID type of encryption to use on the key (-1 means no encryption)
  30426. * certNID type of encryption to use on the certificate
  30427. * itt number of iterations with encryption
  30428. * macItt number of iterations with mac creation
  30429. * keyType flag for signature and/or encryption key
  30430. *
  30431. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  30432. */
  30433. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey,
  30434. WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID,
  30435. int certNID, int itt, int macItt, int keyType)
  30436. {
  30437. WC_PKCS12* pkcs12;
  30438. WC_DerCertList* list = NULL;
  30439. word32 passSz;
  30440. byte* keyDer = NULL;
  30441. word32 keyDerSz;
  30442. byte* certDer;
  30443. int certDerSz;
  30444. WOLFSSL_ENTER("wolfSSL_PKCS12_create");
  30445. if (pass == NULL || pkey == NULL || cert == NULL) {
  30446. WOLFSSL_LEAVE("wolfSSL_PKCS12_create", BAD_FUNC_ARG);
  30447. return NULL;
  30448. }
  30449. passSz = (word32)XSTRLEN(pass);
  30450. keyDer = (byte*)pkey->pkey.ptr;
  30451. keyDerSz = pkey->pkey_sz;
  30452. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  30453. if (certDer == NULL) {
  30454. return NULL;
  30455. }
  30456. if (ca != NULL) {
  30457. unsigned long numCerts = ca->num;
  30458. WOLFSSL_STACK* sk = ca;
  30459. while (numCerts > 0 && sk != NULL) {
  30460. byte* curDer;
  30461. WC_DerCertList* cur;
  30462. int curDerSz = 0;
  30463. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  30464. DYNAMIC_TYPE_PKCS);
  30465. if (cur == NULL) {
  30466. wc_FreeCertList(list, NULL);
  30467. return NULL;
  30468. }
  30469. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  30470. if (curDer == NULL || curDerSz < 0) {
  30471. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  30472. wc_FreeCertList(list, NULL);
  30473. return NULL;
  30474. }
  30475. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  30476. if (cur->buffer == NULL) {
  30477. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  30478. wc_FreeCertList(list, NULL);
  30479. return NULL;
  30480. }
  30481. XMEMCPY(cur->buffer, curDer, curDerSz);
  30482. cur->bufferSz = curDerSz;
  30483. cur->next = list;
  30484. list = cur;
  30485. sk = sk->next;
  30486. numCerts--;
  30487. }
  30488. }
  30489. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  30490. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  30491. keyType, NULL);
  30492. if (ca != NULL) {
  30493. wc_FreeCertList(list, NULL);
  30494. }
  30495. return pkcs12;
  30496. }
  30497. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  30498. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  30499. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
  30500. WOLF_STACK_OF(WOLFSSL_X509)** ca)
  30501. {
  30502. void* heap = NULL;
  30503. int ret;
  30504. byte* certData = NULL;
  30505. word32 certDataSz;
  30506. byte* pk = NULL;
  30507. word32 pkSz;
  30508. WC_DerCertList* certList = NULL;
  30509. #ifdef WOLFSSL_SMALL_STACK
  30510. DecodedCert *DeCert;
  30511. #else
  30512. DecodedCert DeCert[1];
  30513. #endif
  30514. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  30515. /* make sure we init return args */
  30516. if (pkey) *pkey = NULL;
  30517. if (cert) *cert = NULL;
  30518. if (ca) *ca = NULL;
  30519. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  30520. WOLFSSL_MSG("Bad argument value");
  30521. return WOLFSSL_FAILURE;
  30522. }
  30523. heap = wc_PKCS12_GetHeap(pkcs12);
  30524. if (ca == NULL) {
  30525. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  30526. NULL);
  30527. }
  30528. else {
  30529. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  30530. &certList);
  30531. }
  30532. if (ret < 0) {
  30533. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  30534. return WOLFSSL_FAILURE;
  30535. }
  30536. #ifdef WOLFSSL_SMALL_STACK
  30537. DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap,
  30538. DYNAMIC_TYPE_DCERT);
  30539. if (DeCert == NULL) {
  30540. WOLFSSL_MSG("out of memory");
  30541. return WOLFSSL_FAILURE;
  30542. }
  30543. #endif
  30544. /* Decode cert and place in X509 stack struct */
  30545. if (certList != NULL) {
  30546. WC_DerCertList* current = certList;
  30547. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(
  30548. sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509);
  30549. if (*ca == NULL) {
  30550. if (pk != NULL) {
  30551. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30552. }
  30553. if (certData != NULL) {
  30554. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30555. }
  30556. /* Free up WC_DerCertList and move on */
  30557. while (current != NULL) {
  30558. WC_DerCertList* next = current->next;
  30559. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  30560. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  30561. current = next;
  30562. }
  30563. ret = WOLFSSL_FAILURE;
  30564. goto out;
  30565. }
  30566. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  30567. /* add list of DER certs as X509's to stack */
  30568. while (current != NULL) {
  30569. WC_DerCertList* toFree = current;
  30570. WOLFSSL_X509* x509;
  30571. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  30572. DYNAMIC_TYPE_X509);
  30573. InitX509(x509, 1, heap);
  30574. InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap);
  30575. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  30576. WOLFSSL_MSG("Issue with parsing certificate");
  30577. FreeDecodedCert(DeCert);
  30578. wolfSSL_X509_free(x509);
  30579. }
  30580. else {
  30581. if (CopyDecodedToX509(x509, DeCert) != 0) {
  30582. WOLFSSL_MSG("Failed to copy decoded cert");
  30583. FreeDecodedCert(DeCert);
  30584. wolfSSL_X509_free(x509);
  30585. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30586. if (pk != NULL) {
  30587. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30588. }
  30589. if (certData != NULL) {
  30590. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30591. }
  30592. /* Free up WC_DerCertList */
  30593. while (current != NULL) {
  30594. WC_DerCertList* next = current->next;
  30595. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  30596. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  30597. current = next;
  30598. }
  30599. ret = WOLFSSL_FAILURE;
  30600. goto out;
  30601. }
  30602. FreeDecodedCert(DeCert);
  30603. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  30604. WOLFSSL_MSG("Failed to push x509 onto stack");
  30605. wolfSSL_X509_free(x509);
  30606. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30607. if (pk != NULL) {
  30608. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30609. }
  30610. if (certData != NULL) {
  30611. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30612. }
  30613. /* Free up WC_DerCertList */
  30614. while (current != NULL) {
  30615. WC_DerCertList* next = current->next;
  30616. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  30617. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  30618. current = next;
  30619. }
  30620. ret = WOLFSSL_FAILURE;
  30621. goto out;
  30622. }
  30623. }
  30624. current = current->next;
  30625. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  30626. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  30627. }
  30628. }
  30629. /* Decode cert and place in X509 struct */
  30630. if (certData != NULL) {
  30631. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  30632. DYNAMIC_TYPE_X509);
  30633. if (*cert == NULL) {
  30634. if (pk != NULL) {
  30635. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30636. }
  30637. if (ca != NULL) {
  30638. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30639. }
  30640. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30641. ret = WOLFSSL_FAILURE;
  30642. goto out;
  30643. }
  30644. InitX509(*cert, 1, heap);
  30645. InitDecodedCert(DeCert, certData, certDataSz, heap);
  30646. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  30647. WOLFSSL_MSG("Issue with parsing certificate");
  30648. }
  30649. if (CopyDecodedToX509(*cert, DeCert) != 0) {
  30650. WOLFSSL_MSG("Failed to copy decoded cert");
  30651. FreeDecodedCert(DeCert);
  30652. if (pk != NULL) {
  30653. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30654. }
  30655. if (ca != NULL) {
  30656. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30657. }
  30658. wolfSSL_X509_free(*cert); *cert = NULL;
  30659. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30660. ret = WOLFSSL_FAILURE;
  30661. goto out;
  30662. }
  30663. FreeDecodedCert(DeCert);
  30664. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  30665. }
  30666. /* get key type */
  30667. ret = BAD_STATE_E;
  30668. if (pk != NULL) { /* decode key if present */
  30669. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  30670. if (*pkey == NULL) {
  30671. wolfSSL_X509_free(*cert); *cert = NULL;
  30672. if (ca != NULL) {
  30673. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30674. }
  30675. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30676. ret = WOLFSSL_FAILURE;
  30677. goto out;
  30678. }
  30679. #ifndef NO_RSA
  30680. {
  30681. const unsigned char* pt = pk;
  30682. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) !=
  30683. NULL) {
  30684. ret = 0;
  30685. }
  30686. }
  30687. #endif /* NO_RSA */
  30688. #ifdef HAVE_ECC
  30689. if (ret != 0) { /* if is in fail state check if ECC key */
  30690. const unsigned char* pt = pk;
  30691. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) !=
  30692. NULL) {
  30693. ret = 0;
  30694. }
  30695. }
  30696. #endif /* HAVE_ECC */
  30697. if (pk != NULL)
  30698. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  30699. if (ret != 0) { /* if is in fail state and no PKEY then fail */
  30700. wolfSSL_X509_free(*cert); *cert = NULL;
  30701. if (ca != NULL) {
  30702. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  30703. }
  30704. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  30705. WOLFSSL_MSG("Bad PKCS12 key format");
  30706. ret = WOLFSSL_FAILURE;
  30707. goto out;
  30708. }
  30709. if (pkey != NULL && *pkey != NULL) {
  30710. (*pkey)->save_type = 0;
  30711. }
  30712. }
  30713. (void)ret;
  30714. (void)ca;
  30715. ret = WOLFSSL_SUCCESS;
  30716. out:
  30717. #ifdef WOLFSSL_SMALL_STACK
  30718. XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT);
  30719. #endif
  30720. return ret;
  30721. }
  30722. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  30723. int pswLen)
  30724. {
  30725. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  30726. if (!pkcs12) {
  30727. return WOLFSSL_FAILURE;
  30728. }
  30729. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  30730. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  30731. }
  30732. #endif /* !NO_ASN && !NO_PWDBASED */
  30733. #endif /* OPENSSL_EXTRA */
  30734. #endif /* HAVE_PKCS12 */
  30735. /*******************************************************************************
  30736. * END OF PKCS12 APIs
  30737. ******************************************************************************/
  30738. #endif /* !NO_CERTS */
  30739. /*******************************************************************************
  30740. * BEGIN OPENSSL FIPS DRBG APIs
  30741. ******************************************************************************/
  30742. #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG)
  30743. int wolfSSL_FIPS_drbg_init(WOLFSSL_DRBG_CTX *ctx, int type, unsigned int flags)
  30744. {
  30745. int ret = WOLFSSL_FAILURE;
  30746. if (ctx != NULL) {
  30747. XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX));
  30748. ctx->type = type;
  30749. ctx->xflags = flags;
  30750. ctx->status = DRBG_STATUS_UNINITIALISED;
  30751. ret = WOLFSSL_SUCCESS;
  30752. }
  30753. return ret;
  30754. }
  30755. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_drbg_new(int type, unsigned int flags)
  30756. {
  30757. int ret = WOLFSSL_FAILURE;
  30758. WOLFSSL_DRBG_CTX* ctx = (WOLFSSL_DRBG_CTX*)XMALLOC(sizeof(WOLFSSL_DRBG_CTX),
  30759. NULL, DYNAMIC_TYPE_OPENSSL);
  30760. ret = wolfSSL_FIPS_drbg_init(ctx, type, flags);
  30761. if (ret == WOLFSSL_SUCCESS && type != 0) {
  30762. ret = wolfSSL_FIPS_drbg_instantiate(ctx, NULL, 0);
  30763. }
  30764. if (ret != WOLFSSL_SUCCESS) {
  30765. WOLFSSL_ERROR(ret);
  30766. wolfSSL_FIPS_drbg_free(ctx);
  30767. ctx = NULL;
  30768. }
  30769. return ctx;
  30770. }
  30771. int wolfSSL_FIPS_drbg_instantiate(WOLFSSL_DRBG_CTX* ctx,
  30772. const unsigned char* pers, size_t perslen)
  30773. {
  30774. int ret = WOLFSSL_FAILURE;
  30775. if (ctx != NULL && ctx->rng == NULL) {
  30776. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  30777. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  30778. ctx->rng = wc_rng_new((byte*)pers, (word32)perslen, NULL);
  30779. #else
  30780. ctx->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30781. if (ctx->rng != NULL) {
  30782. #if defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)
  30783. ret = wc_InitRngNonce(ctx->rng, (byte*)pers, (word32)perslen);
  30784. #else
  30785. ret = wc_InitRng(ctx->rng);
  30786. (void)pers;
  30787. (void)perslen;
  30788. #endif
  30789. if (ret != 0) {
  30790. WOLFSSL_ERROR(ret);
  30791. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  30792. ctx->rng = NULL;
  30793. }
  30794. }
  30795. #endif
  30796. }
  30797. if (ctx != NULL && ctx->rng != NULL) {
  30798. ctx->status = DRBG_STATUS_READY;
  30799. ret = WOLFSSL_SUCCESS;
  30800. }
  30801. return ret;
  30802. }
  30803. int wolfSSL_FIPS_drbg_set_callbacks(WOLFSSL_DRBG_CTX* ctx,
  30804. drbg_entropy_get entropy_get, drbg_entropy_clean entropy_clean,
  30805. size_t entropy_blocklen,
  30806. drbg_nonce_get none_get, drbg_nonce_clean nonce_clean)
  30807. {
  30808. int ret = WOLFSSL_FAILURE;
  30809. if (ctx != NULL) {
  30810. ctx->entropy_get = entropy_get;
  30811. ctx->entropy_clean = entropy_clean;
  30812. ctx->entropy_blocklen = entropy_blocklen;
  30813. ctx->none_get = none_get;
  30814. ctx->nonce_clean = nonce_clean;
  30815. ret = WOLFSSL_SUCCESS;
  30816. }
  30817. return ret;
  30818. }
  30819. void wolfSSL_FIPS_rand_add(const void* buf, int num, double entropy)
  30820. {
  30821. /* not implemented */
  30822. (void)buf;
  30823. (void)num;
  30824. (void)entropy;
  30825. }
  30826. int wolfSSL_FIPS_drbg_reseed(WOLFSSL_DRBG_CTX* ctx, const unsigned char* adin,
  30827. size_t adinlen)
  30828. {
  30829. int ret = WOLFSSL_FAILURE;
  30830. if (ctx != NULL && ctx->rng != NULL) {
  30831. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  30832. (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)))
  30833. if (wc_RNG_DRBG_Reseed(ctx->rng, adin, (word32)adinlen) == 0) {
  30834. ret = WOLFSSL_SUCCESS;
  30835. }
  30836. #else
  30837. ret = WOLFSSL_SUCCESS;
  30838. (void)adin;
  30839. (void)adinlen;
  30840. #endif
  30841. }
  30842. return ret;
  30843. }
  30844. int wolfSSL_FIPS_drbg_generate(WOLFSSL_DRBG_CTX* ctx, unsigned char* out,
  30845. size_t outlen, int prediction_resistance, const unsigned char* adin,
  30846. size_t adinlen)
  30847. {
  30848. int ret = WOLFSSL_FAILURE;
  30849. if (ctx != NULL && ctx->rng != NULL) {
  30850. ret = wc_RNG_GenerateBlock(ctx->rng, out, (word32)outlen);
  30851. if (ret == 0) {
  30852. ret = WOLFSSL_SUCCESS;
  30853. }
  30854. }
  30855. (void)prediction_resistance;
  30856. (void)adin;
  30857. (void)adinlen;
  30858. return ret;
  30859. }
  30860. int wolfSSL_FIPS_drbg_uninstantiate(WOLFSSL_DRBG_CTX *ctx)
  30861. {
  30862. if (ctx != NULL && ctx->rng != NULL) {
  30863. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  30864. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  30865. wc_rng_free(ctx->rng);
  30866. #else
  30867. wc_FreeRng(ctx->rng);
  30868. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  30869. #endif
  30870. ctx->rng = NULL;
  30871. ctx->status = DRBG_STATUS_UNINITIALISED;
  30872. }
  30873. return WOLFSSL_SUCCESS;
  30874. }
  30875. void wolfSSL_FIPS_drbg_free(WOLFSSL_DRBG_CTX *ctx)
  30876. {
  30877. if (ctx != NULL) {
  30878. /* As safety check if free'ing the default drbg, then mark global NULL.
  30879. * Technically the user should not call free on the default drbg. */
  30880. if (ctx == gDrbgDefCtx) {
  30881. gDrbgDefCtx = NULL;
  30882. }
  30883. wolfSSL_FIPS_drbg_uninstantiate(ctx);
  30884. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  30885. }
  30886. }
  30887. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_get_default_drbg(void)
  30888. {
  30889. if (gDrbgDefCtx == NULL) {
  30890. gDrbgDefCtx = wolfSSL_FIPS_drbg_new(0, 0);
  30891. }
  30892. return gDrbgDefCtx;
  30893. }
  30894. void wolfSSL_FIPS_get_timevec(unsigned char* buf, unsigned long* pctr)
  30895. {
  30896. /* not implemented */
  30897. (void)buf;
  30898. (void)pctr;
  30899. }
  30900. void* wolfSSL_FIPS_drbg_get_app_data(WOLFSSL_DRBG_CTX *ctx)
  30901. {
  30902. if (ctx != NULL) {
  30903. return ctx->app_data;
  30904. }
  30905. return NULL;
  30906. }
  30907. void wolfSSL_FIPS_drbg_set_app_data(WOLFSSL_DRBG_CTX *ctx, void *app_data)
  30908. {
  30909. if (ctx != NULL) {
  30910. ctx->app_data = app_data;
  30911. }
  30912. }
  30913. #endif
  30914. /*******************************************************************************
  30915. * END OF OPENSSL FIPS DRBG APIs
  30916. ******************************************************************************/
  30917. #endif /* !WOLFCRYPT_ONLY */