ssl.c 1.2 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2022 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. #ifndef WOLFCRYPT_ONLY
  82. #include <wolfssl/openssl/pem.h>
  83. #endif
  84. #include <wolfssl/openssl/ec.h>
  85. #include <wolfssl/openssl/ec25519.h>
  86. #include <wolfssl/openssl/ed25519.h>
  87. #include <wolfssl/openssl/ec448.h>
  88. #include <wolfssl/openssl/ed448.h>
  89. #include <wolfssl/openssl/ecdsa.h>
  90. #include <wolfssl/openssl/ecdh.h>
  91. #include <wolfssl/openssl/err.h>
  92. #include <wolfssl/openssl/modes.h>
  93. #include <wolfssl/openssl/opensslv.h>
  94. #include <wolfssl/openssl/rc4.h>
  95. #include <wolfssl/openssl/stack.h>
  96. #include <wolfssl/openssl/x509_vfy.h>
  97. /* openssl headers end, wolfssl internal headers next */
  98. #include <wolfssl/wolfcrypt/hmac.h>
  99. #include <wolfssl/wolfcrypt/random.h>
  100. #include <wolfssl/wolfcrypt/des3.h>
  101. #include <wolfssl/wolfcrypt/ecc.h>
  102. #include <wolfssl/wolfcrypt/md4.h>
  103. #include <wolfssl/wolfcrypt/md5.h>
  104. #include <wolfssl/wolfcrypt/arc4.h>
  105. #include <wolfssl/wolfcrypt/curve25519.h>
  106. #include <wolfssl/wolfcrypt/ed25519.h>
  107. #include <wolfssl/wolfcrypt/curve448.h>
  108. #if defined(HAVE_PQC)
  109. #if defined(HAVE_FALCON)
  110. #include <wolfssl/wolfcrypt/falcon.h>
  111. #endif /* HAVE_FALCON */
  112. #if defined(HAVE_DILITHIUM)
  113. #include <wolfssl/wolfcrypt/dilithium.h>
  114. #endif /* HAVE_DILITHIUM */
  115. #endif /* HAVE_PQC */
  116. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  117. #ifdef HAVE_OCSP
  118. #include <wolfssl/openssl/ocsp.h>
  119. #endif
  120. #include <wolfssl/openssl/lhash.h>
  121. #include <wolfssl/openssl/txt_db.h>
  122. #endif /* WITH_STUNNEL */
  123. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  124. #include <wolfssl/wolfcrypt/sha512.h>
  125. #endif
  126. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  127. && !defined(WC_NO_RNG)
  128. #include <wolfssl/wolfcrypt/srp.h>
  129. #endif
  130. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  131. #include <wolfssl/wolfcrypt/pkcs7.h>
  132. #endif
  133. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  134. #include <wolfssl/openssl/pkcs7.h>
  135. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  136. #endif
  137. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  138. #include <wolfssl/openssl/x509v3.h>
  139. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  140. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  141. #endif
  142. #if defined(WOLFSSL_QT)
  143. #include <wolfssl/wolfcrypt/sha.h>
  144. #endif
  145. #ifdef NO_ASN
  146. #include <wolfssl/wolfcrypt/dh.h>
  147. #endif
  148. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  149. #ifdef WOLFSSL_SYS_CA_CERTS
  150. #ifdef _WIN32
  151. #include <windows.h>
  152. #include <Wincrypt.h>
  153. #pragma comment(lib, "crypt32")
  154. #endif
  155. #if defined(__APPLE__) && defined(HAVE_SECURITY_SECTRUSTSETTINGS_H)
  156. #include <Security/SecTrustSettings.h>
  157. #endif
  158. #endif /* WOLFSSL_SYS_CA_CERTS */
  159. /*
  160. * OPENSSL_COMPATIBLE_DEFAULTS:
  161. * Enable default behaviour that is compatible with OpenSSL. For example
  162. * SSL_CTX by default doesn't verify the loaded certs. Enabling this
  163. * should make porting to new projects easier.
  164. * WOLFSSL_CHECK_ALERT_ON_ERR:
  165. * Check for alerts during the handshake in the event of an error.
  166. * NO_SESSION_CACHE_REF:
  167. * wolfSSL_get_session on a client will return a reference to the internal
  168. * ClientCache by default for backwards compatibility. This define will
  169. * make wolfSSL_get_session return a reference to ssl->session. The returned
  170. * pointer will be freed with the related WOLFSSL object.
  171. * WOLFSSL_SYS_CA_CERTS
  172. * Enables ability to load system CA certs from the OS via
  173. * wolfSSL_CTX_load_system_CA_certs.
  174. */
  175. #define WOLFSSL_SSL_MISC_INCLUDED
  176. #include "src/ssl_misc.c"
  177. #define WOLFSSL_EVP_INCLUDED
  178. #include "wolfcrypt/src/evp.c"
  179. #ifndef WOLFCRYPT_ONLY
  180. #define WOLFSSL_PK_INCLUDED
  181. #include "src/pk.c"
  182. #ifdef OPENSSL_EXTRA
  183. /* Global pointer to constant BN on */
  184. static WOLFSSL_BIGNUM* bn_one = NULL;
  185. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  186. * OPENSSL_EXTRA where RAND callbacks are not used */
  187. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  188. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  189. static int gRandMethodsInit = 0;
  190. static wolfSSL_Mutex gRandMethodMutex;
  191. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  192. #endif /* OPENSSL_EXTRA */
  193. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  194. const WOLF_EC_NIST_NAME kNistCurves[] = {
  195. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  196. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  197. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  198. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  199. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  200. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  201. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  202. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  203. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  204. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  205. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  206. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  207. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  208. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  209. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  210. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  211. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  212. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  213. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  214. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  215. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  216. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  217. #ifdef HAVE_PQC
  218. {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
  219. {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
  220. {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
  221. #ifdef HAVE_LIBOQS
  222. {XSTR_SIZEOF("NTRU_HPS_LEVEL1"), "NTRU_HPS_LEVEL1", WOLFSSL_NTRU_HPS_LEVEL1},
  223. {XSTR_SIZEOF("NTRU_HPS_LEVEL3"), "NTRU_HPS_LEVEL3", WOLFSSL_NTRU_HPS_LEVEL3},
  224. {XSTR_SIZEOF("NTRU_HPS_LEVEL5"), "NTRU_HPS_LEVEL5", WOLFSSL_NTRU_HPS_LEVEL5},
  225. {XSTR_SIZEOF("NTRU_HRSS_LEVEL3"), "NTRU_HRSS_LEVEL3", WOLFSSL_NTRU_HRSS_LEVEL3},
  226. {XSTR_SIZEOF("SABER_LEVEL1"), "SABER_LEVEL1", WOLFSSL_SABER_LEVEL1},
  227. {XSTR_SIZEOF("SABER_LEVEL3"), "SABER_LEVEL3", WOLFSSL_SABER_LEVEL3},
  228. {XSTR_SIZEOF("SABER_LEVEL5"), "SABER_LEVEL5", WOLFSSL_SABER_LEVEL5},
  229. {XSTR_SIZEOF("KYBER_90S_LEVEL1"), "KYBER_90S_LEVEL1", WOLFSSL_KYBER_90S_LEVEL1},
  230. {XSTR_SIZEOF("KYBER_90S_LEVEL3"), "KYBER_90S_LEVEL3", WOLFSSL_KYBER_90S_LEVEL3},
  231. {XSTR_SIZEOF("KYBER_90S_LEVEL5"), "KYBER_90S_LEVEL5", WOLFSSL_KYBER_90S_LEVEL5},
  232. {XSTR_SIZEOF("P256_NTRU_HPS_LEVEL1"), "P256_NTRU_HPS_LEVEL1", WOLFSSL_P256_NTRU_HPS_LEVEL1},
  233. {XSTR_SIZEOF("P384_NTRU_HPS_LEVEL3"), "P384_NTRU_HPS_LEVEL3", WOLFSSL_P384_NTRU_HPS_LEVEL3},
  234. {XSTR_SIZEOF("P521_NTRU_HPS_LEVEL5"), "P521_NTRU_HPS_LEVEL5", WOLFSSL_P521_NTRU_HPS_LEVEL5},
  235. {XSTR_SIZEOF("P384_NTRU_HRSS_LEVEL3"), "P384_NTRU_HRSS_LEVEL3", WOLFSSL_P384_NTRU_HRSS_LEVEL3},
  236. {XSTR_SIZEOF("P256_SABER_LEVEL1"), "P256_SABER_LEVEL1", WOLFSSL_P256_SABER_LEVEL1},
  237. {XSTR_SIZEOF("P384_SABER_LEVEL3"), "P384_SABER_LEVEL3", WOLFSSL_P384_SABER_LEVEL3},
  238. {XSTR_SIZEOF("P521_SABER_LEVEL5"), "P521_SABER_LEVEL5", WOLFSSL_P521_SABER_LEVEL5},
  239. {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1},
  240. {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3},
  241. {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5},
  242. {XSTR_SIZEOF("P256_KYBER_90S_LEVEL1"), "P256_KYBER_90S_LEVEL1", WOLFSSL_P256_KYBER_90S_LEVEL1},
  243. {XSTR_SIZEOF("P384_KYBER_90S_LEVEL3"), "P384_KYBER_90S_LEVEL3", WOLFSSL_P384_KYBER_90S_LEVEL3},
  244. {XSTR_SIZEOF("P521_KYBER_90S_LEVEL5"), "P521_KYBER_90S_LEVEL5", WOLFSSL_P521_KYBER_90S_LEVEL5},
  245. #endif
  246. #endif
  247. {0, NULL, 0},
  248. };
  249. #endif
  250. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  251. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  252. #endif
  253. #ifdef WOLFSSL_SESSION_EXPORT
  254. /* Used to import a serialized TLS session.
  255. * WARNING: buf contains sensitive information about the state and is best to be
  256. * encrypted before storing if stored.
  257. *
  258. * @param ssl WOLFSSL structure to import the session into
  259. * @param buf serialized session
  260. * @param sz size of buffer 'buf'
  261. * @return the number of bytes read from buffer 'buf'
  262. */
  263. int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  264. {
  265. if (ssl == NULL || buf == NULL) {
  266. return BAD_FUNC_ARG;
  267. }
  268. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  269. }
  270. /* Used to export a serialized TLS session.
  271. * WARNING: buf contains sensitive information about the state and is best to be
  272. * encrypted before storing if stored.
  273. *
  274. * @param ssl WOLFSSL structure to export the session from
  275. * @param buf output of serialized session
  276. * @param sz size in bytes set in 'buf'
  277. * @return the number of bytes written into buffer 'buf'
  278. */
  279. int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  280. {
  281. if (ssl == NULL || sz == NULL) {
  282. return BAD_FUNC_ARG;
  283. }
  284. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  285. }
  286. #ifdef WOLFSSL_DTLS
  287. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  288. {
  289. WOLFSSL_ENTER("wolfSSL_session_import");
  290. if (ssl == NULL || buf == NULL) {
  291. return BAD_FUNC_ARG;
  292. }
  293. /* sanity checks on buffer and protocol are done in internal function */
  294. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  295. }
  296. /* Sets the function to call for serializing the session. This function is
  297. * called right after the handshake is completed. */
  298. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  299. {
  300. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  301. /* purposefully allow func to be NULL */
  302. if (ctx == NULL) {
  303. return BAD_FUNC_ARG;
  304. }
  305. ctx->dtls_export = func;
  306. return WOLFSSL_SUCCESS;
  307. }
  308. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  309. * function is called right after the handshake is completed. */
  310. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  311. {
  312. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  313. /* purposefully allow func to be NULL */
  314. if (ssl == NULL) {
  315. return BAD_FUNC_ARG;
  316. }
  317. ssl->dtls_export = func;
  318. return WOLFSSL_SUCCESS;
  319. }
  320. /* This function allows for directly serializing a session rather than using
  321. * callbacks. It has less overhead by removing a temporary buffer and gives
  322. * control over when the session gets serialized. When using callbacks the
  323. * session is always serialized immediately after the handshake is finished.
  324. *
  325. * buf is the argument to contain the serialized session
  326. * sz is the size of the buffer passed in
  327. * ssl is the WOLFSSL struct to serialize
  328. * returns the size of serialized session on success, 0 on no action, and
  329. * negative value on error */
  330. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  331. {
  332. WOLFSSL_ENTER("wolfSSL_dtls_export");
  333. if (ssl == NULL || sz == NULL) {
  334. return BAD_FUNC_ARG;
  335. }
  336. if (buf == NULL) {
  337. *sz = MAX_EXPORT_BUFFER;
  338. return 0;
  339. }
  340. /* if not DTLS do nothing */
  341. if (!ssl->options.dtls) {
  342. WOLFSSL_MSG("Currently only DTLS export is supported");
  343. return 0;
  344. }
  345. /* copy over keys, options, and dtls state struct */
  346. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  347. }
  348. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  349. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  350. * sequence number, epoch, AEAD state etc.
  351. *
  352. * buf is the argument to contain the serialized state, if null then set "sz" to
  353. * buffer size required
  354. * sz is the size of the buffer passed in
  355. * ssl is the WOLFSSL struct to serialize
  356. * returns the size of serialized session on success, 0 on no action, and
  357. * negative value on error */
  358. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  359. unsigned int* sz)
  360. {
  361. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  362. if (ssl == NULL || sz == NULL) {
  363. return BAD_FUNC_ARG;
  364. }
  365. if (buf == NULL) {
  366. *sz = MAX_EXPORT_STATE_BUFFER;
  367. return 0;
  368. }
  369. /* if not DTLS do nothing */
  370. if (!ssl->options.dtls) {
  371. WOLFSSL_MSG("Currently only DTLS export state is supported");
  372. return 0;
  373. }
  374. /* copy over keys, options, and dtls state struct */
  375. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  376. }
  377. /* returns 0 on success */
  378. int wolfSSL_send_session(WOLFSSL* ssl)
  379. {
  380. int ret;
  381. byte* buf;
  382. word32 bufSz = MAX_EXPORT_BUFFER;
  383. WOLFSSL_ENTER("wolfSSL_send_session");
  384. if (ssl == NULL) {
  385. return BAD_FUNC_ARG;
  386. }
  387. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  388. if (buf == NULL) {
  389. return MEMORY_E;
  390. }
  391. /* if not DTLS do nothing */
  392. if (!ssl->options.dtls) {
  393. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  394. WOLFSSL_MSG("Currently only DTLS export is supported");
  395. return 0;
  396. }
  397. /* copy over keys, options, and dtls state struct */
  398. ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS);
  399. if (ret < 0) {
  400. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  401. return ret;
  402. }
  403. /* if no error ret has size of buffer */
  404. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  405. if (ret != WOLFSSL_SUCCESS) {
  406. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  407. return ret;
  408. }
  409. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  410. return 0;
  411. }
  412. #endif /* WOLFSSL_DTLS */
  413. #endif /* WOLFSSL_SESSION_EXPORT */
  414. /* prevent multiple mutex initializations */
  415. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  416. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  417. static WOLFSSL_GLOBAL int count_mutex_valid = 0;
  418. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  419. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  420. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  421. success is freed when ctx is freed.
  422. */
  423. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  424. {
  425. WOLFSSL_CTX* ctx = NULL;
  426. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  427. if (initRefCount == 0) {
  428. /* user no longer forced to call Init themselves */
  429. int ret = wolfSSL_Init();
  430. if (ret != WOLFSSL_SUCCESS) {
  431. WOLFSSL_MSG("wolfSSL_Init failed");
  432. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  433. if (method != NULL) {
  434. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  435. }
  436. return NULL;
  437. }
  438. }
  439. if (method == NULL)
  440. return ctx;
  441. ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  442. if (ctx) {
  443. int ret;
  444. ret = InitSSL_Ctx(ctx, method, heap);
  445. #ifdef WOLFSSL_STATIC_MEMORY
  446. if (heap != NULL) {
  447. ctx->onHeapHint = 1; /* free the memory back to heap when done */
  448. }
  449. #endif
  450. if (ret < 0) {
  451. WOLFSSL_MSG("Init CTX failed");
  452. wolfSSL_CTX_free(ctx);
  453. ctx = NULL;
  454. }
  455. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  456. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  457. else {
  458. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  459. if (ctx->srp == NULL){
  460. WOLFSSL_MSG("Init CTX failed");
  461. wolfSSL_CTX_free(ctx);
  462. return NULL;
  463. }
  464. XMEMSET(ctx->srp, 0, sizeof(Srp));
  465. }
  466. #endif
  467. }
  468. else {
  469. WOLFSSL_MSG("Alloc CTX failed, method freed");
  470. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  471. }
  472. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  473. if (ctx) {
  474. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  475. wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
  476. if (wolfSSL_CTX_set_min_proto_version(ctx,
  477. (method->version.major == DTLS_MAJOR) ?
  478. DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS ||
  479. #ifdef HAVE_ANON
  480. wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS ||
  481. #endif
  482. wolfSSL_CTX_set_group_messages(ctx) != WOLFSSL_SUCCESS) {
  483. WOLFSSL_MSG("Setting OpenSSL CTX defaults failed");
  484. wolfSSL_CTX_free(ctx);
  485. ctx = NULL;
  486. }
  487. }
  488. #endif
  489. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  490. return ctx;
  491. }
  492. WOLFSSL_ABI
  493. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  494. {
  495. #ifdef WOLFSSL_HEAP_TEST
  496. /* if testing the heap hint then set top level CTX to have test value */
  497. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  498. #else
  499. return wolfSSL_CTX_new_ex(method, NULL);
  500. #endif
  501. }
  502. /* increases CTX reference count to track proper time to "free" */
  503. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  504. {
  505. int refCount = SSL_CTX_RefCount(ctx, 1);
  506. return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  507. }
  508. WOLFSSL_ABI
  509. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  510. {
  511. WOLFSSL_ENTER("SSL_CTX_free");
  512. if (ctx) {
  513. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  514. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  515. if (ctx->srp != NULL) {
  516. if (ctx->srp_password != NULL){
  517. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  518. ctx->srp_password = NULL;
  519. }
  520. wc_SrpTerm(ctx->srp);
  521. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  522. ctx->srp = NULL;
  523. }
  524. #endif
  525. FreeSSL_Ctx(ctx);
  526. }
  527. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  528. }
  529. #ifdef HAVE_ENCRYPT_THEN_MAC
  530. /**
  531. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  532. * The default value: enabled.
  533. *
  534. * ctx SSL/TLS context.
  535. * set Whether to allow or not: 1 is allow and 0 is disallow.
  536. * returns WOLFSSL_SUCCESS
  537. */
  538. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  539. {
  540. ctx->disallowEncThenMac = !set;
  541. return WOLFSSL_SUCCESS;
  542. }
  543. /**
  544. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  545. * The default value comes from context.
  546. *
  547. * ctx SSL/TLS context.
  548. * set Whether to allow or not: 1 is allow and 0 is disallow.
  549. * returns WOLFSSL_SUCCESS
  550. */
  551. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  552. {
  553. ssl->options.disallowEncThenMac = !set;
  554. return WOLFSSL_SUCCESS;
  555. }
  556. #endif
  557. #ifdef SINGLE_THREADED
  558. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  559. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  560. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  561. {
  562. WC_RNG* rng;
  563. int ret;
  564. if (ctx == NULL) {
  565. return BAD_FUNC_ARG;
  566. }
  567. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  568. if (rng == NULL) {
  569. return MEMORY_E;
  570. }
  571. #ifndef HAVE_FIPS
  572. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  573. #else
  574. ret = wc_InitRng(rng);
  575. #endif
  576. if (ret != 0) {
  577. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  578. return ret;
  579. }
  580. ctx->rng = rng;
  581. return WOLFSSL_SUCCESS;
  582. }
  583. #endif
  584. WOLFSSL_ABI
  585. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  586. {
  587. WOLFSSL* ssl = NULL;
  588. int ret = 0;
  589. WOLFSSL_ENTER("SSL_new");
  590. if (ctx == NULL)
  591. return ssl;
  592. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  593. if (ssl)
  594. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  595. FreeSSL(ssl, ctx->heap);
  596. ssl = 0;
  597. }
  598. WOLFSSL_LEAVE("SSL_new", ret);
  599. (void)ret;
  600. return ssl;
  601. }
  602. WOLFSSL_ABI
  603. void wolfSSL_free(WOLFSSL* ssl)
  604. {
  605. WOLFSSL_ENTER("SSL_free");
  606. if (ssl)
  607. FreeSSL(ssl, ssl->ctx->heap);
  608. WOLFSSL_LEAVE("SSL_free", 0);
  609. }
  610. int wolfSSL_is_server(WOLFSSL* ssl)
  611. {
  612. if (ssl == NULL)
  613. return BAD_FUNC_ARG;
  614. return ssl->options.side == WOLFSSL_SERVER_END;
  615. }
  616. #ifdef HAVE_WRITE_DUP
  617. /*
  618. * Release resources around WriteDup object
  619. *
  620. * ssl WOLFSSL object
  621. *
  622. * no return, destruction so make best attempt
  623. */
  624. void FreeWriteDup(WOLFSSL* ssl)
  625. {
  626. int doFree = 0;
  627. WOLFSSL_ENTER("FreeWriteDup");
  628. if (ssl->dupWrite) {
  629. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  630. ssl->dupWrite->dupCount--;
  631. if (ssl->dupWrite->dupCount == 0) {
  632. doFree = 1;
  633. } else {
  634. WOLFSSL_MSG("WriteDup count not zero, no full free");
  635. }
  636. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  637. }
  638. }
  639. if (doFree) {
  640. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  641. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  642. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  643. }
  644. }
  645. /*
  646. * duplicate existing ssl members into dup needed for writing
  647. *
  648. * dup write only WOLFSSL
  649. * ssl existing WOLFSSL
  650. *
  651. * 0 on success
  652. */
  653. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  654. {
  655. /* shared dupWrite setup */
  656. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  657. DYNAMIC_TYPE_WRITEDUP);
  658. if (ssl->dupWrite == NULL) {
  659. return MEMORY_E;
  660. }
  661. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  662. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  663. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  664. ssl->dupWrite = NULL;
  665. return BAD_MUTEX_E;
  666. }
  667. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  668. dup->dupWrite = ssl->dupWrite; /* each side uses */
  669. /* copy write parts over to dup writer */
  670. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  671. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  672. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  673. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  674. XMEMCPY(&dup->version, &ssl->version, sizeof(ProtocolVersion));
  675. XMEMCPY(&dup->chVersion, &ssl->chVersion, sizeof(ProtocolVersion));
  676. /* dup side now owns encrypt/write ciphers */
  677. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  678. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  679. dup->CBIOSend = ssl->CBIOSend;
  680. #ifdef OPENSSL_EXTRA
  681. dup->cbioFlag = ssl->cbioFlag;
  682. #endif
  683. dup->wfd = ssl->wfd;
  684. dup->wflags = ssl->wflags;
  685. #ifndef WOLFSSL_AEAD_ONLY
  686. dup->hmac = ssl->hmac;
  687. #endif
  688. #ifdef HAVE_TRUNCATED_HMAC
  689. dup->truncated_hmac = ssl->truncated_hmac;
  690. #endif
  691. /* unique side dup setup */
  692. dup->dupSide = WRITE_DUP_SIDE;
  693. ssl->dupSide = READ_DUP_SIDE;
  694. return 0;
  695. }
  696. /*
  697. * duplicate a WOLFSSL object post handshake for writing only
  698. * turn existing object into read only. Allows concurrent access from two
  699. * different threads.
  700. *
  701. * ssl existing WOLFSSL object
  702. *
  703. * return dup'd WOLFSSL object on success
  704. */
  705. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  706. {
  707. WOLFSSL* dup = NULL;
  708. int ret = 0;
  709. (void)ret;
  710. WOLFSSL_ENTER("wolfSSL_write_dup");
  711. if (ssl == NULL) {
  712. return ssl;
  713. }
  714. if (ssl->options.handShakeDone == 0) {
  715. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  716. return NULL;
  717. }
  718. if (ssl->dupWrite) {
  719. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  720. return NULL;
  721. }
  722. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  723. if (dup) {
  724. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  725. FreeSSL(dup, ssl->ctx->heap);
  726. dup = NULL;
  727. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  728. FreeSSL(dup, ssl->ctx->heap);
  729. dup = NULL;
  730. }
  731. }
  732. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  733. return dup;
  734. }
  735. /*
  736. * Notify write dup side of fatal error or close notify
  737. *
  738. * ssl WOLFSSL object
  739. * err Notify err
  740. *
  741. * 0 on success
  742. */
  743. int NotifyWriteSide(WOLFSSL* ssl, int err)
  744. {
  745. int ret;
  746. WOLFSSL_ENTER("NotifyWriteSide");
  747. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  748. if (ret == 0) {
  749. ssl->dupWrite->dupErr = err;
  750. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  751. }
  752. return ret;
  753. }
  754. #endif /* HAVE_WRITE_DUP */
  755. #ifdef HAVE_POLY1305
  756. /* set if to use old poly 1 for yes 0 to use new poly */
  757. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  758. {
  759. (void)ssl;
  760. (void)value;
  761. #ifndef WOLFSSL_NO_TLS12
  762. WOLFSSL_ENTER("SSL_use_old_poly");
  763. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  764. "is depreciated");
  765. ssl->options.oldPoly = (word16)value;
  766. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  767. #endif
  768. return 0;
  769. }
  770. #endif
  771. WOLFSSL_ABI
  772. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  773. {
  774. int ret;
  775. WOLFSSL_ENTER("SSL_set_fd");
  776. if (ssl == NULL) {
  777. return BAD_FUNC_ARG;
  778. }
  779. ret = wolfSSL_set_read_fd(ssl, fd);
  780. if (ret == WOLFSSL_SUCCESS) {
  781. ret = wolfSSL_set_write_fd(ssl, fd);
  782. }
  783. return ret;
  784. }
  785. #ifdef WOLFSSL_DTLS
  786. int wolfSSL_set_dtls_fd_connected(WOLFSSL* ssl, int fd)
  787. {
  788. int ret;
  789. WOLFSSL_ENTER("SSL_set_dtls_fd_connected");
  790. if (ssl == NULL) {
  791. return BAD_FUNC_ARG;
  792. }
  793. ret = wolfSSL_set_fd(ssl, fd);
  794. if (ret == WOLFSSL_SUCCESS)
  795. ssl->buffers.dtlsCtx.connected = 1;
  796. return ret;
  797. }
  798. #endif
  799. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  800. {
  801. WOLFSSL_ENTER("SSL_set_read_fd");
  802. if (ssl == NULL) {
  803. return BAD_FUNC_ARG;
  804. }
  805. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  806. ssl->IOCB_ReadCtx = &ssl->rfd;
  807. #ifdef WOLFSSL_DTLS
  808. ssl->buffers.dtlsCtx.connected = 0;
  809. if (ssl->options.dtls) {
  810. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  811. ssl->buffers.dtlsCtx.rfd = fd;
  812. }
  813. #endif
  814. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  815. return WOLFSSL_SUCCESS;
  816. }
  817. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  818. {
  819. WOLFSSL_ENTER("SSL_set_write_fd");
  820. if (ssl == NULL) {
  821. return BAD_FUNC_ARG;
  822. }
  823. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  824. ssl->IOCB_WriteCtx = &ssl->wfd;
  825. #ifdef WOLFSSL_DTLS
  826. ssl->buffers.dtlsCtx.connected = 0;
  827. if (ssl->options.dtls) {
  828. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  829. ssl->buffers.dtlsCtx.wfd = fd;
  830. }
  831. #endif
  832. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  833. return WOLFSSL_SUCCESS;
  834. }
  835. /**
  836. * Get the name of cipher at priority level passed in.
  837. */
  838. char* wolfSSL_get_cipher_list(int priority)
  839. {
  840. const CipherSuiteInfo* ciphers = GetCipherNames();
  841. if (priority >= GetCipherNamesSize() || priority < 0) {
  842. return 0;
  843. }
  844. return (char*)ciphers[priority].name;
  845. }
  846. /**
  847. * Get the name of cipher at priority level passed in.
  848. */
  849. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  850. {
  851. if (ssl == NULL) {
  852. return NULL;
  853. }
  854. else {
  855. const char* cipher;
  856. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  857. if (priority == 0) {
  858. return (char*)cipher;
  859. }
  860. else {
  861. return NULL;
  862. }
  863. }
  864. else {
  865. return wolfSSL_get_cipher_list(priority);
  866. }
  867. }
  868. }
  869. int wolfSSL_get_ciphers(char* buf, int len)
  870. {
  871. const CipherSuiteInfo* ciphers = GetCipherNames();
  872. int ciphersSz = GetCipherNamesSize();
  873. int i;
  874. int cipherNameSz;
  875. if (buf == NULL || len <= 0)
  876. return BAD_FUNC_ARG;
  877. /* Add each member to the buffer delimited by a : */
  878. for (i = 0; i < ciphersSz; i++) {
  879. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  880. if (cipherNameSz + 1 < len) {
  881. XSTRNCPY(buf, ciphers[i].name, len);
  882. buf += cipherNameSz;
  883. if (i < ciphersSz - 1)
  884. *buf++ = ':';
  885. *buf = 0;
  886. len -= cipherNameSz + 1;
  887. }
  888. else
  889. return BUFFER_E;
  890. }
  891. return WOLFSSL_SUCCESS;
  892. }
  893. #ifndef NO_ERROR_STRINGS
  894. /* places a list of all supported cipher suites in TLS_* format into "buf"
  895. * return WOLFSSL_SUCCESS on success */
  896. int wolfSSL_get_ciphers_iana(char* buf, int len)
  897. {
  898. const CipherSuiteInfo* ciphers = GetCipherNames();
  899. int ciphersSz = GetCipherNamesSize();
  900. int i;
  901. int cipherNameSz;
  902. if (buf == NULL || len <= 0)
  903. return BAD_FUNC_ARG;
  904. /* Add each member to the buffer delimited by a : */
  905. for (i = 0; i < ciphersSz; i++) {
  906. #ifndef NO_CIPHER_SUITE_ALIASES
  907. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  908. continue;
  909. #endif
  910. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  911. if (cipherNameSz + 1 < len) {
  912. XSTRNCPY(buf, ciphers[i].name_iana, len);
  913. buf += cipherNameSz;
  914. if (i < ciphersSz - 1)
  915. *buf++ = ':';
  916. *buf = 0;
  917. len -= cipherNameSz + 1;
  918. }
  919. else
  920. return BUFFER_E;
  921. }
  922. return WOLFSSL_SUCCESS;
  923. }
  924. #endif /* NO_ERROR_STRINGS */
  925. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  926. {
  927. const char* cipher;
  928. if (ssl == NULL)
  929. return NULL;
  930. cipher = wolfSSL_get_cipher_name_iana(ssl);
  931. len = min(len, (int)(XSTRLEN(cipher) + 1));
  932. XMEMCPY(buf, cipher, len);
  933. return buf;
  934. }
  935. int wolfSSL_get_fd(const WOLFSSL* ssl)
  936. {
  937. int fd = -1;
  938. WOLFSSL_ENTER("SSL_get_fd");
  939. if (ssl) {
  940. fd = ssl->rfd;
  941. }
  942. WOLFSSL_LEAVE("SSL_get_fd", fd);
  943. return fd;
  944. }
  945. int wolfSSL_dtls(WOLFSSL* ssl)
  946. {
  947. int dtlsOpt = 0;
  948. if (ssl)
  949. dtlsOpt = ssl->options.dtls;
  950. return dtlsOpt;
  951. }
  952. #if !defined(NO_CERTS)
  953. /* Set whether mutual authentication is required for connections.
  954. * Server side only.
  955. *
  956. * ctx The SSL/TLS CTX object.
  957. * req 1 to indicate required and 0 when not.
  958. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  959. * 0 on success.
  960. */
  961. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  962. {
  963. if (ctx == NULL)
  964. return BAD_FUNC_ARG;
  965. if (ctx->method->side == WOLFSSL_CLIENT_END)
  966. return SIDE_ERROR;
  967. ctx->mutualAuth = (byte)req;
  968. return 0;
  969. }
  970. /* Set whether mutual authentication is required for the connection.
  971. * Server side only.
  972. *
  973. * ssl The SSL/TLS object.
  974. * req 1 to indicate required and 0 when not.
  975. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  976. * SIDE_ERROR when not a client and 0 on success.
  977. */
  978. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  979. {
  980. if (ssl == NULL)
  981. return BAD_FUNC_ARG;
  982. if (ssl->options.side == WOLFSSL_SERVER_END)
  983. return SIDE_ERROR;
  984. ssl->options.mutualAuth = (word16)req;
  985. return 0;
  986. }
  987. #endif /* NO_CERTS */
  988. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  989. int wolfSSL_CTX_set_AcceptFilter(
  990. WOLFSSL_CTX *ctx,
  991. NetworkFilterCallback_t AcceptFilter,
  992. void *AcceptFilter_arg)
  993. {
  994. if (ctx == NULL)
  995. return BAD_FUNC_ARG;
  996. ctx->AcceptFilter = AcceptFilter;
  997. ctx->AcceptFilter_arg = AcceptFilter_arg;
  998. return 0;
  999. }
  1000. int wolfSSL_set_AcceptFilter(
  1001. WOLFSSL *ssl,
  1002. NetworkFilterCallback_t AcceptFilter,
  1003. void *AcceptFilter_arg)
  1004. {
  1005. if (ssl == NULL)
  1006. return BAD_FUNC_ARG;
  1007. ssl->AcceptFilter = AcceptFilter;
  1008. ssl->AcceptFilter_arg = AcceptFilter_arg;
  1009. return 0;
  1010. }
  1011. int wolfSSL_CTX_set_ConnectFilter(
  1012. WOLFSSL_CTX *ctx,
  1013. NetworkFilterCallback_t ConnectFilter,
  1014. void *ConnectFilter_arg)
  1015. {
  1016. if (ctx == NULL)
  1017. return BAD_FUNC_ARG;
  1018. ctx->ConnectFilter = ConnectFilter;
  1019. ctx->ConnectFilter_arg = ConnectFilter_arg;
  1020. return 0;
  1021. }
  1022. int wolfSSL_set_ConnectFilter(
  1023. WOLFSSL *ssl,
  1024. NetworkFilterCallback_t ConnectFilter,
  1025. void *ConnectFilter_arg)
  1026. {
  1027. if (ssl == NULL)
  1028. return BAD_FUNC_ARG;
  1029. ssl->ConnectFilter = ConnectFilter;
  1030. ssl->ConnectFilter_arg = ConnectFilter_arg;
  1031. return 0;
  1032. }
  1033. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  1034. #ifndef WOLFSSL_LEANPSK
  1035. #if defined(WOLFSSL_DTLS) && defined(XINET_PTON) && \
  1036. !defined(WOLFSSL_NO_SOCK) && defined(HAVE_SOCKADDR)
  1037. void* wolfSSL_dtls_create_peer(int port, char* ip)
  1038. {
  1039. SOCKADDR_IN *addr;
  1040. addr = (SOCKADDR_IN*)XMALLOC(sizeof(*addr), NULL,
  1041. DYNAMIC_TYPE_SOCKADDR);
  1042. if (addr == NULL) {
  1043. return NULL;
  1044. }
  1045. addr->sin_family = AF_INET;
  1046. addr->sin_port = XHTONS((word16)port);
  1047. if (XINET_PTON(AF_INET, ip, &addr->sin_addr) < 1) {
  1048. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1049. return NULL;
  1050. }
  1051. return addr;
  1052. }
  1053. int wolfSSL_dtls_free_peer(void* addr)
  1054. {
  1055. XFREE(addr, NULL, DYNAMIC_TYPE_SOCKADDR);
  1056. return WOLFSSL_SUCCESS;
  1057. }
  1058. #endif
  1059. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  1060. {
  1061. #ifdef WOLFSSL_DTLS
  1062. void* sa;
  1063. if (ssl == NULL)
  1064. return WOLFSSL_FAILURE;
  1065. if (peer == NULL || peerSz == 0) {
  1066. if (ssl->buffers.dtlsCtx.peer.sa != NULL)
  1067. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1068. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1069. ssl->buffers.dtlsCtx.peer.sz = 0;
  1070. ssl->buffers.dtlsCtx.peer.bufSz = 0;
  1071. ssl->buffers.dtlsCtx.userSet = 0;
  1072. return WOLFSSL_SUCCESS;
  1073. }
  1074. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  1075. if (sa != NULL) {
  1076. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1077. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1078. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1079. }
  1080. XMEMCPY(sa, peer, peerSz);
  1081. ssl->buffers.dtlsCtx.peer.sa = sa;
  1082. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  1083. ssl->buffers.dtlsCtx.peer.bufSz = peerSz;
  1084. ssl->buffers.dtlsCtx.userSet = 1;
  1085. return WOLFSSL_SUCCESS;
  1086. }
  1087. return WOLFSSL_FAILURE;
  1088. #else
  1089. (void)ssl;
  1090. (void)peer;
  1091. (void)peerSz;
  1092. return WOLFSSL_NOT_IMPLEMENTED;
  1093. #endif
  1094. }
  1095. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  1096. {
  1097. #ifdef WOLFSSL_DTLS
  1098. if (ssl == NULL) {
  1099. return WOLFSSL_FAILURE;
  1100. }
  1101. if (peer != NULL && peerSz != NULL
  1102. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  1103. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1104. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  1105. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  1106. return WOLFSSL_SUCCESS;
  1107. }
  1108. return WOLFSSL_FAILURE;
  1109. #else
  1110. (void)ssl;
  1111. (void)peer;
  1112. (void)peerSz;
  1113. return WOLFSSL_NOT_IMPLEMENTED;
  1114. #endif
  1115. }
  1116. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  1117. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  1118. {
  1119. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  1120. if (ctx == NULL)
  1121. return BAD_FUNC_ARG;
  1122. ctx->dtlsSctp = 1;
  1123. return WOLFSSL_SUCCESS;
  1124. }
  1125. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  1126. {
  1127. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  1128. if (ssl == NULL)
  1129. return BAD_FUNC_ARG;
  1130. ssl->options.dtlsSctp = 1;
  1131. return WOLFSSL_SUCCESS;
  1132. }
  1133. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  1134. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  1135. defined(WOLFSSL_DTLS)
  1136. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  1137. {
  1138. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  1139. return BAD_FUNC_ARG;
  1140. ctx->dtlsMtuSz = newMtu;
  1141. return WOLFSSL_SUCCESS;
  1142. }
  1143. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  1144. {
  1145. if (ssl == NULL)
  1146. return BAD_FUNC_ARG;
  1147. if (newMtu > MAX_RECORD_SIZE) {
  1148. ssl->error = BAD_FUNC_ARG;
  1149. return WOLFSSL_FAILURE;
  1150. }
  1151. ssl->dtlsMtuSz = newMtu;
  1152. return WOLFSSL_SUCCESS;
  1153. }
  1154. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  1155. #ifdef WOLFSSL_SRTP
  1156. static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = {
  1157. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits
  1158. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1159. {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) },
  1160. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits
  1161. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1162. {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) },
  1163. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */
  1164. {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)},
  1165. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */
  1166. {"SRTP_NULL_SHA1_32", SRTP_NULL_SHA1_32, ((112 * 2) / 8)},
  1167. /* AES GCM 128, Salt: 96-bits, Auth GCM Tag 128-bits
  1168. * (master_key:128bits + master_salt:96bits) * 2 = 448 bits (56) */
  1169. {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM, (((128 + 96) * 2) / 8) },
  1170. /* AES GCM 256, Salt: 96-bits, Auth GCM Tag 128-bits
  1171. * (master_key:256bits + master_salt:96bits) * 2 = 704 bits (88) */
  1172. {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM, (((256 + 96) * 2) / 8) },
  1173. };
  1174. static const WOLFSSL_SRTP_PROTECTION_PROFILE* DtlsSrtpFindProfile(
  1175. const char* profile_str, word32 profile_str_len, unsigned long id)
  1176. {
  1177. int i;
  1178. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1179. for (i=0;
  1180. i<(int)(sizeof(gSrtpProfiles)/sizeof(WOLFSSL_SRTP_PROTECTION_PROFILE));
  1181. i++) {
  1182. if (profile_str != NULL) {
  1183. word32 srtp_profile_len = (word32)XSTRLEN(gSrtpProfiles[i].name);
  1184. if (srtp_profile_len == profile_str_len &&
  1185. XMEMCMP(gSrtpProfiles[i].name, profile_str, profile_str_len)
  1186. == 0) {
  1187. profile = &gSrtpProfiles[i];
  1188. break;
  1189. }
  1190. }
  1191. else if (id != 0 && gSrtpProfiles[i].id == id) {
  1192. profile = &gSrtpProfiles[i];
  1193. break;
  1194. }
  1195. }
  1196. return profile;
  1197. }
  1198. /* profile_str: accepts ":" colon separated list of SRTP profiles */
  1199. static int DtlsSrtpSelProfiles(word16* id, const char* profile_str)
  1200. {
  1201. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile;
  1202. const char *current, *next = NULL;
  1203. word32 length = 0, current_length;
  1204. *id = 0; /* reset destination ID's */
  1205. if (profile_str == NULL) {
  1206. return WOLFSSL_FAILURE;
  1207. }
  1208. /* loop on end of line or colon ":" */
  1209. next = profile_str;
  1210. length = (word32)XSTRLEN(profile_str);
  1211. do {
  1212. current = next;
  1213. next = XSTRSTR(current, ":");
  1214. current_length = (!next) ? (word32)XSTRLEN(current)
  1215. : (word32)(next - current);
  1216. if (current_length < length)
  1217. length = current_length;
  1218. profile = DtlsSrtpFindProfile(current, current_length, 0);
  1219. if (profile != NULL) {
  1220. *id |= (1 << profile->id); /* selected bit based on ID */
  1221. }
  1222. } while (next != NULL && next++); /* ++ needed to skip ':' */
  1223. return WOLFSSL_SUCCESS;
  1224. }
  1225. int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char* profile_str)
  1226. {
  1227. int ret = WOLFSSL_FAILURE;
  1228. if (ctx != NULL) {
  1229. ret = DtlsSrtpSelProfiles(&ctx->dtlsSrtpProfiles, profile_str);
  1230. }
  1231. return ret;
  1232. }
  1233. int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char* profile_str)
  1234. {
  1235. int ret = WOLFSSL_FAILURE;
  1236. if (ssl != NULL) {
  1237. ret = DtlsSrtpSelProfiles(&ssl->dtlsSrtpProfiles, profile_str);
  1238. }
  1239. return ret;
  1240. }
  1241. const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(
  1242. WOLFSSL* ssl)
  1243. {
  1244. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1245. if (ssl) {
  1246. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1247. }
  1248. return profile;
  1249. }
  1250. #ifndef NO_WOLFSSL_STUB
  1251. WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* wolfSSL_get_srtp_profiles(
  1252. WOLFSSL* ssl)
  1253. {
  1254. /* Not yet implemented - should return list of available SRTP profiles
  1255. * ssl->dtlsSrtpProfiles */
  1256. (void)ssl;
  1257. return NULL;
  1258. }
  1259. #endif
  1260. int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl,
  1261. unsigned char* out, size_t* olen)
  1262. {
  1263. int ret = WOLFSSL_FAILURE;
  1264. const char* label = "EXTRACTOR-dtls_srtp";
  1265. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1266. byte seed[SEED_LEN];
  1267. if (ssl == NULL || olen == NULL) {
  1268. return BAD_FUNC_ARG;
  1269. }
  1270. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1271. if (profile == NULL) {
  1272. WOLFSSL_MSG("Not using DTLS SRTP");
  1273. return EXT_MISSING;
  1274. }
  1275. if (out == NULL) {
  1276. *olen = profile->kdfBits;
  1277. return LENGTH_ONLY_E;
  1278. }
  1279. if (*olen < (size_t)profile->kdfBits) {
  1280. return BUFFER_E;
  1281. }
  1282. #ifdef WOLFSSL_HAVE_PRF
  1283. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  1284. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  1285. PRIVATE_KEY_UNLOCK();
  1286. ret = wc_PRF_TLS(out, profile->kdfBits, /* out: generated keys / salt */
  1287. ssl->arrays->masterSecret, SECRET_LEN, /* existing master secret */
  1288. (const byte*)label, (int)XSTRLEN(label),/* label */
  1289. seed, SEED_LEN, /* seed: client/server random */
  1290. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  1291. ssl->heap, INVALID_DEVID);
  1292. if (ret == 0) {
  1293. *olen = profile->kdfBits;
  1294. ret = WOLFSSL_SUCCESS;
  1295. }
  1296. PRIVATE_KEY_LOCK();
  1297. #else
  1298. /* Pseudo random function must be enabled in the configuration */
  1299. ret = PRF_MISSING;
  1300. #endif
  1301. return ret;
  1302. }
  1303. #endif /* WOLFSSL_SRTP */
  1304. #ifdef WOLFSSL_DTLS_DROP_STATS
  1305. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  1306. word32* macDropCount, word32* replayDropCount)
  1307. {
  1308. int ret;
  1309. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  1310. if (ssl == NULL)
  1311. ret = BAD_FUNC_ARG;
  1312. else {
  1313. ret = WOLFSSL_SUCCESS;
  1314. if (macDropCount != NULL)
  1315. *macDropCount = ssl->macDropCount;
  1316. if (replayDropCount != NULL)
  1317. *replayDropCount = ssl->replayDropCount;
  1318. }
  1319. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  1320. return ret;
  1321. }
  1322. #endif /* WOLFSSL_DTLS_DROP_STATS */
  1323. #if defined(WOLFSSL_MULTICAST)
  1324. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  1325. {
  1326. int ret = 0;
  1327. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  1328. if (ctx == NULL || id > 255)
  1329. ret = BAD_FUNC_ARG;
  1330. if (ret == 0) {
  1331. ctx->haveEMS = 0;
  1332. ctx->haveMcast = 1;
  1333. ctx->mcastID = (byte)id;
  1334. #ifndef WOLFSSL_USER_IO
  1335. ctx->CBIORecv = EmbedReceiveFromMcast;
  1336. #endif /* WOLFSSL_USER_IO */
  1337. ret = WOLFSSL_SUCCESS;
  1338. }
  1339. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  1340. return ret;
  1341. }
  1342. int wolfSSL_mcast_get_max_peers(void)
  1343. {
  1344. return WOLFSSL_MULTICAST_PEERS;
  1345. }
  1346. #ifdef WOLFSSL_DTLS
  1347. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  1348. word32 second, word32 high)
  1349. {
  1350. word32 newCur = 0;
  1351. if (cur < first)
  1352. newCur = first;
  1353. else if (cur < second)
  1354. newCur = second;
  1355. else if (cur < high)
  1356. newCur = high;
  1357. return newCur;
  1358. }
  1359. #endif /* WOLFSSL_DTLS */
  1360. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  1361. const byte* preMasterSecret, word32 preMasterSz,
  1362. const byte* clientRandom, const byte* serverRandom,
  1363. const byte* suite)
  1364. {
  1365. int ret = 0;
  1366. WOLFSSL_ENTER("wolfSSL_set_secret()");
  1367. if (ssl == NULL || preMasterSecret == NULL ||
  1368. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  1369. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  1370. ret = BAD_FUNC_ARG;
  1371. }
  1372. if (ret == 0 && ssl->arrays->preMasterSecret == NULL) {
  1373. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  1374. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  1375. DYNAMIC_TYPE_SECRET);
  1376. if (ssl->arrays->preMasterSecret == NULL) {
  1377. ret = MEMORY_E;
  1378. }
  1379. }
  1380. if (ret == 0) {
  1381. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  1382. XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz);
  1383. ssl->arrays->preMasterSz = preMasterSz;
  1384. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  1385. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  1386. ssl->options.cipherSuite0 = suite[0];
  1387. ssl->options.cipherSuite = suite[1];
  1388. ret = SetCipherSpecs(ssl);
  1389. }
  1390. if (ret == 0)
  1391. ret = MakeTlsMasterSecret(ssl);
  1392. if (ret == 0) {
  1393. ssl->keys.encryptionOn = 1;
  1394. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1395. }
  1396. if (ret == 0) {
  1397. if (ssl->options.dtls) {
  1398. #ifdef WOLFSSL_DTLS
  1399. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1400. int i;
  1401. ssl->keys.dtls_epoch = epoch;
  1402. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1403. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1404. i++, peerSeq++) {
  1405. peerSeq->nextEpoch = epoch;
  1406. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1407. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1408. peerSeq->nextSeq_lo = 0;
  1409. peerSeq->nextSeq_hi = 0;
  1410. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1411. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1412. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1413. ssl->ctx->mcastFirstSeq,
  1414. ssl->ctx->mcastSecondSeq,
  1415. ssl->ctx->mcastMaxSeq);
  1416. }
  1417. #else
  1418. (void)epoch;
  1419. #endif
  1420. }
  1421. FreeHandshakeResources(ssl);
  1422. ret = WOLFSSL_SUCCESS;
  1423. }
  1424. else {
  1425. if (ssl)
  1426. ssl->error = ret;
  1427. ret = WOLFSSL_FATAL_ERROR;
  1428. }
  1429. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1430. return ret;
  1431. }
  1432. #ifdef WOLFSSL_DTLS
  1433. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int sub)
  1434. {
  1435. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1436. int ret = WOLFSSL_SUCCESS;
  1437. int i;
  1438. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1439. if (ssl == NULL || peerId > 255)
  1440. return BAD_FUNC_ARG;
  1441. if (!sub) {
  1442. /* Make sure it isn't already present, while keeping the first
  1443. * open spot. */
  1444. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1445. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1446. p = &ssl->keys.peerSeq[i];
  1447. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1448. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1449. p = NULL;
  1450. }
  1451. }
  1452. if (p != NULL) {
  1453. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1454. p->peerId = peerId;
  1455. p->highwaterMark = UpdateHighwaterMark(0,
  1456. ssl->ctx->mcastFirstSeq,
  1457. ssl->ctx->mcastSecondSeq,
  1458. ssl->ctx->mcastMaxSeq);
  1459. }
  1460. else {
  1461. WOLFSSL_MSG("No room in peer list.");
  1462. ret = -1;
  1463. }
  1464. }
  1465. else {
  1466. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1467. if (ssl->keys.peerSeq[i].peerId == peerId)
  1468. p = &ssl->keys.peerSeq[i];
  1469. }
  1470. if (p != NULL) {
  1471. p->peerId = INVALID_PEER_ID;
  1472. }
  1473. else {
  1474. WOLFSSL_MSG("Peer not found in list.");
  1475. }
  1476. }
  1477. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1478. return ret;
  1479. }
  1480. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1481. * return 1, otherwise return 0. */
  1482. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1483. {
  1484. int known = 0;
  1485. int i;
  1486. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1487. if (ssl == NULL || peerId > 255) {
  1488. return BAD_FUNC_ARG;
  1489. }
  1490. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1491. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1492. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1493. ssl->keys.peerSeq[i].nextSeq_lo) {
  1494. known = 1;
  1495. }
  1496. break;
  1497. }
  1498. }
  1499. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1500. return known;
  1501. }
  1502. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1503. word32 first, word32 second,
  1504. CallbackMcastHighwater cb)
  1505. {
  1506. if (ctx == NULL || (second && first > second) ||
  1507. first > maxSeq || second > maxSeq || cb == NULL) {
  1508. return BAD_FUNC_ARG;
  1509. }
  1510. ctx->mcastHwCb = cb;
  1511. ctx->mcastFirstSeq = first;
  1512. ctx->mcastSecondSeq = second;
  1513. ctx->mcastMaxSeq = maxSeq;
  1514. return WOLFSSL_SUCCESS;
  1515. }
  1516. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1517. {
  1518. if (ssl == NULL || ctx == NULL)
  1519. return BAD_FUNC_ARG;
  1520. ssl->mcastHwCbCtx = ctx;
  1521. return WOLFSSL_SUCCESS;
  1522. }
  1523. #endif /* WOLFSSL_DTLS */
  1524. #endif /* WOLFSSL_MULTICAST */
  1525. #endif /* WOLFSSL_LEANPSK */
  1526. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1527. int wolfSSL_negotiate(WOLFSSL* ssl)
  1528. {
  1529. int err = WOLFSSL_FATAL_ERROR;
  1530. WOLFSSL_ENTER("wolfSSL_negotiate");
  1531. if (ssl == NULL)
  1532. return WOLFSSL_FATAL_ERROR;
  1533. #ifndef NO_WOLFSSL_SERVER
  1534. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1535. #ifdef WOLFSSL_TLS13
  1536. if (IsAtLeastTLSv1_3(ssl->version))
  1537. err = wolfSSL_accept_TLSv13(ssl);
  1538. else
  1539. #endif
  1540. err = wolfSSL_accept(ssl);
  1541. }
  1542. #endif
  1543. #ifndef NO_WOLFSSL_CLIENT
  1544. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1545. #ifdef WOLFSSL_TLS13
  1546. if (IsAtLeastTLSv1_3(ssl->version))
  1547. err = wolfSSL_connect_TLSv13(ssl);
  1548. else
  1549. #endif
  1550. err = wolfSSL_connect(ssl);
  1551. }
  1552. #endif
  1553. (void)ssl;
  1554. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1555. return err;
  1556. }
  1557. WOLFSSL_ABI
  1558. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1559. {
  1560. if (ssl) {
  1561. return ssl->rng;
  1562. }
  1563. return NULL;
  1564. }
  1565. #ifndef WOLFSSL_LEANPSK
  1566. /* object size based on build */
  1567. int wolfSSL_GetObjectSize(void)
  1568. {
  1569. #ifdef SHOW_SIZES
  1570. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1571. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1572. #ifndef NO_RC4
  1573. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1574. #endif
  1575. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1576. #ifndef NO_DES3
  1577. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1578. #endif
  1579. #ifdef HAVE_CHACHA
  1580. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1581. #endif
  1582. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1583. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1584. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1585. #ifndef NO_MD5
  1586. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1587. #endif
  1588. #ifndef NO_SHA
  1589. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1590. #endif
  1591. #ifdef WOLFSSL_SHA224
  1592. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1593. #endif
  1594. #ifndef NO_SHA256
  1595. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1596. #endif
  1597. #ifdef WOLFSSL_SHA384
  1598. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1599. #endif
  1600. #ifdef WOLFSSL_SHA384
  1601. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1602. #endif
  1603. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1604. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1605. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1606. #ifndef NO_RSA
  1607. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1608. #endif
  1609. #ifdef HAVE_ECC
  1610. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1611. #endif
  1612. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1613. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1614. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1615. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1616. #endif
  1617. return sizeof(WOLFSSL);
  1618. }
  1619. int wolfSSL_CTX_GetObjectSize(void)
  1620. {
  1621. return sizeof(WOLFSSL_CTX);
  1622. }
  1623. int wolfSSL_METHOD_GetObjectSize(void)
  1624. {
  1625. return sizeof(WOLFSSL_METHOD);
  1626. }
  1627. #endif
  1628. #ifdef WOLFSSL_STATIC_MEMORY
  1629. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1630. unsigned char* buf, unsigned int sz,
  1631. int flag, int maxSz)
  1632. {
  1633. WOLFSSL_HEAP* heap;
  1634. WOLFSSL_HEAP_HINT* hint;
  1635. word32 idx = 0;
  1636. if (ctx == NULL || buf == NULL) {
  1637. return BAD_FUNC_ARG;
  1638. }
  1639. if (*ctx == NULL && method == NULL) {
  1640. return BAD_FUNC_ARG;
  1641. }
  1642. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1643. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1644. return BUFFER_E; /* not enough memory for structures */
  1645. }
  1646. heap = (WOLFSSL_HEAP*)buf;
  1647. idx += sizeof(WOLFSSL_HEAP);
  1648. if (wolfSSL_init_memory_heap(heap) != 0) {
  1649. return WOLFSSL_FAILURE;
  1650. }
  1651. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1652. idx += sizeof(WOLFSSL_HEAP_HINT);
  1653. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1654. hint->memory = heap;
  1655. if (*ctx && (*ctx)->heap == NULL) {
  1656. (*ctx)->heap = (void*)hint;
  1657. }
  1658. }
  1659. else {
  1660. #ifdef WOLFSSL_HEAP_TEST
  1661. /* do not load in memory if test has been set */
  1662. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1663. return WOLFSSL_SUCCESS;
  1664. }
  1665. #endif
  1666. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1667. heap = hint->memory;
  1668. }
  1669. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1670. WOLFSSL_MSG("Error partitioning memory");
  1671. return WOLFSSL_FAILURE;
  1672. }
  1673. /* create ctx if needed */
  1674. if (*ctx == NULL) {
  1675. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1676. if (*ctx == NULL) {
  1677. WOLFSSL_MSG("Error creating ctx");
  1678. return WOLFSSL_FAILURE;
  1679. }
  1680. }
  1681. /* determine what max applies too */
  1682. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1683. heap->maxIO = maxSz;
  1684. }
  1685. else { /* general memory used in handshakes */
  1686. heap->maxHa = maxSz;
  1687. }
  1688. heap->flag |= flag;
  1689. (void)maxSz;
  1690. (void)method;
  1691. return WOLFSSL_SUCCESS;
  1692. }
  1693. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1694. {
  1695. if (ssl == NULL) {
  1696. return BAD_FUNC_ARG;
  1697. }
  1698. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1699. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1700. if (mem_stats != NULL && ssl->heap != NULL) {
  1701. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1702. WOLFSSL_HEAP* heap = hint->memory;
  1703. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1704. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1705. }
  1706. }
  1707. return (ssl->heap) ? 1 : 0;
  1708. }
  1709. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1710. {
  1711. if (ctx == NULL) {
  1712. return BAD_FUNC_ARG;
  1713. }
  1714. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1715. /* fill out statistics if wanted */
  1716. if (mem_stats != NULL && ctx->heap != NULL) {
  1717. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1718. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1719. return MEMORY_E;
  1720. }
  1721. }
  1722. return (ctx->heap) ? 1 : 0;
  1723. }
  1724. #endif /* WOLFSSL_STATIC_MEMORY */
  1725. /* return max record layer size plaintext input size */
  1726. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1727. {
  1728. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1729. if (ssl == NULL)
  1730. return BAD_FUNC_ARG;
  1731. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1732. WOLFSSL_MSG("Handshake not complete yet");
  1733. return BAD_FUNC_ARG;
  1734. }
  1735. return wolfSSL_GetMaxFragSize(ssl, OUTPUT_RECORD_SIZE);
  1736. }
  1737. /* return record layer size of plaintext input size */
  1738. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1739. {
  1740. int maxSize;
  1741. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1742. if (inSz < 0)
  1743. return BAD_FUNC_ARG;
  1744. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1745. if (maxSize < 0)
  1746. return maxSize; /* error */
  1747. if (inSz > maxSize)
  1748. return INPUT_SIZE_E;
  1749. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1750. }
  1751. #ifdef HAVE_ECC
  1752. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1753. {
  1754. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1755. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1756. return BAD_FUNC_ARG;
  1757. }
  1758. ctx->minEccKeySz = keySz / 8;
  1759. #ifndef NO_CERTS
  1760. ctx->cm->minEccKeySz = keySz / 8;
  1761. #endif
  1762. return WOLFSSL_SUCCESS;
  1763. }
  1764. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1765. {
  1766. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1767. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1768. return BAD_FUNC_ARG;
  1769. }
  1770. ssl->options.minEccKeySz = keySz / 8;
  1771. return WOLFSSL_SUCCESS;
  1772. }
  1773. #endif /* HAVE_ECC */
  1774. #ifndef NO_RSA
  1775. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1776. {
  1777. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1778. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1779. return BAD_FUNC_ARG;
  1780. }
  1781. ctx->minRsaKeySz = keySz / 8;
  1782. ctx->cm->minRsaKeySz = keySz / 8;
  1783. return WOLFSSL_SUCCESS;
  1784. }
  1785. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1786. {
  1787. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1788. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1789. return BAD_FUNC_ARG;
  1790. }
  1791. ssl->options.minRsaKeySz = keySz / 8;
  1792. return WOLFSSL_SUCCESS;
  1793. }
  1794. #endif /* !NO_RSA */
  1795. #ifndef NO_DH
  1796. #ifdef OPENSSL_EXTRA
  1797. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  1798. {
  1799. int pSz, gSz;
  1800. byte *p, *g;
  1801. int ret = 0;
  1802. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  1803. if (!ssl || !dh)
  1804. return BAD_FUNC_ARG;
  1805. /* Get needed size for p and g */
  1806. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  1807. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  1808. if (pSz <= 0 || gSz <= 0)
  1809. return -1;
  1810. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1811. if (!p)
  1812. return MEMORY_E;
  1813. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1814. if (!g) {
  1815. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1816. return MEMORY_E;
  1817. }
  1818. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  1819. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  1820. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  1821. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  1822. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1823. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1824. return pSz > 0 && gSz > 0 ? ret : -1;
  1825. }
  1826. #endif /* OPENSSL_EXTRA */
  1827. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1828. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1829. const unsigned char* g, int gSz)
  1830. {
  1831. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1832. if (ssl == NULL || p == NULL || g == NULL)
  1833. return BAD_FUNC_ARG;
  1834. if ((word16)pSz < ssl->options.minDhKeySz)
  1835. return DH_KEY_SIZE_E;
  1836. if ((word16)pSz > ssl->options.maxDhKeySz)
  1837. return DH_KEY_SIZE_E;
  1838. /* this function is for server only */
  1839. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1840. return SIDE_ERROR;
  1841. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1842. !defined(HAVE_SELFTEST)
  1843. ssl->options.dhKeyTested = 0;
  1844. ssl->options.dhDoKeyTest = 1;
  1845. #endif
  1846. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1847. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1848. ssl->buffers.serverDH_P.buffer = NULL;
  1849. }
  1850. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1851. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1852. ssl->buffers.serverDH_G.buffer = NULL;
  1853. }
  1854. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1855. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1856. DYNAMIC_TYPE_PUBLIC_KEY);
  1857. if (ssl->buffers.serverDH_P.buffer == NULL)
  1858. return MEMORY_E;
  1859. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1860. DYNAMIC_TYPE_PUBLIC_KEY);
  1861. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1862. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1863. ssl->buffers.serverDH_P.buffer = NULL;
  1864. return MEMORY_E;
  1865. }
  1866. ssl->buffers.serverDH_P.length = pSz;
  1867. ssl->buffers.serverDH_G.length = gSz;
  1868. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1869. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1870. ssl->options.haveDH = 1;
  1871. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1872. word16 havePSK;
  1873. word16 haveRSA;
  1874. int keySz = 0;
  1875. #ifndef NO_PSK
  1876. havePSK = ssl->options.havePSK;
  1877. #else
  1878. havePSK = 0;
  1879. #endif
  1880. #ifdef NO_RSA
  1881. haveRSA = 0;
  1882. #else
  1883. haveRSA = 1;
  1884. #endif
  1885. #ifndef NO_CERTS
  1886. keySz = ssl->buffers.keySz;
  1887. #endif
  1888. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1889. ssl->options.haveDH, ssl->options.haveECDSAsig,
  1890. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  1891. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  1892. ssl->options.haveAnon, TRUE, ssl->options.side);
  1893. }
  1894. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1895. return WOLFSSL_SUCCESS;
  1896. }
  1897. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1898. !defined(HAVE_SELFTEST)
  1899. /* Enables or disables the session's DH key prime test. */
  1900. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1901. {
  1902. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1903. if (ssl == NULL)
  1904. return BAD_FUNC_ARG;
  1905. if (!enable)
  1906. ssl->options.dhDoKeyTest = 0;
  1907. else
  1908. ssl->options.dhDoKeyTest = 1;
  1909. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1910. return WOLFSSL_SUCCESS;
  1911. }
  1912. #endif
  1913. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1914. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1915. const unsigned char* g, int gSz)
  1916. {
  1917. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1918. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1919. if ((word16)pSz < ctx->minDhKeySz)
  1920. return DH_KEY_SIZE_E;
  1921. if ((word16)pSz > ctx->maxDhKeySz)
  1922. return DH_KEY_SIZE_E;
  1923. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1924. !defined(HAVE_SELFTEST)
  1925. {
  1926. WC_RNG rng;
  1927. int error, freeKey = 0;
  1928. #ifdef WOLFSSL_SMALL_STACK
  1929. DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  1930. if (checkKey == NULL)
  1931. return MEMORY_E;
  1932. #else
  1933. DhKey checkKey[1];
  1934. #endif
  1935. error = wc_InitRng(&rng);
  1936. if (!error)
  1937. error = wc_InitDhKey(checkKey);
  1938. if (!error) {
  1939. freeKey = 1;
  1940. error = wc_DhSetCheckKey(checkKey,
  1941. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1942. }
  1943. if (freeKey)
  1944. wc_FreeDhKey(checkKey);
  1945. #ifdef WOLFSSL_SMALL_STACK
  1946. XFREE(checkKey, NULL, DYNAMIC_TYPE_DH);
  1947. #endif
  1948. wc_FreeRng(&rng);
  1949. if (error)
  1950. return error;
  1951. ctx->dhKeyTested = 1;
  1952. }
  1953. #endif
  1954. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1955. ctx->serverDH_P.buffer = NULL;
  1956. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1957. ctx->serverDH_G.buffer = NULL;
  1958. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1959. if (ctx->serverDH_P.buffer == NULL)
  1960. return MEMORY_E;
  1961. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1962. if (ctx->serverDH_G.buffer == NULL) {
  1963. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1964. ctx->serverDH_P.buffer = NULL;
  1965. return MEMORY_E;
  1966. }
  1967. ctx->serverDH_P.length = pSz;
  1968. ctx->serverDH_G.length = gSz;
  1969. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1970. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1971. ctx->haveDH = 1;
  1972. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1973. return WOLFSSL_SUCCESS;
  1974. }
  1975. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1976. {
  1977. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1978. return BAD_FUNC_ARG;
  1979. ctx->minDhKeySz = keySz_bits / 8;
  1980. return WOLFSSL_SUCCESS;
  1981. }
  1982. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1983. {
  1984. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1985. return BAD_FUNC_ARG;
  1986. ssl->options.minDhKeySz = keySz_bits / 8;
  1987. return WOLFSSL_SUCCESS;
  1988. }
  1989. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1990. {
  1991. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1992. return BAD_FUNC_ARG;
  1993. ctx->maxDhKeySz = keySz_bits / 8;
  1994. return WOLFSSL_SUCCESS;
  1995. }
  1996. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1997. {
  1998. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1999. return BAD_FUNC_ARG;
  2000. ssl->options.maxDhKeySz = keySz_bits / 8;
  2001. return WOLFSSL_SUCCESS;
  2002. }
  2003. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  2004. {
  2005. if (ssl == NULL)
  2006. return BAD_FUNC_ARG;
  2007. return (ssl->options.dhKeySz * 8);
  2008. }
  2009. #endif /* !NO_DH */
  2010. WOLFSSL_ABI
  2011. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  2012. {
  2013. int ret;
  2014. WOLFSSL_ENTER("SSL_write()");
  2015. if (ssl == NULL || data == NULL || sz < 0)
  2016. return BAD_FUNC_ARG;
  2017. #ifdef WOLFSSL_QUIC
  2018. if (WOLFSSL_IS_QUIC(ssl)) {
  2019. WOLFSSL_MSG("SSL_write() on QUIC not allowed");
  2020. return BAD_FUNC_ARG;
  2021. }
  2022. #endif
  2023. #ifdef WOLFSSL_EARLY_DATA
  2024. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  2025. ssl->error = ret;
  2026. return WOLFSSL_FATAL_ERROR;
  2027. }
  2028. ssl->earlyData = no_early_data;
  2029. #endif
  2030. #ifdef HAVE_WRITE_DUP
  2031. { /* local variable scope */
  2032. int dupErr = 0; /* local copy */
  2033. ret = 0;
  2034. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  2035. WOLFSSL_MSG("Read dup side cannot write");
  2036. return WRITE_DUP_WRITE_E;
  2037. }
  2038. if (ssl->dupWrite) {
  2039. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  2040. return BAD_MUTEX_E;
  2041. }
  2042. dupErr = ssl->dupWrite->dupErr;
  2043. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  2044. }
  2045. if (ret != 0) {
  2046. ssl->error = ret; /* high priority fatal error */
  2047. return WOLFSSL_FATAL_ERROR;
  2048. }
  2049. if (dupErr != 0) {
  2050. WOLFSSL_MSG("Write dup error from other side");
  2051. ssl->error = dupErr;
  2052. return WOLFSSL_FATAL_ERROR;
  2053. }
  2054. }
  2055. #endif
  2056. #ifdef HAVE_ERRNO_H
  2057. errno = 0;
  2058. #endif
  2059. #ifdef OPENSSL_EXTRA
  2060. if (ssl->CBIS != NULL) {
  2061. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  2062. ssl->cbmode = SSL_CB_WRITE;
  2063. }
  2064. #endif
  2065. ret = SendData(ssl, data, sz);
  2066. WOLFSSL_LEAVE("SSL_write()", ret);
  2067. if (ret < 0)
  2068. return WOLFSSL_FATAL_ERROR;
  2069. else
  2070. return ret;
  2071. }
  2072. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  2073. {
  2074. int ret;
  2075. WOLFSSL_ENTER("wolfSSL_read_internal()");
  2076. if (ssl == NULL || data == NULL || sz < 0)
  2077. return BAD_FUNC_ARG;
  2078. #ifdef WOLFSSL_QUIC
  2079. if (WOLFSSL_IS_QUIC(ssl)) {
  2080. WOLFSSL_MSG("SSL_read() on QUIC not allowed");
  2081. return BAD_FUNC_ARG;
  2082. }
  2083. #endif
  2084. #if defined(WOLFSSL_ERROR_CODE_OPENSSL) && defined(OPENSSL_EXTRA)
  2085. /* This additional logic is meant to simulate following openSSL behavior:
  2086. * After bidirectional SSL_shutdown complete, SSL_read returns 0 and
  2087. * SSL_get_error_code returns SSL_ERROR_ZERO_RETURN.
  2088. * This behavior is used to know the disconnect of the underlying
  2089. * transport layer.
  2090. *
  2091. * In this logic, CBIORecv is called with a read size of 0 to check the
  2092. * transport layer status. It also returns WOLFSSL_FAILURE so that
  2093. * SSL_read does not return a positive number on failure.
  2094. */
  2095. /* make sure bidirectional TLS shutdown completes */
  2096. if (ssl->error == WOLFSSL_ERROR_SYSCALL) {
  2097. /* ask the underlying transport the connection is closed */
  2098. if (ssl->CBIORecv(ssl, (char*)data, 0, ssl->IOCB_ReadCtx) ==
  2099. WOLFSSL_CBIO_ERR_CONN_CLOSE) {
  2100. ssl->options.isClosed = 1;
  2101. ssl->error = WOLFSSL_ERROR_ZERO_RETURN;
  2102. }
  2103. return WOLFSSL_FAILURE;
  2104. }
  2105. #endif
  2106. #ifdef HAVE_WRITE_DUP
  2107. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  2108. WOLFSSL_MSG("Write dup side cannot read");
  2109. return WRITE_DUP_READ_E;
  2110. }
  2111. #endif
  2112. #ifdef HAVE_ERRNO_H
  2113. errno = 0;
  2114. #endif
  2115. #ifdef WOLFSSL_DTLS
  2116. if (ssl->options.dtls) {
  2117. ssl->dtls_expected_rx = max(sz + DTLS_MTU_ADDITIONAL_READ_BUFFER,
  2118. MAX_MTU);
  2119. #ifdef WOLFSSL_SCTP
  2120. if (ssl->options.dtlsSctp)
  2121. #endif
  2122. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  2123. /* Add some bytes so that we can operate with slight difference
  2124. * in set MTU size on each peer */
  2125. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx,
  2126. ssl->dtlsMtuSz + (word32)DTLS_MTU_ADDITIONAL_READ_BUFFER);
  2127. #endif
  2128. }
  2129. #endif
  2130. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  2131. #ifdef HAVE_WRITE_DUP
  2132. if (ssl->dupWrite) {
  2133. if (ssl->error != 0 && ssl->error != WANT_READ
  2134. #ifdef WOLFSSL_ASYNC_CRYPT
  2135. && ssl->error != WC_PENDING_E
  2136. #endif
  2137. ) {
  2138. int notifyErr;
  2139. WOLFSSL_MSG("Notifying write side of fatal read error");
  2140. notifyErr = NotifyWriteSide(ssl, ssl->error);
  2141. if (notifyErr < 0) {
  2142. ret = ssl->error = notifyErr;
  2143. }
  2144. }
  2145. }
  2146. #endif
  2147. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  2148. if (ret < 0)
  2149. return WOLFSSL_FATAL_ERROR;
  2150. else
  2151. return ret;
  2152. }
  2153. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  2154. {
  2155. WOLFSSL_ENTER("wolfSSL_peek()");
  2156. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  2157. }
  2158. WOLFSSL_ABI
  2159. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  2160. {
  2161. WOLFSSL_ENTER("wolfSSL_read()");
  2162. #ifdef OPENSSL_EXTRA
  2163. if (ssl == NULL) {
  2164. return BAD_FUNC_ARG;
  2165. }
  2166. if (ssl->CBIS != NULL) {
  2167. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  2168. ssl->cbmode = SSL_CB_READ;
  2169. }
  2170. #endif
  2171. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  2172. }
  2173. #ifdef WOLFSSL_MULTICAST
  2174. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  2175. {
  2176. int ret = 0;
  2177. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  2178. if (ssl == NULL)
  2179. return BAD_FUNC_ARG;
  2180. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  2181. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  2182. *id = ssl->keys.curPeerId;
  2183. return ret;
  2184. }
  2185. #endif /* WOLFSSL_MULTICAST */
  2186. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  2187. WOLFSSL_ABI
  2188. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  2189. {
  2190. if (ssl == NULL)
  2191. return BAD_FUNC_ARG;
  2192. ssl->devId = devId;
  2193. return WOLFSSL_SUCCESS;
  2194. }
  2195. WOLFSSL_ABI
  2196. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  2197. {
  2198. if (ctx == NULL)
  2199. return BAD_FUNC_ARG;
  2200. ctx->devId = devId;
  2201. return WOLFSSL_SUCCESS;
  2202. }
  2203. /* helpers to get device id and heap */
  2204. WOLFSSL_ABI
  2205. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2206. {
  2207. int devId = INVALID_DEVID;
  2208. if (ssl != NULL)
  2209. devId = ssl->devId;
  2210. if (ctx != NULL && devId == INVALID_DEVID)
  2211. devId = ctx->devId;
  2212. return devId;
  2213. }
  2214. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2215. {
  2216. void* heap = NULL;
  2217. if (ctx != NULL)
  2218. heap = ctx->heap;
  2219. else if (ssl != NULL)
  2220. heap = ssl->heap;
  2221. return heap;
  2222. }
  2223. #ifdef HAVE_SNI
  2224. WOLFSSL_ABI
  2225. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  2226. {
  2227. if (ssl == NULL)
  2228. return BAD_FUNC_ARG;
  2229. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  2230. }
  2231. WOLFSSL_ABI
  2232. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  2233. word16 size)
  2234. {
  2235. if (ctx == NULL)
  2236. return BAD_FUNC_ARG;
  2237. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  2238. }
  2239. #ifndef NO_WOLFSSL_SERVER
  2240. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  2241. {
  2242. if (ssl && ssl->extensions)
  2243. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  2244. }
  2245. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  2246. {
  2247. if (ctx && ctx->extensions)
  2248. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  2249. }
  2250. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  2251. {
  2252. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  2253. }
  2254. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  2255. {
  2256. if (data)
  2257. *data = NULL;
  2258. if (ssl && ssl->extensions)
  2259. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  2260. return 0;
  2261. }
  2262. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  2263. byte type, byte* sni, word32* inOutSz)
  2264. {
  2265. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  2266. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  2267. return BAD_FUNC_ARG;
  2268. }
  2269. #endif /* NO_WOLFSSL_SERVER */
  2270. #endif /* HAVE_SNI */
  2271. #ifdef HAVE_TRUSTED_CA
  2272. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  2273. const byte* certId, word32 certIdSz)
  2274. {
  2275. if (ssl == NULL)
  2276. return BAD_FUNC_ARG;
  2277. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  2278. if (certId != NULL || certIdSz != 0)
  2279. return BAD_FUNC_ARG;
  2280. }
  2281. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  2282. if (certId == NULL || certIdSz == 0)
  2283. return BAD_FUNC_ARG;
  2284. }
  2285. #ifndef NO_SHA
  2286. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  2287. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  2288. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  2289. return BAD_FUNC_ARG;
  2290. }
  2291. #endif
  2292. else
  2293. return BAD_FUNC_ARG;
  2294. return TLSX_UseTrustedCA(&ssl->extensions,
  2295. type, certId, certIdSz, ssl->heap);
  2296. }
  2297. #endif /* HAVE_TRUSTED_CA */
  2298. #ifdef HAVE_MAX_FRAGMENT
  2299. #ifndef NO_WOLFSSL_CLIENT
  2300. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  2301. {
  2302. if (ssl == NULL)
  2303. return BAD_FUNC_ARG;
  2304. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  2305. /* The following is a non-standard way to reconfigure the max packet size
  2306. post-handshake for wolfSSL_write/wolfSSL_read */
  2307. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  2308. switch (mfl) {
  2309. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2310. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2311. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2312. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2313. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2314. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2315. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  2316. }
  2317. return WOLFSSL_SUCCESS;
  2318. }
  2319. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  2320. /* This call sets the max fragment TLS extension, which gets sent to server.
  2321. The server_hello response is what sets the `ssl->max_fragment` in
  2322. TLSX_MFL_Parse */
  2323. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  2324. }
  2325. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  2326. {
  2327. if (ctx == NULL)
  2328. return BAD_FUNC_ARG;
  2329. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  2330. }
  2331. #endif /* NO_WOLFSSL_CLIENT */
  2332. #endif /* HAVE_MAX_FRAGMENT */
  2333. #ifdef HAVE_TRUNCATED_HMAC
  2334. #ifndef NO_WOLFSSL_CLIENT
  2335. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  2336. {
  2337. if (ssl == NULL)
  2338. return BAD_FUNC_ARG;
  2339. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  2340. }
  2341. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  2342. {
  2343. if (ctx == NULL)
  2344. return BAD_FUNC_ARG;
  2345. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  2346. }
  2347. #endif /* NO_WOLFSSL_CLIENT */
  2348. #endif /* HAVE_TRUNCATED_HMAC */
  2349. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2350. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  2351. {
  2352. WOLFSSL_ENTER("wolfSSL_UseOCSPStapling");
  2353. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2354. return BAD_FUNC_ARG;
  2355. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  2356. options, NULL, ssl->heap, ssl->devId);
  2357. }
  2358. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  2359. byte options)
  2360. {
  2361. WOLFSSL_ENTER("wolfSSL_CTX_UseOCSPStapling");
  2362. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2363. return BAD_FUNC_ARG;
  2364. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  2365. options, NULL, ctx->heap, ctx->devId);
  2366. }
  2367. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  2368. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2369. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  2370. {
  2371. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2372. return BAD_FUNC_ARG;
  2373. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  2374. options, ssl->heap, ssl->devId);
  2375. }
  2376. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  2377. byte options)
  2378. {
  2379. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2380. return BAD_FUNC_ARG;
  2381. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  2382. options, ctx->heap, ctx->devId);
  2383. }
  2384. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2385. /* Elliptic Curves */
  2386. #if defined(HAVE_SUPPORTED_CURVES)
  2387. static int isValidCurveGroup(word16 name)
  2388. {
  2389. switch (name) {
  2390. case WOLFSSL_ECC_SECP160K1:
  2391. case WOLFSSL_ECC_SECP160R1:
  2392. case WOLFSSL_ECC_SECP160R2:
  2393. case WOLFSSL_ECC_SECP192K1:
  2394. case WOLFSSL_ECC_SECP192R1:
  2395. case WOLFSSL_ECC_SECP224K1:
  2396. case WOLFSSL_ECC_SECP224R1:
  2397. case WOLFSSL_ECC_SECP256K1:
  2398. case WOLFSSL_ECC_SECP256R1:
  2399. case WOLFSSL_ECC_SECP384R1:
  2400. case WOLFSSL_ECC_SECP521R1:
  2401. case WOLFSSL_ECC_BRAINPOOLP256R1:
  2402. case WOLFSSL_ECC_BRAINPOOLP384R1:
  2403. case WOLFSSL_ECC_BRAINPOOLP512R1:
  2404. case WOLFSSL_ECC_X25519:
  2405. case WOLFSSL_ECC_X448:
  2406. case WOLFSSL_FFDHE_2048:
  2407. case WOLFSSL_FFDHE_3072:
  2408. case WOLFSSL_FFDHE_4096:
  2409. case WOLFSSL_FFDHE_6144:
  2410. case WOLFSSL_FFDHE_8192:
  2411. #ifdef HAVE_PQC
  2412. case WOLFSSL_KYBER_LEVEL1:
  2413. case WOLFSSL_KYBER_LEVEL3:
  2414. case WOLFSSL_KYBER_LEVEL5:
  2415. #ifdef HAVE_LIBOQS
  2416. case WOLFSSL_NTRU_HPS_LEVEL1:
  2417. case WOLFSSL_NTRU_HPS_LEVEL3:
  2418. case WOLFSSL_NTRU_HPS_LEVEL5:
  2419. case WOLFSSL_NTRU_HRSS_LEVEL3:
  2420. case WOLFSSL_SABER_LEVEL1:
  2421. case WOLFSSL_SABER_LEVEL3:
  2422. case WOLFSSL_SABER_LEVEL5:
  2423. case WOLFSSL_KYBER_90S_LEVEL1:
  2424. case WOLFSSL_KYBER_90S_LEVEL3:
  2425. case WOLFSSL_KYBER_90S_LEVEL5:
  2426. case WOLFSSL_P256_NTRU_HPS_LEVEL1:
  2427. case WOLFSSL_P384_NTRU_HPS_LEVEL3:
  2428. case WOLFSSL_P521_NTRU_HPS_LEVEL5:
  2429. case WOLFSSL_P384_NTRU_HRSS_LEVEL3:
  2430. case WOLFSSL_P256_SABER_LEVEL1:
  2431. case WOLFSSL_P384_SABER_LEVEL3:
  2432. case WOLFSSL_P521_SABER_LEVEL5:
  2433. case WOLFSSL_P256_KYBER_LEVEL1:
  2434. case WOLFSSL_P384_KYBER_LEVEL3:
  2435. case WOLFSSL_P521_KYBER_LEVEL5:
  2436. case WOLFSSL_P256_KYBER_90S_LEVEL1:
  2437. case WOLFSSL_P384_KYBER_90S_LEVEL3:
  2438. case WOLFSSL_P521_KYBER_90S_LEVEL5:
  2439. #endif
  2440. #endif
  2441. return 1;
  2442. default:
  2443. return 0;
  2444. }
  2445. }
  2446. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  2447. {
  2448. if (ssl == NULL || !isValidCurveGroup(name))
  2449. return BAD_FUNC_ARG;
  2450. ssl->options.userCurves = 1;
  2451. #if defined(NO_TLS)
  2452. return WOLFSSL_FAILURE;
  2453. #else
  2454. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  2455. #endif /* NO_TLS */
  2456. }
  2457. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  2458. {
  2459. if (ctx == NULL || !isValidCurveGroup(name))
  2460. return BAD_FUNC_ARG;
  2461. ctx->userCurves = 1;
  2462. #if defined(NO_TLS)
  2463. return WOLFSSL_FAILURE;
  2464. #else
  2465. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  2466. #endif /* NO_TLS */
  2467. }
  2468. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  2469. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  2470. int count)
  2471. {
  2472. int i;
  2473. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2474. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2475. if (count == 0) {
  2476. WOLFSSL_MSG("Group count is zero");
  2477. return WOLFSSL_FAILURE;
  2478. }
  2479. for (i = 0; i < count; i++) {
  2480. if (isValidCurveGroup((word16)groups[i])) {
  2481. _groups[i] = groups[i];
  2482. }
  2483. #ifdef HAVE_ECC
  2484. else {
  2485. /* groups may be populated with curve NIDs */
  2486. int oid = nid2oid(groups[i], oidCurveType);
  2487. int name = (int)GetCurveByOID(oid);
  2488. if (name == 0) {
  2489. WOLFSSL_MSG("Invalid group name");
  2490. return WOLFSSL_FAILURE;
  2491. }
  2492. _groups[i] = name;
  2493. }
  2494. #else
  2495. else {
  2496. WOLFSSL_MSG("Invalid group name");
  2497. return WOLFSSL_FAILURE;
  2498. }
  2499. #endif
  2500. }
  2501. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  2502. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2503. }
  2504. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  2505. {
  2506. int i;
  2507. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2508. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2509. if (count == 0) {
  2510. WOLFSSL_MSG("Group count is zero");
  2511. return WOLFSSL_FAILURE;
  2512. }
  2513. for (i = 0; i < count; i++) {
  2514. if (isValidCurveGroup((word16)groups[i])) {
  2515. _groups[i] = groups[i];
  2516. }
  2517. #ifdef HAVE_ECC
  2518. else {
  2519. /* groups may be populated with curve NIDs */
  2520. int oid = nid2oid(groups[i], oidCurveType);
  2521. int name = (int)GetCurveByOID(oid);
  2522. if (name == 0) {
  2523. WOLFSSL_MSG("Invalid group name");
  2524. return WOLFSSL_FAILURE;
  2525. }
  2526. _groups[i] = name;
  2527. }
  2528. #else
  2529. else {
  2530. WOLFSSL_MSG("Invalid group name");
  2531. return WOLFSSL_FAILURE;
  2532. }
  2533. #endif
  2534. }
  2535. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  2536. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2537. }
  2538. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  2539. #endif /* HAVE_SUPPORTED_CURVES */
  2540. /* Application-Layer Protocol Negotiation */
  2541. #ifdef HAVE_ALPN
  2542. WOLFSSL_ABI
  2543. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2544. word32 protocol_name_listSz, byte options)
  2545. {
  2546. char *list, *ptr, **token;
  2547. word16 len;
  2548. int idx = 0;
  2549. int ret = WOLFSSL_FAILURE;
  2550. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2551. if (ssl == NULL || protocol_name_list == NULL)
  2552. return BAD_FUNC_ARG;
  2553. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2554. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2555. WOLFSSL_MAX_ALPN_NUMBER)) {
  2556. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2557. return BAD_FUNC_ARG;
  2558. }
  2559. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2560. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2561. WOLFSSL_MSG("Invalid arguments, options not supported");
  2562. return BAD_FUNC_ARG;
  2563. }
  2564. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2565. DYNAMIC_TYPE_ALPN);
  2566. if (list == NULL) {
  2567. WOLFSSL_MSG("Memory failure");
  2568. return MEMORY_ERROR;
  2569. }
  2570. token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN);
  2571. if (token == NULL) {
  2572. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2573. WOLFSSL_MSG("Memory failure");
  2574. return MEMORY_ERROR;
  2575. }
  2576. XMEMSET(token, 0, sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1));
  2577. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2578. list[protocol_name_listSz] = '\0';
  2579. /* read all protocol name from the list */
  2580. token[idx] = XSTRTOK(list, ",", &ptr);
  2581. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2582. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2583. /* add protocol name list in the TLS extension in reverse order */
  2584. while ((idx--) > 0) {
  2585. len = (word16)XSTRLEN(token[idx]);
  2586. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2587. ssl->heap);
  2588. if (ret != WOLFSSL_SUCCESS) {
  2589. WOLFSSL_MSG("TLSX_UseALPN failure");
  2590. break;
  2591. }
  2592. }
  2593. XFREE(token, ssl->heap, DYNAMIC_TYPE_ALPN);
  2594. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2595. return ret;
  2596. }
  2597. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2598. {
  2599. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2600. (void **)protocol_name, size);
  2601. }
  2602. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2603. {
  2604. int i, len;
  2605. char *p;
  2606. byte *s;
  2607. if (ssl == NULL || list == NULL || listSz == NULL)
  2608. return BAD_FUNC_ARG;
  2609. if (ssl->alpn_peer_requested == NULL
  2610. || ssl->alpn_peer_requested_length == 0)
  2611. return BUFFER_ERROR;
  2612. /* ssl->alpn_peer_requested are the original bytes sent in a ClientHello,
  2613. * formatted as (len-byte chars+)+. To turn n protocols into a
  2614. * comma-separated C string, one needs (n-1) commas and a final 0 byte
  2615. * which has the same length as the original.
  2616. * The returned length is the strlen() of the C string, so -1 of that. */
  2617. *listSz = ssl->alpn_peer_requested_length-1;
  2618. *list = p = (char *)XMALLOC(ssl->alpn_peer_requested_length, ssl->heap,
  2619. DYNAMIC_TYPE_TLSX);
  2620. if (p == NULL)
  2621. return MEMORY_ERROR;
  2622. for (i = 0, s = ssl->alpn_peer_requested;
  2623. i < ssl->alpn_peer_requested_length;
  2624. p += len, i += len)
  2625. {
  2626. if (i)
  2627. *p++ = ',';
  2628. len = s[i++];
  2629. /* guard against bad length bytes. */
  2630. if (i + len > ssl->alpn_peer_requested_length) {
  2631. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2632. *list = NULL;
  2633. return WOLFSSL_FAILURE;
  2634. }
  2635. XMEMCPY(p, s + i, len);
  2636. }
  2637. *p = 0;
  2638. return WOLFSSL_SUCCESS;
  2639. }
  2640. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2641. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2642. {
  2643. if (ssl == NULL) {
  2644. return BAD_FUNC_ARG;
  2645. }
  2646. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2647. *list = NULL;
  2648. return WOLFSSL_SUCCESS;
  2649. }
  2650. #endif /* HAVE_ALPN */
  2651. /* Secure Renegotiation */
  2652. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2653. /* user is forcing ability to use secure renegotiation, we discourage it */
  2654. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2655. {
  2656. int ret = BAD_FUNC_ARG;
  2657. #if defined(NO_TLS)
  2658. (void)ssl;
  2659. #else
  2660. if (ssl)
  2661. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2662. if (ret == WOLFSSL_SUCCESS) {
  2663. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2664. if (extension)
  2665. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2666. }
  2667. #endif /* !NO_TLS */
  2668. return ret;
  2669. }
  2670. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2671. {
  2672. if (ctx == NULL)
  2673. return BAD_FUNC_ARG;
  2674. ctx->useSecureReneg = 1;
  2675. return WOLFSSL_SUCCESS;
  2676. }
  2677. /* do a secure renegotiation handshake, user forced, we discourage */
  2678. static int _Rehandshake(WOLFSSL* ssl)
  2679. {
  2680. int ret;
  2681. if (ssl == NULL)
  2682. return BAD_FUNC_ARG;
  2683. if (IsAtLeastTLSv1_3(ssl->version)) {
  2684. WOLFSSL_MSG("Secure Renegotiation not supported in TLS 1.3");
  2685. return SECURE_RENEGOTIATION_E;
  2686. }
  2687. if (ssl->secure_renegotiation == NULL) {
  2688. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2689. return SECURE_RENEGOTIATION_E;
  2690. }
  2691. if (ssl->secure_renegotiation->enabled == 0) {
  2692. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2693. return SECURE_RENEGOTIATION_E;
  2694. }
  2695. #ifdef WOLFSSL_DTLS
  2696. if (ssl->options.dtls && ssl->keys.dtls_epoch == 0xFFFF) {
  2697. WOLFSSL_MSG("Secure Renegotiation not allowed. Epoch would wrap");
  2698. return SECURE_RENEGOTIATION_E;
  2699. }
  2700. #endif
  2701. /* If the client started the renegotiation, the server will already
  2702. * have processed the client's hello. */
  2703. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2704. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2705. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2706. if (!ssl->options.handShakeDone) {
  2707. WOLFSSL_MSG("Can't renegotiate until initial "
  2708. "handshake complete");
  2709. return SECURE_RENEGOTIATION_E;
  2710. }
  2711. else {
  2712. WOLFSSL_MSG("Renegotiation already started. "
  2713. "Moving it forward.");
  2714. ret = wolfSSL_negotiate(ssl);
  2715. if (ret == WOLFSSL_SUCCESS)
  2716. ssl->secure_rene_count++;
  2717. return ret;
  2718. }
  2719. }
  2720. #ifndef NO_FORCE_SCR_SAME_SUITE
  2721. /* force same suite */
  2722. if (ssl->suites) {
  2723. ssl->suites->suiteSz = SUITE_LEN;
  2724. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2725. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2726. }
  2727. #endif
  2728. /* reset handshake states */
  2729. ssl->options.sendVerify = 0;
  2730. ssl->options.serverState = NULL_STATE;
  2731. ssl->options.clientState = NULL_STATE;
  2732. ssl->options.connectState = CONNECT_BEGIN;
  2733. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2734. ssl->options.handShakeState = NULL_STATE;
  2735. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2736. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2737. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2738. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SECURE_RENEGOTIATION)
  2739. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2740. ret = SendHelloRequest(ssl);
  2741. if (ret != 0) {
  2742. ssl->error = ret;
  2743. return WOLFSSL_FATAL_ERROR;
  2744. }
  2745. }
  2746. #endif /* !NO_WOLFSSL_SERVER && HAVE_SECURE_RENEGOTIATION */
  2747. ret = InitHandshakeHashes(ssl);
  2748. if (ret != 0) {
  2749. ssl->error = ret;
  2750. return WOLFSSL_FATAL_ERROR;
  2751. }
  2752. }
  2753. ret = wolfSSL_negotiate(ssl);
  2754. if (ret == WOLFSSL_SUCCESS)
  2755. ssl->secure_rene_count++;
  2756. return ret;
  2757. }
  2758. /* do a secure renegotiation handshake, user forced, we discourage */
  2759. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2760. {
  2761. int ret;
  2762. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2763. if (ssl == NULL)
  2764. return WOLFSSL_FAILURE;
  2765. #ifdef HAVE_SESSION_TICKET
  2766. ret = WOLFSSL_SUCCESS;
  2767. #endif
  2768. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2769. /* Reset option to send certificate verify. */
  2770. ssl->options.sendVerify = 0;
  2771. }
  2772. else {
  2773. /* Reset resuming flag to do full secure handshake. */
  2774. ssl->options.resuming = 0;
  2775. #ifdef HAVE_SESSION_TICKET
  2776. /* Clearing the ticket. */
  2777. ret = wolfSSL_UseSessionTicket(ssl);
  2778. #endif
  2779. }
  2780. /* CLIENT/SERVER: Reset peer authentication for full secure handshake. */
  2781. ssl->options.peerAuthGood = 0;
  2782. #ifdef HAVE_SESSION_TICKET
  2783. if (ret == WOLFSSL_SUCCESS)
  2784. #endif
  2785. ret = _Rehandshake(ssl);
  2786. return ret;
  2787. }
  2788. #ifndef NO_WOLFSSL_CLIENT
  2789. /* do a secure resumption handshake, user forced, we discourage */
  2790. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2791. {
  2792. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2793. if (ssl == NULL)
  2794. return BAD_FUNC_ARG;
  2795. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2796. ssl->error = SIDE_ERROR;
  2797. return WOLFSSL_FATAL_ERROR;
  2798. }
  2799. return _Rehandshake(ssl);
  2800. }
  2801. #endif /* NO_WOLFSSL_CLIENT */
  2802. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2803. {
  2804. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2805. if (!ssl || !ssl->secure_renegotiation)
  2806. return WOLFSSL_FAILURE;
  2807. return ssl->secure_renegotiation->enabled;
  2808. }
  2809. #endif /* HAVE_SECURE_RENEGOTIATION_INFO */
  2810. #if defined(HAVE_SESSION_TICKET)
  2811. /* Session Ticket */
  2812. #if !defined(NO_WOLFSSL_SERVER)
  2813. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  2814. {
  2815. if (ctx == NULL)
  2816. return BAD_FUNC_ARG;
  2817. ctx->noTicketTls12 = 1;
  2818. return WOLFSSL_SUCCESS;
  2819. }
  2820. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  2821. {
  2822. if (ssl == NULL)
  2823. return BAD_FUNC_ARG;
  2824. ssl->options.noTicketTls12 = 1;
  2825. return WOLFSSL_SUCCESS;
  2826. }
  2827. /* WOLFSSL_SUCCESS on ok */
  2828. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2829. {
  2830. if (ctx == NULL)
  2831. return BAD_FUNC_ARG;
  2832. ctx->ticketEncCb = cb;
  2833. return WOLFSSL_SUCCESS;
  2834. }
  2835. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2836. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2837. {
  2838. if (ctx == NULL)
  2839. return BAD_FUNC_ARG;
  2840. ctx->ticketHint = hint;
  2841. return WOLFSSL_SUCCESS;
  2842. }
  2843. /* set user context, WOLFSSL_SUCCESS on ok */
  2844. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2845. {
  2846. if (ctx == NULL)
  2847. return BAD_FUNC_ARG;
  2848. ctx->ticketEncCtx = userCtx;
  2849. return WOLFSSL_SUCCESS;
  2850. }
  2851. /* get user context - returns userCtx on success, NULL on failure */
  2852. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  2853. {
  2854. if (ctx == NULL)
  2855. return NULL;
  2856. return ctx->ticketEncCtx;
  2857. }
  2858. #ifdef WOLFSSL_TLS13
  2859. /* set the maximum number of tickets to send
  2860. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  2861. */
  2862. int wolfSSL_CTX_set_num_tickets(WOLFSSL_CTX* ctx, size_t mxTickets)
  2863. {
  2864. if (ctx == NULL)
  2865. return WOLFSSL_FAILURE;
  2866. ctx->maxTicketTls13 = (unsigned int)mxTickets;
  2867. return WOLFSSL_SUCCESS;
  2868. }
  2869. /* get the maximum number of tickets to send
  2870. * return number of tickets set to be sent
  2871. */
  2872. size_t wolfSSL_CTX_get_num_tickets(WOLFSSL_CTX* ctx)
  2873. {
  2874. if (ctx == NULL)
  2875. return 0;
  2876. return (size_t)ctx->maxTicketTls13;
  2877. }
  2878. #endif /* WOLFSSL_TLS13 */
  2879. #endif /* !NO_WOLFSSL_SERVER */
  2880. #if !defined(NO_WOLFSSL_CLIENT)
  2881. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2882. {
  2883. if (ssl == NULL)
  2884. return BAD_FUNC_ARG;
  2885. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2886. }
  2887. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2888. {
  2889. if (ctx == NULL)
  2890. return BAD_FUNC_ARG;
  2891. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2892. }
  2893. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2894. byte* buf, word32* bufSz)
  2895. {
  2896. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2897. return BAD_FUNC_ARG;
  2898. if (ssl->session->ticketLen <= *bufSz) {
  2899. XMEMCPY(buf, ssl->session->ticket, ssl->session->ticketLen);
  2900. *bufSz = ssl->session->ticketLen;
  2901. }
  2902. else
  2903. *bufSz = 0;
  2904. return WOLFSSL_SUCCESS;
  2905. }
  2906. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2907. word32 bufSz)
  2908. {
  2909. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2910. return BAD_FUNC_ARG;
  2911. if (bufSz > 0) {
  2912. /* Ticket will fit into static ticket */
  2913. if (bufSz <= SESSION_TICKET_LEN) {
  2914. if (ssl->session->ticketLenAlloc > 0) {
  2915. XFREE(ssl->session->ticket, ssl->session->heap,
  2916. DYNAMIC_TYPE_SESSION_TICK);
  2917. ssl->session->ticketLenAlloc = 0;
  2918. ssl->session->ticket = ssl->session->staticTicket;
  2919. }
  2920. }
  2921. else { /* Ticket requires dynamic ticket storage */
  2922. if (ssl->session->ticketLen < bufSz) { /* is dyn buffer big enough */
  2923. if (ssl->session->ticketLenAlloc > 0) {
  2924. XFREE(ssl->session->ticket, ssl->session->heap,
  2925. DYNAMIC_TYPE_SESSION_TICK);
  2926. }
  2927. ssl->session->ticket = (byte*)XMALLOC(bufSz, ssl->session->heap,
  2928. DYNAMIC_TYPE_SESSION_TICK);
  2929. if(ssl->session->ticket == NULL) {
  2930. ssl->session->ticket = ssl->session->staticTicket;
  2931. ssl->session->ticketLenAlloc = 0;
  2932. return MEMORY_ERROR;
  2933. }
  2934. ssl->session->ticketLenAlloc = (word16)bufSz;
  2935. }
  2936. }
  2937. XMEMCPY(ssl->session->ticket, buf, bufSz);
  2938. }
  2939. ssl->session->ticketLen = (word16)bufSz;
  2940. return WOLFSSL_SUCCESS;
  2941. }
  2942. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2943. CallbackSessionTicket cb, void* ctx)
  2944. {
  2945. if (ssl == NULL)
  2946. return BAD_FUNC_ARG;
  2947. ssl->session_ticket_cb = cb;
  2948. ssl->session_ticket_ctx = ctx;
  2949. return WOLFSSL_SUCCESS;
  2950. }
  2951. #endif /* !NO_WOLFSSL_CLIENT */
  2952. #endif /* HAVE_SESSION_TICKET */
  2953. #ifdef HAVE_EXTENDED_MASTER
  2954. #ifndef NO_WOLFSSL_CLIENT
  2955. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2956. {
  2957. if (ctx == NULL)
  2958. return BAD_FUNC_ARG;
  2959. ctx->haveEMS = 0;
  2960. return WOLFSSL_SUCCESS;
  2961. }
  2962. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2963. {
  2964. if (ssl == NULL)
  2965. return BAD_FUNC_ARG;
  2966. ssl->options.haveEMS = 0;
  2967. return WOLFSSL_SUCCESS;
  2968. }
  2969. #endif
  2970. #endif
  2971. #ifndef WOLFSSL_LEANPSK
  2972. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2973. {
  2974. int ret;
  2975. int oldFlags;
  2976. WOLFSSL_ENTER("wolfSSL_send()");
  2977. if (ssl == NULL || data == NULL || sz < 0)
  2978. return BAD_FUNC_ARG;
  2979. oldFlags = ssl->wflags;
  2980. ssl->wflags = flags;
  2981. ret = wolfSSL_write(ssl, data, sz);
  2982. ssl->wflags = oldFlags;
  2983. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2984. return ret;
  2985. }
  2986. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2987. {
  2988. int ret;
  2989. int oldFlags;
  2990. WOLFSSL_ENTER("wolfSSL_recv()");
  2991. if (ssl == NULL || data == NULL || sz < 0)
  2992. return BAD_FUNC_ARG;
  2993. oldFlags = ssl->rflags;
  2994. ssl->rflags = flags;
  2995. ret = wolfSSL_read(ssl, data, sz);
  2996. ssl->rflags = oldFlags;
  2997. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2998. return ret;
  2999. }
  3000. #endif
  3001. /* WOLFSSL_SUCCESS on ok */
  3002. WOLFSSL_ABI
  3003. int wolfSSL_shutdown(WOLFSSL* ssl)
  3004. {
  3005. int ret = WOLFSSL_FATAL_ERROR;
  3006. WOLFSSL_ENTER("SSL_shutdown()");
  3007. if (ssl == NULL)
  3008. return WOLFSSL_FATAL_ERROR;
  3009. if (ssl->options.quietShutdown) {
  3010. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  3011. ret = WOLFSSL_SUCCESS;
  3012. }
  3013. else {
  3014. /* try to send close notify, not an error if can't */
  3015. if (!ssl->options.isClosed && !ssl->options.connReset &&
  3016. !ssl->options.sentNotify) {
  3017. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  3018. if (ssl->error < 0) {
  3019. WOLFSSL_ERROR(ssl->error);
  3020. return WOLFSSL_FATAL_ERROR;
  3021. }
  3022. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  3023. if (ssl->options.closeNotify)
  3024. ret = WOLFSSL_SUCCESS;
  3025. else {
  3026. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3027. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  3028. return ret;
  3029. }
  3030. }
  3031. #ifdef WOLFSSL_SHUTDOWNONCE
  3032. if (ssl->options.isClosed || ssl->options.connReset) {
  3033. /* Shutdown has already occurred.
  3034. * Caller is free to ignore this error. */
  3035. return SSL_SHUTDOWN_ALREADY_DONE_E;
  3036. }
  3037. #endif
  3038. /* call wolfSSL_shutdown again for bidirectional shutdown */
  3039. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  3040. ret = ProcessReply(ssl);
  3041. if (ret == ZERO_RETURN) {
  3042. /* simulate OpenSSL behavior */
  3043. ssl->error = WOLFSSL_ERROR_SYSCALL;
  3044. ret = WOLFSSL_SUCCESS;
  3045. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  3046. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  3047. } else {
  3048. WOLFSSL_ERROR(ssl->error);
  3049. ret = WOLFSSL_FATAL_ERROR;
  3050. }
  3051. }
  3052. }
  3053. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3054. /* reset WOLFSSL structure state for possible re-use */
  3055. if (ret == WOLFSSL_SUCCESS) {
  3056. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  3057. WOLFSSL_MSG("could not clear WOLFSSL");
  3058. ret = WOLFSSL_FATAL_ERROR;
  3059. }
  3060. }
  3061. #endif
  3062. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  3063. return ret;
  3064. }
  3065. /* get current error state value */
  3066. int wolfSSL_state(WOLFSSL* ssl)
  3067. {
  3068. if (ssl == NULL) {
  3069. return BAD_FUNC_ARG;
  3070. }
  3071. return ssl->error;
  3072. }
  3073. WOLFSSL_ABI
  3074. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  3075. {
  3076. WOLFSSL_ENTER("SSL_get_error");
  3077. if (ret > 0)
  3078. return WOLFSSL_ERROR_NONE;
  3079. if (ssl == NULL)
  3080. return BAD_FUNC_ARG;
  3081. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  3082. /* make sure converted types are handled in SetErrorString() too */
  3083. if (ssl->error == WANT_READ)
  3084. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  3085. else if (ssl->error == WANT_WRITE)
  3086. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  3087. else if (ssl->error == ZERO_RETURN)
  3088. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  3089. return ssl->error;
  3090. }
  3091. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  3092. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  3093. {
  3094. if (ssl && h) {
  3095. *h = ssl->alert_history;
  3096. }
  3097. return WOLFSSL_SUCCESS;
  3098. }
  3099. #ifdef OPENSSL_EXTRA
  3100. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  3101. int wolfSSL_want(WOLFSSL* ssl)
  3102. {
  3103. int rw_state = SSL_NOTHING;
  3104. if (ssl) {
  3105. if (ssl->error == WANT_READ)
  3106. rw_state = SSL_READING;
  3107. else if (ssl->error == WANT_WRITE)
  3108. rw_state = SSL_WRITING;
  3109. }
  3110. return rw_state;
  3111. }
  3112. #endif
  3113. /* return TRUE if current error is want read */
  3114. int wolfSSL_want_read(WOLFSSL* ssl)
  3115. {
  3116. WOLFSSL_ENTER("SSL_want_read");
  3117. if (ssl->error == WANT_READ)
  3118. return 1;
  3119. return 0;
  3120. }
  3121. /* return TRUE if current error is want write */
  3122. int wolfSSL_want_write(WOLFSSL* ssl)
  3123. {
  3124. WOLFSSL_ENTER("SSL_want_write");
  3125. if (ssl->error == WANT_WRITE)
  3126. return 1;
  3127. return 0;
  3128. }
  3129. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  3130. {
  3131. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  3132. WOLFSSL_ENTER("ERR_error_string");
  3133. if (data) {
  3134. SetErrorString((int)errNumber, data);
  3135. return data;
  3136. }
  3137. else {
  3138. SetErrorString((int)errNumber, tmp);
  3139. return tmp;
  3140. }
  3141. }
  3142. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  3143. {
  3144. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  3145. if (len >= WOLFSSL_MAX_ERROR_SZ)
  3146. wolfSSL_ERR_error_string(e, buf);
  3147. else {
  3148. char tmp[WOLFSSL_MAX_ERROR_SZ];
  3149. WOLFSSL_MSG("Error buffer too short, truncating");
  3150. if (len) {
  3151. wolfSSL_ERR_error_string(e, tmp);
  3152. XMEMCPY(buf, tmp, len-1);
  3153. buf[len-1] = '\0';
  3154. }
  3155. }
  3156. }
  3157. /* don't free temporary arrays at end of handshake */
  3158. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  3159. {
  3160. if (ssl)
  3161. ssl->options.saveArrays = 1;
  3162. }
  3163. /* user doesn't need temporary arrays anymore, Free */
  3164. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  3165. {
  3166. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  3167. ssl->options.saveArrays = 0;
  3168. FreeArrays(ssl, 1);
  3169. }
  3170. }
  3171. /* Set option to indicate that the resources are not to be freed after
  3172. * handshake.
  3173. *
  3174. * ssl The SSL/TLS object.
  3175. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3176. */
  3177. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  3178. {
  3179. if (ssl == NULL)
  3180. return BAD_FUNC_ARG;
  3181. ssl->options.keepResources = 1;
  3182. return 0;
  3183. }
  3184. /* Free the handshake resources after handshake.
  3185. *
  3186. * ssl The SSL/TLS object.
  3187. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3188. */
  3189. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  3190. {
  3191. if (ssl == NULL)
  3192. return BAD_FUNC_ARG;
  3193. FreeHandshakeResources(ssl);
  3194. return 0;
  3195. }
  3196. /* Use the client's order of preference when matching cipher suites.
  3197. *
  3198. * ssl The SSL/TLS context object.
  3199. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3200. */
  3201. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  3202. {
  3203. if (ctx == NULL)
  3204. return BAD_FUNC_ARG;
  3205. ctx->useClientOrder = 1;
  3206. return 0;
  3207. }
  3208. /* Use the client's order of preference when matching cipher suites.
  3209. *
  3210. * ssl The SSL/TLS object.
  3211. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3212. */
  3213. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  3214. {
  3215. if (ssl == NULL)
  3216. return BAD_FUNC_ARG;
  3217. ssl->options.useClientOrder = 1;
  3218. return 0;
  3219. }
  3220. #ifdef WOLFSSL_DTLS
  3221. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  3222. {
  3223. #ifndef WOLFSSL_AEAD_ONLY
  3224. Keys* keys = NULL;
  3225. (void)epochOrder;
  3226. if (ssl == NULL)
  3227. return NULL;
  3228. #ifdef HAVE_SECURE_RENEGOTIATION
  3229. switch (epochOrder) {
  3230. case PEER_ORDER:
  3231. if (IsDtlsMsgSCRKeys(ssl))
  3232. keys = &ssl->secure_renegotiation->tmp_keys;
  3233. else
  3234. keys = &ssl->keys;
  3235. break;
  3236. case PREV_ORDER:
  3237. keys = &ssl->keys;
  3238. break;
  3239. case CUR_ORDER:
  3240. if (DtlsUseSCRKeys(ssl))
  3241. keys = &ssl->secure_renegotiation->tmp_keys;
  3242. else
  3243. keys = &ssl->keys;
  3244. break;
  3245. default:
  3246. WOLFSSL_MSG("Unknown epoch order");
  3247. return NULL;
  3248. }
  3249. #else
  3250. keys = &ssl->keys;
  3251. #endif
  3252. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3253. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3254. return keys->client_write_MAC_secret;
  3255. else
  3256. return keys->server_write_MAC_secret;
  3257. #else
  3258. (void)ssl;
  3259. (void)verify;
  3260. (void)epochOrder;
  3261. return NULL;
  3262. #endif
  3263. }
  3264. #endif /* WOLFSSL_DTLS */
  3265. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  3266. {
  3267. #ifndef WOLFSSL_AEAD_ONLY
  3268. if (ssl == NULL)
  3269. return NULL;
  3270. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3271. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3272. return ssl->keys.client_write_MAC_secret;
  3273. else
  3274. return ssl->keys.server_write_MAC_secret;
  3275. #else
  3276. (void)ssl;
  3277. (void)verify;
  3278. return NULL;
  3279. #endif
  3280. }
  3281. int wolfSSL_GetSide(WOLFSSL* ssl)
  3282. {
  3283. if (ssl)
  3284. return ssl->options.side;
  3285. return BAD_FUNC_ARG;
  3286. }
  3287. #ifdef ATOMIC_USER
  3288. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  3289. {
  3290. if (ctx)
  3291. ctx->MacEncryptCb = cb;
  3292. }
  3293. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  3294. {
  3295. if (ssl)
  3296. ssl->MacEncryptCtx = ctx;
  3297. }
  3298. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  3299. {
  3300. if (ssl)
  3301. return ssl->MacEncryptCtx;
  3302. return NULL;
  3303. }
  3304. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  3305. {
  3306. if (ctx)
  3307. ctx->DecryptVerifyCb = cb;
  3308. }
  3309. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  3310. {
  3311. if (ssl)
  3312. ssl->DecryptVerifyCtx = ctx;
  3313. }
  3314. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  3315. {
  3316. if (ssl)
  3317. return ssl->DecryptVerifyCtx;
  3318. return NULL;
  3319. }
  3320. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3321. /**
  3322. * Set the callback, against the context, that encrypts then MACs.
  3323. *
  3324. * ctx SSL/TLS context.
  3325. * cb Callback function to use with Encrypt-Then-MAC.
  3326. */
  3327. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  3328. {
  3329. if (ctx)
  3330. ctx->EncryptMacCb = cb;
  3331. }
  3332. /**
  3333. * Set the context to use with callback that encrypts then MACs.
  3334. *
  3335. * ssl SSL/TLS object.
  3336. * ctx Callback function's context.
  3337. */
  3338. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  3339. {
  3340. if (ssl)
  3341. ssl->EncryptMacCtx = ctx;
  3342. }
  3343. /**
  3344. * Get the context being used with callback that encrypts then MACs.
  3345. *
  3346. * ssl SSL/TLS object.
  3347. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3348. */
  3349. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  3350. {
  3351. if (ssl)
  3352. return ssl->EncryptMacCtx;
  3353. return NULL;
  3354. }
  3355. /**
  3356. * Set the callback, against the context, that MAC verifies then decrypts.
  3357. *
  3358. * ctx SSL/TLS context.
  3359. * cb Callback function to use with Encrypt-Then-MAC.
  3360. */
  3361. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  3362. {
  3363. if (ctx)
  3364. ctx->VerifyDecryptCb = cb;
  3365. }
  3366. /**
  3367. * Set the context to use with callback that MAC verifies then decrypts.
  3368. *
  3369. * ssl SSL/TLS object.
  3370. * ctx Callback function's context.
  3371. */
  3372. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  3373. {
  3374. if (ssl)
  3375. ssl->VerifyDecryptCtx = ctx;
  3376. }
  3377. /**
  3378. * Get the context being used with callback that MAC verifies then decrypts.
  3379. *
  3380. * ssl SSL/TLS object.
  3381. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3382. */
  3383. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  3384. {
  3385. if (ssl)
  3386. return ssl->VerifyDecryptCtx;
  3387. return NULL;
  3388. }
  3389. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  3390. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  3391. {
  3392. if (ssl)
  3393. return ssl->keys.client_write_key;
  3394. return NULL;
  3395. }
  3396. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  3397. {
  3398. if (ssl)
  3399. return ssl->keys.client_write_IV;
  3400. return NULL;
  3401. }
  3402. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  3403. {
  3404. if (ssl)
  3405. return ssl->keys.server_write_key;
  3406. return NULL;
  3407. }
  3408. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  3409. {
  3410. if (ssl)
  3411. return ssl->keys.server_write_IV;
  3412. return NULL;
  3413. }
  3414. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  3415. {
  3416. if (ssl)
  3417. return ssl->specs.key_size;
  3418. return BAD_FUNC_ARG;
  3419. }
  3420. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  3421. {
  3422. if (ssl)
  3423. return ssl->specs.iv_size;
  3424. return BAD_FUNC_ARG;
  3425. }
  3426. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  3427. {
  3428. if (ssl)
  3429. return ssl->specs.bulk_cipher_algorithm;
  3430. return BAD_FUNC_ARG;
  3431. }
  3432. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  3433. {
  3434. if (ssl == NULL)
  3435. return BAD_FUNC_ARG;
  3436. #ifndef WOLFSSL_AEAD_ONLY
  3437. if (ssl->specs.cipher_type == block)
  3438. return WOLFSSL_BLOCK_TYPE;
  3439. if (ssl->specs.cipher_type == stream)
  3440. return WOLFSSL_STREAM_TYPE;
  3441. #endif
  3442. if (ssl->specs.cipher_type == aead)
  3443. return WOLFSSL_AEAD_TYPE;
  3444. return -1;
  3445. }
  3446. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  3447. {
  3448. if (ssl == NULL)
  3449. return BAD_FUNC_ARG;
  3450. return ssl->specs.block_size;
  3451. }
  3452. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  3453. {
  3454. if (ssl == NULL)
  3455. return BAD_FUNC_ARG;
  3456. return ssl->specs.aead_mac_size;
  3457. }
  3458. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  3459. {
  3460. if (ssl == NULL)
  3461. return BAD_FUNC_ARG;
  3462. if (ssl->options.tls1_1)
  3463. return 1;
  3464. return 0;
  3465. }
  3466. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  3467. {
  3468. /* AEAD ciphers don't have HMAC keys */
  3469. if (ssl)
  3470. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  3471. return BAD_FUNC_ARG;
  3472. }
  3473. #ifdef WORD64_AVAILABLE
  3474. int wolfSSL_GetPeerSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3475. {
  3476. if ((ssl == NULL) || (seq == NULL))
  3477. return BAD_FUNC_ARG;
  3478. *seq = ((word64)ssl->keys.peer_sequence_number_hi << 32) |
  3479. ssl->keys.peer_sequence_number_lo;
  3480. return !(*seq);
  3481. }
  3482. int wolfSSL_GetSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3483. {
  3484. if ((ssl == NULL) || (seq == NULL))
  3485. return BAD_FUNC_ARG;
  3486. *seq = ((word64)ssl->keys.sequence_number_hi << 32) |
  3487. ssl->keys.sequence_number_lo;
  3488. return !(*seq);
  3489. }
  3490. #endif
  3491. #endif /* ATOMIC_USER */
  3492. #ifndef NO_CERTS
  3493. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  3494. {
  3495. WOLFSSL_CERT_MANAGER* cm = NULL;
  3496. if (ctx)
  3497. cm = ctx->cm;
  3498. return cm;
  3499. }
  3500. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  3501. {
  3502. WOLFSSL_CERT_MANAGER* cm;
  3503. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  3504. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  3505. DYNAMIC_TYPE_CERT_MANAGER);
  3506. if (cm) {
  3507. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  3508. cm->refCount = 1;
  3509. if (wc_InitMutex(&cm->caLock) != 0) {
  3510. WOLFSSL_MSG("Bad mutex init");
  3511. wolfSSL_CertManagerFree(cm);
  3512. return NULL;
  3513. }
  3514. #ifndef SINGLE_THREADED
  3515. if (wc_InitMutex(&cm->refMutex) != 0) {
  3516. WOLFSSL_MSG("Bad mutex init");
  3517. wolfSSL_CertManagerFree(cm);
  3518. return NULL;
  3519. }
  3520. #endif
  3521. #ifdef WOLFSSL_TRUST_PEER_CERT
  3522. if (wc_InitMutex(&cm->tpLock) != 0) {
  3523. WOLFSSL_MSG("Bad mutex init");
  3524. wolfSSL_CertManagerFree(cm);
  3525. return NULL;
  3526. }
  3527. #endif
  3528. /* set default minimum key size allowed */
  3529. #ifndef NO_RSA
  3530. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  3531. #endif
  3532. #ifdef HAVE_ECC
  3533. cm->minEccKeySz = MIN_ECCKEY_SZ;
  3534. #endif
  3535. #ifdef HAVE_PQC
  3536. #ifdef HAVE_FALCON
  3537. cm->minFalconKeySz = MIN_FALCONKEY_SZ;
  3538. #endif /* HAVE_FALCON */
  3539. #ifdef HAVE_DILITHIUM
  3540. cm->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  3541. #endif /* HAVE_DILITHIUM */
  3542. #endif /* HAVE_PQC */
  3543. cm->heap = heap;
  3544. }
  3545. return cm;
  3546. }
  3547. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  3548. {
  3549. return wolfSSL_CertManagerNew_ex(NULL);
  3550. }
  3551. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  3552. {
  3553. int doFree = 0;
  3554. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  3555. if (cm) {
  3556. #ifndef SINGLE_THREADED
  3557. if (wc_LockMutex(&cm->refMutex) != 0) {
  3558. WOLFSSL_MSG("Couldn't lock cm mutex");
  3559. }
  3560. #endif
  3561. cm->refCount--;
  3562. if (cm->refCount == 0)
  3563. doFree = 1;
  3564. #ifndef SINGLE_THREADED
  3565. wc_UnLockMutex(&cm->refMutex);
  3566. #endif
  3567. if (doFree) {
  3568. #ifdef HAVE_CRL
  3569. if (cm->crl)
  3570. FreeCRL(cm->crl, 1);
  3571. #endif
  3572. #ifdef HAVE_OCSP
  3573. if (cm->ocsp)
  3574. FreeOCSP(cm->ocsp, 1);
  3575. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  3576. #if !defined(NO_WOLFSSL_SERVER) && \
  3577. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  3578. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  3579. if (cm->ocsp_stapling)
  3580. FreeOCSP(cm->ocsp_stapling, 1);
  3581. #endif
  3582. #endif
  3583. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3584. wc_FreeMutex(&cm->caLock);
  3585. #ifdef WOLFSSL_TRUST_PEER_CERT
  3586. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3587. wc_FreeMutex(&cm->tpLock);
  3588. #endif
  3589. #ifndef SINGLE_THREADED
  3590. if (wc_FreeMutex(&cm->refMutex) != 0) {
  3591. WOLFSSL_MSG("Couldn't free refMutex mutex");
  3592. }
  3593. #endif
  3594. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  3595. }
  3596. }
  3597. }
  3598. int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
  3599. {
  3600. if (cm) {
  3601. #ifndef SINGLE_THREADED
  3602. if (wc_LockMutex(&cm->refMutex) != 0) {
  3603. WOLFSSL_MSG("Failed to lock cm mutex");
  3604. return WOLFSSL_FAILURE;
  3605. }
  3606. #endif
  3607. cm->refCount++;
  3608. #ifndef SINGLE_THREADED
  3609. wc_UnLockMutex(&cm->refMutex);
  3610. #endif
  3611. return WOLFSSL_SUCCESS;
  3612. }
  3613. return WOLFSSL_FAILURE;
  3614. }
  3615. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  3616. #if defined(WOLFSSL_SIGNER_DER_CERT)
  3617. /******************************************************************************
  3618. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  3619. * certificate manager (CM).
  3620. *
  3621. * RETURNS:
  3622. * returns stack of X509 certs on success, otherwise returns a NULL.
  3623. */
  3624. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  3625. {
  3626. WOLFSSL_STACK* sk = NULL;
  3627. int numCerts = 0;
  3628. DerBuffer** certBuffers = NULL;
  3629. const byte* derBuffer = NULL;
  3630. Signer* signers = NULL;
  3631. word32 row = 0;
  3632. WOLFSSL_X509* x509 = NULL;
  3633. int i = 0;
  3634. int ret = 0;
  3635. if (cm == NULL)
  3636. return NULL;
  3637. sk = wolfSSL_sk_X509_new_null();
  3638. if (sk == NULL)
  3639. goto error;
  3640. if (wc_LockMutex(&cm->caLock) != 0)
  3641. goto error;
  3642. /* Iterate once to get the number of certs, for memory allocation
  3643. purposes. */
  3644. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3645. signers = cm->caTable[row];
  3646. while (signers && signers->derCert && signers->derCert->buffer) {
  3647. ++numCerts;
  3648. signers = signers->next;
  3649. }
  3650. }
  3651. if (numCerts == 0) {
  3652. wc_UnLockMutex(&cm->caLock);
  3653. goto error;
  3654. }
  3655. certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap,
  3656. DYNAMIC_TYPE_TMP_BUFFER);
  3657. if (certBuffers == NULL) {
  3658. wc_UnLockMutex(&cm->caLock);
  3659. goto error;
  3660. }
  3661. XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts);
  3662. /* Copy the certs locally so that we can release the caLock. If the lock is
  3663. held when wolfSSL_d2i_X509 is called, GetCA will also try to get the
  3664. lock, leading to deadlock. */
  3665. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3666. signers = cm->caTable[row];
  3667. while (signers && signers->derCert && signers->derCert->buffer) {
  3668. ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE,
  3669. cm->heap);
  3670. if (ret < 0) {
  3671. wc_UnLockMutex(&cm->caLock);
  3672. goto error;
  3673. }
  3674. XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer,
  3675. signers->derCert->length);
  3676. certBuffers[i]->length = signers->derCert->length;
  3677. ++i;
  3678. signers = signers->next;
  3679. }
  3680. }
  3681. wc_UnLockMutex(&cm->caLock);
  3682. for (i = 0; i < numCerts; ++i) {
  3683. derBuffer = certBuffers[i]->buffer;
  3684. wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length);
  3685. if (x509 == NULL)
  3686. goto error;
  3687. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS)
  3688. goto error;
  3689. }
  3690. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3691. FreeDer(&certBuffers[i]);
  3692. }
  3693. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3694. return sk;
  3695. error:
  3696. if (sk)
  3697. wolfSSL_sk_X509_pop_free(sk, NULL);
  3698. if (certBuffers != NULL) {
  3699. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3700. FreeDer(&certBuffers[i]);
  3701. }
  3702. }
  3703. if (certBuffers)
  3704. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3705. return NULL;
  3706. }
  3707. #endif /* WOLFSSL_SIGNER_DER_CERT */
  3708. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3709. /* Unload the CA signer list */
  3710. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3711. {
  3712. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3713. if (cm == NULL)
  3714. return BAD_FUNC_ARG;
  3715. if (wc_LockMutex(&cm->caLock) != 0)
  3716. return BAD_MUTEX_E;
  3717. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3718. wc_UnLockMutex(&cm->caLock);
  3719. return WOLFSSL_SUCCESS;
  3720. }
  3721. #ifdef WOLFSSL_TRUST_PEER_CERT
  3722. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3723. {
  3724. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3725. if (cm == NULL)
  3726. return BAD_FUNC_ARG;
  3727. if (wc_LockMutex(&cm->tpLock) != 0)
  3728. return BAD_MUTEX_E;
  3729. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3730. wc_UnLockMutex(&cm->tpLock);
  3731. return WOLFSSL_SUCCESS;
  3732. }
  3733. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3734. #endif /* NO_CERTS */
  3735. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3736. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3737. {
  3738. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3739. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3740. SetErrorString(err, data);
  3741. if (XFPRINTF(fp, "%s", data) < 0)
  3742. WOLFSSL_MSG("fprintf failed in wolfSSL_ERR_print_errors_fp");
  3743. }
  3744. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3745. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3746. {
  3747. wc_ERR_print_errors_fp(fp);
  3748. }
  3749. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3750. void *u), void *u)
  3751. {
  3752. wc_ERR_print_errors_cb(cb, u);
  3753. }
  3754. #endif
  3755. #endif
  3756. /*
  3757. * TODO This ssl parameter needs to be changed to const once our ABI checker
  3758. * stops flagging qualifier additions as ABI breaking.
  3759. */
  3760. WOLFSSL_ABI
  3761. int wolfSSL_pending(WOLFSSL* ssl)
  3762. {
  3763. WOLFSSL_ENTER("SSL_pending");
  3764. if (ssl == NULL)
  3765. return WOLFSSL_FAILURE;
  3766. return ssl->buffers.clearOutputBuffer.length;
  3767. }
  3768. int wolfSSL_has_pending(const WOLFSSL* ssl)
  3769. {
  3770. WOLFSSL_ENTER("wolfSSL_has_pending");
  3771. if (ssl == NULL)
  3772. return WOLFSSL_FAILURE;
  3773. return ssl->buffers.clearOutputBuffer.length > 0;
  3774. }
  3775. #ifndef WOLFSSL_LEANPSK
  3776. /* turn on handshake group messages for context */
  3777. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3778. {
  3779. if (ctx == NULL)
  3780. return BAD_FUNC_ARG;
  3781. ctx->groupMessages = 1;
  3782. return WOLFSSL_SUCCESS;
  3783. }
  3784. #endif
  3785. #ifndef NO_WOLFSSL_CLIENT
  3786. /* connect enough to get peer cert chain */
  3787. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3788. {
  3789. int ret;
  3790. if (ssl == NULL)
  3791. return WOLFSSL_FAILURE;
  3792. ssl->options.certOnly = 1;
  3793. ret = wolfSSL_connect(ssl);
  3794. ssl->options.certOnly = 0;
  3795. return ret;
  3796. }
  3797. #endif
  3798. #ifndef WOLFSSL_LEANPSK
  3799. /* turn on handshake group messages for ssl object */
  3800. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3801. {
  3802. if (ssl == NULL)
  3803. return BAD_FUNC_ARG;
  3804. ssl->options.groupMessages = 1;
  3805. return WOLFSSL_SUCCESS;
  3806. }
  3807. /* make minVersion the internal equivalent SSL version */
  3808. static int SetMinVersionHelper(byte* minVersion, int version)
  3809. {
  3810. #ifdef NO_TLS
  3811. (void)minVersion;
  3812. #endif
  3813. switch (version) {
  3814. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3815. case WOLFSSL_SSLV3:
  3816. *minVersion = SSLv3_MINOR;
  3817. break;
  3818. #endif
  3819. #ifndef NO_TLS
  3820. #ifndef NO_OLD_TLS
  3821. #ifdef WOLFSSL_ALLOW_TLSV10
  3822. case WOLFSSL_TLSV1:
  3823. *minVersion = TLSv1_MINOR;
  3824. break;
  3825. #endif
  3826. case WOLFSSL_TLSV1_1:
  3827. *minVersion = TLSv1_1_MINOR;
  3828. break;
  3829. #endif
  3830. #ifndef WOLFSSL_NO_TLS12
  3831. case WOLFSSL_TLSV1_2:
  3832. *minVersion = TLSv1_2_MINOR;
  3833. break;
  3834. #endif
  3835. #endif
  3836. #ifdef WOLFSSL_TLS13
  3837. case WOLFSSL_TLSV1_3:
  3838. *minVersion = TLSv1_3_MINOR;
  3839. break;
  3840. #endif
  3841. #ifdef WOLFSSL_DTLS
  3842. case WOLFSSL_DTLSV1:
  3843. *minVersion = DTLS_MINOR;
  3844. break;
  3845. case WOLFSSL_DTLSV1_2:
  3846. *minVersion = DTLSv1_2_MINOR;
  3847. break;
  3848. #ifdef WOLFSSL_DTLS13
  3849. case WOLFSSL_DTLSV1_3:
  3850. *minVersion = DTLSv1_3_MINOR;
  3851. break;
  3852. #endif /* WOLFSSL_DTLS13 */
  3853. #endif /* WOLFSSL_DTLS */
  3854. default:
  3855. WOLFSSL_MSG("Bad function argument");
  3856. return BAD_FUNC_ARG;
  3857. }
  3858. return WOLFSSL_SUCCESS;
  3859. }
  3860. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3861. WOLFSSL_ABI
  3862. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3863. {
  3864. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3865. if (ctx == NULL) {
  3866. WOLFSSL_MSG("Bad function argument");
  3867. return BAD_FUNC_ARG;
  3868. }
  3869. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3870. }
  3871. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3872. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3873. {
  3874. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3875. if (ssl == NULL) {
  3876. WOLFSSL_MSG("Bad function argument");
  3877. return BAD_FUNC_ARG;
  3878. }
  3879. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3880. }
  3881. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3882. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  3883. {
  3884. if (ssl == NULL)
  3885. return BAD_FUNC_ARG;
  3886. if (ssl->version.major == SSLv3_MAJOR) {
  3887. switch (ssl->version.minor) {
  3888. case SSLv3_MINOR :
  3889. return WOLFSSL_SSLV3;
  3890. case TLSv1_MINOR :
  3891. return WOLFSSL_TLSV1;
  3892. case TLSv1_1_MINOR :
  3893. return WOLFSSL_TLSV1_1;
  3894. case TLSv1_2_MINOR :
  3895. return WOLFSSL_TLSV1_2;
  3896. case TLSv1_3_MINOR :
  3897. return WOLFSSL_TLSV1_3;
  3898. default:
  3899. break;
  3900. }
  3901. }
  3902. return VERSION_ERROR;
  3903. }
  3904. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3905. {
  3906. word16 haveRSA = 1;
  3907. word16 havePSK = 0;
  3908. int keySz = 0;
  3909. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3910. if (ssl == NULL) {
  3911. WOLFSSL_MSG("Bad function argument");
  3912. return BAD_FUNC_ARG;
  3913. }
  3914. switch (version) {
  3915. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3916. case WOLFSSL_SSLV3:
  3917. ssl->version = MakeSSLv3();
  3918. break;
  3919. #endif
  3920. #ifndef NO_TLS
  3921. #ifndef NO_OLD_TLS
  3922. #ifdef WOLFSSL_ALLOW_TLSV10
  3923. case WOLFSSL_TLSV1:
  3924. ssl->version = MakeTLSv1();
  3925. break;
  3926. #endif
  3927. case WOLFSSL_TLSV1_1:
  3928. ssl->version = MakeTLSv1_1();
  3929. break;
  3930. #endif
  3931. #ifndef WOLFSSL_NO_TLS12
  3932. case WOLFSSL_TLSV1_2:
  3933. ssl->version = MakeTLSv1_2();
  3934. break;
  3935. #endif
  3936. #ifdef WOLFSSL_TLS13
  3937. case WOLFSSL_TLSV1_3:
  3938. ssl->version = MakeTLSv1_3();
  3939. break;
  3940. #endif /* WOLFSSL_TLS13 */
  3941. #endif
  3942. default:
  3943. WOLFSSL_MSG("Bad function argument");
  3944. return BAD_FUNC_ARG;
  3945. }
  3946. #ifdef NO_RSA
  3947. haveRSA = 0;
  3948. #endif
  3949. #ifndef NO_PSK
  3950. havePSK = ssl->options.havePSK;
  3951. #endif
  3952. #ifndef NO_CERTS
  3953. keySz = ssl->buffers.keySz;
  3954. #endif
  3955. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3956. ssl->options.haveDH, ssl->options.haveECDSAsig,
  3957. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  3958. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  3959. ssl->options.haveAnon, TRUE, ssl->options.side);
  3960. return WOLFSSL_SUCCESS;
  3961. }
  3962. #endif /* !leanpsk */
  3963. #ifndef NO_CERTS
  3964. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3965. static WC_INLINE word32 HashSigner(const byte* hash)
  3966. {
  3967. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3968. }
  3969. /* does CA already exist on signer list */
  3970. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3971. {
  3972. Signer* signers;
  3973. int ret = 0;
  3974. word32 row;
  3975. if (cm == NULL || hash == NULL) {
  3976. return ret;
  3977. }
  3978. row = HashSigner(hash);
  3979. if (wc_LockMutex(&cm->caLock) != 0) {
  3980. return ret;
  3981. }
  3982. signers = cm->caTable[row];
  3983. while (signers) {
  3984. byte* subjectHash;
  3985. #ifndef NO_SKID
  3986. subjectHash = signers->subjectKeyIdHash;
  3987. #else
  3988. subjectHash = signers->subjectNameHash;
  3989. #endif
  3990. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3991. ret = 1; /* success */
  3992. break;
  3993. }
  3994. signers = signers->next;
  3995. }
  3996. wc_UnLockMutex(&cm->caLock);
  3997. return ret;
  3998. }
  3999. #ifdef WOLFSSL_TRUST_PEER_CERT
  4000. /* hash is the SHA digest of name, just use first 32 bits as hash */
  4001. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  4002. {
  4003. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  4004. }
  4005. /* does trusted peer already exist on signer list */
  4006. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DecodedCert* cert)
  4007. {
  4008. TrustedPeerCert* tp;
  4009. int ret = 0;
  4010. word32 row = TrustedPeerHashSigner(cert->subjectHash);
  4011. if (wc_LockMutex(&cm->tpLock) != 0)
  4012. return ret;
  4013. tp = cm->tpTable[row];
  4014. while (tp) {
  4015. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4016. SIGNER_DIGEST_SIZE) == 0)
  4017. ret = 1;
  4018. #ifndef NO_SKID
  4019. if (cert->extSubjKeyIdSet) {
  4020. /* Compare SKID as well if available */
  4021. if (ret == 1 && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4022. SIGNER_DIGEST_SIZE) != 0)
  4023. ret = 0;
  4024. }
  4025. #endif
  4026. if (ret == 1)
  4027. break;
  4028. tp = tp->next;
  4029. }
  4030. wc_UnLockMutex(&cm->tpLock);
  4031. return ret;
  4032. }
  4033. /* return Trusted Peer if found, otherwise NULL
  4034. type is what to match on
  4035. */
  4036. TrustedPeerCert* GetTrustedPeer(void* vp, DecodedCert* cert)
  4037. {
  4038. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4039. TrustedPeerCert* ret = NULL;
  4040. TrustedPeerCert* tp = NULL;
  4041. word32 row;
  4042. if (cm == NULL || cert == NULL)
  4043. return NULL;
  4044. row = TrustedPeerHashSigner(cert->subjectHash);
  4045. if (wc_LockMutex(&cm->tpLock) != 0)
  4046. return ret;
  4047. tp = cm->tpTable[row];
  4048. while (tp) {
  4049. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  4050. SIGNER_DIGEST_SIZE) == 0)
  4051. ret = tp;
  4052. #ifndef NO_SKID
  4053. if (cert->extSubjKeyIdSet) {
  4054. /* Compare SKID as well if available */
  4055. if (ret != NULL && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  4056. SIGNER_DIGEST_SIZE) != 0)
  4057. ret = NULL;
  4058. }
  4059. #endif
  4060. if (ret != NULL)
  4061. break;
  4062. tp = tp->next;
  4063. }
  4064. wc_UnLockMutex(&cm->tpLock);
  4065. return ret;
  4066. }
  4067. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  4068. {
  4069. if (tp == NULL || cert == NULL)
  4070. return BAD_FUNC_ARG;
  4071. /* subject key id or subject hash has been compared when searching
  4072. tpTable for the cert from function GetTrustedPeer */
  4073. /* compare signatures */
  4074. if (tp->sigLen == cert->sigLength) {
  4075. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  4076. return WOLFSSL_FAILURE;
  4077. }
  4078. }
  4079. else {
  4080. return WOLFSSL_FAILURE;
  4081. }
  4082. return WOLFSSL_SUCCESS;
  4083. }
  4084. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4085. /* return CA if found, otherwise NULL */
  4086. Signer* GetCA(void* vp, byte* hash)
  4087. {
  4088. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4089. Signer* ret = NULL;
  4090. Signer* signers;
  4091. word32 row = 0;
  4092. if (cm == NULL || hash == NULL)
  4093. return NULL;
  4094. row = HashSigner(hash);
  4095. if (wc_LockMutex(&cm->caLock) != 0)
  4096. return ret;
  4097. signers = cm->caTable[row];
  4098. while (signers) {
  4099. byte* subjectHash;
  4100. #ifndef NO_SKID
  4101. subjectHash = signers->subjectKeyIdHash;
  4102. #else
  4103. subjectHash = signers->subjectNameHash;
  4104. #endif
  4105. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4106. ret = signers;
  4107. break;
  4108. }
  4109. signers = signers->next;
  4110. }
  4111. wc_UnLockMutex(&cm->caLock);
  4112. return ret;
  4113. }
  4114. #ifndef NO_SKID
  4115. /* return CA if found, otherwise NULL. Walk through hash table. */
  4116. Signer* GetCAByName(void* vp, byte* hash)
  4117. {
  4118. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4119. Signer* ret = NULL;
  4120. Signer* signers;
  4121. word32 row;
  4122. if (cm == NULL)
  4123. return NULL;
  4124. if (wc_LockMutex(&cm->caLock) != 0)
  4125. return ret;
  4126. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4127. signers = cm->caTable[row];
  4128. while (signers && ret == NULL) {
  4129. if (XMEMCMP(hash, signers->subjectNameHash,
  4130. SIGNER_DIGEST_SIZE) == 0) {
  4131. ret = signers;
  4132. }
  4133. signers = signers->next;
  4134. }
  4135. }
  4136. wc_UnLockMutex(&cm->caLock);
  4137. return ret;
  4138. }
  4139. #endif
  4140. #ifdef WOLFSSL_TRUST_PEER_CERT
  4141. /* add a trusted peer cert to linked list */
  4142. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  4143. {
  4144. int ret, row;
  4145. TrustedPeerCert* peerCert;
  4146. DecodedCert* cert;
  4147. DerBuffer* der = *pDer;
  4148. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  4149. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4150. DYNAMIC_TYPE_DCERT);
  4151. if (cert == NULL) {
  4152. FreeDer(&der);
  4153. return MEMORY_E;
  4154. }
  4155. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4156. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  4157. FreeDecodedCert(cert);
  4158. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4159. FreeDer(&der);
  4160. return ret;
  4161. }
  4162. WOLFSSL_MSG("\tParsed new trusted peer cert");
  4163. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  4164. DYNAMIC_TYPE_CERT);
  4165. if (peerCert == NULL) {
  4166. FreeDecodedCert(cert);
  4167. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4168. FreeDer(&der);
  4169. return MEMORY_E;
  4170. }
  4171. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  4172. #ifndef IGNORE_NAME_CONSTRAINTS
  4173. if (peerCert->permittedNames)
  4174. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  4175. if (peerCert->excludedNames)
  4176. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  4177. #endif
  4178. if (AlreadyTrustedPeer(cm, cert)) {
  4179. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4180. FreeTrustedPeer(peerCert, cm->heap);
  4181. (void)ret;
  4182. }
  4183. else {
  4184. /* add trusted peer signature */
  4185. peerCert->sigLen = cert->sigLength;
  4186. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  4187. DYNAMIC_TYPE_SIGNATURE);
  4188. if (peerCert->sig == NULL) {
  4189. FreeDecodedCert(cert);
  4190. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4191. FreeTrustedPeer(peerCert, cm->heap);
  4192. FreeDer(&der);
  4193. return MEMORY_E;
  4194. }
  4195. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  4196. /* add trusted peer name */
  4197. peerCert->nameLen = cert->subjectCNLen;
  4198. peerCert->name = cert->subjectCN;
  4199. #ifndef IGNORE_NAME_CONSTRAINTS
  4200. peerCert->permittedNames = cert->permittedNames;
  4201. peerCert->excludedNames = cert->excludedNames;
  4202. #endif
  4203. /* add SKID when available and hash of name */
  4204. #ifndef NO_SKID
  4205. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  4206. SIGNER_DIGEST_SIZE);
  4207. #endif
  4208. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  4209. SIGNER_DIGEST_SIZE);
  4210. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  4211. cert->subjectCN = 0;
  4212. #ifndef IGNORE_NAME_CONSTRAINTS
  4213. cert->permittedNames = NULL;
  4214. cert->excludedNames = NULL;
  4215. #endif
  4216. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4217. if (wc_LockMutex(&cm->tpLock) == 0) {
  4218. peerCert->next = cm->tpTable[row];
  4219. cm->tpTable[row] = peerCert; /* takes ownership */
  4220. wc_UnLockMutex(&cm->tpLock);
  4221. }
  4222. else {
  4223. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  4224. FreeDecodedCert(cert);
  4225. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4226. FreeTrustedPeer(peerCert, cm->heap);
  4227. FreeDer(&der);
  4228. return BAD_MUTEX_E;
  4229. }
  4230. }
  4231. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  4232. FreeDecodedCert(cert);
  4233. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4234. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  4235. FreeDer(&der);
  4236. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  4237. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  4238. return WOLFSSL_SUCCESS;
  4239. }
  4240. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4241. /* owns der, internal now uses too */
  4242. /* type flag ids from user or from chain received during verify
  4243. don't allow chain ones to be added w/o isCA extension */
  4244. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  4245. {
  4246. int ret;
  4247. Signer* signer = NULL;
  4248. word32 row;
  4249. byte* subjectHash;
  4250. #ifdef WOLFSSL_SMALL_STACK
  4251. DecodedCert* cert = NULL;
  4252. #else
  4253. DecodedCert cert[1];
  4254. #endif
  4255. DerBuffer* der = *pDer;
  4256. WOLFSSL_MSG("Adding a CA");
  4257. if (cm == NULL) {
  4258. FreeDer(pDer);
  4259. return BAD_FUNC_ARG;
  4260. }
  4261. #ifdef WOLFSSL_SMALL_STACK
  4262. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4263. DYNAMIC_TYPE_DCERT);
  4264. if (cert == NULL) {
  4265. FreeDer(pDer);
  4266. return MEMORY_E;
  4267. }
  4268. #endif
  4269. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4270. ret = ParseCert(cert, CA_TYPE, verify, cm);
  4271. WOLFSSL_MSG("\tParsed new CA");
  4272. #ifndef NO_SKID
  4273. subjectHash = cert->extSubjKeyId;
  4274. #else
  4275. subjectHash = cert->subjectHash;
  4276. #endif
  4277. /* check CA key size */
  4278. if (verify) {
  4279. switch (cert->keyOID) {
  4280. #ifndef NO_RSA
  4281. #ifdef WC_RSA_PSS
  4282. case RSAPSSk:
  4283. #endif
  4284. case RSAk:
  4285. if (cm->minRsaKeySz < 0 ||
  4286. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  4287. ret = RSA_KEY_SIZE_E;
  4288. WOLFSSL_MSG("\tCA RSA key size error");
  4289. }
  4290. break;
  4291. #endif /* !NO_RSA */
  4292. #ifdef HAVE_ECC
  4293. case ECDSAk:
  4294. if (cm->minEccKeySz < 0 ||
  4295. cert->pubKeySize < (word16)cm->minEccKeySz) {
  4296. ret = ECC_KEY_SIZE_E;
  4297. WOLFSSL_MSG("\tCA ECC key size error");
  4298. }
  4299. break;
  4300. #endif /* HAVE_ECC */
  4301. #ifdef HAVE_ED25519
  4302. case ED25519k:
  4303. if (cm->minEccKeySz < 0 ||
  4304. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  4305. ret = ECC_KEY_SIZE_E;
  4306. WOLFSSL_MSG("\tCA ECC key size error");
  4307. }
  4308. break;
  4309. #endif /* HAVE_ED25519 */
  4310. #ifdef HAVE_ED448
  4311. case ED448k:
  4312. if (cm->minEccKeySz < 0 ||
  4313. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  4314. ret = ECC_KEY_SIZE_E;
  4315. WOLFSSL_MSG("\tCA ECC key size error");
  4316. }
  4317. break;
  4318. #endif /* HAVE_ED448 */
  4319. #if defined(HAVE_PQC)
  4320. #if defined(HAVE_FALCON)
  4321. case FALCON_LEVEL1k:
  4322. if (cm->minFalconKeySz < 0 ||
  4323. FALCON_LEVEL1_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4324. ret = FALCON_KEY_SIZE_E;
  4325. WOLFSSL_MSG("\tCA Falcon level 1 key size error");
  4326. }
  4327. break;
  4328. case FALCON_LEVEL5k:
  4329. if (cm->minFalconKeySz < 0 ||
  4330. FALCON_LEVEL5_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4331. ret = FALCON_KEY_SIZE_E;
  4332. WOLFSSL_MSG("\tCA Falcon level 5 key size error");
  4333. }
  4334. break;
  4335. #endif /* HAVE_FALCON */
  4336. #if defined(HAVE_DILITHIUM)
  4337. case DILITHIUM_LEVEL2k:
  4338. case DILITHIUM_AES_LEVEL2k:
  4339. if (cm->minDilithiumKeySz < 0 ||
  4340. DILITHIUM_LEVEL2_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4341. ret = DILITHIUM_KEY_SIZE_E;
  4342. WOLFSSL_MSG("\tCA Dilithium level 2 key size error");
  4343. }
  4344. break;
  4345. case DILITHIUM_LEVEL3k:
  4346. case DILITHIUM_AES_LEVEL3k:
  4347. if (cm->minDilithiumKeySz < 0 ||
  4348. DILITHIUM_LEVEL3_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4349. ret = DILITHIUM_KEY_SIZE_E;
  4350. WOLFSSL_MSG("\tCA Dilithium level 3 key size error");
  4351. }
  4352. break;
  4353. case DILITHIUM_LEVEL5k:
  4354. case DILITHIUM_AES_LEVEL5k:
  4355. if (cm->minDilithiumKeySz < 0 ||
  4356. DILITHIUM_LEVEL5_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4357. ret = DILITHIUM_KEY_SIZE_E;
  4358. WOLFSSL_MSG("\tCA Dilithium level 5 key size error");
  4359. }
  4360. break;
  4361. #endif /* HAVE_DILITHIUM */
  4362. #endif /* HAVE_PQC */
  4363. default:
  4364. WOLFSSL_MSG("\tNo key size check done on CA");
  4365. break; /* no size check if key type is not in switch */
  4366. }
  4367. }
  4368. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  4369. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  4370. ret = NOT_CA_ERROR;
  4371. }
  4372. #ifndef ALLOW_INVALID_CERTSIGN
  4373. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  4374. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  4375. /* Intermediate CA certs are required to have the keyCertSign
  4376. * extension set. User loaded root certs are not. */
  4377. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  4378. ret = NOT_CA_ERROR;
  4379. }
  4380. #endif
  4381. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  4382. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4383. (void)ret;
  4384. }
  4385. else if (ret == 0) {
  4386. /* take over signer parts */
  4387. signer = MakeSigner(cm->heap);
  4388. if (!signer)
  4389. ret = MEMORY_ERROR;
  4390. }
  4391. if (ret == 0 && signer != NULL) {
  4392. #ifdef WOLFSSL_SIGNER_DER_CERT
  4393. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  4394. }
  4395. if (ret == 0 && signer != NULL) {
  4396. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  4397. #endif
  4398. signer->keyOID = cert->keyOID;
  4399. if (cert->pubKeyStored) {
  4400. signer->publicKey = cert->publicKey;
  4401. signer->pubKeySize = cert->pubKeySize;
  4402. }
  4403. if (cert->subjectCNStored) {
  4404. signer->nameLen = cert->subjectCNLen;
  4405. signer->name = cert->subjectCN;
  4406. }
  4407. signer->pathLength = cert->pathLength;
  4408. signer->maxPathLen = cert->maxPathLen;
  4409. signer->pathLengthSet = cert->pathLengthSet;
  4410. signer->selfSigned = cert->selfSigned;
  4411. #ifndef IGNORE_NAME_CONSTRAINTS
  4412. signer->permittedNames = cert->permittedNames;
  4413. signer->excludedNames = cert->excludedNames;
  4414. #endif
  4415. #ifndef NO_SKID
  4416. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  4417. SIGNER_DIGEST_SIZE);
  4418. #endif
  4419. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  4420. SIGNER_DIGEST_SIZE);
  4421. #ifdef HAVE_OCSP
  4422. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  4423. KEYID_SIZE);
  4424. #endif
  4425. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  4426. : 0xFFFF;
  4427. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  4428. cert->publicKey = 0; /* in case lock fails don't free here. */
  4429. cert->subjectCN = 0;
  4430. #ifndef IGNORE_NAME_CONSTRAINTS
  4431. cert->permittedNames = NULL;
  4432. cert->excludedNames = NULL;
  4433. #endif
  4434. #ifndef NO_SKID
  4435. row = HashSigner(signer->subjectKeyIdHash);
  4436. #else
  4437. row = HashSigner(signer->subjectNameHash);
  4438. #endif
  4439. if (wc_LockMutex(&cm->caLock) == 0) {
  4440. signer->next = cm->caTable[row];
  4441. cm->caTable[row] = signer; /* takes ownership */
  4442. wc_UnLockMutex(&cm->caLock);
  4443. if (cm->caCacheCallback)
  4444. cm->caCacheCallback(der->buffer, (int)der->length, type);
  4445. }
  4446. else {
  4447. WOLFSSL_MSG("\tCA Mutex Lock failed");
  4448. ret = BAD_MUTEX_E;
  4449. FreeSigner(signer, cm->heap);
  4450. }
  4451. }
  4452. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  4453. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  4454. /* be used for peer's cert verification */
  4455. /* TSIP is only able to handle USER CA, and only one CA. */
  4456. /* Therefore, it doesn't need to call TSIP again if there is already */
  4457. /* verified CA. */
  4458. if ( ret == 0 && signer != NULL ) {
  4459. signer->cm_idx = row;
  4460. if (type == WOLFSSL_USER_CA) {
  4461. if ((ret = wc_Renesas_cmn_RootCertVerify(cert->source, cert->maxIdx,
  4462. cert->sigCtx.CertAtt.pubkey_n_start,
  4463. cert->sigCtx.CertAtt.pubkey_n_len - 1,
  4464. cert->sigCtx.CertAtt.pubkey_e_start,
  4465. cert->sigCtx.CertAtt.pubkey_e_len - 1,
  4466. row/* cm index */))
  4467. < 0)
  4468. WOLFSSL_MSG("Renesas_RootCertVerify() failed");
  4469. else
  4470. WOLFSSL_MSG("Renesas_RootCertVerify() succeed or skipped");
  4471. }
  4472. }
  4473. #endif /* TSIP or SCE */
  4474. WOLFSSL_MSG("\tFreeing Parsed CA");
  4475. FreeDecodedCert(cert);
  4476. #ifdef WOLFSSL_SMALL_STACK
  4477. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4478. #endif
  4479. WOLFSSL_MSG("\tFreeing der CA");
  4480. FreeDer(pDer);
  4481. WOLFSSL_MSG("\t\tOK Freeing der CA");
  4482. WOLFSSL_LEAVE("AddCA", ret);
  4483. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  4484. }
  4485. #endif /* !NO_CERTS */
  4486. #ifndef NO_SESSION_CACHE
  4487. /* basic config gives a cache with 33 sessions, adequate for clients and
  4488. embedded servers
  4489. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  4490. with titanic amounts of memory with long session ID timeouts and high
  4491. levels of traffic.
  4492. ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased
  4493. performance with large session caches
  4494. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  4495. allows over 13,000 new sessions per minute or over 200 new sessions per
  4496. second
  4497. BIG_SESSION_CACHE yields 20,027 sessions
  4498. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  4499. aren't under heavy load, basically allows 200 new sessions per minute
  4500. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  4501. or systems where the default of nearly 3kB is too much RAM, this define
  4502. uses less than 500 bytes RAM
  4503. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  4504. */
  4505. #if defined(TITAN_SESSION_CACHE)
  4506. #define SESSIONS_PER_ROW 31
  4507. #define SESSION_ROWS 64937
  4508. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4509. #define ENABLE_SESSION_CACHE_ROW_LOCK
  4510. #endif
  4511. #elif defined(HUGE_SESSION_CACHE)
  4512. #define SESSIONS_PER_ROW 11
  4513. #define SESSION_ROWS 5981
  4514. #elif defined(BIG_SESSION_CACHE)
  4515. #define SESSIONS_PER_ROW 7
  4516. #define SESSION_ROWS 2861
  4517. #elif defined(MEDIUM_SESSION_CACHE)
  4518. #define SESSIONS_PER_ROW 5
  4519. #define SESSION_ROWS 211
  4520. #elif defined(SMALL_SESSION_CACHE)
  4521. #define SESSIONS_PER_ROW 2
  4522. #define SESSION_ROWS 3
  4523. #else
  4524. #define SESSIONS_PER_ROW 3
  4525. #define SESSION_ROWS 11
  4526. #endif
  4527. #define INVALID_SESSION_ROW (-1)
  4528. #ifdef NO_SESSION_CACHE_ROW_LOCK
  4529. #undef ENABLE_SESSION_CACHE_ROW_LOCK
  4530. #endif
  4531. typedef struct SessionRow {
  4532. int nextIdx; /* where to place next one */
  4533. int totalCount; /* sessions ever on this row */
  4534. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  4535. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4536. /* not included in import/export */
  4537. wolfSSL_Mutex row_mutex;
  4538. int mutex_valid;
  4539. #endif
  4540. } SessionRow;
  4541. #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2))
  4542. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  4543. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  4544. static WOLFSSL_GLOBAL word32 PeakSessions;
  4545. #endif
  4546. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4547. #define SESSION_ROW_LOCK(row) wc_LockMutex(&(row)->row_mutex)
  4548. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&(row)->row_mutex);
  4549. #else
  4550. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  4551. static WOLFSSL_GLOBAL int session_mutex_valid = 0;
  4552. #define SESSION_ROW_LOCK(row) wc_LockMutex(&session_mutex)
  4553. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&session_mutex);
  4554. #endif
  4555. #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE)
  4556. #error ClientCache is required when not using NO_SESSION_CACHE_REF
  4557. #endif
  4558. #ifndef NO_CLIENT_CACHE
  4559. #ifndef CLIENT_SESSIONS_MULTIPLIER
  4560. #ifdef NO_SESSION_CACHE_REF
  4561. #define CLIENT_SESSIONS_MULTIPLIER 1
  4562. #else
  4563. /* ClientSession objects are lightweight (compared to
  4564. * WOLFSSL_SESSION) so to decrease chance that user will reuse
  4565. * thse wrong session, increase the ClientCache size. This will
  4566. * make the entire ClientCache about the size of one
  4567. * WOLFSSL_SESSION object. */
  4568. #define CLIENT_SESSIONS_MULTIPLIER 8
  4569. #endif
  4570. #endif
  4571. #define CLIENT_SESSIONS_PER_ROW \
  4572. (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER)
  4573. #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER)
  4574. #if CLIENT_SESSIONS_PER_ROW > 65535
  4575. #error CLIENT_SESSIONS_PER_ROW too big
  4576. #endif
  4577. #if CLIENT_SESSION_ROWS > 65535
  4578. #error CLIENT_SESSION_ROWS too big
  4579. #endif
  4580. struct ClientSession {
  4581. word16 serverRow; /* SessionCache Row id */
  4582. word16 serverIdx; /* SessionCache Idx (column) */
  4583. word32 sessionIDHash;
  4584. };
  4585. #ifndef WOLFSSL_CLIENT_SESSION_DEFINED
  4586. typedef struct ClientSession ClientSession;
  4587. #define WOLFSSL_CLIENT_SESSION_DEFINED
  4588. #endif
  4589. typedef struct ClientRow {
  4590. int nextIdx; /* where to place next one */
  4591. int totalCount; /* sessions ever on this row */
  4592. ClientSession Clients[CLIENT_SESSIONS_PER_ROW];
  4593. } ClientRow;
  4594. static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS];
  4595. /* Client Cache */
  4596. /* uses session mutex */
  4597. static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex; /* ClientCache mutex */
  4598. static WOLFSSL_GLOBAL int clisession_mutex_valid = 0;
  4599. #endif /* !NO_CLIENT_CACHE */
  4600. #endif /* !NO_SESSION_CACHE */
  4601. #if !defined(WC_NO_RNG) && (defined(OPENSSL_EXTRA) || \
  4602. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA)) || \
  4603. (defined(OPENSSL_ALL) && !defined(NO_DH)))
  4604. #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */
  4605. static WC_RNG globalRNG;
  4606. static int initGlobalRNG = 0;
  4607. static wolfSSL_Mutex globalRNGMutex;
  4608. static int globalRNGMutex_valid = 0;
  4609. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  4610. static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL;
  4611. #endif
  4612. WC_RNG* wolfssl_get_global_rng(void)
  4613. {
  4614. WC_RNG* ret = NULL;
  4615. if (initGlobalRNG == 0)
  4616. WOLFSSL_MSG("Global RNG no Init");
  4617. else
  4618. ret = &globalRNG;
  4619. return ret;
  4620. }
  4621. #endif
  4622. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  4623. static int wolfSSL_RAND_InitMutex(void);
  4624. #endif
  4625. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4626. static void AtExitCleanup(void)
  4627. {
  4628. if (initRefCount > 0) {
  4629. initRefCount = 1;
  4630. (void)wolfSSL_Cleanup();
  4631. }
  4632. }
  4633. #endif
  4634. WOLFSSL_ABI
  4635. int wolfSSL_Init(void)
  4636. {
  4637. int ret = WOLFSSL_SUCCESS;
  4638. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  4639. int i;
  4640. #endif
  4641. WOLFSSL_ENTER("wolfSSL_Init");
  4642. #if FIPS_VERSION_GE(5,1)
  4643. ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL);
  4644. if (ret != 0)
  4645. return ret;
  4646. else
  4647. ret = WOLFSSL_SUCCESS;
  4648. #endif
  4649. if (initRefCount == 0) {
  4650. /* Initialize crypto for use with TLS connection */
  4651. if (wolfCrypt_Init() != 0) {
  4652. WOLFSSL_MSG("Bad wolfCrypt Init");
  4653. ret = WC_INIT_E;
  4654. }
  4655. #ifdef HAVE_GLOBAL_RNG
  4656. if (ret == WOLFSSL_SUCCESS) {
  4657. if (wc_InitMutex(&globalRNGMutex) != 0) {
  4658. WOLFSSL_MSG("Bad Init Mutex rng");
  4659. ret = BAD_MUTEX_E;
  4660. }
  4661. else {
  4662. globalRNGMutex_valid = 1;
  4663. }
  4664. }
  4665. #endif
  4666. #ifdef WC_RNG_SEED_CB
  4667. wc_SetSeed_Cb(wc_GenerateSeed);
  4668. #endif
  4669. #ifdef OPENSSL_EXTRA
  4670. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  4671. if ((ret == WOLFSSL_SUCCESS) && (wolfSSL_RAND_InitMutex() != 0)) {
  4672. ret = BAD_MUTEX_E;
  4673. }
  4674. #endif
  4675. if ((ret == WOLFSSL_SUCCESS) &&
  4676. (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS)) {
  4677. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  4678. ret = WC_INIT_E;
  4679. }
  4680. #endif
  4681. #ifndef NO_SESSION_CACHE
  4682. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4683. for (i = 0; i < SESSION_ROWS; ++i) {
  4684. SessionCache[i].mutex_valid = 0;
  4685. }
  4686. for (i = 0; (ret == WOLFSSL_SUCCESS) && (i < SESSION_ROWS); ++i) {
  4687. if (wc_InitMutex(&SessionCache[i].row_mutex) != 0) {
  4688. WOLFSSL_MSG("Bad Init Mutex session");
  4689. ret = BAD_MUTEX_E;
  4690. }
  4691. else {
  4692. SessionCache[i].mutex_valid = 1;
  4693. }
  4694. }
  4695. #else
  4696. if (ret == WOLFSSL_SUCCESS) {
  4697. if (wc_InitMutex(&session_mutex) != 0) {
  4698. WOLFSSL_MSG("Bad Init Mutex session");
  4699. ret = BAD_MUTEX_E;
  4700. }
  4701. else {
  4702. session_mutex_valid = 1;
  4703. }
  4704. }
  4705. #endif
  4706. #ifndef NO_CLIENT_CACHE
  4707. if (ret == WOLFSSL_SUCCESS) {
  4708. if (wc_InitMutex(&clisession_mutex) != 0) {
  4709. WOLFSSL_MSG("Bad Init Mutex session");
  4710. ret = BAD_MUTEX_E;
  4711. }
  4712. else {
  4713. clisession_mutex_valid = 1;
  4714. }
  4715. }
  4716. #endif
  4717. #endif
  4718. if (ret == WOLFSSL_SUCCESS) {
  4719. if (wc_InitMutex(&count_mutex) != 0) {
  4720. WOLFSSL_MSG("Bad Init Mutex count");
  4721. ret = BAD_MUTEX_E;
  4722. }
  4723. else {
  4724. count_mutex_valid = 1;
  4725. }
  4726. }
  4727. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4728. /* OpenSSL registers cleanup using atexit */
  4729. if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) {
  4730. WOLFSSL_MSG("Bad atexit registration");
  4731. ret = WC_INIT_E;
  4732. }
  4733. #endif
  4734. }
  4735. if (ret == WOLFSSL_SUCCESS) {
  4736. if (wc_LockMutex(&count_mutex) != 0) {
  4737. WOLFSSL_MSG("Bad Lock Mutex count");
  4738. ret = BAD_MUTEX_E;
  4739. }
  4740. else {
  4741. initRefCount++;
  4742. wc_UnLockMutex(&count_mutex);
  4743. }
  4744. }
  4745. if (ret != WOLFSSL_SUCCESS) {
  4746. initRefCount = 1; /* Force cleanup */
  4747. (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */
  4748. }
  4749. return ret;
  4750. }
  4751. #ifndef NO_CERTS
  4752. /* process user cert chain to pass during the handshake */
  4753. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4754. long sz, int format, int type, WOLFSSL* ssl,
  4755. long* used, EncryptedInfo* info, int verify)
  4756. {
  4757. int ret = 0;
  4758. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4759. #ifdef WOLFSSL_TLS13
  4760. int cnt = 0;
  4761. #endif
  4762. if ((type == CA_TYPE) && (ctx == NULL)) {
  4763. WOLFSSL_MSG("Need context for CA load");
  4764. return BAD_FUNC_ARG;
  4765. }
  4766. /* we may have a user cert chain, try to consume */
  4767. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  4768. #ifdef WOLFSSL_SMALL_STACK
  4769. byte staticBuffer[1]; /* force heap usage */
  4770. #else
  4771. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  4772. #endif
  4773. byte* chainBuffer = staticBuffer;
  4774. int dynamicBuffer = 0;
  4775. word32 bufferSz;
  4776. long consumed = info->consumed;
  4777. word32 idx = 0;
  4778. int gotOne = 0;
  4779. /* Calculate max possible size, including max headers */
  4780. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  4781. if (bufferSz > sizeof(staticBuffer)) {
  4782. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  4783. /* will shrink to actual size */
  4784. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  4785. if (chainBuffer == NULL) {
  4786. return MEMORY_E;
  4787. }
  4788. dynamicBuffer = 1;
  4789. }
  4790. WOLFSSL_MSG("Processing Cert Chain");
  4791. while (consumed < sz) {
  4792. DerBuffer* part = NULL;
  4793. word32 remain = (word32)(sz - consumed);
  4794. info->consumed = 0;
  4795. if (format == WOLFSSL_FILETYPE_PEM) {
  4796. #ifdef WOLFSSL_PEM_TO_DER
  4797. ret = PemToDer(buff + consumed, remain, type, &part,
  4798. heap, info, NULL);
  4799. #else
  4800. ret = NOT_COMPILED_IN;
  4801. #endif
  4802. }
  4803. else {
  4804. int length = remain;
  4805. if (format == WOLFSSL_FILETYPE_ASN1) {
  4806. /* get length of der (read sequence) */
  4807. word32 inOutIdx = 0;
  4808. if (GetSequence(buff + consumed, &inOutIdx, &length,
  4809. remain) < 0) {
  4810. ret = ASN_NO_PEM_HEADER;
  4811. }
  4812. length += inOutIdx; /* include leading sequence */
  4813. }
  4814. info->consumed = length;
  4815. if (ret == 0) {
  4816. ret = AllocDer(&part, length, type, heap);
  4817. if (ret == 0) {
  4818. XMEMCPY(part->buffer, buff + consumed, length);
  4819. }
  4820. }
  4821. }
  4822. if (ret == 0) {
  4823. gotOne = 1;
  4824. #ifdef WOLFSSL_TLS13
  4825. cnt++;
  4826. #endif
  4827. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  4828. WOLFSSL_MSG(" Cert Chain bigger than buffer. "
  4829. "Consider increasing MAX_CHAIN_DEPTH");
  4830. ret = BUFFER_E;
  4831. }
  4832. else {
  4833. c32to24(part->length, &chainBuffer[idx]);
  4834. idx += CERT_HEADER_SZ;
  4835. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  4836. idx += part->length;
  4837. consumed += info->consumed;
  4838. if (used)
  4839. *used += info->consumed;
  4840. }
  4841. /* add CA's to certificate manager */
  4842. if (ret == 0 && type == CA_TYPE) {
  4843. /* verify CA unless user set to no verify */
  4844. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  4845. if (ret == WOLFSSL_SUCCESS) {
  4846. ret = 0; /* converted success case */
  4847. }
  4848. gotOne = 0; /* don't exit loop for CA type */
  4849. }
  4850. }
  4851. FreeDer(&part);
  4852. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  4853. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  4854. break;
  4855. }
  4856. if (ret < 0) {
  4857. WOLFSSL_MSG(" Error in Cert in Chain");
  4858. if (dynamicBuffer)
  4859. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4860. return ret;
  4861. }
  4862. WOLFSSL_MSG(" Consumed another Cert in Chain");
  4863. }
  4864. WOLFSSL_MSG("Finished Processing Cert Chain");
  4865. /* only retain actual size used */
  4866. ret = 0;
  4867. if (idx > 0) {
  4868. if (ssl) {
  4869. if (ssl->buffers.weOwnCertChain) {
  4870. FreeDer(&ssl->buffers.certChain);
  4871. }
  4872. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4873. if (ret == 0) {
  4874. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4875. idx);
  4876. ssl->buffers.weOwnCertChain = 1;
  4877. }
  4878. #ifdef WOLFSSL_TLS13
  4879. ssl->buffers.certChainCnt = cnt;
  4880. #endif
  4881. } else if (ctx) {
  4882. FreeDer(&ctx->certChain);
  4883. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4884. if (ret == 0) {
  4885. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4886. }
  4887. #ifdef WOLFSSL_TLS13
  4888. ctx->certChainCnt = cnt;
  4889. #endif
  4890. }
  4891. }
  4892. if (dynamicBuffer)
  4893. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4894. }
  4895. return ret;
  4896. }
  4897. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4898. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4899. {
  4900. int ret = 0;
  4901. (void)heap;
  4902. (void)devId;
  4903. if (ctx == NULL && ssl == NULL)
  4904. return BAD_FUNC_ARG;
  4905. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4906. return BAD_FUNC_ARG;
  4907. #ifndef NO_RSA
  4908. if ((*keyFormat == 0 || *keyFormat == RSAk)) {
  4909. /* make sure RSA key can be used */
  4910. #ifdef WOLFSSL_SMALL_STACK
  4911. RsaKey* key;
  4912. #else
  4913. RsaKey key[1];
  4914. #endif
  4915. #ifdef WOLFSSL_SMALL_STACK
  4916. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4917. if (key == NULL)
  4918. return MEMORY_E;
  4919. #endif
  4920. ret = wc_InitRsaKey_ex(key, heap, devId);
  4921. if (ret == 0) {
  4922. *idx = 0;
  4923. ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length);
  4924. #ifdef WOLF_PRIVATE_KEY_ID
  4925. if (ret != 0 && (devId != INVALID_DEVID
  4926. #ifdef HAVE_PK_CALLBACKS
  4927. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  4928. #endif
  4929. )) {
  4930. /* if using crypto or PK callbacks, try public key decode */
  4931. *idx = 0;
  4932. ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length);
  4933. }
  4934. #endif
  4935. if (ret != 0) {
  4936. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4937. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  4938. WOLFSSL_MSG("RSA decode failed and other algorithms "
  4939. "not enabled to try");
  4940. ret = WOLFSSL_BAD_FILE;
  4941. #else
  4942. ret = 0; /* continue trying other algorithms */
  4943. #endif
  4944. }
  4945. else {
  4946. /* check that the size of the RSA key is enough */
  4947. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4948. ctx->minRsaKeySz;
  4949. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4950. if (*keySz < minRsaSz) {
  4951. ret = RSA_KEY_SIZE_E;
  4952. WOLFSSL_MSG("Private Key size too small");
  4953. }
  4954. if (ssl) {
  4955. ssl->buffers.keyType = rsa_sa_algo;
  4956. ssl->buffers.keySz = *keySz;
  4957. }
  4958. else {
  4959. ctx->privateKeyType = rsa_sa_algo;
  4960. ctx->privateKeySz = *keySz;
  4961. }
  4962. *keyFormat = RSAk;
  4963. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4964. ssl->options.haveStaticECC = 0;
  4965. *resetSuites = 1;
  4966. }
  4967. }
  4968. wc_FreeRsaKey(key);
  4969. }
  4970. #ifdef WOLFSSL_SMALL_STACK
  4971. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4972. #endif
  4973. if (ret != 0)
  4974. return ret;
  4975. }
  4976. #endif
  4977. #ifdef HAVE_ECC
  4978. if ((*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4979. /* make sure ECC key can be used */
  4980. #ifdef WOLFSSL_SMALL_STACK
  4981. ecc_key* key;
  4982. #else
  4983. ecc_key key[1];
  4984. #endif
  4985. #ifdef WOLFSSL_SMALL_STACK
  4986. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4987. if (key == NULL)
  4988. return MEMORY_E;
  4989. #endif
  4990. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4991. *idx = 0;
  4992. ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length);
  4993. #ifdef WOLF_PRIVATE_KEY_ID
  4994. if (ret != 0 && (devId != INVALID_DEVID
  4995. #ifdef HAVE_PK_CALLBACKS
  4996. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  4997. #endif
  4998. )) {
  4999. /* if using crypto or PK callbacks, try public key decode */
  5000. *idx = 0;
  5001. ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length);
  5002. }
  5003. #endif
  5004. if (ret == 0) {
  5005. /* check for minimum ECC key size and then free */
  5006. int minKeySz = ssl ? ssl->options.minEccKeySz :
  5007. ctx->minEccKeySz;
  5008. *keySz = wc_ecc_size(key);
  5009. if (*keySz < minKeySz) {
  5010. WOLFSSL_MSG("ECC private key too small");
  5011. ret = ECC_KEY_SIZE_E;
  5012. }
  5013. *keyFormat = ECDSAk;
  5014. if (ssl) {
  5015. ssl->options.haveStaticECC = 1;
  5016. ssl->buffers.keyType = ecc_dsa_sa_algo;
  5017. ssl->buffers.keySz = *keySz;
  5018. }
  5019. else {
  5020. ctx->haveStaticECC = 1;
  5021. ctx->privateKeyType = ecc_dsa_sa_algo;
  5022. ctx->privateKeySz = *keySz;
  5023. }
  5024. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5025. *resetSuites = 1;
  5026. }
  5027. }
  5028. else {
  5029. ret = 0; /* continue trying other algorithms */
  5030. }
  5031. wc_ecc_free(key);
  5032. }
  5033. #ifdef WOLFSSL_SMALL_STACK
  5034. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5035. #endif
  5036. if (ret != 0)
  5037. return ret;
  5038. }
  5039. #endif /* HAVE_ECC */
  5040. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  5041. if ((*keyFormat == 0 || *keyFormat == ED25519k)) {
  5042. /* make sure Ed25519 key can be used */
  5043. #ifdef WOLFSSL_SMALL_STACK
  5044. ed25519_key* key;
  5045. #else
  5046. ed25519_key key[1];
  5047. #endif
  5048. #ifdef WOLFSSL_SMALL_STACK
  5049. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  5050. DYNAMIC_TYPE_ED25519);
  5051. if (key == NULL)
  5052. return MEMORY_E;
  5053. #endif
  5054. ret = wc_ed25519_init_ex(key, heap, devId);
  5055. if (ret == 0) {
  5056. *idx = 0;
  5057. ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length);
  5058. #ifdef WOLF_PRIVATE_KEY_ID
  5059. if (ret != 0 && (devId != INVALID_DEVID
  5060. #ifdef HAVE_PK_CALLBACKS
  5061. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  5062. #endif
  5063. )) {
  5064. /* if using crypto or PK callbacks, try public key decode */
  5065. *idx = 0;
  5066. ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key,
  5067. der->length);
  5068. }
  5069. #endif
  5070. if (ret == 0) {
  5071. /* check for minimum key size and then free */
  5072. int minKeySz = ssl ? ssl->options.minEccKeySz :
  5073. ctx->minEccKeySz;
  5074. *keySz = ED25519_KEY_SIZE;
  5075. if (*keySz < minKeySz) {
  5076. WOLFSSL_MSG("ED25519 private key too small");
  5077. ret = ECC_KEY_SIZE_E;
  5078. }
  5079. if (ret == 0) {
  5080. if (ssl) {
  5081. ssl->buffers.keyType = ed25519_sa_algo;
  5082. ssl->buffers.keySz = *keySz;
  5083. }
  5084. else if (ctx) {
  5085. ctx->privateKeyType = ed25519_sa_algo;
  5086. ctx->privateKeySz = *keySz;
  5087. }
  5088. *keyFormat = ED25519k;
  5089. if (ssl != NULL) {
  5090. /* ED25519 requires caching enabled for tracking message
  5091. * hash used in EdDSA_Update for signing */
  5092. ssl->options.cacheMessages = 1;
  5093. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5094. *resetSuites = 1;
  5095. }
  5096. }
  5097. }
  5098. }
  5099. else {
  5100. ret = 0; /* continue trying other algorithms */
  5101. }
  5102. wc_ed25519_free(key);
  5103. }
  5104. #ifdef WOLFSSL_SMALL_STACK
  5105. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  5106. #endif
  5107. if (ret != 0)
  5108. return ret;
  5109. }
  5110. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  5111. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  5112. if ((*keyFormat == 0 || *keyFormat == ED448k)) {
  5113. /* make sure Ed448 key can be used */
  5114. #ifdef WOLFSSL_SMALL_STACK
  5115. ed448_key* key = NULL;
  5116. #else
  5117. ed448_key key[1];
  5118. #endif
  5119. #ifdef WOLFSSL_SMALL_STACK
  5120. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  5121. if (key == NULL)
  5122. return MEMORY_E;
  5123. #endif
  5124. ret = wc_ed448_init(key);
  5125. if (ret == 0) {
  5126. *idx = 0;
  5127. ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length);
  5128. #ifdef WOLF_PRIVATE_KEY_ID
  5129. if (ret != 0 && (devId != INVALID_DEVID
  5130. #ifdef HAVE_PK_CALLBACKS
  5131. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  5132. #endif
  5133. )) {
  5134. /* if using crypto or PK callbacks, try public key decode */
  5135. *idx = 0;
  5136. ret = wc_Ed448PublicKeyDecode(der->buffer, idx, key,
  5137. der->length);
  5138. }
  5139. #endif
  5140. if (ret == 0) {
  5141. /* check for minimum key size and then free */
  5142. int minKeySz = ssl ? ssl->options.minEccKeySz :
  5143. ctx->minEccKeySz;
  5144. *keySz = ED448_KEY_SIZE;
  5145. if (*keySz < minKeySz) {
  5146. WOLFSSL_MSG("ED448 private key too small");
  5147. ret = ECC_KEY_SIZE_E;
  5148. }
  5149. }
  5150. if (ret == 0) {
  5151. if (ssl) {
  5152. ssl->buffers.keyType = ed448_sa_algo;
  5153. ssl->buffers.keySz = *keySz;
  5154. }
  5155. else if (ctx) {
  5156. ctx->privateKeyType = ed448_sa_algo;
  5157. ctx->privateKeySz = *keySz;
  5158. }
  5159. *keyFormat = ED448k;
  5160. if (ssl != NULL) {
  5161. /* ED448 requires caching enabled for tracking message
  5162. * hash used in EdDSA_Update for signing */
  5163. ssl->options.cacheMessages = 1;
  5164. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5165. *resetSuites = 1;
  5166. }
  5167. }
  5168. }
  5169. wc_ed448_free(key);
  5170. }
  5171. #ifdef WOLFSSL_SMALL_STACK
  5172. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  5173. #endif
  5174. if (ret != 0)
  5175. return ret;
  5176. }
  5177. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  5178. #if defined(HAVE_PQC)
  5179. #if defined(HAVE_FALCON)
  5180. if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) ||
  5181. (*keyFormat == FALCON_LEVEL5k))) {
  5182. /* make sure Falcon key can be used */
  5183. falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  5184. DYNAMIC_TYPE_FALCON);
  5185. if (key == NULL) {
  5186. return MEMORY_E;
  5187. }
  5188. ret = wc_falcon_init(key);
  5189. if (ret == 0) {
  5190. if (*keyFormat == FALCON_LEVEL1k) {
  5191. ret = wc_falcon_set_level(key, 1);
  5192. }
  5193. else if (*keyFormat == FALCON_LEVEL5k) {
  5194. ret = wc_falcon_set_level(key, 5);
  5195. }
  5196. else {
  5197. /* What if *keyformat is 0? We might want to do something more
  5198. * graceful here. */
  5199. wc_falcon_free(key);
  5200. ret = ALGO_ID_E;
  5201. }
  5202. }
  5203. if (ret == 0) {
  5204. *idx = 0;
  5205. ret = wc_falcon_import_private_only(der->buffer, der->length, key);
  5206. if (ret == 0) {
  5207. /* check for minimum key size and then free */
  5208. int minKeySz = ssl ? ssl->options.minFalconKeySz :
  5209. ctx->minFalconKeySz;
  5210. *keySz = FALCON_MAX_KEY_SIZE;
  5211. if (*keySz < minKeySz) {
  5212. WOLFSSL_MSG("Falcon private key too small");
  5213. ret = FALCON_KEY_SIZE_E;
  5214. }
  5215. if (ssl) {
  5216. if (*keyFormat == FALCON_LEVEL1k) {
  5217. ssl->buffers.keyType = falcon_level1_sa_algo;
  5218. }
  5219. else {
  5220. ssl->buffers.keyType = falcon_level5_sa_algo;
  5221. }
  5222. ssl->buffers.keySz = *keySz;
  5223. }
  5224. else {
  5225. if (*keyFormat == FALCON_LEVEL1k) {
  5226. ctx->privateKeyType = falcon_level1_sa_algo;
  5227. }
  5228. else {
  5229. ctx->privateKeyType = falcon_level5_sa_algo;
  5230. }
  5231. ctx->privateKeySz = *keySz;
  5232. }
  5233. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5234. *resetSuites = 1;
  5235. }
  5236. }
  5237. wc_falcon_free(key);
  5238. }
  5239. XFREE(key, heap, DYNAMIC_TYPE_FALCON);
  5240. if (ret != 0)
  5241. return ret;
  5242. }
  5243. #endif /* HAVE_FALCON */
  5244. #if defined(HAVE_DILITHIUM)
  5245. if ((*keyFormat == 0) ||
  5246. (*keyFormat == DILITHIUM_LEVEL2k) ||
  5247. (*keyFormat == DILITHIUM_LEVEL3k) ||
  5248. (*keyFormat == DILITHIUM_LEVEL5k) ||
  5249. (*keyFormat == DILITHIUM_AES_LEVEL2k) ||
  5250. (*keyFormat == DILITHIUM_AES_LEVEL3k) ||
  5251. (*keyFormat == DILITHIUM_AES_LEVEL5k)) {
  5252. /* make sure Dilithium key can be used */
  5253. dilithium_key* key = (dilithium_key*)XMALLOC(sizeof(dilithium_key),
  5254. heap,
  5255. DYNAMIC_TYPE_DILITHIUM);
  5256. if (key == NULL) {
  5257. return MEMORY_E;
  5258. }
  5259. ret = wc_dilithium_init(key);
  5260. if (ret == 0) {
  5261. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5262. ret = wc_dilithium_set_level_and_sym(key, 2, SHAKE_VARIANT);
  5263. }
  5264. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5265. ret = wc_dilithium_set_level_and_sym(key, 3, SHAKE_VARIANT);
  5266. }
  5267. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5268. ret = wc_dilithium_set_level_and_sym(key, 5, SHAKE_VARIANT);
  5269. }
  5270. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5271. ret = wc_dilithium_set_level_and_sym(key, 2, AES_VARIANT);
  5272. }
  5273. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5274. ret = wc_dilithium_set_level_and_sym(key, 3, AES_VARIANT);
  5275. }
  5276. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5277. ret = wc_dilithium_set_level_and_sym(key, 5, AES_VARIANT);
  5278. }
  5279. else {
  5280. /* What if *keyformat is 0? We might want to do something more
  5281. * graceful here. */
  5282. wc_dilithium_free(key);
  5283. ret = ALGO_ID_E;
  5284. }
  5285. }
  5286. if (ret == 0) {
  5287. *idx = 0;
  5288. ret = wc_dilithium_import_private_only(der->buffer, der->length,
  5289. key);
  5290. if (ret == 0) {
  5291. /* check for minimum key size and then free */
  5292. int minKeySz = ssl ? ssl->options.minDilithiumKeySz :
  5293. ctx->minDilithiumKeySz;
  5294. *keySz = DILITHIUM_MAX_KEY_SIZE;
  5295. if (*keySz < minKeySz) {
  5296. WOLFSSL_MSG("Dilithium private key too small");
  5297. ret = DILITHIUM_KEY_SIZE_E;
  5298. }
  5299. if (ssl) {
  5300. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5301. ssl->buffers.keyType = dilithium_level2_sa_algo;
  5302. }
  5303. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5304. ssl->buffers.keyType = dilithium_level3_sa_algo;
  5305. }
  5306. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5307. ssl->buffers.keyType = dilithium_level5_sa_algo;
  5308. }
  5309. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5310. ssl->buffers.keyType = dilithium_aes_level2_sa_algo;
  5311. }
  5312. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5313. ssl->buffers.keyType = dilithium_aes_level3_sa_algo;
  5314. }
  5315. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5316. ssl->buffers.keyType = dilithium_aes_level5_sa_algo;
  5317. }
  5318. ssl->buffers.keySz = *keySz;
  5319. }
  5320. else {
  5321. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5322. ctx->privateKeyType = dilithium_level2_sa_algo;
  5323. }
  5324. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5325. ctx->privateKeyType = dilithium_level3_sa_algo;
  5326. }
  5327. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5328. ctx->privateKeyType = dilithium_level5_sa_algo;
  5329. }
  5330. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5331. ctx->privateKeyType = dilithium_aes_level2_sa_algo;
  5332. }
  5333. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5334. ctx->privateKeyType = dilithium_aes_level3_sa_algo;
  5335. }
  5336. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5337. ctx->privateKeyType = dilithium_aes_level5_sa_algo;
  5338. }
  5339. ctx->privateKeySz = *keySz;
  5340. }
  5341. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5342. *resetSuites = 1;
  5343. }
  5344. }
  5345. wc_dilithium_free(key);
  5346. }
  5347. XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM);
  5348. if (ret != 0) {
  5349. return ret;
  5350. }
  5351. }
  5352. #endif /* HAVE_DILITHIUM */
  5353. #endif /* HAVE_PQC */
  5354. return ret;
  5355. }
  5356. /* process the buffer buff, length sz, into ctx of format and type
  5357. used tracks bytes consumed, userChain specifies a user cert chain
  5358. to pass during the handshake */
  5359. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5360. long sz, int format, int type, WOLFSSL* ssl,
  5361. long* used, int userChain, int verify)
  5362. {
  5363. DerBuffer* der = NULL;
  5364. int ret = 0;
  5365. int done = 0;
  5366. int keyFormat = 0;
  5367. int resetSuites = 0;
  5368. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  5369. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  5370. word32 idx = 0;
  5371. int keySz = 0;
  5372. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  5373. defined(HAVE_PKCS8)
  5374. word32 algId = 0;
  5375. #endif
  5376. #ifdef WOLFSSL_SMALL_STACK
  5377. EncryptedInfo* info = NULL;
  5378. #else
  5379. EncryptedInfo info[1];
  5380. #endif
  5381. (void)devId;
  5382. (void)idx;
  5383. (void)keySz;
  5384. if (used)
  5385. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  5386. /* check args */
  5387. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  5388. return WOLFSSL_BAD_FILETYPE;
  5389. if (ctx == NULL && ssl == NULL)
  5390. return BAD_FUNC_ARG;
  5391. #ifdef WOLFSSL_SMALL_STACK
  5392. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  5393. DYNAMIC_TYPE_ENCRYPTEDINFO);
  5394. if (info == NULL)
  5395. return MEMORY_E;
  5396. #endif
  5397. XMEMSET(info, 0, sizeof(EncryptedInfo));
  5398. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5399. if (ctx) {
  5400. info->passwd_cb = ctx->passwd_cb;
  5401. info->passwd_userdata = ctx->passwd_userdata;
  5402. }
  5403. #endif
  5404. if (format == WOLFSSL_FILETYPE_PEM) {
  5405. #ifdef WOLFSSL_PEM_TO_DER
  5406. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  5407. #else
  5408. ret = NOT_COMPILED_IN;
  5409. #endif
  5410. }
  5411. else {
  5412. /* ASN1 (DER) */
  5413. int length = (int)sz;
  5414. if (format == WOLFSSL_FILETYPE_ASN1) {
  5415. /* get length of der (read sequence or octet string) */
  5416. word32 inOutIdx = 0;
  5417. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5418. length += inOutIdx; /* include leading sequence */
  5419. }
  5420. /* get length using octect string (allowed for private key types) */
  5421. else if (type == PRIVATEKEY_TYPE &&
  5422. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5423. length += inOutIdx; /* include leading oct string */
  5424. }
  5425. else {
  5426. ret = ASN_PARSE_E;
  5427. }
  5428. }
  5429. info->consumed = length;
  5430. if (ret == 0) {
  5431. ret = AllocDer(&der, (word32)length, type, heap);
  5432. if (ret == 0) {
  5433. XMEMCPY(der->buffer, buff, length);
  5434. }
  5435. #ifdef HAVE_PKCS8
  5436. /* if private key try and remove PKCS8 header */
  5437. if (type == PRIVATEKEY_TYPE) {
  5438. if ((ret = ToTraditional_ex(der->buffer, der->length,
  5439. &algId)) > 0) {
  5440. /* Found PKCS8 header */
  5441. /* ToTraditional_ex moves buff and returns adjusted length */
  5442. der->length = ret;
  5443. keyFormat = algId;
  5444. }
  5445. ret = 0; /* failures should be ignored */
  5446. }
  5447. #endif
  5448. }
  5449. }
  5450. if (used) {
  5451. *used = info->consumed;
  5452. }
  5453. /* process user chain */
  5454. if (ret >= 0) {
  5455. /* Chain should have server cert first, then intermediates, then root.
  5456. * First certificate in chain is processed below after ProcessUserChain
  5457. * and is loaded into ssl->buffers.certificate.
  5458. * Remainder are processed using ProcessUserChain and are loaded into
  5459. * ssl->buffers.certChain. */
  5460. if (userChain) {
  5461. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  5462. verify);
  5463. if (ret == ASN_NO_PEM_HEADER) { /* Additional chain is optional */
  5464. unsigned long pemErr;
  5465. CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr);
  5466. ret = 0;
  5467. }
  5468. }
  5469. }
  5470. /* info is only used for private key with DER or PEM, so free now */
  5471. if (ret < 0 || type != PRIVATEKEY_TYPE) {
  5472. #ifdef WOLFSSL_SMALL_STACK
  5473. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5474. #endif
  5475. }
  5476. /* check for error */
  5477. if (ret < 0) {
  5478. FreeDer(&der);
  5479. done = 1;
  5480. }
  5481. if (done == 1) {
  5482. /* No operation, just skip the next section */
  5483. }
  5484. /* Handle DER owner */
  5485. else if (type == CA_TYPE) {
  5486. if (ctx == NULL) {
  5487. WOLFSSL_MSG("Need context for CA load");
  5488. FreeDer(&der);
  5489. return BAD_FUNC_ARG;
  5490. }
  5491. /* verify CA unless user set to no verify */
  5492. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  5493. done = 1;
  5494. }
  5495. #ifdef WOLFSSL_TRUST_PEER_CERT
  5496. else if (type == TRUSTED_PEER_TYPE) {
  5497. /* add trusted peer cert. der is freed within */
  5498. if (ctx != NULL)
  5499. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  5500. else
  5501. ret = AddTrustedPeer(SSL_CM(ssl), &der, !ssl->options.verifyNone);
  5502. if (ret != WOLFSSL_SUCCESS) {
  5503. WOLFSSL_MSG("Error adding trusted peer");
  5504. }
  5505. done = 1;
  5506. }
  5507. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5508. else if (type == CERT_TYPE) {
  5509. if (ssl != NULL) {
  5510. /* Make sure previous is free'd */
  5511. if (ssl->buffers.weOwnCert) {
  5512. FreeDer(&ssl->buffers.certificate);
  5513. #ifdef KEEP_OUR_CERT
  5514. wolfSSL_X509_free(ssl->ourCert);
  5515. ssl->ourCert = NULL;
  5516. #endif
  5517. }
  5518. ssl->buffers.certificate = der;
  5519. #ifdef KEEP_OUR_CERT
  5520. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  5521. #endif
  5522. ssl->buffers.weOwnCert = 1;
  5523. }
  5524. else if (ctx != NULL) {
  5525. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  5526. #ifdef KEEP_OUR_CERT
  5527. if (ctx->ourCert) {
  5528. if (ctx->ownOurCert)
  5529. wolfSSL_X509_free(ctx->ourCert);
  5530. ctx->ourCert = NULL;
  5531. }
  5532. #endif
  5533. ctx->certificate = der;
  5534. }
  5535. }
  5536. else if (type == PRIVATEKEY_TYPE) {
  5537. if (ssl != NULL) {
  5538. /* Make sure previous is free'd */
  5539. if (ssl->buffers.weOwnKey) {
  5540. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  5541. FreeDer(&ssl->buffers.key);
  5542. }
  5543. ssl->buffers.key = der;
  5544. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5545. wc_MemZero_Add("SSL Buffers key", der->buffer, der->length);
  5546. #endif
  5547. ssl->buffers.weOwnKey = 1;
  5548. }
  5549. else if (ctx != NULL) {
  5550. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  5551. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  5552. }
  5553. FreeDer(&ctx->privateKey);
  5554. ctx->privateKey = der;
  5555. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5556. wc_MemZero_Add("CTX private key", der->buffer, der->length);
  5557. #endif
  5558. }
  5559. }
  5560. else {
  5561. FreeDer(&der);
  5562. return WOLFSSL_BAD_CERTTYPE;
  5563. }
  5564. if (done == 1) {
  5565. /* No operation, just skip the next section */
  5566. }
  5567. else if (type == PRIVATEKEY_TYPE) {
  5568. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  5569. &keyFormat, heap, devId);
  5570. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5571. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  5572. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  5573. if ((ret != 0 || keyFormat == 0)
  5574. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  5575. {
  5576. int passwordSz = NAME_SZ;
  5577. #ifndef WOLFSSL_SMALL_STACK
  5578. char password[NAME_SZ];
  5579. #else
  5580. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  5581. if (password == NULL) {
  5582. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5583. FreeDer(&der);
  5584. return MEMORY_E;
  5585. }
  5586. #endif
  5587. /* get password */
  5588. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  5589. info->passwd_userdata);
  5590. if (ret >= 0) {
  5591. passwordSz = ret;
  5592. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5593. wc_MemZero_Add("ProcessBuffer password", password, passwordSz);
  5594. #endif
  5595. /* PKCS8 decrypt */
  5596. ret = ToTraditionalEnc(der->buffer, der->length,
  5597. password, passwordSz, &algId);
  5598. if (ret >= 0) {
  5599. ForceZero(der->buffer + ret, der->length - ret);
  5600. der->length = ret;
  5601. }
  5602. /* ignore failures and try parsing as unencrypted */
  5603. ForceZero(password, passwordSz);
  5604. }
  5605. #ifdef WOLFSSL_SMALL_STACK
  5606. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  5607. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  5608. wc_MemZero_Check(password, NAME_SZ);
  5609. #endif
  5610. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  5611. &resetSuites, &keyFormat, heap, devId);
  5612. }
  5613. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  5614. #ifdef WOLFSSL_SMALL_STACK
  5615. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5616. #endif
  5617. if (ret != 0)
  5618. return ret;
  5619. if (keyFormat == 0) {
  5620. #ifdef OPENSSL_EXTRA
  5621. /* Reaching this point probably means that the
  5622. * decryption password is wrong */
  5623. if (info->passwd_cb)
  5624. EVPerr(0, EVP_R_BAD_DECRYPT);
  5625. #endif
  5626. WOLFSSL_ERROR(WOLFSSL_BAD_FILE);
  5627. return WOLFSSL_BAD_FILE;
  5628. }
  5629. (void)devId;
  5630. }
  5631. else if (type == CERT_TYPE) {
  5632. #ifdef WOLFSSL_SMALL_STACK
  5633. DecodedCert* cert;
  5634. #else
  5635. DecodedCert cert[1];
  5636. #endif
  5637. #ifdef WOLF_PRIVATE_KEY_ID
  5638. int keyType = 0;
  5639. #endif
  5640. #ifdef WOLFSSL_SMALL_STACK
  5641. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  5642. DYNAMIC_TYPE_DCERT);
  5643. if (cert == NULL)
  5644. return MEMORY_E;
  5645. #endif
  5646. WOLFSSL_MSG("Checking cert signature type");
  5647. InitDecodedCert(cert, der->buffer, der->length, heap);
  5648. if (DecodeToKey(cert, 0) < 0) {
  5649. WOLFSSL_MSG("Decode to key failed");
  5650. FreeDecodedCert(cert);
  5651. #ifdef WOLFSSL_SMALL_STACK
  5652. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5653. #endif
  5654. return WOLFSSL_BAD_FILE;
  5655. }
  5656. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5657. resetSuites = 1;
  5658. }
  5659. if (ssl && ssl->ctx->haveECDSAsig) {
  5660. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  5661. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  5662. }
  5663. switch (cert->signatureOID) {
  5664. case CTC_SHAwECDSA:
  5665. case CTC_SHA256wECDSA:
  5666. case CTC_SHA384wECDSA:
  5667. case CTC_SHA512wECDSA:
  5668. case CTC_ED25519:
  5669. case CTC_ED448:
  5670. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  5671. if (ssl)
  5672. ssl->options.haveECDSAsig = 1;
  5673. else if (ctx)
  5674. ctx->haveECDSAsig = 1;
  5675. break;
  5676. case CTC_FALCON_LEVEL1:
  5677. case CTC_FALCON_LEVEL5:
  5678. WOLFSSL_MSG("Falcon cert signature");
  5679. if (ssl)
  5680. ssl->options.haveFalconSig = 1;
  5681. else if (ctx)
  5682. ctx->haveFalconSig = 1;
  5683. break;
  5684. case CTC_DILITHIUM_LEVEL2:
  5685. case CTC_DILITHIUM_LEVEL3:
  5686. case CTC_DILITHIUM_LEVEL5:
  5687. case CTC_DILITHIUM_AES_LEVEL2:
  5688. case CTC_DILITHIUM_AES_LEVEL3:
  5689. case CTC_DILITHIUM_AES_LEVEL5:
  5690. WOLFSSL_MSG("Dilithium cert signature");
  5691. if (ssl)
  5692. ssl->options.haveDilithiumSig = 1;
  5693. else if (ctx)
  5694. ctx->haveDilithiumSig = 1;
  5695. break;
  5696. default:
  5697. WOLFSSL_MSG("Not ECDSA cert signature");
  5698. break;
  5699. }
  5700. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5701. (defined(HAVE_PQC) && defined(HAVE_LIBOQS)) || !defined(NO_RSA)
  5702. if (ssl) {
  5703. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5704. (defined(HAVE_CURVE448) && defined(HAVE_ED448))
  5705. ssl->pkCurveOID = cert->pkCurveOID;
  5706. #endif
  5707. #ifndef WC_STRICT_SIG
  5708. if (cert->keyOID == ECDSAk) {
  5709. ssl->options.haveECC = 1;
  5710. }
  5711. #ifndef NO_RSA
  5712. else if (cert->keyOID == RSAk) {
  5713. ssl->options.haveRSA = 1;
  5714. }
  5715. #ifdef WC_RSA_PSS
  5716. else if (cert->keyOID == RSAPSSk) {
  5717. ssl->options.haveRSA = 1;
  5718. }
  5719. #endif
  5720. #endif
  5721. #ifdef HAVE_ED25519
  5722. else if (cert->keyOID == ED25519k) {
  5723. ssl->options.haveECC = 1;
  5724. }
  5725. #endif
  5726. #ifdef HAVE_ED448
  5727. else if (cert->keyOID == ED448k) {
  5728. ssl->options.haveECC = 1;
  5729. }
  5730. #endif
  5731. #ifdef HAVE_PQC
  5732. #ifdef HAVE_FALCON
  5733. else if (cert->keyOID == FALCON_LEVEL1k ||
  5734. cert->keyOID == FALCON_LEVEL5k) {
  5735. ssl->options.haveFalconSig = 1;
  5736. }
  5737. #endif /* HAVE_FALCON */
  5738. #ifdef HAVE_DILITHIUM
  5739. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  5740. cert->keyOID == DILITHIUM_LEVEL3k ||
  5741. cert->keyOID == DILITHIUM_LEVEL5k ||
  5742. cert->keyOID == DILITHIUM_AES_LEVEL2k ||
  5743. cert->keyOID == DILITHIUM_AES_LEVEL3k ||
  5744. cert->keyOID == DILITHIUM_AES_LEVEL5k) {
  5745. ssl->options.haveDilithiumSig = 1;
  5746. }
  5747. #endif /* HAVE_DILITHIUM */
  5748. #endif /* HAVE_PQC */
  5749. #else
  5750. ssl->options.haveECC = ssl->options.haveECDSAsig;
  5751. #endif
  5752. }
  5753. else if (ctx) {
  5754. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5755. ctx->pkCurveOID = cert->pkCurveOID;
  5756. #endif
  5757. #ifndef WC_STRICT_SIG
  5758. if (cert->keyOID == ECDSAk) {
  5759. ctx->haveECC = 1;
  5760. }
  5761. #ifndef NO_RSA
  5762. else if (cert->keyOID == RSAk) {
  5763. ctx->haveRSA = 1;
  5764. }
  5765. #ifdef WC_RSA_PSS
  5766. else if (cert->keyOID == RSAPSSk) {
  5767. ctx->haveRSA = 1;
  5768. }
  5769. #endif
  5770. #endif
  5771. #ifdef HAVE_ED25519
  5772. else if (cert->keyOID == ED25519k) {
  5773. ctx->haveECC = 1;
  5774. }
  5775. #endif
  5776. #ifdef HAVE_ED448
  5777. else if (cert->keyOID == ED448k) {
  5778. ctx->haveECC = 1;
  5779. }
  5780. #endif
  5781. #ifdef HAVE_PQC
  5782. #ifdef HAVE_FALCON
  5783. else if (cert->keyOID == FALCON_LEVEL1k ||
  5784. cert->keyOID == FALCON_LEVEL5k) {
  5785. ctx->haveFalconSig = 1;
  5786. }
  5787. #endif /* HAVE_FALCON */
  5788. #ifdef HAVE_DILITHIUM
  5789. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  5790. cert->keyOID == DILITHIUM_LEVEL3k ||
  5791. cert->keyOID == DILITHIUM_LEVEL5k ||
  5792. cert->keyOID == DILITHIUM_AES_LEVEL2k ||
  5793. cert->keyOID == DILITHIUM_AES_LEVEL3k ||
  5794. cert->keyOID == DILITHIUM_AES_LEVEL5k) {
  5795. ctx->haveDilithiumSig = 1;
  5796. }
  5797. #endif /* HAVE_DILITHIUM */
  5798. #endif /* HAVE_PQC */
  5799. #else
  5800. ctx->haveECC = ctx->haveECDSAsig;
  5801. #endif
  5802. }
  5803. #endif
  5804. /* check key size of cert unless specified not to */
  5805. switch (cert->keyOID) {
  5806. #ifndef NO_RSA
  5807. #ifdef WC_RSA_PSS
  5808. case RSAPSSk:
  5809. #endif
  5810. case RSAk:
  5811. #ifdef WOLF_PRIVATE_KEY_ID
  5812. keyType = rsa_sa_algo;
  5813. #endif
  5814. /* Determine RSA key size by parsing public key */
  5815. idx = 0;
  5816. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  5817. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  5818. if (ret < 0)
  5819. break;
  5820. if (ssl && !ssl->options.verifyNone) {
  5821. if (ssl->options.minRsaKeySz < 0 ||
  5822. keySz < (int)ssl->options.minRsaKeySz ||
  5823. keySz > (RSA_MAX_SIZE / 8)) {
  5824. ret = RSA_KEY_SIZE_E;
  5825. WOLFSSL_MSG("Certificate RSA key size too small");
  5826. }
  5827. }
  5828. else if (ctx && !ctx->verifyNone) {
  5829. if (ctx->minRsaKeySz < 0 ||
  5830. keySz < (int)ctx->minRsaKeySz ||
  5831. keySz > (RSA_MAX_SIZE / 8)) {
  5832. ret = RSA_KEY_SIZE_E;
  5833. WOLFSSL_MSG("Certificate RSA key size too small");
  5834. }
  5835. }
  5836. break;
  5837. #endif /* !NO_RSA */
  5838. #ifdef HAVE_ECC
  5839. case ECDSAk:
  5840. #ifdef WOLF_PRIVATE_KEY_ID
  5841. keyType = ecc_dsa_sa_algo;
  5842. #endif
  5843. /* Determine ECC key size based on curve */
  5844. keySz = wc_ecc_get_curve_size_from_id(
  5845. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  5846. if (ssl && !ssl->options.verifyNone) {
  5847. if (ssl->options.minEccKeySz < 0 ||
  5848. keySz < (int)ssl->options.minEccKeySz) {
  5849. ret = ECC_KEY_SIZE_E;
  5850. WOLFSSL_MSG("Certificate ECC key size error");
  5851. }
  5852. }
  5853. else if (ctx && !ctx->verifyNone) {
  5854. if (ctx->minEccKeySz < 0 ||
  5855. keySz < (int)ctx->minEccKeySz) {
  5856. ret = ECC_KEY_SIZE_E;
  5857. WOLFSSL_MSG("Certificate ECC key size error");
  5858. }
  5859. }
  5860. break;
  5861. #endif /* HAVE_ECC */
  5862. #ifdef HAVE_ED25519
  5863. case ED25519k:
  5864. #ifdef WOLF_PRIVATE_KEY_ID
  5865. keyType = ed25519_sa_algo;
  5866. #endif
  5867. /* ED25519 is fixed key size */
  5868. keySz = ED25519_KEY_SIZE;
  5869. if (ssl && !ssl->options.verifyNone) {
  5870. if (ssl->options.minEccKeySz < 0 ||
  5871. keySz < (int)ssl->options.minEccKeySz) {
  5872. ret = ECC_KEY_SIZE_E;
  5873. WOLFSSL_MSG("Certificate Ed key size error");
  5874. }
  5875. }
  5876. else if (ctx && !ctx->verifyNone) {
  5877. if (ctx->minEccKeySz < 0 ||
  5878. keySz < (int)ctx->minEccKeySz) {
  5879. ret = ECC_KEY_SIZE_E;
  5880. WOLFSSL_MSG("Certificate ECC key size error");
  5881. }
  5882. }
  5883. break;
  5884. #endif /* HAVE_ED25519 */
  5885. #ifdef HAVE_ED448
  5886. case ED448k:
  5887. #ifdef WOLF_PRIVATE_KEY_ID
  5888. keyType = ed448_sa_algo;
  5889. #endif
  5890. /* ED448 is fixed key size */
  5891. keySz = ED448_KEY_SIZE;
  5892. if (ssl && !ssl->options.verifyNone) {
  5893. if (ssl->options.minEccKeySz < 0 ||
  5894. keySz < (int)ssl->options.minEccKeySz) {
  5895. ret = ECC_KEY_SIZE_E;
  5896. WOLFSSL_MSG("Certificate Ed key size error");
  5897. }
  5898. }
  5899. else if (ctx && !ctx->verifyNone) {
  5900. if (ctx->minEccKeySz < 0 ||
  5901. keySz < (int)ctx->minEccKeySz) {
  5902. ret = ECC_KEY_SIZE_E;
  5903. WOLFSSL_MSG("Certificate ECC key size error");
  5904. }
  5905. }
  5906. break;
  5907. #endif /* HAVE_ED448 */
  5908. #if defined(HAVE_PQC)
  5909. #if defined(HAVE_FALCON)
  5910. case FALCON_LEVEL1k:
  5911. case FALCON_LEVEL5k:
  5912. /* Falcon is fixed key size */
  5913. keySz = FALCON_MAX_KEY_SIZE;
  5914. if (ssl && !ssl->options.verifyNone) {
  5915. if (ssl->options.minFalconKeySz < 0 ||
  5916. keySz < (int)ssl->options.minFalconKeySz) {
  5917. ret = FALCON_KEY_SIZE_E;
  5918. WOLFSSL_MSG("Certificate Falcon key size error");
  5919. }
  5920. }
  5921. else if (ctx && !ctx->verifyNone) {
  5922. if (ctx->minFalconKeySz < 0 ||
  5923. keySz < (int)ctx->minFalconKeySz) {
  5924. ret = FALCON_KEY_SIZE_E;
  5925. WOLFSSL_MSG("Certificate Falcon key size error");
  5926. }
  5927. }
  5928. break;
  5929. #endif /* HAVE_FALCON */
  5930. #if defined(HAVE_DILITHIUM)
  5931. case DILITHIUM_LEVEL2k:
  5932. case DILITHIUM_LEVEL3k:
  5933. case DILITHIUM_LEVEL5k:
  5934. case DILITHIUM_AES_LEVEL2k:
  5935. case DILITHIUM_AES_LEVEL3k:
  5936. case DILITHIUM_AES_LEVEL5k:
  5937. /* Dilithium is fixed key size */
  5938. keySz = DILITHIUM_MAX_KEY_SIZE;
  5939. if (ssl && !ssl->options.verifyNone) {
  5940. if (ssl->options.minDilithiumKeySz < 0 ||
  5941. keySz < (int)ssl->options.minDilithiumKeySz) {
  5942. ret = DILITHIUM_KEY_SIZE_E;
  5943. WOLFSSL_MSG("Certificate Dilithium key size error");
  5944. }
  5945. }
  5946. else if (ctx && !ctx->verifyNone) {
  5947. if (ctx->minDilithiumKeySz < 0 ||
  5948. keySz < (int)ctx->minDilithiumKeySz) {
  5949. ret = DILITHIUM_KEY_SIZE_E;
  5950. WOLFSSL_MSG("Certificate Dilithium key size error");
  5951. }
  5952. }
  5953. break;
  5954. #endif /* HAVE_DILITHIUM */
  5955. #endif /* HAVE_PQC */
  5956. default:
  5957. WOLFSSL_MSG("No key size check done on certificate");
  5958. break; /* do no check if not a case for the key */
  5959. }
  5960. #ifdef WOLF_PRIVATE_KEY_ID
  5961. if (ssl != NULL && ssl->buffers.keyType == 0) {
  5962. ssl->buffers.keyType = keyType;
  5963. ssl->buffers.keySz = keySz;
  5964. }
  5965. else if (ctx != NULL && ctx->privateKeyType == 0) {
  5966. ctx->privateKeyType = keyType;
  5967. ctx->privateKeySz = keySz;
  5968. }
  5969. #endif
  5970. FreeDecodedCert(cert);
  5971. #ifdef WOLFSSL_SMALL_STACK
  5972. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5973. #endif
  5974. if (ret != 0) {
  5975. done = 1;
  5976. }
  5977. }
  5978. if (done == 1) {
  5979. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  5980. !defined(WOLFSSL_NO_CLIENT_AUTH))
  5981. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  5982. /* Call to over-ride status */
  5983. if ((ctx != NULL) && (ctx->cm != NULL) &&
  5984. (ctx->cm->verifyCallback != NULL)) {
  5985. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  5986. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  5987. }
  5988. }
  5989. #endif /* NO_WOLFSSL_CM_VERIFY */
  5990. return ret;
  5991. }
  5992. if (ssl && resetSuites) {
  5993. word16 havePSK = 0;
  5994. word16 haveRSA = 0;
  5995. #ifndef NO_PSK
  5996. if (ssl->options.havePSK) {
  5997. havePSK = 1;
  5998. }
  5999. #endif
  6000. #ifndef NO_RSA
  6001. haveRSA = 1;
  6002. #endif
  6003. keySz = ssl->buffers.keySz;
  6004. /* let's reset suites */
  6005. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  6006. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  6007. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  6008. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  6009. ssl->options.haveAnon, TRUE, ssl->options.side);
  6010. }
  6011. return WOLFSSL_SUCCESS;
  6012. }
  6013. /* CA PEM file for verification, may have multiple/chain certs to process */
  6014. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6015. long sz, int format, int type, WOLFSSL* ssl, int verify)
  6016. {
  6017. long used = 0;
  6018. int ret = 0;
  6019. int gotOne = 0;
  6020. WOLFSSL_MSG("Processing CA PEM file");
  6021. while (used < sz) {
  6022. long consumed = 0;
  6023. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  6024. &consumed, 0, verify);
  6025. if (ret < 0) {
  6026. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  6027. DerBuffer* der = NULL;
  6028. EncryptedInfo info;
  6029. WOLFSSL_MSG("Trying a CRL");
  6030. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  6031. NULL) == 0) {
  6032. WOLFSSL_MSG(" Processed a CRL");
  6033. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  6034. der->length, WOLFSSL_FILETYPE_ASN1);
  6035. FreeDer(&der);
  6036. used += info.consumed;
  6037. continue;
  6038. }
  6039. #endif
  6040. if (consumed > 0) { /* Made progress in file */
  6041. WOLFSSL_ERROR(ret);
  6042. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  6043. WOLFSSL_MSG("Search for other certs in file");
  6044. }
  6045. else {
  6046. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  6047. WOLFSSL_MSG("Do not continue search for other certs in file");
  6048. break;
  6049. }
  6050. }
  6051. else {
  6052. WOLFSSL_MSG(" Processed a CA");
  6053. gotOne = 1;
  6054. }
  6055. used += consumed;
  6056. }
  6057. if (gotOne) {
  6058. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  6059. return WOLFSSL_SUCCESS;
  6060. }
  6061. return ret;
  6062. }
  6063. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  6064. {
  6065. #ifndef NO_WOLFSSL_CLIENT
  6066. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  6067. return wolfSSLv3_client_method();
  6068. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  6069. return wolfTLSv1_client_method();
  6070. #elif !defined(NO_OLD_TLS)
  6071. return wolfTLSv1_1_client_method();
  6072. #elif !defined(WOLFSSL_NO_TLS12)
  6073. return wolfTLSv1_2_client_method();
  6074. #elif defined(WOLFSSL_TLS13)
  6075. return wolfTLSv1_3_client_method();
  6076. #else
  6077. return NULL;
  6078. #endif
  6079. #elif !defined(NO_WOLFSSL_SERVER)
  6080. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  6081. return wolfSSLv3_server_method();
  6082. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  6083. return wolfTLSv1_server_method();
  6084. #elif !defined(NO_OLD_TLS)
  6085. return wolfTLSv1_1_server_method();
  6086. #elif !defined(WOLFSSL_NO_TLS12)
  6087. return wolfTLSv1_2_server_method();
  6088. #elif defined(WOLFSSL_TLS13)
  6089. return wolfTLSv1_3_server_method();
  6090. #else
  6091. return NULL;
  6092. #endif
  6093. #else
  6094. return NULL;
  6095. #endif
  6096. }
  6097. /* like load verify locations, 1 for success, < 0 for error */
  6098. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  6099. const unsigned char* in, long sz, int format)
  6100. {
  6101. int ret = WOLFSSL_FATAL_ERROR;
  6102. WOLFSSL_CTX* tmp;
  6103. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  6104. if (cm == NULL) {
  6105. WOLFSSL_MSG("No CertManager error");
  6106. return ret;
  6107. }
  6108. tmp = wolfSSL_CTX_new(cm_pick_method());
  6109. if (tmp == NULL) {
  6110. WOLFSSL_MSG("CTX new failed");
  6111. return ret;
  6112. }
  6113. /* for tmp use */
  6114. wolfSSL_CertManagerFree(tmp->cm);
  6115. tmp->cm = cm;
  6116. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  6117. /* don't loose our good one */
  6118. tmp->cm = NULL;
  6119. wolfSSL_CTX_free(tmp);
  6120. return ret;
  6121. }
  6122. #ifdef HAVE_CRL
  6123. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  6124. const unsigned char* buff, long sz, int type)
  6125. {
  6126. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  6127. if (cm == NULL)
  6128. return BAD_FUNC_ARG;
  6129. if (cm->crl == NULL) {
  6130. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  6131. WOLFSSL_MSG("Enable CRL failed");
  6132. return WOLFSSL_FATAL_ERROR;
  6133. }
  6134. }
  6135. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  6136. }
  6137. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  6138. {
  6139. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  6140. if (cm == NULL)
  6141. return BAD_FUNC_ARG;
  6142. if (cm->crl != NULL){
  6143. FreeCRL(cm->crl, 1);
  6144. cm->crl = NULL;
  6145. }
  6146. return WOLFSSL_SUCCESS;
  6147. }
  6148. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6149. long sz, int type)
  6150. {
  6151. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  6152. if (ctx == NULL)
  6153. return BAD_FUNC_ARG;
  6154. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  6155. }
  6156. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  6157. long sz, int type)
  6158. {
  6159. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  6160. if (ssl == NULL || ssl->ctx == NULL)
  6161. return BAD_FUNC_ARG;
  6162. return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type);
  6163. }
  6164. #endif /* HAVE_CRL */
  6165. /* turn on CRL if off and compiled in, set options */
  6166. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  6167. {
  6168. int ret = WOLFSSL_SUCCESS;
  6169. (void)options;
  6170. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  6171. if (cm == NULL)
  6172. return BAD_FUNC_ARG;
  6173. #ifdef HAVE_CRL
  6174. if (cm->crl == NULL) {
  6175. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  6176. DYNAMIC_TYPE_CRL);
  6177. if (cm->crl == NULL)
  6178. return MEMORY_E;
  6179. if (InitCRL(cm->crl, cm) != 0) {
  6180. WOLFSSL_MSG("Init CRL failed");
  6181. FreeCRL(cm->crl, 1);
  6182. cm->crl = NULL;
  6183. return WOLFSSL_FAILURE;
  6184. }
  6185. #if defined(HAVE_CRL_IO) && defined(USE_WOLFSSL_IO)
  6186. cm->crl->crlIOCb = EmbedCrlLookup;
  6187. #endif
  6188. }
  6189. cm->crlEnabled = 1;
  6190. if (options & WOLFSSL_CRL_CHECKALL)
  6191. cm->crlCheckAll = 1;
  6192. #else
  6193. ret = NOT_COMPILED_IN;
  6194. #endif
  6195. return ret;
  6196. }
  6197. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  6198. {
  6199. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  6200. if (cm == NULL)
  6201. return BAD_FUNC_ARG;
  6202. cm->crlEnabled = 0;
  6203. return WOLFSSL_SUCCESS;
  6204. }
  6205. #ifndef NO_WOLFSSL_CM_VERIFY
  6206. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  6207. {
  6208. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  6209. if (cm == NULL)
  6210. return;
  6211. cm->verifyCallback = vc;
  6212. }
  6213. #endif /* NO_WOLFSSL_CM_VERIFY */
  6214. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  6215. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6216. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  6217. long sz, int format, int err_val)
  6218. {
  6219. int ret = 0;
  6220. DerBuffer* der = NULL;
  6221. #ifdef WOLFSSL_SMALL_STACK
  6222. DecodedCert* cert;
  6223. #else
  6224. DecodedCert cert[1];
  6225. #endif
  6226. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  6227. #ifdef WOLFSSL_SMALL_STACK
  6228. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  6229. DYNAMIC_TYPE_DCERT);
  6230. if (cert == NULL)
  6231. return MEMORY_E;
  6232. #endif
  6233. if (format == WOLFSSL_FILETYPE_PEM) {
  6234. #ifdef WOLFSSL_PEM_TO_DER
  6235. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  6236. if (ret != 0) {
  6237. FreeDer(&der);
  6238. #ifdef WOLFSSL_SMALL_STACK
  6239. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6240. #endif
  6241. return ret;
  6242. }
  6243. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  6244. #else
  6245. ret = NOT_COMPILED_IN;
  6246. #endif
  6247. }
  6248. else {
  6249. InitDecodedCert(cert, buff, (word32)sz, cm->heap);
  6250. }
  6251. if (ret == 0)
  6252. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  6253. #ifdef HAVE_CRL
  6254. if (ret == 0 && cm->crlEnabled)
  6255. ret = CheckCertCRL(cm->crl, cert);
  6256. #endif
  6257. #ifndef NO_WOLFSSL_CM_VERIFY
  6258. /* if verify callback has been set */
  6259. if (cm->verifyCallback) {
  6260. buffer certBuf;
  6261. #ifdef WOLFSSL_SMALL_STACK
  6262. ProcPeerCertArgs* args;
  6263. args = (ProcPeerCertArgs*)XMALLOC(
  6264. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6265. if (args == NULL) {
  6266. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6267. return MEMORY_E;
  6268. }
  6269. #else
  6270. ProcPeerCertArgs args[1];
  6271. #endif
  6272. certBuf.buffer = (byte*)buff;
  6273. certBuf.length = (unsigned int)sz;
  6274. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  6275. args->totalCerts = 1;
  6276. args->certs = &certBuf;
  6277. args->dCert = cert;
  6278. args->dCertInit = 1;
  6279. if (err_val != 0) {
  6280. ret = err_val;
  6281. }
  6282. ret = DoVerifyCallback(cm, NULL, ret, args);
  6283. #ifdef WOLFSSL_SMALL_STACK
  6284. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6285. #endif
  6286. }
  6287. #else
  6288. (void)err_val;
  6289. #endif
  6290. FreeDecodedCert(cert);
  6291. FreeDer(&der);
  6292. #ifdef WOLFSSL_SMALL_STACK
  6293. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6294. #endif
  6295. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6296. }
  6297. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6298. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  6299. long sz, int format)
  6300. {
  6301. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  6302. }
  6303. #endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
  6304. /* turn on OCSP if off and compiled in, set options */
  6305. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  6306. {
  6307. int ret = WOLFSSL_SUCCESS;
  6308. (void)options;
  6309. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  6310. if (cm == NULL)
  6311. return BAD_FUNC_ARG;
  6312. #ifdef HAVE_OCSP
  6313. if (cm->ocsp == NULL) {
  6314. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  6315. DYNAMIC_TYPE_OCSP);
  6316. if (cm->ocsp == NULL)
  6317. return MEMORY_E;
  6318. if (InitOCSP(cm->ocsp, cm) != 0) {
  6319. WOLFSSL_MSG("Init OCSP failed");
  6320. FreeOCSP(cm->ocsp, 1);
  6321. cm->ocsp = NULL;
  6322. return WOLFSSL_FAILURE;
  6323. }
  6324. }
  6325. cm->ocspEnabled = 1;
  6326. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  6327. cm->ocspUseOverrideURL = 1;
  6328. if (options & WOLFSSL_OCSP_NO_NONCE)
  6329. cm->ocspSendNonce = 0;
  6330. else
  6331. cm->ocspSendNonce = 1;
  6332. if (options & WOLFSSL_OCSP_CHECKALL)
  6333. cm->ocspCheckAll = 1;
  6334. #ifndef WOLFSSL_USER_IO
  6335. cm->ocspIOCb = EmbedOcspLookup;
  6336. cm->ocspRespFreeCb = EmbedOcspRespFree;
  6337. cm->ocspIOCtx = cm->heap;
  6338. #endif /* WOLFSSL_USER_IO */
  6339. #else
  6340. ret = NOT_COMPILED_IN;
  6341. #endif
  6342. return ret;
  6343. }
  6344. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  6345. {
  6346. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  6347. if (cm == NULL)
  6348. return BAD_FUNC_ARG;
  6349. cm->ocspEnabled = 0;
  6350. return WOLFSSL_SUCCESS;
  6351. }
  6352. /* turn on OCSP Stapling if off and compiled in, set options */
  6353. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  6354. {
  6355. int ret = WOLFSSL_SUCCESS;
  6356. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  6357. if (cm == NULL)
  6358. return BAD_FUNC_ARG;
  6359. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6360. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6361. #ifndef NO_WOLFSSL_SERVER
  6362. if (cm->ocsp_stapling == NULL) {
  6363. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  6364. cm->heap, DYNAMIC_TYPE_OCSP);
  6365. if (cm->ocsp_stapling == NULL)
  6366. return MEMORY_E;
  6367. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  6368. WOLFSSL_MSG("Init OCSP failed");
  6369. FreeOCSP(cm->ocsp_stapling, 1);
  6370. cm->ocsp_stapling = NULL;
  6371. return WOLFSSL_FAILURE;
  6372. }
  6373. }
  6374. #ifndef WOLFSSL_USER_IO
  6375. cm->ocspIOCb = EmbedOcspLookup;
  6376. cm->ocspRespFreeCb = EmbedOcspRespFree;
  6377. cm->ocspIOCtx = cm->heap;
  6378. #endif /* WOLFSSL_USER_IO */
  6379. #endif /* NO_WOLFSSL_SERVER */
  6380. cm->ocspStaplingEnabled = 1;
  6381. #else
  6382. ret = NOT_COMPILED_IN;
  6383. #endif
  6384. return ret;
  6385. }
  6386. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  6387. {
  6388. int ret = WOLFSSL_SUCCESS;
  6389. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  6390. if (cm == NULL)
  6391. return BAD_FUNC_ARG;
  6392. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6393. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6394. cm->ocspStaplingEnabled = 0;
  6395. #else
  6396. ret = NOT_COMPILED_IN;
  6397. #endif
  6398. return ret;
  6399. }
  6400. /* require OCSP stapling response */
  6401. int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  6402. {
  6403. int ret;
  6404. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
  6405. if (cm == NULL)
  6406. return BAD_FUNC_ARG;
  6407. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6408. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6409. #ifndef NO_WOLFSSL_CLIENT
  6410. cm->ocspMustStaple = 1;
  6411. #endif
  6412. ret = WOLFSSL_SUCCESS;
  6413. #else
  6414. ret = NOT_COMPILED_IN;
  6415. #endif
  6416. return ret;
  6417. }
  6418. int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  6419. {
  6420. int ret;
  6421. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
  6422. if (cm == NULL)
  6423. return BAD_FUNC_ARG;
  6424. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6425. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6426. #ifndef NO_WOLFSSL_CLIENT
  6427. cm->ocspMustStaple = 0;
  6428. #endif
  6429. ret = WOLFSSL_SUCCESS;
  6430. #else
  6431. ret = NOT_COMPILED_IN;
  6432. #endif
  6433. return ret;
  6434. }
  6435. #ifdef HAVE_OCSP
  6436. /* check CRL if enabled, WOLFSSL_SUCCESS */
  6437. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  6438. {
  6439. int ret;
  6440. #ifdef WOLFSSL_SMALL_STACK
  6441. DecodedCert* cert = NULL;
  6442. #else
  6443. DecodedCert cert[1];
  6444. #endif
  6445. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  6446. if (cm == NULL)
  6447. return BAD_FUNC_ARG;
  6448. if (cm->ocspEnabled == 0)
  6449. return WOLFSSL_SUCCESS;
  6450. #ifdef WOLFSSL_SMALL_STACK
  6451. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
  6452. if (cert == NULL)
  6453. return MEMORY_E;
  6454. #endif
  6455. InitDecodedCert(cert, der, sz, NULL);
  6456. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  6457. WOLFSSL_MSG("ParseCert failed");
  6458. }
  6459. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  6460. WOLFSSL_MSG("CheckCertOCSP failed");
  6461. }
  6462. FreeDecodedCert(cert);
  6463. #ifdef WOLFSSL_SMALL_STACK
  6464. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6465. #endif
  6466. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6467. }
  6468. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  6469. byte *response, int responseSz, buffer *responseBuffer,
  6470. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  6471. {
  6472. int ret;
  6473. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSPResponse");
  6474. if (cm == NULL || response == NULL)
  6475. return BAD_FUNC_ARG;
  6476. if (cm->ocspEnabled == 0)
  6477. return WOLFSSL_SUCCESS;
  6478. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  6479. entry, ocspRequest);
  6480. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6481. }
  6482. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  6483. const char* url)
  6484. {
  6485. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  6486. if (cm == NULL)
  6487. return BAD_FUNC_ARG;
  6488. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  6489. if (url != NULL) {
  6490. int urlSz = (int)XSTRLEN(url) + 1;
  6491. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  6492. if (cm->ocspOverrideURL != NULL) {
  6493. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  6494. }
  6495. else
  6496. return MEMORY_E;
  6497. }
  6498. else
  6499. cm->ocspOverrideURL = NULL;
  6500. return WOLFSSL_SUCCESS;
  6501. }
  6502. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  6503. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6504. {
  6505. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  6506. if (cm == NULL)
  6507. return BAD_FUNC_ARG;
  6508. cm->ocspIOCb = ioCb;
  6509. cm->ocspRespFreeCb = respFreeCb;
  6510. cm->ocspIOCtx = ioCbCtx;
  6511. return WOLFSSL_SUCCESS;
  6512. }
  6513. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  6514. {
  6515. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  6516. if (ssl)
  6517. return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options);
  6518. else
  6519. return BAD_FUNC_ARG;
  6520. }
  6521. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  6522. {
  6523. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  6524. if (ssl)
  6525. return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl));
  6526. else
  6527. return BAD_FUNC_ARG;
  6528. }
  6529. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  6530. {
  6531. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  6532. if (ssl)
  6533. return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl));
  6534. else
  6535. return BAD_FUNC_ARG;
  6536. }
  6537. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  6538. {
  6539. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  6540. if (ssl)
  6541. return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl));
  6542. else
  6543. return BAD_FUNC_ARG;
  6544. }
  6545. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  6546. {
  6547. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6548. if (ssl)
  6549. return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url);
  6550. else
  6551. return BAD_FUNC_ARG;
  6552. }
  6553. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  6554. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6555. {
  6556. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  6557. if (ssl) {
  6558. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  6559. return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl),
  6560. ioCb, respFreeCb, NULL);
  6561. }
  6562. else
  6563. return BAD_FUNC_ARG;
  6564. }
  6565. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  6566. {
  6567. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  6568. if (ctx)
  6569. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  6570. else
  6571. return BAD_FUNC_ARG;
  6572. }
  6573. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  6574. {
  6575. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  6576. if (ctx)
  6577. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  6578. else
  6579. return BAD_FUNC_ARG;
  6580. }
  6581. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  6582. {
  6583. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6584. if (ctx)
  6585. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  6586. else
  6587. return BAD_FUNC_ARG;
  6588. }
  6589. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  6590. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6591. {
  6592. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  6593. if (ctx)
  6594. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  6595. respFreeCb, ioCbCtx);
  6596. else
  6597. return BAD_FUNC_ARG;
  6598. }
  6599. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6600. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6601. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  6602. {
  6603. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  6604. if (ctx)
  6605. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  6606. else
  6607. return BAD_FUNC_ARG;
  6608. }
  6609. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  6610. {
  6611. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  6612. if (ctx)
  6613. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  6614. else
  6615. return BAD_FUNC_ARG;
  6616. }
  6617. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6618. {
  6619. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  6620. if (ctx)
  6621. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  6622. else
  6623. return BAD_FUNC_ARG;
  6624. }
  6625. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6626. {
  6627. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  6628. if (ctx)
  6629. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  6630. else
  6631. return BAD_FUNC_ARG;
  6632. }
  6633. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  6634. #endif /* HAVE_OCSP */
  6635. /* macro to get verify settings for AddCA */
  6636. #define GET_VERIFY_SETTING_CTX(ctx) \
  6637. ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY)
  6638. #define GET_VERIFY_SETTING_SSL(ssl) \
  6639. ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY)
  6640. #ifndef NO_FILESYSTEM
  6641. /* process a file with name fname into ctx of format and type
  6642. userChain specifies a user certificate chain to pass during handshake */
  6643. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  6644. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  6645. {
  6646. #ifdef WOLFSSL_SMALL_STACK
  6647. byte staticBuffer[1]; /* force heap usage */
  6648. #else
  6649. byte staticBuffer[FILE_BUFFER_SIZE];
  6650. #endif
  6651. byte* myBuffer = staticBuffer;
  6652. int dynamic = 0;
  6653. int ret;
  6654. long sz = 0;
  6655. XFILE file;
  6656. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  6657. #ifndef NO_CODING
  6658. const char* header = NULL;
  6659. const char* footer = NULL;
  6660. #endif
  6661. (void)crl;
  6662. (void)heapHint;
  6663. if (fname == NULL) return WOLFSSL_BAD_FILE;
  6664. file = XFOPEN(fname, "rb");
  6665. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6666. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  6667. XFCLOSE(file);
  6668. return WOLFSSL_BAD_FILE;
  6669. }
  6670. sz = XFTELL(file);
  6671. XREWIND(file);
  6672. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6673. WOLFSSL_MSG("ProcessFile file size error");
  6674. XFCLOSE(file);
  6675. return WOLFSSL_BAD_FILE;
  6676. }
  6677. if (sz > (long)sizeof(staticBuffer)) {
  6678. WOLFSSL_MSG("Getting dynamic buffer");
  6679. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  6680. if (myBuffer == NULL) {
  6681. XFCLOSE(file);
  6682. return WOLFSSL_BAD_FILE;
  6683. }
  6684. dynamic = 1;
  6685. }
  6686. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6687. ret = WOLFSSL_BAD_FILE;
  6688. else {
  6689. /* Try to detect type by parsing cert header and footer */
  6690. if (type == DETECT_CERT_TYPE) {
  6691. #ifndef NO_CODING
  6692. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  6693. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6694. type = CA_TYPE;
  6695. }
  6696. #ifdef HAVE_CRL
  6697. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  6698. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6699. type = CRL_TYPE;
  6700. }
  6701. #endif
  6702. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  6703. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6704. type = CERT_TYPE;
  6705. }
  6706. else
  6707. #endif
  6708. {
  6709. WOLFSSL_MSG("Failed to detect certificate type");
  6710. if (dynamic)
  6711. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6712. XFCLOSE(file);
  6713. return WOLFSSL_BAD_CERTTYPE;
  6714. }
  6715. }
  6716. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  6717. && format == WOLFSSL_FILETYPE_PEM) {
  6718. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  6719. verify);
  6720. }
  6721. #ifdef HAVE_CRL
  6722. else if (type == CRL_TYPE)
  6723. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  6724. #endif
  6725. else
  6726. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  6727. userChain, verify);
  6728. }
  6729. XFCLOSE(file);
  6730. if (dynamic)
  6731. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6732. return ret;
  6733. }
  6734. /* loads file then loads each file in path, no c_rehash */
  6735. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  6736. const char* path, word32 flags)
  6737. {
  6738. int ret = WOLFSSL_SUCCESS;
  6739. #ifndef NO_WOLFSSL_DIR
  6740. int fileRet;
  6741. int successCount = 0;
  6742. int failCount = 0;
  6743. #endif
  6744. int verify;
  6745. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  6746. if (ctx == NULL || (file == NULL && path == NULL)) {
  6747. return WOLFSSL_FAILURE;
  6748. }
  6749. verify = GET_VERIFY_SETTING_CTX(ctx);
  6750. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  6751. verify = VERIFY_SKIP_DATE;
  6752. if (file) {
  6753. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  6754. NULL, verify);
  6755. #ifndef NO_WOLFSSL_DIR
  6756. if (ret == WOLFSSL_SUCCESS)
  6757. successCount++;
  6758. #endif
  6759. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  6760. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  6761. if (ret != WOLFSSL_SUCCESS) {
  6762. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error");
  6763. }
  6764. #endif
  6765. }
  6766. if (ret == WOLFSSL_SUCCESS && path) {
  6767. #ifndef NO_WOLFSSL_DIR
  6768. char* name = NULL;
  6769. #ifdef WOLFSSL_SMALL_STACK
  6770. ReadDirCtx* readCtx;
  6771. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  6772. DYNAMIC_TYPE_DIRCTX);
  6773. if (readCtx == NULL)
  6774. return MEMORY_E;
  6775. #else
  6776. ReadDirCtx readCtx[1];
  6777. #endif
  6778. /* try to load each regular file in path */
  6779. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  6780. while (fileRet == 0 && name) {
  6781. WOLFSSL_MSG(name); /* log file name */
  6782. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  6783. NULL, 0, NULL, verify);
  6784. if (ret != WOLFSSL_SUCCESS) {
  6785. /* handle flags for ignoring errors, skipping expired certs or
  6786. by PEM certificate header error */
  6787. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  6788. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  6789. (ret == ASN_NO_PEM_HEADER))) {
  6790. /* Do not fail here if a certificate fails to load,
  6791. continue to next file */
  6792. unsigned long err;
  6793. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  6794. #if defined(WOLFSSL_QT)
  6795. ret = WOLFSSL_SUCCESS;
  6796. #endif
  6797. }
  6798. else {
  6799. WOLFSSL_ERROR(ret);
  6800. WOLFSSL_MSG("Load CA file failed, continuing");
  6801. failCount++;
  6802. }
  6803. }
  6804. else {
  6805. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  6806. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  6807. if (ret != WOLFSSL_SUCCESS) {
  6808. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. Ignoring"
  6809. "this error.");
  6810. }
  6811. #endif
  6812. successCount++;
  6813. }
  6814. fileRet = wc_ReadDirNext(readCtx, path, &name);
  6815. }
  6816. wc_ReadDirClose(readCtx);
  6817. /* pass directory read failure to response code */
  6818. if (fileRet != WC_READDIR_NOFILE) {
  6819. ret = fileRet;
  6820. #if defined(WOLFSSL_QT)
  6821. if (ret == BAD_PATH_ERROR &&
  6822. flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) {
  6823. /* QSslSocket always loads certs in system folder
  6824. * when it is initialized.
  6825. * Compliant with OpenSSL when flag sets.
  6826. */
  6827. ret = WOLFSSL_SUCCESS;
  6828. }
  6829. else {
  6830. /* qssl socket wants to know errors. */
  6831. WOLFSSL_ERROR(ret);
  6832. }
  6833. #endif
  6834. }
  6835. /* report failure if no files were loaded or there were failures */
  6836. else if (successCount == 0 || failCount > 0) {
  6837. /* use existing error code if exists */
  6838. #if defined(WOLFSSL_QT)
  6839. /* compliant with OpenSSL when flag sets*/
  6840. if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE))
  6841. #endif
  6842. {
  6843. ret = WOLFSSL_FAILURE;
  6844. }
  6845. }
  6846. else {
  6847. ret = WOLFSSL_SUCCESS;
  6848. }
  6849. #ifdef WOLFSSL_SMALL_STACK
  6850. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  6851. #endif
  6852. #else
  6853. ret = NOT_COMPILED_IN;
  6854. (void)flags;
  6855. #endif
  6856. }
  6857. return ret;
  6858. }
  6859. WOLFSSL_ABI
  6860. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  6861. const char* path)
  6862. {
  6863. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  6864. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  6865. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  6866. }
  6867. #ifdef WOLFSSL_SYS_CA_CERTS
  6868. #ifdef USE_WINDOWS_API
  6869. static int LoadSystemCaCertsWindows(WOLFSSL_CTX* ctx, byte* loaded)
  6870. {
  6871. int ret = WOLFSSL_SUCCESS;
  6872. word32 i;
  6873. HANDLE handle = NULL;
  6874. PCCERT_CONTEXT certCtx = NULL;
  6875. LPCSTR storeNames[2] = {"ROOT", "CA"};
  6876. HCRYPTPROV_LEGACY hProv = (HCRYPTPROV_LEGACY)NULL;
  6877. if (ctx == NULL || loaded == NULL) {
  6878. ret = WOLFSSL_FAILURE;
  6879. }
  6880. for (i = 0; ret == WOLFSSL_SUCCESS &&
  6881. i < sizeof(storeNames)/sizeof(*storeNames); ++i) {
  6882. handle = CertOpenSystemStoreA(hProv, storeNames[i]);
  6883. if (handle != NULL) {
  6884. while (certCtx = CertEnumCertificatesInStore(handle,
  6885. certCtx)) {
  6886. if (certCtx->dwCertEncodingType == X509_ASN_ENCODING) {
  6887. if (ProcessBuffer(ctx, certCtx->pbCertEncoded,
  6888. certCtx->cbCertEncoded, WOLFSSL_FILETYPE_ASN1,
  6889. CA_TYPE, NULL, NULL, 0,
  6890. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6891. /*
  6892. * Set "loaded" as long as we've loaded one CA
  6893. * cert.
  6894. */
  6895. *loaded = 1;
  6896. }
  6897. }
  6898. }
  6899. }
  6900. else {
  6901. WOLFSSL_MSG_EX("Failed to open cert store %s.", storeNames[i]);
  6902. }
  6903. if (handle != NULL && !CertCloseStore(handle, 0)) {
  6904. WOLFSSL_MSG_EX("Failed to close cert store %s.", storeNames[i]);
  6905. ret = WOLFSSL_FAILURE;
  6906. }
  6907. }
  6908. return ret;
  6909. }
  6910. #elif defined(__APPLE__)
  6911. static int LoadSystemCaCertsMac(WOLFSSL_CTX* ctx, byte* loaded)
  6912. {
  6913. int ret = WOLFSSL_SUCCESS;
  6914. word32 i;
  6915. const unsigned int trustDomains[] = {
  6916. kSecTrustSettingsDomainUser,
  6917. kSecTrustSettingsDomainAdmin,
  6918. kSecTrustSettingsDomainSystem
  6919. };
  6920. CFArrayRef certs;
  6921. OSStatus stat;
  6922. CFIndex numCerts;
  6923. CFDataRef der;
  6924. CFIndex j;
  6925. if (ctx == NULL || loaded == NULL) {
  6926. ret = WOLFSSL_FAILURE;
  6927. }
  6928. for (i = 0; ret == WOLFSSL_SUCCESS &&
  6929. i < sizeof(trustDomains)/sizeof(*trustDomains); ++i) {
  6930. stat = SecTrustSettingsCopyCertificates(trustDomains[i], &certs);
  6931. if (stat == errSecSuccess) {
  6932. numCerts = CFArrayGetCount(certs);
  6933. for (j = 0; j < numCerts; ++j) {
  6934. der = SecCertificateCopyData((SecCertificateRef)
  6935. CFArrayGetValueAtIndex(certs, j));
  6936. if (der != NULL) {
  6937. if (ProcessBuffer(ctx, CFDataGetBytePtr(der),
  6938. CFDataGetLength(der), WOLFSSL_FILETYPE_ASN1,
  6939. CA_TYPE, NULL, NULL, 0,
  6940. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6941. /*
  6942. * Set "loaded" as long as we've loaded one CA
  6943. * cert.
  6944. */
  6945. *loaded = 1;
  6946. }
  6947. CFRelease(der);
  6948. }
  6949. }
  6950. CFRelease(certs);
  6951. }
  6952. else if (stat == errSecNoTrustSettings) {
  6953. WOLFSSL_MSG_EX("No trust settings for domain %d, moving to next "
  6954. "domain.", trustDomains[i]);
  6955. }
  6956. else {
  6957. WOLFSSL_MSG_EX("SecTrustSettingsCopyCertificates failed with"
  6958. " status %d.", stat);
  6959. ret = WOLFSSL_FAILURE;
  6960. break;
  6961. }
  6962. }
  6963. return ret;
  6964. }
  6965. #else
  6966. /* Potential system CA certs directories on Linux distros. */
  6967. static const char* systemCaDirs[] = {
  6968. "/etc/ssl/certs", /* Debian, Ubuntu, Gentoo, others */
  6969. "/etc/pki/ca-trust/source/anchors", /* Fedora, RHEL */
  6970. "/etc/pki/tls/certs" /* Older RHEL */
  6971. };
  6972. const char** wolfSSL_get_system_CA_dirs(word32* num)
  6973. {
  6974. const char** ret;
  6975. if (num == NULL) {
  6976. ret = NULL;
  6977. }
  6978. else {
  6979. ret = systemCaDirs;
  6980. *num = sizeof(systemCaDirs)/sizeof(*systemCaDirs);
  6981. }
  6982. return ret;
  6983. }
  6984. static int LoadSystemCaCertsNix(WOLFSSL_CTX* ctx, byte* loaded) {
  6985. int ret = WOLFSSL_SUCCESS;
  6986. word32 i;
  6987. if (ctx == NULL || loaded == NULL) {
  6988. ret = WOLFSSL_FAILURE;
  6989. }
  6990. for (i = 0; ret == WOLFSSL_SUCCESS &&
  6991. i < sizeof(systemCaDirs)/sizeof(*systemCaDirs); ++i) {
  6992. WOLFSSL_MSG_EX("Attempting to load system CA certs from %s.",
  6993. systemCaDirs[i]);
  6994. /*
  6995. * We want to keep trying to load more CAs even if one cert in
  6996. * the directory is bad and can't be used (e.g. if one is expired),
  6997. * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR.
  6998. */
  6999. if (wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, systemCaDirs[i],
  7000. WOLFSSL_LOAD_FLAG_IGNORE_ERR) != WOLFSSL_SUCCESS) {
  7001. WOLFSSL_MSG_EX("Failed to load CA certs from %s, trying "
  7002. "next possible location.", systemCaDirs[i]);
  7003. }
  7004. else {
  7005. WOLFSSL_MSG_EX("Loaded CA certs from %s.",
  7006. systemCaDirs[i]);
  7007. *loaded = 1;
  7008. /* Stop searching after we've loaded one directory. */
  7009. break;
  7010. }
  7011. }
  7012. return ret;
  7013. }
  7014. #endif
  7015. int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx)
  7016. {
  7017. int ret;
  7018. byte loaded = 0;
  7019. WOLFSSL_ENTER("wolfSSL_CTX_load_system_CA_certs");
  7020. #ifdef USE_WINDOWS_API
  7021. ret = LoadSystemCaCertsWindows(ctx, &loaded);
  7022. #elif defined(__APPLE__)
  7023. ret = LoadSystemCaCertsMac(ctx, &loaded);
  7024. #else
  7025. ret = LoadSystemCaCertsNix(ctx, &loaded);
  7026. #endif
  7027. if (ret == WOLFSSL_SUCCESS && !loaded) {
  7028. ret = WOLFSSL_BAD_PATH;
  7029. }
  7030. WOLFSSL_LEAVE("wolfSSL_CTX_load_system_CA_certs", ret);
  7031. return ret;
  7032. }
  7033. #endif /* WOLFSSL_SYS_CA_CERTS */
  7034. #ifdef WOLFSSL_TRUST_PEER_CERT
  7035. /* Used to specify a peer cert to match when connecting
  7036. ctx : the ctx structure to load in peer cert
  7037. file: the string name of cert file
  7038. type: type of format such as PEM/DER
  7039. */
  7040. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  7041. {
  7042. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  7043. if (ctx == NULL || file == NULL) {
  7044. return WOLFSSL_FAILURE;
  7045. }
  7046. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  7047. GET_VERIFY_SETTING_CTX(ctx));
  7048. }
  7049. int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int type)
  7050. {
  7051. WOLFSSL_ENTER("wolfSSL_trust_peer_cert");
  7052. if (ssl == NULL || file == NULL) {
  7053. return WOLFSSL_FAILURE;
  7054. }
  7055. return ProcessFile(NULL, file, type, TRUSTED_PEER_TYPE, ssl, 0, NULL,
  7056. GET_VERIFY_SETTING_SSL(ssl));
  7057. }
  7058. #endif /* WOLFSSL_TRUST_PEER_CERT */
  7059. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  7060. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  7061. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  7062. int format)
  7063. {
  7064. int ret = WOLFSSL_FATAL_ERROR;
  7065. #ifdef WOLFSSL_SMALL_STACK
  7066. byte staticBuffer[1]; /* force heap usage */
  7067. #else
  7068. byte staticBuffer[FILE_BUFFER_SIZE];
  7069. #endif
  7070. byte* myBuffer = staticBuffer;
  7071. int dynamic = 0;
  7072. long sz = 0;
  7073. XFILE file = XFOPEN(fname, "rb");
  7074. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  7075. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7076. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  7077. XFCLOSE(file);
  7078. return WOLFSSL_BAD_FILE;
  7079. }
  7080. sz = XFTELL(file);
  7081. XREWIND(file);
  7082. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7083. WOLFSSL_MSG("CertManagerVerify file size error");
  7084. XFCLOSE(file);
  7085. return WOLFSSL_BAD_FILE;
  7086. }
  7087. if (sz > (long)sizeof(staticBuffer)) {
  7088. WOLFSSL_MSG("Getting dynamic buffer");
  7089. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  7090. if (myBuffer == NULL) {
  7091. XFCLOSE(file);
  7092. return WOLFSSL_BAD_FILE;
  7093. }
  7094. dynamic = 1;
  7095. }
  7096. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7097. ret = WOLFSSL_BAD_FILE;
  7098. else
  7099. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  7100. XFCLOSE(file);
  7101. if (dynamic)
  7102. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  7103. return ret;
  7104. }
  7105. #endif
  7106. /* like load verify locations, 1 for success, < 0 for error */
  7107. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  7108. const char* path)
  7109. {
  7110. int ret = WOLFSSL_FATAL_ERROR;
  7111. WOLFSSL_CTX* tmp;
  7112. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  7113. if (cm == NULL) {
  7114. WOLFSSL_MSG("No CertManager error");
  7115. return ret;
  7116. }
  7117. tmp = wolfSSL_CTX_new(cm_pick_method());
  7118. if (tmp == NULL) {
  7119. WOLFSSL_MSG("CTX new failed");
  7120. return ret;
  7121. }
  7122. /* for tmp use */
  7123. wolfSSL_CertManagerFree(tmp->cm);
  7124. tmp->cm = cm;
  7125. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  7126. /* don't lose our good one */
  7127. tmp->cm = NULL;
  7128. wolfSSL_CTX_free(tmp);
  7129. return ret;
  7130. }
  7131. #endif /* NO_FILESYSTEM */
  7132. #ifdef HAVE_CRL
  7133. /* check CRL if enabled, WOLFSSL_SUCCESS */
  7134. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  7135. {
  7136. int ret = 0;
  7137. #ifdef WOLFSSL_SMALL_STACK
  7138. DecodedCert* cert = NULL;
  7139. #else
  7140. DecodedCert cert[1];
  7141. #endif
  7142. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  7143. if (cm == NULL)
  7144. return BAD_FUNC_ARG;
  7145. if (cm->crlEnabled == 0)
  7146. return WOLFSSL_SUCCESS;
  7147. #ifdef WOLFSSL_SMALL_STACK
  7148. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  7149. if (cert == NULL)
  7150. return MEMORY_E;
  7151. #endif
  7152. InitDecodedCert(cert, der, sz, NULL);
  7153. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  7154. WOLFSSL_MSG("ParseCert failed");
  7155. }
  7156. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  7157. WOLFSSL_MSG("CheckCertCRL failed");
  7158. }
  7159. FreeDecodedCert(cert);
  7160. #ifdef WOLFSSL_SMALL_STACK
  7161. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  7162. #endif
  7163. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  7164. }
  7165. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  7166. {
  7167. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  7168. if (cm == NULL)
  7169. return BAD_FUNC_ARG;
  7170. cm->cbMissingCRL = cb;
  7171. return WOLFSSL_SUCCESS;
  7172. }
  7173. #ifdef HAVE_CRL_IO
  7174. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  7175. {
  7176. if (cm == NULL)
  7177. return BAD_FUNC_ARG;
  7178. cm->crl->crlIOCb = cb;
  7179. return WOLFSSL_SUCCESS;
  7180. }
  7181. #endif
  7182. #ifndef NO_FILESYSTEM
  7183. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  7184. int type, int monitor)
  7185. {
  7186. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  7187. if (cm == NULL)
  7188. return BAD_FUNC_ARG;
  7189. if (cm->crl == NULL) {
  7190. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  7191. WOLFSSL_MSG("Enable CRL failed");
  7192. return WOLFSSL_FATAL_ERROR;
  7193. }
  7194. }
  7195. return LoadCRL(cm->crl, path, type, monitor);
  7196. }
  7197. int wolfSSL_CertManagerLoadCRLFile(WOLFSSL_CERT_MANAGER* cm, const char* file,
  7198. int type)
  7199. {
  7200. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLFile");
  7201. if (cm == NULL || file == NULL)
  7202. return BAD_FUNC_ARG;
  7203. if (cm->crl == NULL) {
  7204. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  7205. WOLFSSL_MSG("Enable CRL failed");
  7206. return WOLFSSL_FATAL_ERROR;
  7207. }
  7208. }
  7209. return ProcessFile(NULL, file, type, CRL_TYPE, NULL, 0, cm->crl,
  7210. VERIFY);
  7211. }
  7212. #endif
  7213. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  7214. {
  7215. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  7216. if (ssl)
  7217. return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options);
  7218. else
  7219. return BAD_FUNC_ARG;
  7220. }
  7221. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  7222. {
  7223. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  7224. if (ssl)
  7225. return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl));
  7226. else
  7227. return BAD_FUNC_ARG;
  7228. }
  7229. #ifndef NO_FILESYSTEM
  7230. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  7231. {
  7232. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  7233. if (ssl)
  7234. return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor);
  7235. else
  7236. return BAD_FUNC_ARG;
  7237. }
  7238. int wolfSSL_LoadCRLFile(WOLFSSL* ssl, const char* file, int type)
  7239. {
  7240. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  7241. if (ssl)
  7242. return wolfSSL_CertManagerLoadCRLFile(SSL_CM(ssl), file, type);
  7243. else
  7244. return BAD_FUNC_ARG;
  7245. }
  7246. #endif
  7247. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  7248. {
  7249. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7250. if (ssl)
  7251. return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb);
  7252. else
  7253. return BAD_FUNC_ARG;
  7254. }
  7255. #ifdef HAVE_CRL_IO
  7256. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  7257. {
  7258. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  7259. if (ssl)
  7260. return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb);
  7261. else
  7262. return BAD_FUNC_ARG;
  7263. }
  7264. #endif
  7265. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  7266. {
  7267. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  7268. if (ctx)
  7269. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  7270. else
  7271. return BAD_FUNC_ARG;
  7272. }
  7273. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  7274. {
  7275. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  7276. if (ctx)
  7277. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  7278. else
  7279. return BAD_FUNC_ARG;
  7280. }
  7281. #ifndef NO_FILESYSTEM
  7282. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  7283. int type, int monitor)
  7284. {
  7285. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7286. if (ctx)
  7287. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  7288. else
  7289. return BAD_FUNC_ARG;
  7290. }
  7291. int wolfSSL_CTX_LoadCRLFile(WOLFSSL_CTX* ctx, const char* file,
  7292. int type)
  7293. {
  7294. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7295. if (ctx)
  7296. return wolfSSL_CertManagerLoadCRLFile(ctx->cm, file, type);
  7297. else
  7298. return BAD_FUNC_ARG;
  7299. }
  7300. #endif
  7301. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  7302. {
  7303. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  7304. if (ctx)
  7305. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  7306. else
  7307. return BAD_FUNC_ARG;
  7308. }
  7309. #ifdef HAVE_CRL_IO
  7310. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  7311. {
  7312. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  7313. if (ctx)
  7314. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  7315. else
  7316. return BAD_FUNC_ARG;
  7317. }
  7318. #endif
  7319. #endif /* HAVE_CRL */
  7320. #ifndef NO_FILESYSTEM
  7321. #ifdef WOLFSSL_DER_LOAD
  7322. /* Add format parameter to allow DER load of CA files */
  7323. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7324. int format)
  7325. {
  7326. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  7327. if (ctx == NULL || file == NULL)
  7328. return WOLFSSL_FAILURE;
  7329. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  7330. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7331. return WOLFSSL_SUCCESS;
  7332. }
  7333. return WOLFSSL_FAILURE;
  7334. }
  7335. #endif /* WOLFSSL_DER_LOAD */
  7336. WOLFSSL_ABI
  7337. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  7338. int format)
  7339. {
  7340. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  7341. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  7342. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7343. return WOLFSSL_SUCCESS;
  7344. }
  7345. return WOLFSSL_FAILURE;
  7346. }
  7347. WOLFSSL_ABI
  7348. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  7349. int format)
  7350. {
  7351. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  7352. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  7353. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7354. return WOLFSSL_SUCCESS;
  7355. }
  7356. return WOLFSSL_FAILURE;
  7357. }
  7358. #endif /* NO_FILESYSTEM */
  7359. /* Sets the max chain depth when verifying a certificate chain. Default depth
  7360. * is set to MAX_CHAIN_DEPTH.
  7361. *
  7362. * ctx WOLFSSL_CTX structure to set depth in
  7363. * depth max depth
  7364. */
  7365. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  7366. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  7367. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  7368. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  7369. return;
  7370. }
  7371. ctx->verifyDepth = (byte)depth;
  7372. }
  7373. /* get cert chaining depth using ssl struct */
  7374. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  7375. {
  7376. if(ssl == NULL) {
  7377. return BAD_FUNC_ARG;
  7378. }
  7379. #ifndef OPENSSL_EXTRA
  7380. return MAX_CHAIN_DEPTH;
  7381. #else
  7382. return ssl->options.verifyDepth;
  7383. #endif
  7384. }
  7385. /* get cert chaining depth using ctx struct */
  7386. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  7387. {
  7388. if (ctx == NULL) {
  7389. return BAD_FUNC_ARG;
  7390. }
  7391. #ifndef OPENSSL_EXTRA
  7392. return MAX_CHAIN_DEPTH;
  7393. #else
  7394. return ctx->verifyDepth;
  7395. #endif
  7396. }
  7397. #ifndef NO_FILESYSTEM
  7398. WOLFSSL_ABI
  7399. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  7400. {
  7401. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7402. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  7403. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  7404. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7405. return WOLFSSL_SUCCESS;
  7406. }
  7407. return WOLFSSL_FAILURE;
  7408. }
  7409. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  7410. const char* file, int format)
  7411. {
  7412. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7413. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  7414. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  7415. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7416. return WOLFSSL_SUCCESS;
  7417. }
  7418. return WOLFSSL_FAILURE;
  7419. }
  7420. #ifndef NO_DH
  7421. /* server Diffie-Hellman parameters */
  7422. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  7423. const char* fname, int format)
  7424. {
  7425. #ifdef WOLFSSL_SMALL_STACK
  7426. byte staticBuffer[1]; /* force heap usage */
  7427. #else
  7428. byte staticBuffer[FILE_BUFFER_SIZE];
  7429. #endif
  7430. byte* myBuffer = staticBuffer;
  7431. int dynamic = 0;
  7432. int ret;
  7433. long sz = 0;
  7434. XFILE file;
  7435. if (ctx == NULL || fname == NULL)
  7436. return BAD_FUNC_ARG;
  7437. file = XFOPEN(fname, "rb");
  7438. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7439. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  7440. XFCLOSE(file);
  7441. return WOLFSSL_BAD_FILE;
  7442. }
  7443. sz = XFTELL(file);
  7444. XREWIND(file);
  7445. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7446. WOLFSSL_MSG("SetTmpDH file size error");
  7447. XFCLOSE(file);
  7448. return WOLFSSL_BAD_FILE;
  7449. }
  7450. if (sz > (long)sizeof(staticBuffer)) {
  7451. WOLFSSL_MSG("Getting dynamic buffer");
  7452. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  7453. if (myBuffer == NULL) {
  7454. XFCLOSE(file);
  7455. return WOLFSSL_BAD_FILE;
  7456. }
  7457. dynamic = 1;
  7458. }
  7459. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7460. ret = WOLFSSL_BAD_FILE;
  7461. else {
  7462. if (ssl)
  7463. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  7464. else
  7465. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  7466. }
  7467. XFCLOSE(file);
  7468. if (dynamic)
  7469. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  7470. return ret;
  7471. }
  7472. /* server Diffie-Hellman parameters */
  7473. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  7474. {
  7475. if (ssl == NULL)
  7476. return BAD_FUNC_ARG;
  7477. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  7478. }
  7479. /* server Diffie-Hellman parameters */
  7480. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  7481. {
  7482. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  7483. }
  7484. #endif /* NO_DH */
  7485. #endif /* NO_FILESYSTEM */
  7486. #ifndef NO_CHECK_PRIVATE_KEY
  7487. /* Check private against public in certificate for match
  7488. *
  7489. * Returns WOLFSSL_SUCCESS on good private key
  7490. * WOLFSSL_FAILURE if mismatched */
  7491. static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
  7492. int devId, int isKeyLabel, int isKeyId)
  7493. {
  7494. #ifdef WOLFSSL_SMALL_STACK
  7495. DecodedCert* der = NULL;
  7496. #else
  7497. DecodedCert der[1];
  7498. #endif
  7499. word32 size;
  7500. byte* buff;
  7501. int ret = WOLFSSL_FAILURE;
  7502. WOLFSSL_ENTER("check_cert_key");
  7503. if (cert == NULL || key == NULL) {
  7504. return WOLFSSL_FAILURE;
  7505. }
  7506. #ifdef WOLFSSL_SMALL_STACK
  7507. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  7508. if (der == NULL)
  7509. return MEMORY_E;
  7510. #endif
  7511. size = cert->length;
  7512. buff = cert->buffer;
  7513. InitDecodedCert(der, buff, size, heap);
  7514. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  7515. FreeDecodedCert(der);
  7516. #ifdef WOLFSSL_SMALL_STACK
  7517. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7518. #endif
  7519. return WOLFSSL_FAILURE;
  7520. }
  7521. size = key->length;
  7522. buff = key->buffer;
  7523. #ifdef WOLF_PRIVATE_KEY_ID
  7524. if (devId != INVALID_DEVID) {
  7525. int type = 0;
  7526. void *pkey = NULL;
  7527. #ifndef NO_RSA
  7528. if (der->keyOID == RSAk) {
  7529. type = DYNAMIC_TYPE_RSA;
  7530. }
  7531. #ifdef WC_RSA_PSS
  7532. if (der->keyOID == RSAPSSk) {
  7533. type = DYNAMIC_TYPE_RSA;
  7534. }
  7535. #endif
  7536. #endif
  7537. #ifdef HAVE_ECC
  7538. if (der->keyOID == ECDSAk) {
  7539. type = DYNAMIC_TYPE_ECC;
  7540. }
  7541. #endif
  7542. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  7543. isKeyLabel, isKeyId, heap, devId);
  7544. #ifdef WOLF_CRYPTO_CB
  7545. if (ret == 0) {
  7546. #ifndef NO_RSA
  7547. if (der->keyOID == RSAk
  7548. #ifdef WC_RSA_PSS
  7549. || der->keyOID == RSAPSSk
  7550. #endif
  7551. ) {
  7552. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey,
  7553. der->publicKey, der->pubKeySize);
  7554. }
  7555. #endif
  7556. #ifdef HAVE_ECC
  7557. if (der->keyOID == ECDSAk) {
  7558. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey,
  7559. der->publicKey, der->pubKeySize);
  7560. }
  7561. #endif
  7562. }
  7563. #else
  7564. /* devId was set, don't check, for now */
  7565. /* TODO: Add callback for private key check? */
  7566. #endif
  7567. if (pkey != NULL) {
  7568. #ifndef NO_RSA
  7569. if (der->keyOID == RSAk
  7570. #ifdef WC_RSA_PSS
  7571. || der->keyOID == RSAPSSk
  7572. #endif
  7573. ) {
  7574. wc_FreeRsaKey((RsaKey*)pkey);
  7575. }
  7576. #endif
  7577. #ifdef HAVE_ECC
  7578. if (der->keyOID == ECDSAk) {
  7579. wc_ecc_free((ecc_key*)pkey);
  7580. }
  7581. #endif
  7582. XFREE(pkey, heap, type);
  7583. }
  7584. if (ret != CRYPTOCB_UNAVAILABLE) {
  7585. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7586. }
  7587. }
  7588. else {
  7589. /* fall through if unavailable */
  7590. ret = CRYPTOCB_UNAVAILABLE;
  7591. }
  7592. if (ret == CRYPTOCB_UNAVAILABLE)
  7593. #endif /* WOLF_PRIVATE_KEY_ID */
  7594. {
  7595. ret = wc_CheckPrivateKeyCert(buff, size, der);
  7596. ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7597. }
  7598. FreeDecodedCert(der);
  7599. #ifdef WOLFSSL_SMALL_STACK
  7600. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7601. #endif
  7602. (void)devId;
  7603. (void)isKeyLabel;
  7604. (void)isKeyId;
  7605. return ret;
  7606. }
  7607. /* Check private against public in certificate for match
  7608. *
  7609. * ctx WOLFSSL_CTX structure to check private key in
  7610. *
  7611. * Returns WOLFSSL_SUCCESS on good private key
  7612. * WOLFSSL_FAILURE if mismatched. */
  7613. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  7614. {
  7615. if (ctx == NULL) {
  7616. return WOLFSSL_FAILURE;
  7617. }
  7618. return check_cert_key(ctx->certificate, ctx->privateKey, ctx->heap,
  7619. ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId);
  7620. }
  7621. #endif /* !NO_CHECK_PRIVATE_KEY */
  7622. #ifdef OPENSSL_ALL
  7623. /**
  7624. * Return the private key of the WOLFSSL_CTX struct
  7625. * @return WOLFSSL_EVP_PKEY* The caller doesn *NOT*` free the returned object.
  7626. */
  7627. WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx)
  7628. {
  7629. const unsigned char *key;
  7630. int type;
  7631. WOLFSSL_ENTER("wolfSSL_CTX_get0_privatekey");
  7632. if (ctx == NULL || ctx->privateKey == NULL ||
  7633. ctx->privateKey->buffer == NULL) {
  7634. WOLFSSL_MSG("Bad parameter or key not set");
  7635. return NULL;
  7636. }
  7637. switch (ctx->privateKeyType) {
  7638. #ifndef NO_RSA
  7639. case rsa_sa_algo:
  7640. type = EVP_PKEY_RSA;
  7641. break;
  7642. #endif
  7643. #ifdef HAVE_ECC
  7644. case ecc_dsa_sa_algo:
  7645. type = EVP_PKEY_EC;
  7646. break;
  7647. #endif
  7648. default:
  7649. /* Other key types not supported either as ssl private keys
  7650. * or in the EVP layer */
  7651. WOLFSSL_MSG("Unsupported key type");
  7652. return NULL;
  7653. }
  7654. key = ctx->privateKey->buffer;
  7655. if (ctx->privateKeyPKey != NULL)
  7656. return ctx->privateKeyPKey;
  7657. else
  7658. return wolfSSL_d2i_PrivateKey(type,
  7659. (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key,
  7660. (long)ctx->privateKey->length);
  7661. }
  7662. #endif
  7663. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7664. static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out,
  7665. const unsigned char** in, long inSz, int priv)
  7666. {
  7667. WOLFSSL_EVP_PKEY* pkey = NULL;
  7668. const unsigned char* mem;
  7669. long memSz = inSz;
  7670. WOLFSSL_ENTER("d2iGenericKey");
  7671. if (in == NULL || *in == NULL || inSz < 0) {
  7672. WOLFSSL_MSG("Bad argument");
  7673. return NULL;
  7674. }
  7675. mem = *in;
  7676. #if !defined(NO_RSA)
  7677. {
  7678. word32 keyIdx = 0;
  7679. int isRsaKey;
  7680. #ifdef WOLFSSL_SMALL_STACK
  7681. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  7682. if (rsa == NULL)
  7683. return NULL;
  7684. #else
  7685. RsaKey rsa[1];
  7686. #endif
  7687. XMEMSET(rsa, 0, sizeof(RsaKey));
  7688. /* test if RSA key */
  7689. if (priv)
  7690. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7691. wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7692. else
  7693. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7694. wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7695. wc_FreeRsaKey(rsa);
  7696. #ifdef WOLFSSL_SMALL_STACK
  7697. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  7698. #endif
  7699. if (isRsaKey) {
  7700. pkey = wolfSSL_EVP_PKEY_new();
  7701. if (pkey != NULL) {
  7702. pkey->pkey_sz = keyIdx;
  7703. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7704. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7705. DYNAMIC_TYPE_PUBLIC_KEY);
  7706. if (pkey->pkey.ptr == NULL) {
  7707. wolfSSL_EVP_PKEY_free(pkey);
  7708. return NULL;
  7709. }
  7710. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7711. pkey->type = EVP_PKEY_RSA;
  7712. if (out != NULL) {
  7713. *out = pkey;
  7714. }
  7715. pkey->ownRsa = 1;
  7716. pkey->rsa = wolfssl_rsa_d2i(NULL, mem, inSz,
  7717. priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC);
  7718. if (pkey->rsa == NULL) {
  7719. wolfSSL_EVP_PKEY_free(pkey);
  7720. return NULL;
  7721. }
  7722. return pkey;
  7723. }
  7724. else {
  7725. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  7726. }
  7727. }
  7728. }
  7729. #endif /* NO_RSA */
  7730. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  7731. {
  7732. word32 keyIdx = 0;
  7733. int isEccKey;
  7734. #ifdef WOLFSSL_SMALL_STACK
  7735. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  7736. if (ecc == NULL)
  7737. return NULL;
  7738. #else
  7739. ecc_key ecc[1];
  7740. #endif
  7741. XMEMSET(ecc, 0, sizeof(ecc_key));
  7742. if (priv)
  7743. isEccKey = wc_ecc_init(ecc) == 0 &&
  7744. wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7745. else
  7746. isEccKey = wc_ecc_init(ecc) == 0 &&
  7747. wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7748. wc_ecc_free(ecc);
  7749. #ifdef WOLFSSL_SMALL_STACK
  7750. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  7751. #endif
  7752. if (isEccKey) {
  7753. pkey = wolfSSL_EVP_PKEY_new();
  7754. if (pkey != NULL) {
  7755. pkey->pkey_sz = keyIdx;
  7756. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  7757. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7758. DYNAMIC_TYPE_PUBLIC_KEY);
  7759. if (pkey->pkey.ptr == NULL) {
  7760. wolfSSL_EVP_PKEY_free(pkey);
  7761. return NULL;
  7762. }
  7763. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7764. pkey->type = EVP_PKEY_EC;
  7765. if (out != NULL) {
  7766. *out = pkey;
  7767. }
  7768. pkey->ownEcc = 1;
  7769. pkey->ecc = wolfSSL_EC_KEY_new();
  7770. if (pkey->ecc == NULL) {
  7771. wolfSSL_EVP_PKEY_free(pkey);
  7772. return NULL;
  7773. }
  7774. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  7775. (const unsigned char*)pkey->pkey.ptr,
  7776. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7777. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7778. wolfSSL_EVP_PKEY_free(pkey);
  7779. return NULL;
  7780. }
  7781. return pkey;
  7782. }
  7783. else {
  7784. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  7785. }
  7786. }
  7787. }
  7788. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  7789. #if !defined(NO_DSA)
  7790. {
  7791. word32 keyIdx = 0;
  7792. int isDsaKey;
  7793. #ifdef WOLFSSL_SMALL_STACK
  7794. DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  7795. if (dsa == NULL)
  7796. return NULL;
  7797. #else
  7798. DsaKey dsa[1];
  7799. #endif
  7800. XMEMSET(dsa, 0, sizeof(DsaKey));
  7801. if (priv)
  7802. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7803. wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7804. else
  7805. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7806. wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7807. wc_FreeDsaKey(dsa);
  7808. #ifdef WOLFSSL_SMALL_STACK
  7809. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  7810. #endif
  7811. /* test if DSA key */
  7812. if (isDsaKey) {
  7813. pkey = wolfSSL_EVP_PKEY_new();
  7814. if (pkey != NULL) {
  7815. pkey->pkey_sz = keyIdx;
  7816. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7817. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7818. DYNAMIC_TYPE_PUBLIC_KEY);
  7819. if (pkey->pkey.ptr == NULL) {
  7820. wolfSSL_EVP_PKEY_free(pkey);
  7821. return NULL;
  7822. }
  7823. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7824. pkey->type = EVP_PKEY_DSA;
  7825. if (out != NULL) {
  7826. *out = pkey;
  7827. }
  7828. pkey->ownDsa = 1;
  7829. pkey->dsa = wolfSSL_DSA_new();
  7830. if (pkey->dsa == NULL) {
  7831. wolfSSL_EVP_PKEY_free(pkey);
  7832. return NULL;
  7833. }
  7834. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  7835. (const unsigned char*)pkey->pkey.ptr,
  7836. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7837. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7838. wolfSSL_EVP_PKEY_free(pkey);
  7839. return NULL;
  7840. }
  7841. return pkey;
  7842. }
  7843. else {
  7844. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  7845. }
  7846. }
  7847. }
  7848. #endif /* NO_DSA */
  7849. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  7850. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7851. (HAVE_FIPS_VERSION > 2))
  7852. {
  7853. int isDhKey;
  7854. word32 keyIdx = 0;
  7855. #ifdef WOLFSSL_SMALL_STACK
  7856. DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  7857. if (dh == NULL)
  7858. return NULL;
  7859. #else
  7860. DhKey dh[1];
  7861. #endif
  7862. XMEMSET(dh, 0, sizeof(DhKey));
  7863. isDhKey = wc_InitDhKey(dh) == 0 &&
  7864. wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0;
  7865. wc_FreeDhKey(dh);
  7866. #ifdef WOLFSSL_SMALL_STACK
  7867. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  7868. #endif
  7869. /* test if DH key */
  7870. if (isDhKey) {
  7871. pkey = wolfSSL_EVP_PKEY_new();
  7872. if (pkey != NULL) {
  7873. pkey->pkey_sz = (int)memSz;
  7874. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7875. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7876. DYNAMIC_TYPE_PUBLIC_KEY);
  7877. if (pkey->pkey.ptr == NULL) {
  7878. wolfSSL_EVP_PKEY_free(pkey);
  7879. return NULL;
  7880. }
  7881. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7882. pkey->type = EVP_PKEY_DH;
  7883. if (out != NULL) {
  7884. *out = pkey;
  7885. }
  7886. pkey->ownDh = 1;
  7887. pkey->dh = wolfSSL_DH_new();
  7888. if (pkey->dh == NULL) {
  7889. wolfSSL_EVP_PKEY_free(pkey);
  7890. return NULL;
  7891. }
  7892. if (wolfSSL_DH_LoadDer(pkey->dh,
  7893. (const unsigned char*)pkey->pkey.ptr,
  7894. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  7895. wolfSSL_EVP_PKEY_free(pkey);
  7896. return NULL;
  7897. }
  7898. return pkey;
  7899. }
  7900. else {
  7901. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  7902. }
  7903. }
  7904. }
  7905. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7906. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  7907. #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
  7908. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7909. (HAVE_FIPS_VERSION > 2))
  7910. {
  7911. word32 keyIdx = 0;
  7912. DhKey* key = NULL;
  7913. int ret;
  7914. int elements;
  7915. #ifdef WOLFSSL_SMALL_STACK
  7916. DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  7917. if (dh == NULL)
  7918. return NULL;
  7919. #else
  7920. DhKey dh[1];
  7921. #endif
  7922. XMEMSET(dh, 0, sizeof(DhKey));
  7923. /* test if DH-public key */
  7924. if (wc_InitDhKey(dh) != 0)
  7925. return NULL;
  7926. ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz);
  7927. wc_FreeDhKey(dh);
  7928. #ifdef WOLFSSL_SMALL_STACK
  7929. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  7930. #endif
  7931. if (ret == 0) {
  7932. pkey = wolfSSL_EVP_PKEY_new();
  7933. if (pkey != NULL) {
  7934. pkey->type = EVP_PKEY_DH;
  7935. pkey->pkey_sz = (int)memSz;
  7936. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7937. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7938. DYNAMIC_TYPE_PUBLIC_KEY);
  7939. if (pkey->pkey.ptr == NULL) {
  7940. wolfSSL_EVP_PKEY_free(pkey);
  7941. return NULL;
  7942. }
  7943. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7944. if (out != NULL) {
  7945. *out = pkey;
  7946. }
  7947. pkey->ownDh = 1;
  7948. pkey->dh = wolfSSL_DH_new();
  7949. if (pkey->dh == NULL) {
  7950. wolfSSL_EVP_PKEY_free(pkey);
  7951. return NULL;
  7952. }
  7953. key = (DhKey*)pkey->dh->internal;
  7954. keyIdx = 0;
  7955. if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0)
  7956. {
  7957. elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | ELEMENT_PUB;
  7958. if (priv)
  7959. elements |= ELEMENT_PRV;
  7960. if(SetDhExternal_ex(pkey->dh, elements)
  7961. == WOLFSSL_SUCCESS ) {
  7962. return pkey;
  7963. }
  7964. }
  7965. else {
  7966. wolfSSL_EVP_PKEY_free(pkey);
  7967. return NULL;
  7968. }
  7969. }
  7970. }
  7971. }
  7972. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7973. #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */
  7974. #ifdef HAVE_PQC
  7975. #ifdef HAVE_FALCON
  7976. {
  7977. int isFalcon = 0;
  7978. #ifdef WOLFSSL_SMALL_STACK
  7979. falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL,
  7980. DYNAMIC_TYPE_FALCON);
  7981. if (falcon == NULL) {
  7982. return NULL;
  7983. }
  7984. #else
  7985. falcon_key falcon[1];
  7986. #endif
  7987. if (wc_falcon_init(falcon) == 0) {
  7988. /* test if Falcon key */
  7989. if (priv) {
  7990. /* Try level 1 */
  7991. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  7992. wc_falcon_import_private_only(mem, (word32)memSz,
  7993. falcon) == 0;
  7994. if (!isFalcon) {
  7995. /* Try level 5 */
  7996. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  7997. wc_falcon_import_private_only(mem, (word32)memSz,
  7998. falcon) == 0;
  7999. }
  8000. } else {
  8001. /* Try level 1 */
  8002. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  8003. wc_falcon_import_public(mem, (word32)memSz, falcon)
  8004. == 0;
  8005. if (!isFalcon) {
  8006. /* Try level 5 */
  8007. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  8008. wc_falcon_import_public(mem, (word32)memSz,
  8009. falcon) == 0;
  8010. }
  8011. }
  8012. wc_falcon_free(falcon);
  8013. }
  8014. #ifdef WOLFSSL_SMALL_STACK
  8015. XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON);
  8016. #endif
  8017. if (isFalcon) {
  8018. /* Create a fake Falcon EVP_PKEY. In the future, we might integrate
  8019. * Falcon into the compatibility layer. */
  8020. pkey = wolfSSL_EVP_PKEY_new();
  8021. if (pkey == NULL) {
  8022. WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error");
  8023. return NULL;
  8024. }
  8025. pkey->type = EVP_PKEY_FALCON;
  8026. pkey->pkey.ptr = NULL;
  8027. pkey->pkey_sz = 0;
  8028. return pkey;
  8029. }
  8030. }
  8031. #endif /* HAVE_FALCON */
  8032. #ifdef HAVE_DILITHIUM
  8033. {
  8034. int isDilithium = 0;
  8035. #ifdef WOLFSSL_SMALL_STACK
  8036. dilithium_key *dilithium = (dilithium_key *)
  8037. XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM);
  8038. if (dilithium == NULL) {
  8039. return NULL;
  8040. }
  8041. #else
  8042. dilithium_key dilithium[1];
  8043. #endif
  8044. if (wc_dilithium_init(dilithium) == 0) {
  8045. /* Test if Dilithium key. Try all levels for both SHAKE and AES */
  8046. if (priv) {
  8047. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  8048. SHAKE_VARIANT) == 0 &&
  8049. wc_dilithium_import_private_only(mem,
  8050. (word32)memSz, dilithium) == 0;
  8051. if (!isDilithium) {
  8052. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  8053. SHAKE_VARIANT) == 0 &&
  8054. wc_dilithium_import_private_only(mem,
  8055. (word32)memSz, dilithium) == 0;
  8056. }
  8057. if (!isDilithium) {
  8058. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  8059. SHAKE_VARIANT) == 0 &&
  8060. wc_dilithium_import_private_only(mem,
  8061. (word32)memSz, dilithium) == 0;
  8062. }
  8063. if (!isDilithium) {
  8064. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  8065. AES_VARIANT) == 0 &&
  8066. wc_dilithium_import_private_only(mem,
  8067. (word32)memSz, dilithium) == 0;
  8068. }
  8069. if (!isDilithium) {
  8070. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  8071. AES_VARIANT) == 0 &&
  8072. wc_dilithium_import_private_only(mem,
  8073. (word32)memSz, dilithium) == 0;
  8074. }
  8075. if (!isDilithium) {
  8076. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  8077. AES_VARIANT) == 0 &&
  8078. wc_dilithium_import_private_only(mem,
  8079. (word32)memSz, dilithium) == 0;
  8080. }
  8081. } else {
  8082. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  8083. SHAKE_VARIANT) == 0 &&
  8084. wc_dilithium_import_public(mem, (word32)memSz,
  8085. dilithium) == 0;
  8086. if (!isDilithium) {
  8087. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  8088. SHAKE_VARIANT) == 0 &&
  8089. wc_dilithium_import_public(mem, (word32)memSz,
  8090. dilithium) == 0;
  8091. }
  8092. if (!isDilithium) {
  8093. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  8094. SHAKE_VARIANT) == 0 &&
  8095. wc_dilithium_import_public(mem, (word32)memSz,
  8096. dilithium) == 0;
  8097. }
  8098. if (!isDilithium) {
  8099. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  8100. AES_VARIANT) == 0 &&
  8101. wc_dilithium_import_public(mem, (word32)memSz,
  8102. dilithium) == 0;
  8103. }
  8104. if (!isDilithium) {
  8105. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  8106. AES_VARIANT) == 0 &&
  8107. wc_dilithium_import_public(mem, (word32)memSz,
  8108. dilithium) == 0;
  8109. }
  8110. if (!isDilithium) {
  8111. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  8112. AES_VARIANT) == 0 &&
  8113. wc_dilithium_import_public(mem, (word32)memSz,
  8114. dilithium) == 0;
  8115. }
  8116. }
  8117. wc_dilithium_free(dilithium);
  8118. }
  8119. #ifdef WOLFSSL_SMALL_STACK
  8120. XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM);
  8121. #endif
  8122. if (isDilithium) {
  8123. /* Create a fake Dilithium EVP_PKEY. In the future, we might
  8124. * integrate Dilithium into the compatibility layer. */
  8125. pkey = wolfSSL_EVP_PKEY_new();
  8126. if (pkey == NULL) {
  8127. WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error");
  8128. return NULL;
  8129. }
  8130. pkey->type = EVP_PKEY_DILITHIUM;
  8131. pkey->pkey.ptr = NULL;
  8132. pkey->pkey_sz = 0;
  8133. return pkey;
  8134. }
  8135. }
  8136. #endif /* HAVE_DILITHIUM */
  8137. #endif /* HAVE_PQC */
  8138. if (pkey == NULL) {
  8139. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  8140. }
  8141. return pkey;
  8142. }
  8143. #endif /* OPENSSL_EXTRA || WPA_SMALL */
  8144. #ifdef OPENSSL_EXTRA
  8145. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY(
  8146. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen)
  8147. {
  8148. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8149. #ifdef WOLFSSL_PEM_TO_DER
  8150. int ret;
  8151. DerBuffer* der = NULL;
  8152. if (keyBuf == NULL || *keyBuf == NULL || keyLen <= 0) {
  8153. WOLFSSL_MSG("Bad key PEM/DER args");
  8154. return NULL;
  8155. }
  8156. ret = PemToDer(*keyBuf, keyLen, PRIVATEKEY_TYPE, &der, NULL, NULL, NULL);
  8157. if (ret < 0) {
  8158. WOLFSSL_MSG("Not PEM format");
  8159. ret = AllocDer(&der, (word32)keyLen, PRIVATEKEY_TYPE, NULL);
  8160. if (ret == 0) {
  8161. XMEMCPY(der->buffer, *keyBuf, keyLen);
  8162. }
  8163. }
  8164. if (ret == 0) {
  8165. /* Verify this is PKCS8 Key */
  8166. word32 inOutIdx = 0;
  8167. word32 algId;
  8168. ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId);
  8169. if (ret >= 0) {
  8170. ret = 0; /* good DER */
  8171. }
  8172. }
  8173. if (ret == 0) {
  8174. pkcs8 = wolfSSL_EVP_PKEY_new();
  8175. if (pkcs8 == NULL)
  8176. ret = MEMORY_E;
  8177. }
  8178. if (ret == 0) {
  8179. pkcs8->pkey.ptr = (char*)XMALLOC(der->length, NULL,
  8180. DYNAMIC_TYPE_PUBLIC_KEY);
  8181. if (pkcs8->pkey.ptr == NULL)
  8182. ret = MEMORY_E;
  8183. }
  8184. if (ret == 0) {
  8185. XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length);
  8186. pkcs8->pkey_sz = der->length;
  8187. }
  8188. FreeDer(&der);
  8189. if (ret != 0) {
  8190. wolfSSL_EVP_PKEY_free(pkcs8);
  8191. pkcs8 = NULL;
  8192. }
  8193. if (pkey != NULL) {
  8194. *pkey = pkcs8;
  8195. }
  8196. #else
  8197. (void)bio;
  8198. (void)pkey;
  8199. #endif /* WOLFSSL_PEM_TO_DER */
  8200. return pkcs8;
  8201. }
  8202. #ifndef NO_BIO
  8203. /* put SSL type in extra for now, not very common */
  8204. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  8205. *
  8206. * bio input bio to read DER from
  8207. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  8208. * structure.
  8209. *
  8210. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  8211. * case.
  8212. */
  8213. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  8214. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  8215. {
  8216. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  8217. #ifdef WOLFSSL_PEM_TO_DER
  8218. unsigned char* mem = NULL;
  8219. int memSz;
  8220. WOLFSSL_ENTER("wolfSSL_d2i_PKCS8_PKEY_bio");
  8221. if (bio == NULL) {
  8222. return NULL;
  8223. }
  8224. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  8225. return NULL;
  8226. }
  8227. pkcs8 = wolfSSL_d2i_PKCS8_PKEY(pkey, (const unsigned char**)&mem, memSz);
  8228. #else
  8229. (void)bio;
  8230. (void)pkey;
  8231. #endif /* WOLFSSL_PEM_TO_DER */
  8232. return pkcs8;
  8233. }
  8234. /* expecting DER format public key
  8235. *
  8236. * bio input bio to read DER from
  8237. * out If not NULL then this pointer will be overwritten with a new
  8238. * WOLFSSL_EVP_PKEY pointer
  8239. *
  8240. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  8241. */
  8242. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  8243. WOLFSSL_EVP_PKEY** out)
  8244. {
  8245. unsigned char* mem;
  8246. long memSz;
  8247. WOLFSSL_EVP_PKEY* pkey = NULL;
  8248. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  8249. if (bio == NULL) {
  8250. return NULL;
  8251. }
  8252. (void)out;
  8253. memSz = wolfSSL_BIO_get_len(bio);
  8254. if (memSz <= 0) {
  8255. return NULL;
  8256. }
  8257. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8258. if (mem == NULL) {
  8259. return NULL;
  8260. }
  8261. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  8262. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  8263. if (out != NULL && pkey != NULL) {
  8264. *out = pkey;
  8265. }
  8266. }
  8267. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8268. return pkey;
  8269. }
  8270. #endif /* !NO_BIO */
  8271. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  8272. *
  8273. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  8274. * in DER buffer to convert
  8275. * inSz size of in buffer
  8276. *
  8277. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  8278. * on fail
  8279. */
  8280. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  8281. const unsigned char** in, long inSz)
  8282. {
  8283. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  8284. return d2iGenericKey(out, in, inSz, 0);
  8285. }
  8286. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  8287. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  8288. {
  8289. unsigned char* pt;
  8290. int sz;
  8291. word16 pkcs8HeaderSz;
  8292. if (!key || !key->pkey_sz)
  8293. return WOLFSSL_FATAL_ERROR;
  8294. /* return the key without PKCS8 for compatibility */
  8295. /* if pkcs8HeaderSz is invalid, use 0 and return all of pkey */
  8296. pkcs8HeaderSz = 0;
  8297. if (key->pkey_sz > key->pkcs8HeaderSz)
  8298. pkcs8HeaderSz = key->pkcs8HeaderSz;
  8299. sz = key->pkey_sz - pkcs8HeaderSz;
  8300. if (der) {
  8301. pt = (unsigned char*)key->pkey.ptr;
  8302. if (*der) {
  8303. /* since this function signature has no size value passed in it is
  8304. * assumed that the user has allocated a large enough buffer */
  8305. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8306. *der += sz;
  8307. }
  8308. else {
  8309. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  8310. if (*der == NULL) {
  8311. return WOLFSSL_FATAL_ERROR;
  8312. }
  8313. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8314. }
  8315. }
  8316. return sz;
  8317. }
  8318. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  8319. {
  8320. return wolfSSL_EVP_PKEY_get_der(key, der);
  8321. }
  8322. static WOLFSSL_EVP_PKEY* _d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8323. const unsigned char **in, long inSz, int priv)
  8324. {
  8325. int ret = 0;
  8326. word32 idx = 0, algId;
  8327. word16 pkcs8HeaderSz = 0;
  8328. WOLFSSL_EVP_PKEY* local;
  8329. int opt;
  8330. (void)opt;
  8331. if (in == NULL || inSz < 0) {
  8332. WOLFSSL_MSG("Bad argument");
  8333. return NULL;
  8334. }
  8335. if (priv == 1) {
  8336. /* Check if input buffer has PKCS8 header. In the case that it does not
  8337. * have a PKCS8 header then do not error out. */
  8338. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx,
  8339. (word32)inSz, &algId)) > 0) {
  8340. WOLFSSL_MSG("Found PKCS8 header");
  8341. pkcs8HeaderSz = (word16)idx;
  8342. if ((type == EVP_PKEY_RSA && algId != RSAk
  8343. #ifdef WC_RSA_PSS
  8344. && algId != RSAPSSk
  8345. #endif
  8346. ) ||
  8347. (type == EVP_PKEY_EC && algId != ECDSAk) ||
  8348. (type == EVP_PKEY_DSA && algId != DSAk) ||
  8349. (type == EVP_PKEY_DH && algId != DHk)) {
  8350. WOLFSSL_MSG("PKCS8 does not match EVP key type");
  8351. return NULL;
  8352. }
  8353. (void)idx; /* not used */
  8354. }
  8355. else {
  8356. if (ret != ASN_PARSE_E) {
  8357. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 "
  8358. "header");
  8359. return NULL;
  8360. }
  8361. }
  8362. }
  8363. if (out != NULL && *out != NULL) {
  8364. wolfSSL_EVP_PKEY_free(*out);
  8365. *out = NULL;
  8366. }
  8367. local = wolfSSL_EVP_PKEY_new();
  8368. if (local == NULL) {
  8369. return NULL;
  8370. }
  8371. local->type = type;
  8372. local->pkey_sz = (int)inSz;
  8373. local->pkcs8HeaderSz = pkcs8HeaderSz;
  8374. local->pkey.ptr = (char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  8375. if (local->pkey.ptr == NULL) {
  8376. wolfSSL_EVP_PKEY_free(local);
  8377. local = NULL;
  8378. return NULL;
  8379. }
  8380. else {
  8381. XMEMCPY(local->pkey.ptr, *in, inSz);
  8382. }
  8383. switch (type) {
  8384. #ifndef NO_RSA
  8385. case EVP_PKEY_RSA:
  8386. opt = priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC;
  8387. local->ownRsa = 1;
  8388. local->rsa = wolfssl_rsa_d2i(NULL,
  8389. (const unsigned char*)local->pkey.ptr, local->pkey_sz, opt);
  8390. if (local->rsa == NULL) {
  8391. wolfSSL_EVP_PKEY_free(local);
  8392. return NULL;
  8393. }
  8394. break;
  8395. #endif /* NO_RSA */
  8396. #ifdef HAVE_ECC
  8397. case EVP_PKEY_EC:
  8398. local->ownEcc = 1;
  8399. local->ecc = wolfSSL_EC_KEY_new();
  8400. if (local->ecc == NULL) {
  8401. wolfSSL_EVP_PKEY_free(local);
  8402. return NULL;
  8403. }
  8404. opt = priv ? WOLFSSL_EC_KEY_LOAD_PRIVATE :
  8405. WOLFSSL_EC_KEY_LOAD_PUBLIC;
  8406. if (wolfSSL_EC_KEY_LoadDer_ex(local->ecc,
  8407. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8408. opt)
  8409. != WOLFSSL_SUCCESS) {
  8410. wolfSSL_EVP_PKEY_free(local);
  8411. return NULL;
  8412. }
  8413. break;
  8414. #endif /* HAVE_ECC */
  8415. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  8416. #ifndef NO_DSA
  8417. case EVP_PKEY_DSA:
  8418. local->ownDsa = 1;
  8419. local->dsa = wolfSSL_DSA_new();
  8420. if (local->dsa == NULL) {
  8421. wolfSSL_EVP_PKEY_free(local);
  8422. return NULL;
  8423. }
  8424. opt = priv ? WOLFSSL_DSA_LOAD_PRIVATE : WOLFSSL_DSA_LOAD_PUBLIC;
  8425. if (wolfSSL_DSA_LoadDer_ex(local->dsa,
  8426. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8427. opt)
  8428. != WOLFSSL_SUCCESS) {
  8429. wolfSSL_EVP_PKEY_free(local);
  8430. return NULL;
  8431. }
  8432. break;
  8433. #endif /* NO_DSA */
  8434. #ifndef NO_DH
  8435. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  8436. case EVP_PKEY_DH:
  8437. local->ownDh = 1;
  8438. local->dh = wolfSSL_DH_new();
  8439. if (local->dh == NULL) {
  8440. wolfSSL_EVP_PKEY_free(local);
  8441. return NULL;
  8442. }
  8443. if (wolfSSL_DH_LoadDer(local->dh,
  8444. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  8445. != WOLFSSL_SUCCESS) {
  8446. wolfSSL_EVP_PKEY_free(local);
  8447. return NULL;
  8448. }
  8449. break;
  8450. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8451. #endif /* HAVE_DH */
  8452. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  8453. default:
  8454. WOLFSSL_MSG("Unsupported key type");
  8455. wolfSSL_EVP_PKEY_free(local);
  8456. return NULL;
  8457. }
  8458. /* advance pointer with success */
  8459. if (local != NULL) {
  8460. if (local->pkey_sz <= (int)inSz) {
  8461. *in += local->pkey_sz;
  8462. }
  8463. if (out != NULL) {
  8464. *out = local;
  8465. }
  8466. }
  8467. return local;
  8468. }
  8469. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8470. const unsigned char **in, long inSz)
  8471. {
  8472. WOLFSSL_ENTER("wolfSSL_d2i_PublicKey");
  8473. return _d2i_PublicKey(type, out, in, inSz, 0);
  8474. }
  8475. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  8476. *
  8477. * type type of key
  8478. * out newly created WOLFSSL_EVP_PKEY structure
  8479. * in pointer to input key DER
  8480. * inSz size of in buffer
  8481. *
  8482. * On success a non null pointer is returned and the pointer in is advanced the
  8483. * same number of bytes read.
  8484. */
  8485. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  8486. const unsigned char **in, long inSz)
  8487. {
  8488. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  8489. return _d2i_PublicKey(type, out, in, inSz, 1);
  8490. }
  8491. #ifdef WOLF_PRIVATE_KEY_ID
  8492. /* Create an EVP structure for use with crypto callbacks */
  8493. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_id(int type, WOLFSSL_EVP_PKEY** out,
  8494. void* heap, int devId)
  8495. {
  8496. WOLFSSL_EVP_PKEY* local;
  8497. if (out != NULL && *out != NULL) {
  8498. wolfSSL_EVP_PKEY_free(*out);
  8499. *out = NULL;
  8500. }
  8501. local = wolfSSL_EVP_PKEY_new_ex(heap);
  8502. if (local == NULL) {
  8503. return NULL;
  8504. }
  8505. local->type = type;
  8506. local->pkey_sz = 0;
  8507. local->pkcs8HeaderSz = 0;
  8508. switch (type) {
  8509. #ifndef NO_RSA
  8510. case EVP_PKEY_RSA:
  8511. {
  8512. RsaKey* key;
  8513. local->ownRsa = 1;
  8514. local->rsa = wolfSSL_RSA_new_ex(heap, devId);
  8515. if (local->rsa == NULL) {
  8516. wolfSSL_EVP_PKEY_free(local);
  8517. return NULL;
  8518. }
  8519. key = (RsaKey*)local->rsa->internal;
  8520. #ifdef WOLF_CRYPTO_CB
  8521. key->devId = devId;
  8522. #endif
  8523. (void)key;
  8524. local->rsa->inSet = 1;
  8525. break;
  8526. }
  8527. #endif /* !NO_RSA */
  8528. #ifdef HAVE_ECC
  8529. case EVP_PKEY_EC:
  8530. {
  8531. ecc_key* key;
  8532. local->ownEcc = 1;
  8533. local->ecc = wolfSSL_EC_KEY_new_ex(heap, devId);
  8534. if (local->ecc == NULL) {
  8535. wolfSSL_EVP_PKEY_free(local);
  8536. return NULL;
  8537. }
  8538. key = (ecc_key*)local->ecc->internal;
  8539. #ifdef WOLF_CRYPTO_CB
  8540. key->devId = devId;
  8541. #endif
  8542. key->type = ECC_PRIVATEKEY;
  8543. /* key is required to have a key size / curve set, although
  8544. * actual one used is determined by devId callback function */
  8545. wc_ecc_set_curve(key, ECDHE_SIZE, ECC_CURVE_DEF);
  8546. local->ecc->inSet = 1;
  8547. break;
  8548. }
  8549. #endif /* HAVE_ECC */
  8550. default:
  8551. WOLFSSL_MSG("Unsupported private key id type");
  8552. wolfSSL_EVP_PKEY_free(local);
  8553. return NULL;
  8554. }
  8555. if (local != NULL && out != NULL) {
  8556. *out = local;
  8557. }
  8558. return local;
  8559. }
  8560. #endif /* WOLF_PRIVATE_KEY_ID */
  8561. #ifndef NO_CERTS // NOLINT(readability-redundant-preprocessor)
  8562. #ifndef NO_CHECK_PRIVATE_KEY
  8563. /* Check private against public in certificate for match
  8564. *
  8565. * ssl WOLFSSL structure to check private key in
  8566. *
  8567. * Returns WOLFSSL_SUCCESS on good private key
  8568. * WOLFSSL_FAILURE if mismatched. */
  8569. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  8570. {
  8571. if (ssl == NULL) {
  8572. return WOLFSSL_FAILURE;
  8573. }
  8574. return check_cert_key(ssl->buffers.certificate, ssl->buffers.key, ssl->heap,
  8575. ssl->buffers.keyDevId, ssl->buffers.keyLabel, ssl->buffers.keyId);
  8576. }
  8577. #endif /* !NO_CHECK_PRIVATE_KEY */
  8578. #if defined(OPENSSL_ALL)
  8579. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  8580. int val)
  8581. {
  8582. int bytes_cnt, bit;
  8583. byte* temp;
  8584. if (!str || (val != 0 && val != 1) || pos < 0) {
  8585. return WOLFSSL_FAILURE;
  8586. }
  8587. bytes_cnt = pos/8;
  8588. bit = 1<<(7-(pos%8));
  8589. if (bytes_cnt+1 > str->length) {
  8590. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  8591. DYNAMIC_TYPE_OPENSSL))) {
  8592. return WOLFSSL_FAILURE;
  8593. }
  8594. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  8595. str->data = temp;
  8596. str->length = bytes_cnt+1;
  8597. }
  8598. str->data[bytes_cnt] &= ~bit;
  8599. str->data[bytes_cnt] |= val ? bit : 0;
  8600. return WOLFSSL_SUCCESS;
  8601. }
  8602. #endif /* OPENSSL_ALL */
  8603. #endif /* !NO_CERTS */
  8604. #endif /* OPENSSL_EXTRA */
  8605. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8606. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  8607. {
  8608. WOLFSSL_ASN1_BIT_STRING* str;
  8609. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  8610. NULL, DYNAMIC_TYPE_OPENSSL);
  8611. if (str) {
  8612. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  8613. }
  8614. return str;
  8615. }
  8616. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  8617. {
  8618. if (str) {
  8619. if (str->data) {
  8620. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  8621. str->data = NULL;
  8622. }
  8623. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  8624. }
  8625. }
  8626. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  8627. {
  8628. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  8629. return WOLFSSL_FAILURE;
  8630. }
  8631. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  8632. }
  8633. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8634. #ifdef OPENSSL_EXTRA
  8635. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8636. {
  8637. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8638. if (ssl == NULL || pkey == NULL ) {
  8639. return WOLFSSL_FAILURE;
  8640. }
  8641. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8642. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8643. }
  8644. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8645. long derSz)
  8646. {
  8647. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8648. if (ssl == NULL || der == NULL ) {
  8649. return WOLFSSL_FAILURE;
  8650. }
  8651. (void)pri; /* type of private key */
  8652. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8653. }
  8654. /******************************************************************************
  8655. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8656. *
  8657. * RETURNS:
  8658. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8659. */
  8660. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8661. unsigned char* der, long derSz)
  8662. {
  8663. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8664. if (ctx == NULL || der == NULL ) {
  8665. return WOLFSSL_FAILURE;
  8666. }
  8667. (void)pri; /* type of private key */
  8668. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8669. }
  8670. #ifndef NO_RSA
  8671. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8672. {
  8673. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8674. if (ssl == NULL || der == NULL ) {
  8675. return WOLFSSL_FAILURE;
  8676. }
  8677. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8678. }
  8679. #endif
  8680. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8681. {
  8682. long idx;
  8683. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8684. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8685. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8686. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8687. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8688. return WOLFSSL_SUCCESS;
  8689. }
  8690. }
  8691. (void)idx;
  8692. return WOLFSSL_FAILURE;
  8693. }
  8694. #endif /* OPENSSL_EXTRA */
  8695. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8696. int derSz)
  8697. {
  8698. long idx;
  8699. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8700. if (der != NULL && ssl != NULL) {
  8701. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8702. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8703. return WOLFSSL_SUCCESS;
  8704. }
  8705. }
  8706. (void)idx;
  8707. return WOLFSSL_FAILURE;
  8708. }
  8709. #ifndef NO_FILESYSTEM
  8710. WOLFSSL_ABI
  8711. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8712. {
  8713. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8714. if (ssl == NULL) {
  8715. return BAD_FUNC_ARG;
  8716. }
  8717. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8718. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8719. return WOLFSSL_SUCCESS;
  8720. }
  8721. return WOLFSSL_FAILURE;
  8722. }
  8723. WOLFSSL_ABI
  8724. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8725. {
  8726. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8727. if (ssl == NULL) {
  8728. return BAD_FUNC_ARG;
  8729. }
  8730. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8731. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8732. return WOLFSSL_SUCCESS;
  8733. }
  8734. return WOLFSSL_FAILURE;
  8735. }
  8736. WOLFSSL_ABI
  8737. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8738. {
  8739. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8740. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8741. if (ssl == NULL) {
  8742. return BAD_FUNC_ARG;
  8743. }
  8744. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8745. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8746. return WOLFSSL_SUCCESS;
  8747. }
  8748. return WOLFSSL_FAILURE;
  8749. }
  8750. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8751. int format)
  8752. {
  8753. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8754. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8755. if (ssl == NULL) {
  8756. return BAD_FUNC_ARG;
  8757. }
  8758. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8759. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8760. return WOLFSSL_SUCCESS;
  8761. }
  8762. return WOLFSSL_FAILURE;
  8763. }
  8764. #endif /* !NO_FILESYSTEM */
  8765. #ifdef HAVE_ECC
  8766. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8767. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8768. {
  8769. if (ctx == NULL)
  8770. return BAD_FUNC_ARG;
  8771. /* if 0 then get from loaded private key */
  8772. if (sz == 0) {
  8773. /* applies only to ECDSA */
  8774. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8775. return WOLFSSL_SUCCESS;
  8776. if (ctx->privateKeySz == 0) {
  8777. WOLFSSL_MSG("Must set private key/cert first");
  8778. return BAD_FUNC_ARG;
  8779. }
  8780. sz = (word16)ctx->privateKeySz;
  8781. }
  8782. /* check size */
  8783. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8784. return BAD_FUNC_ARG;
  8785. ctx->eccTempKeySz = sz;
  8786. return WOLFSSL_SUCCESS;
  8787. }
  8788. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8789. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8790. {
  8791. if (ssl == NULL)
  8792. return BAD_FUNC_ARG;
  8793. /* check size */
  8794. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8795. return BAD_FUNC_ARG;
  8796. ssl->eccTempKeySz = sz;
  8797. return WOLFSSL_SUCCESS;
  8798. }
  8799. #endif /* HAVE_ECC */
  8800. #ifdef OPENSSL_EXTRA
  8801. #ifndef NO_FILESYSTEM
  8802. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8803. int format)
  8804. {
  8805. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8806. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8807. }
  8808. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8809. {
  8810. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  8811. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  8812. }
  8813. #endif /* NO_FILESYSTEM */
  8814. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  8815. * of master secret.
  8816. *
  8817. * ses : a session from completed TLS/SSL handshake
  8818. * out : buffer to hold copy of master secret
  8819. * outSz : size of out buffer
  8820. * returns : number of bytes copied into out buffer on success
  8821. * less then or equal to 0 is considered a failure case
  8822. */
  8823. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  8824. unsigned char* out, int outSz)
  8825. {
  8826. int size;
  8827. ses = ClientSessionToSession(ses);
  8828. if (outSz == 0) {
  8829. return SECRET_LEN;
  8830. }
  8831. if (ses == NULL || out == NULL || outSz < 0) {
  8832. return 0;
  8833. }
  8834. if (outSz > SECRET_LEN) {
  8835. size = SECRET_LEN;
  8836. }
  8837. else {
  8838. size = outSz;
  8839. }
  8840. XMEMCPY(out, ses->masterSecret, size);
  8841. return size;
  8842. }
  8843. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  8844. {
  8845. (void)ses;
  8846. return SECRET_LEN;
  8847. }
  8848. #ifdef WOLFSSL_EARLY_DATA
  8849. unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session)
  8850. {
  8851. return session->maxEarlyDataSz;
  8852. }
  8853. #endif /* WOLFSSL_EARLY_DATA */
  8854. #endif /* OPENSSL_EXTRA */
  8855. typedef struct {
  8856. byte verifyPeer:1;
  8857. byte verifyNone:1;
  8858. byte failNoCert:1;
  8859. byte failNoCertxPSK:1;
  8860. byte verifyPostHandshake:1;
  8861. } SetVerifyOptions;
  8862. static SetVerifyOptions ModeToVerifyOptions(int mode)
  8863. {
  8864. SetVerifyOptions opts;
  8865. XMEMSET(&opts, 0, sizeof(SetVerifyOptions));
  8866. if (mode != WOLFSSL_VERIFY_DEFAULT) {
  8867. opts.verifyNone = (mode == WOLFSSL_VERIFY_NONE);
  8868. if (!opts.verifyNone) {
  8869. opts.verifyPeer =
  8870. (mode & WOLFSSL_VERIFY_PEER) != 0;
  8871. opts.failNoCertxPSK =
  8872. (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) != 0;
  8873. opts.failNoCert =
  8874. (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) != 0;
  8875. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8876. opts.verifyPostHandshake =
  8877. (mode & WOLFSSL_VERIFY_POST_HANDSHAKE) != 0;
  8878. #endif
  8879. }
  8880. }
  8881. return opts;
  8882. }
  8883. WOLFSSL_ABI
  8884. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  8885. {
  8886. SetVerifyOptions opts;
  8887. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  8888. if (ctx == NULL)
  8889. return;
  8890. opts = ModeToVerifyOptions(mode);
  8891. ctx->verifyNone = opts.verifyNone;
  8892. ctx->verifyPeer = opts.verifyPeer;
  8893. ctx->failNoCert = opts.failNoCert;
  8894. ctx->failNoCertxPSK = opts.failNoCertxPSK;
  8895. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8896. ctx->verifyPostHandshake = opts.verifyPostHandshake;
  8897. #endif
  8898. ctx->verifyCallback = vc;
  8899. }
  8900. #ifdef OPENSSL_ALL
  8901. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  8902. CertVerifyCallback cb, void* arg)
  8903. {
  8904. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  8905. if (ctx == NULL)
  8906. return;
  8907. ctx->verifyCertCb = cb;
  8908. ctx->verifyCertCbArg = arg;
  8909. }
  8910. #endif
  8911. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  8912. {
  8913. SetVerifyOptions opts;
  8914. WOLFSSL_ENTER("wolfSSL_set_verify");
  8915. if (ssl == NULL)
  8916. return;
  8917. opts = ModeToVerifyOptions(mode);
  8918. ssl->options.verifyNone = opts.verifyNone;
  8919. ssl->options.verifyPeer = opts.verifyPeer;
  8920. ssl->options.failNoCert = opts.failNoCert;
  8921. ssl->options.failNoCertxPSK = opts.failNoCertxPSK;
  8922. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8923. ssl->options.verifyPostHandshake = opts.verifyPostHandshake;
  8924. #endif
  8925. ssl->verifyCallback = vc;
  8926. }
  8927. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  8928. {
  8929. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  8930. if (ssl == NULL)
  8931. return;
  8932. #ifdef OPENSSL_ALL
  8933. ssl->verifyCallbackResult = v;
  8934. #else
  8935. (void)v;
  8936. WOLFSSL_STUB("wolfSSL_set_verify_result");
  8937. #endif
  8938. }
  8939. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  8940. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8941. /* For TLS v1.3 send handshake messages after handshake completes. */
  8942. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  8943. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  8944. {
  8945. int ret = wolfSSL_request_certificate(ssl);
  8946. if (ret != WOLFSSL_SUCCESS) {
  8947. if (!IsAtLeastTLSv1_3(ssl->version)) {
  8948. /* specific error of wrong version expected */
  8949. WOLFSSL_ERROR(UNSUPPORTED_PROTO_VERSION);
  8950. }
  8951. else {
  8952. WOLFSSL_ERROR(ret); /* log the error in the error queue */
  8953. }
  8954. }
  8955. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8956. }
  8957. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  8958. {
  8959. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  8960. if (ret == 0) {
  8961. ctx->postHandshakeAuth = (val != 0);
  8962. }
  8963. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8964. }
  8965. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  8966. {
  8967. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  8968. if (ret == 0) {
  8969. ssl->options.postHandshakeAuth = (val != 0);
  8970. }
  8971. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8972. }
  8973. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  8974. /* store user ctx for verify callback */
  8975. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  8976. {
  8977. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  8978. if (ssl)
  8979. ssl->verifyCbCtx = ctx;
  8980. }
  8981. /* store user ctx for verify callback */
  8982. void wolfSSL_CTX_SetCertCbCtx(WOLFSSL_CTX* ctx, void* userCtx)
  8983. {
  8984. WOLFSSL_ENTER("wolfSSL_CTX_SetCertCbCtx");
  8985. if (ctx)
  8986. ctx->verifyCbCtx = userCtx;
  8987. }
  8988. /* store context CA Cache addition callback */
  8989. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  8990. {
  8991. if (ctx && ctx->cm)
  8992. ctx->cm->caCacheCallback = cb;
  8993. }
  8994. #if defined(PERSIST_CERT_CACHE)
  8995. #if !defined(NO_FILESYSTEM)
  8996. /* Persist cert cache to file */
  8997. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8998. {
  8999. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  9000. if (ctx == NULL || fname == NULL)
  9001. return BAD_FUNC_ARG;
  9002. return CM_SaveCertCache(ctx->cm, fname);
  9003. }
  9004. /* Persist cert cache from file */
  9005. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9006. {
  9007. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  9008. if (ctx == NULL || fname == NULL)
  9009. return BAD_FUNC_ARG;
  9010. return CM_RestoreCertCache(ctx->cm, fname);
  9011. }
  9012. #endif /* NO_FILESYSTEM */
  9013. /* Persist cert cache to memory */
  9014. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  9015. int sz, int* used)
  9016. {
  9017. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  9018. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  9019. return BAD_FUNC_ARG;
  9020. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  9021. }
  9022. /* Restore cert cache from memory */
  9023. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  9024. {
  9025. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  9026. if (ctx == NULL || mem == NULL || sz <= 0)
  9027. return BAD_FUNC_ARG;
  9028. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  9029. }
  9030. /* get how big the the cert cache save buffer needs to be */
  9031. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  9032. {
  9033. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  9034. if (ctx == NULL)
  9035. return BAD_FUNC_ARG;
  9036. return CM_GetCertCacheMemSize(ctx->cm);
  9037. }
  9038. #endif /* PERSIST_CERT_CACHE */
  9039. #endif /* !NO_CERTS */
  9040. #ifndef NO_SESSION_CACHE
  9041. WOLFSSL_ABI
  9042. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  9043. {
  9044. WOLFSSL_ENTER("SSL_get_session");
  9045. if (ssl) {
  9046. #ifdef NO_SESSION_CACHE_REF
  9047. return ssl->session;
  9048. #else
  9049. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9050. /* On the client side we want to return a persistant reference for
  9051. * backwards compatibility. */
  9052. #ifndef NO_CLIENT_CACHE
  9053. if (ssl->clientSession) {
  9054. return (WOLFSSL_SESSION*)ssl->clientSession;
  9055. }
  9056. else {
  9057. /* Try to add a ClientCache entry to associate with the current
  9058. * session. Ignore any session cache options. */
  9059. int err;
  9060. const byte* id = ssl->session->sessionID;
  9061. byte idSz = ssl->session->sessionIDSz;
  9062. if (ssl->session->haveAltSessionID) {
  9063. id = ssl->session->altSessionID;
  9064. idSz = ID_LEN;
  9065. }
  9066. err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz,
  9067. NULL, ssl->session->side,
  9068. #ifdef HAVE_SESSION_TICKET
  9069. ssl->session->ticketLen > 0,
  9070. #else
  9071. 0,
  9072. #endif
  9073. &ssl->clientSession);
  9074. if (err == 0) {
  9075. return (WOLFSSL_SESSION*)ssl->clientSession;
  9076. }
  9077. }
  9078. #endif
  9079. }
  9080. else {
  9081. return ssl->session;
  9082. }
  9083. #endif
  9084. }
  9085. return NULL;
  9086. }
  9087. /* The get1 version requires caller to call SSL_SESSION_free */
  9088. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  9089. {
  9090. WOLFSSL_SESSION* sess = NULL;
  9091. WOLFSSL_ENTER("SSL_get1_session");
  9092. if (ssl != NULL) {
  9093. sess = ssl->session;
  9094. if (sess != NULL) {
  9095. /* increase reference count if allocated session */
  9096. if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) {
  9097. if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS)
  9098. sess = NULL;
  9099. }
  9100. }
  9101. }
  9102. return sess;
  9103. }
  9104. /*
  9105. * Sets the session object to use when establishing a TLS/SSL session using
  9106. * the ssl object. Therefore, this function must be called before
  9107. * wolfSSL_connect. The session object to use can be obtained in a previous
  9108. * TLS/SSL connection using wolfSSL_get_session.
  9109. *
  9110. * This function rejects the session if it has been expired when this function
  9111. * is called. Note that this expiration check is wolfSSL specific and differs
  9112. * from OpenSSL return code behavior.
  9113. *
  9114. * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully
  9115. * setting the session, WOLFSSL_FAILURE on failure due to the session cache
  9116. * being disabled, or the session has expired.
  9117. *
  9118. * To match OpenSSL return code behavior when session is expired, define
  9119. * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return
  9120. * WOLFSSL_SUCCESS even when the session is expired and rejected.
  9121. */
  9122. WOLFSSL_ABI
  9123. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  9124. {
  9125. WOLFSSL_ENTER("SSL_set_session");
  9126. if (session)
  9127. return wolfSSL_SetSession(ssl, session);
  9128. return WOLFSSL_FAILURE;
  9129. }
  9130. #ifndef NO_CLIENT_CACHE
  9131. /* Associate client session with serverID, find existing or store for saving
  9132. if newSession flag on, don't reuse existing session
  9133. WOLFSSL_SUCCESS on ok */
  9134. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  9135. {
  9136. WOLFSSL_SESSION* session = NULL;
  9137. WOLFSSL_ENTER("wolfSSL_SetServerID");
  9138. if (ssl == NULL || id == NULL || len <= 0)
  9139. return BAD_FUNC_ARG;
  9140. if (newSession == 0) {
  9141. session = wolfSSL_GetSessionClient(ssl, id, len);
  9142. if (session) {
  9143. if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  9144. #ifdef HAVE_EXT_CACHE
  9145. wolfSSL_FreeSession(ssl->ctx, session);
  9146. #endif
  9147. WOLFSSL_MSG("wolfSSL_SetSession failed");
  9148. session = NULL;
  9149. }
  9150. }
  9151. }
  9152. if (session == NULL) {
  9153. WOLFSSL_MSG("Valid ServerID not cached already");
  9154. ssl->session->idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  9155. XMEMCPY(ssl->session->serverID, id, ssl->session->idLen);
  9156. }
  9157. #ifdef HAVE_EXT_CACHE
  9158. else {
  9159. wolfSSL_FreeSession(ssl->ctx, session);
  9160. }
  9161. #endif
  9162. return WOLFSSL_SUCCESS;
  9163. }
  9164. #endif /* !NO_CLIENT_CACHE */
  9165. #if defined(PERSIST_SESSION_CACHE)
  9166. /* for persistence, if changes to layout need to increment and modify
  9167. save_session_cache() and restore_session_cache and memory versions too */
  9168. #define WOLFSSL_CACHE_VERSION 2
  9169. /* Session Cache Header information */
  9170. typedef struct {
  9171. int version; /* cache layout version id */
  9172. int rows; /* session rows */
  9173. int columns; /* session columns */
  9174. int sessionSz; /* sizeof WOLFSSL_SESSION */
  9175. } cache_header_t;
  9176. /* current persistence layout is:
  9177. 1) cache_header_t
  9178. 2) SessionCache
  9179. 3) ClientCache
  9180. update WOLFSSL_CACHE_VERSION if change layout for the following
  9181. PERSISTENT_SESSION_CACHE functions
  9182. */
  9183. /* get how big the the session cache save buffer needs to be */
  9184. int wolfSSL_get_session_cache_memsize(void)
  9185. {
  9186. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  9187. #ifndef NO_CLIENT_CACHE
  9188. sz += (int)(sizeof(ClientCache));
  9189. #endif
  9190. return sz;
  9191. }
  9192. /* Persist session cache to memory */
  9193. int wolfSSL_memsave_session_cache(void* mem, int sz)
  9194. {
  9195. int i;
  9196. cache_header_t cache_header;
  9197. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9198. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  9199. if (sz < wolfSSL_get_session_cache_memsize()) {
  9200. WOLFSSL_MSG("Memory buffer too small");
  9201. return BUFFER_E;
  9202. }
  9203. cache_header.version = WOLFSSL_CACHE_VERSION;
  9204. cache_header.rows = SESSION_ROWS;
  9205. cache_header.columns = SESSIONS_PER_ROW;
  9206. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9207. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  9208. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9209. if (wc_LockMutex(&session_mutex) != 0) {
  9210. WOLFSSL_MSG("Session cache mutex lock failed");
  9211. return BAD_MUTEX_E;
  9212. }
  9213. #endif
  9214. for (i = 0; i < cache_header.rows; ++i) {
  9215. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9216. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9217. WOLFSSL_MSG("Session row cache mutex lock failed");
  9218. return BAD_MUTEX_E;
  9219. }
  9220. #endif
  9221. XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW);
  9222. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9223. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9224. #endif
  9225. }
  9226. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9227. wc_UnLockMutex(&session_mutex);
  9228. #endif
  9229. #ifndef NO_CLIENT_CACHE
  9230. if (wc_LockMutex(&clisession_mutex) != 0) {
  9231. WOLFSSL_MSG("Client cache mutex lock failed");
  9232. return BAD_MUTEX_E;
  9233. }
  9234. XMEMCPY(row, ClientCache, sizeof(ClientCache));
  9235. wc_UnLockMutex(&clisession_mutex);
  9236. #endif
  9237. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  9238. return WOLFSSL_SUCCESS;
  9239. }
  9240. /* Restore the persistent session cache from memory */
  9241. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  9242. {
  9243. int i;
  9244. cache_header_t cache_header;
  9245. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9246. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  9247. if (sz < wolfSSL_get_session_cache_memsize()) {
  9248. WOLFSSL_MSG("Memory buffer too small");
  9249. return BUFFER_E;
  9250. }
  9251. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  9252. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9253. cache_header.rows != SESSION_ROWS ||
  9254. cache_header.columns != SESSIONS_PER_ROW ||
  9255. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9256. WOLFSSL_MSG("Session cache header match failed");
  9257. return CACHE_MATCH_ERROR;
  9258. }
  9259. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9260. if (wc_LockMutex(&session_mutex) != 0) {
  9261. WOLFSSL_MSG("Session cache mutex lock failed");
  9262. return BAD_MUTEX_E;
  9263. }
  9264. #endif
  9265. for (i = 0; i < cache_header.rows; ++i) {
  9266. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9267. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9268. WOLFSSL_MSG("Session row cache mutex lock failed");
  9269. return BAD_MUTEX_E;
  9270. }
  9271. #endif
  9272. XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW);
  9273. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9274. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9275. #endif
  9276. }
  9277. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9278. wc_UnLockMutex(&session_mutex);
  9279. #endif
  9280. #ifndef NO_CLIENT_CACHE
  9281. if (wc_LockMutex(&clisession_mutex) != 0) {
  9282. WOLFSSL_MSG("Client cache mutex lock failed");
  9283. return BAD_MUTEX_E;
  9284. }
  9285. XMEMCPY(ClientCache, row, sizeof(ClientCache));
  9286. wc_UnLockMutex(&clisession_mutex);
  9287. #endif
  9288. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9289. return WOLFSSL_SUCCESS;
  9290. }
  9291. #if !defined(NO_FILESYSTEM)
  9292. /* Persist session cache to file */
  9293. /* doesn't use memsave because of additional memory use */
  9294. int wolfSSL_save_session_cache(const char *fname)
  9295. {
  9296. XFILE file;
  9297. int ret;
  9298. int rc = WOLFSSL_SUCCESS;
  9299. int i;
  9300. cache_header_t cache_header;
  9301. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9302. file = XFOPEN(fname, "w+b");
  9303. if (file == XBADFILE) {
  9304. WOLFSSL_MSG("Couldn't open session cache save file");
  9305. return WOLFSSL_BAD_FILE;
  9306. }
  9307. cache_header.version = WOLFSSL_CACHE_VERSION;
  9308. cache_header.rows = SESSION_ROWS;
  9309. cache_header.columns = SESSIONS_PER_ROW;
  9310. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9311. /* cache header */
  9312. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9313. if (ret != 1) {
  9314. WOLFSSL_MSG("Session cache header file write failed");
  9315. XFCLOSE(file);
  9316. return FWRITE_ERROR;
  9317. }
  9318. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9319. if (wc_LockMutex(&session_mutex) != 0) {
  9320. WOLFSSL_MSG("Session cache mutex lock failed");
  9321. XFCLOSE(file);
  9322. return BAD_MUTEX_E;
  9323. }
  9324. #endif
  9325. /* session cache */
  9326. for (i = 0; i < cache_header.rows; ++i) {
  9327. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9328. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9329. WOLFSSL_MSG("Session row cache mutex lock failed");
  9330. XFCLOSE(file);
  9331. return BAD_MUTEX_E;
  9332. }
  9333. #endif
  9334. ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9335. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9336. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9337. #endif
  9338. if (ret != 1) {
  9339. WOLFSSL_MSG("Session cache member file write failed");
  9340. rc = FWRITE_ERROR;
  9341. break;
  9342. }
  9343. }
  9344. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9345. wc_UnLockMutex(&session_mutex);
  9346. #endif
  9347. #ifndef NO_CLIENT_CACHE
  9348. /* client cache */
  9349. if (wc_LockMutex(&clisession_mutex) != 0) {
  9350. WOLFSSL_MSG("Client cache mutex lock failed");
  9351. XFCLOSE(file);
  9352. return BAD_MUTEX_E;
  9353. }
  9354. ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file);
  9355. if (ret != 1) {
  9356. WOLFSSL_MSG("Client cache member file write failed");
  9357. rc = FWRITE_ERROR;
  9358. }
  9359. wc_UnLockMutex(&clisession_mutex);
  9360. #endif /* !NO_CLIENT_CACHE */
  9361. XFCLOSE(file);
  9362. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9363. return rc;
  9364. }
  9365. /* Restore the persistent session cache from file */
  9366. /* doesn't use memstore because of additional memory use */
  9367. int wolfSSL_restore_session_cache(const char *fname)
  9368. {
  9369. XFILE file;
  9370. int rc = WOLFSSL_SUCCESS;
  9371. int ret;
  9372. int i;
  9373. cache_header_t cache_header;
  9374. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9375. file = XFOPEN(fname, "rb");
  9376. if (file == XBADFILE) {
  9377. WOLFSSL_MSG("Couldn't open session cache save file");
  9378. return WOLFSSL_BAD_FILE;
  9379. }
  9380. /* cache header */
  9381. ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file);
  9382. if (ret != 1) {
  9383. WOLFSSL_MSG("Session cache header file read failed");
  9384. XFCLOSE(file);
  9385. return FREAD_ERROR;
  9386. }
  9387. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9388. cache_header.rows != SESSION_ROWS ||
  9389. cache_header.columns != SESSIONS_PER_ROW ||
  9390. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9391. WOLFSSL_MSG("Session cache header match failed");
  9392. XFCLOSE(file);
  9393. return CACHE_MATCH_ERROR;
  9394. }
  9395. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9396. if (wc_LockMutex(&session_mutex) != 0) {
  9397. WOLFSSL_MSG("Session cache mutex lock failed");
  9398. XFCLOSE(file);
  9399. return BAD_MUTEX_E;
  9400. }
  9401. #endif
  9402. /* session cache */
  9403. for (i = 0; i < cache_header.rows; ++i) {
  9404. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9405. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9406. WOLFSSL_MSG("Session row cache mutex lock failed");
  9407. XFCLOSE(file);
  9408. return BAD_MUTEX_E;
  9409. }
  9410. #endif
  9411. ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9412. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9413. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9414. #endif
  9415. if (ret != 1) {
  9416. WOLFSSL_MSG("Session cache member file read failed");
  9417. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9418. rc = FREAD_ERROR;
  9419. break;
  9420. }
  9421. }
  9422. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9423. wc_UnLockMutex(&session_mutex);
  9424. #endif
  9425. #ifndef NO_CLIENT_CACHE
  9426. /* client cache */
  9427. if (wc_LockMutex(&clisession_mutex) != 0) {
  9428. WOLFSSL_MSG("Client cache mutex lock failed");
  9429. XFCLOSE(file);
  9430. return BAD_MUTEX_E;
  9431. }
  9432. ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file);
  9433. if (ret != 1) {
  9434. WOLFSSL_MSG("Client cache member file read failed");
  9435. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9436. rc = FREAD_ERROR;
  9437. }
  9438. wc_UnLockMutex(&clisession_mutex);
  9439. #endif /* !NO_CLIENT_CACHE */
  9440. XFCLOSE(file);
  9441. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9442. return rc;
  9443. }
  9444. #endif /* !NO_FILESYSTEM */
  9445. #endif /* PERSIST_SESSION_CACHE */
  9446. #endif /* NO_SESSION_CACHE */
  9447. void wolfSSL_load_error_strings(void)
  9448. {
  9449. /* compatibility only */
  9450. }
  9451. int wolfSSL_library_init(void)
  9452. {
  9453. WOLFSSL_ENTER("SSL_library_init");
  9454. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9455. return WOLFSSL_SUCCESS;
  9456. else
  9457. return WOLFSSL_FATAL_ERROR;
  9458. }
  9459. #ifdef HAVE_SECRET_CALLBACK
  9460. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9461. {
  9462. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9463. if (ssl == NULL)
  9464. return WOLFSSL_FATAL_ERROR;
  9465. ssl->sessionSecretCb = cb;
  9466. ssl->sessionSecretCtx = ctx;
  9467. if (cb != NULL) {
  9468. /* If using a pre-set key, assume session resumption. */
  9469. ssl->session->sessionIDSz = 0;
  9470. ssl->options.resuming = 1;
  9471. }
  9472. return WOLFSSL_SUCCESS;
  9473. }
  9474. #endif
  9475. #ifndef NO_SESSION_CACHE
  9476. /* on by default if built in but allow user to turn off */
  9477. WOLFSSL_ABI
  9478. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9479. {
  9480. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  9481. if (ctx == NULL)
  9482. return WOLFSSL_FAILURE;
  9483. if (mode == WOLFSSL_SESS_CACHE_OFF)
  9484. ctx->sessionCacheOff = 1;
  9485. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  9486. ctx->sessionCacheFlushOff = 1;
  9487. #ifdef HAVE_EXT_CACHE
  9488. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  9489. ctx->internalCacheOff = 1;
  9490. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0)
  9491. ctx->internalCacheLookupOff = 1;
  9492. #endif
  9493. return WOLFSSL_SUCCESS;
  9494. }
  9495. #endif /* NO_SESSION_CACHE */
  9496. #if !defined(NO_CERTS)
  9497. #if defined(PERSIST_CERT_CACHE)
  9498. #define WOLFSSL_CACHE_CERT_VERSION 1
  9499. typedef struct {
  9500. int version; /* cache cert layout version id */
  9501. int rows; /* hash table rows, CA_TABLE_SIZE */
  9502. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  9503. int signerSz; /* sizeof Signer object */
  9504. } CertCacheHeader;
  9505. /* current cert persistence layout is:
  9506. 1) CertCacheHeader
  9507. 2) caTable
  9508. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  9509. PERSIST_CERT_CACHE functions
  9510. */
  9511. /* Return memory needed to persist this signer, have lock */
  9512. static WC_INLINE int GetSignerMemory(Signer* signer)
  9513. {
  9514. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  9515. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9516. #if !defined(NO_SKID)
  9517. sz += (int)sizeof(signer->subjectKeyIdHash);
  9518. #endif
  9519. /* add dynamic bytes needed */
  9520. sz += signer->pubKeySize;
  9521. sz += signer->nameLen;
  9522. return sz;
  9523. }
  9524. /* Return memory needed to persist this row, have lock */
  9525. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  9526. {
  9527. int sz = 0;
  9528. while (row) {
  9529. sz += GetSignerMemory(row);
  9530. row = row->next;
  9531. }
  9532. return sz;
  9533. }
  9534. /* get the size of persist cert cache, have lock */
  9535. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9536. {
  9537. int sz;
  9538. int i;
  9539. sz = sizeof(CertCacheHeader);
  9540. for (i = 0; i < CA_TABLE_SIZE; i++)
  9541. sz += GetCertCacheRowMemory(cm->caTable[i]);
  9542. return sz;
  9543. }
  9544. /* Store cert cache header columns with number of items per list, have lock */
  9545. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  9546. {
  9547. int i;
  9548. Signer* row;
  9549. for (i = 0; i < CA_TABLE_SIZE; i++) {
  9550. int count = 0;
  9551. row = cm->caTable[i];
  9552. while (row) {
  9553. ++count;
  9554. row = row->next;
  9555. }
  9556. columns[i] = count;
  9557. }
  9558. }
  9559. /* Restore whole cert row from memory, have lock, return bytes consumed,
  9560. < 0 on error, have lock */
  9561. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  9562. int row, int listSz, const byte* end)
  9563. {
  9564. int idx = 0;
  9565. if (listSz < 0) {
  9566. WOLFSSL_MSG("Row header corrupted, negative value");
  9567. return PARSE_ERROR;
  9568. }
  9569. while (listSz) {
  9570. Signer* signer;
  9571. byte* publicKey;
  9572. byte* start = current + idx; /* for end checks on this signer */
  9573. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  9574. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9575. #ifndef NO_SKID
  9576. minSz += (int)sizeof(signer->subjectKeyIdHash);
  9577. #endif
  9578. if (start + minSz > end) {
  9579. WOLFSSL_MSG("Would overread restore buffer");
  9580. return BUFFER_E;
  9581. }
  9582. signer = MakeSigner(cm->heap);
  9583. if (signer == NULL)
  9584. return MEMORY_E;
  9585. /* pubKeySize */
  9586. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  9587. idx += (int)sizeof(signer->pubKeySize);
  9588. /* keyOID */
  9589. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  9590. idx += (int)sizeof(signer->keyOID);
  9591. /* publicKey */
  9592. if (start + minSz + signer->pubKeySize > end) {
  9593. WOLFSSL_MSG("Would overread restore buffer");
  9594. FreeSigner(signer, cm->heap);
  9595. return BUFFER_E;
  9596. }
  9597. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  9598. DYNAMIC_TYPE_KEY);
  9599. if (publicKey == NULL) {
  9600. FreeSigner(signer, cm->heap);
  9601. return MEMORY_E;
  9602. }
  9603. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  9604. signer->publicKey = publicKey;
  9605. idx += signer->pubKeySize;
  9606. /* nameLen */
  9607. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  9608. idx += (int)sizeof(signer->nameLen);
  9609. /* name */
  9610. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  9611. WOLFSSL_MSG("Would overread restore buffer");
  9612. FreeSigner(signer, cm->heap);
  9613. return BUFFER_E;
  9614. }
  9615. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  9616. DYNAMIC_TYPE_SUBJECT_CN);
  9617. if (signer->name == NULL) {
  9618. FreeSigner(signer, cm->heap);
  9619. return MEMORY_E;
  9620. }
  9621. XMEMCPY(signer->name, current + idx, signer->nameLen);
  9622. idx += signer->nameLen;
  9623. /* subjectNameHash */
  9624. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  9625. idx += SIGNER_DIGEST_SIZE;
  9626. #ifndef NO_SKID
  9627. /* subjectKeyIdHash */
  9628. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  9629. idx += SIGNER_DIGEST_SIZE;
  9630. #endif
  9631. signer->next = cm->caTable[row];
  9632. cm->caTable[row] = signer;
  9633. --listSz;
  9634. }
  9635. return idx;
  9636. }
  9637. /* Store whole cert row into memory, have lock, return bytes added */
  9638. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  9639. {
  9640. int added = 0;
  9641. Signer* list = cm->caTable[row];
  9642. while (list) {
  9643. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  9644. added += (int)sizeof(list->pubKeySize);
  9645. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  9646. added += (int)sizeof(list->keyOID);
  9647. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  9648. added += list->pubKeySize;
  9649. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  9650. added += (int)sizeof(list->nameLen);
  9651. XMEMCPY(current + added, list->name, list->nameLen);
  9652. added += list->nameLen;
  9653. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  9654. added += SIGNER_DIGEST_SIZE;
  9655. #ifndef NO_SKID
  9656. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  9657. added += SIGNER_DIGEST_SIZE;
  9658. #endif
  9659. list = list->next;
  9660. }
  9661. return added;
  9662. }
  9663. /* Persist cert cache to memory, have lock */
  9664. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  9665. void* mem, int sz)
  9666. {
  9667. int realSz;
  9668. int ret = WOLFSSL_SUCCESS;
  9669. int i;
  9670. WOLFSSL_ENTER("DoMemSaveCertCache");
  9671. realSz = GetCertCacheMemSize(cm);
  9672. if (realSz > sz) {
  9673. WOLFSSL_MSG("Mem output buffer too small");
  9674. ret = BUFFER_E;
  9675. }
  9676. else {
  9677. byte* current;
  9678. CertCacheHeader hdr;
  9679. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  9680. hdr.rows = CA_TABLE_SIZE;
  9681. SetCertHeaderColumns(cm, hdr.columns);
  9682. hdr.signerSz = (int)sizeof(Signer);
  9683. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  9684. current = (byte*)mem + sizeof(CertCacheHeader);
  9685. for (i = 0; i < CA_TABLE_SIZE; ++i)
  9686. current += StoreCertRow(cm, current, i);
  9687. }
  9688. return ret;
  9689. }
  9690. #if !defined(NO_FILESYSTEM)
  9691. /* Persist cert cache to file */
  9692. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9693. {
  9694. XFILE file;
  9695. int rc = WOLFSSL_SUCCESS;
  9696. int memSz;
  9697. byte* mem;
  9698. WOLFSSL_ENTER("CM_SaveCertCache");
  9699. file = XFOPEN(fname, "w+b");
  9700. if (file == XBADFILE) {
  9701. WOLFSSL_MSG("Couldn't open cert cache save file");
  9702. return WOLFSSL_BAD_FILE;
  9703. }
  9704. if (wc_LockMutex(&cm->caLock) != 0) {
  9705. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9706. XFCLOSE(file);
  9707. return BAD_MUTEX_E;
  9708. }
  9709. memSz = GetCertCacheMemSize(cm);
  9710. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9711. if (mem == NULL) {
  9712. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9713. rc = MEMORY_E;
  9714. } else {
  9715. rc = DoMemSaveCertCache(cm, mem, memSz);
  9716. if (rc == WOLFSSL_SUCCESS) {
  9717. int ret = (int)XFWRITE(mem, memSz, 1, file);
  9718. if (ret != 1) {
  9719. WOLFSSL_MSG("Cert cache file write failed");
  9720. rc = FWRITE_ERROR;
  9721. }
  9722. }
  9723. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9724. }
  9725. wc_UnLockMutex(&cm->caLock);
  9726. XFCLOSE(file);
  9727. return rc;
  9728. }
  9729. /* Restore cert cache from file */
  9730. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9731. {
  9732. XFILE file;
  9733. int rc = WOLFSSL_SUCCESS;
  9734. int ret;
  9735. int memSz;
  9736. byte* mem;
  9737. WOLFSSL_ENTER("CM_RestoreCertCache");
  9738. file = XFOPEN(fname, "rb");
  9739. if (file == XBADFILE) {
  9740. WOLFSSL_MSG("Couldn't open cert cache save file");
  9741. return WOLFSSL_BAD_FILE;
  9742. }
  9743. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  9744. XFCLOSE(file);
  9745. return WOLFSSL_BAD_FILE;
  9746. }
  9747. memSz = (int)XFTELL(file);
  9748. XREWIND(file);
  9749. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  9750. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  9751. XFCLOSE(file);
  9752. return WOLFSSL_BAD_FILE;
  9753. }
  9754. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9755. if (mem == NULL) {
  9756. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9757. XFCLOSE(file);
  9758. return MEMORY_E;
  9759. }
  9760. ret = (int)XFREAD(mem, memSz, 1, file);
  9761. if (ret != 1) {
  9762. WOLFSSL_MSG("Cert file read error");
  9763. rc = FREAD_ERROR;
  9764. } else {
  9765. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9766. if (rc != WOLFSSL_SUCCESS) {
  9767. WOLFSSL_MSG("Mem restore cert cache failed");
  9768. }
  9769. }
  9770. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9771. XFCLOSE(file);
  9772. return rc;
  9773. }
  9774. #endif /* NO_FILESYSTEM */
  9775. /* Persist cert cache to memory */
  9776. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9777. {
  9778. int ret = WOLFSSL_SUCCESS;
  9779. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9780. if (wc_LockMutex(&cm->caLock) != 0) {
  9781. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9782. return BAD_MUTEX_E;
  9783. }
  9784. ret = DoMemSaveCertCache(cm, mem, sz);
  9785. if (ret == WOLFSSL_SUCCESS)
  9786. *used = GetCertCacheMemSize(cm);
  9787. wc_UnLockMutex(&cm->caLock);
  9788. return ret;
  9789. }
  9790. /* Restore cert cache from memory */
  9791. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9792. {
  9793. int ret = WOLFSSL_SUCCESS;
  9794. int i;
  9795. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9796. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9797. byte* end = (byte*)mem + sz; /* don't go over */
  9798. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9799. if (current > end) {
  9800. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9801. return BUFFER_E;
  9802. }
  9803. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9804. hdr->rows != CA_TABLE_SIZE ||
  9805. hdr->signerSz != (int)sizeof(Signer)) {
  9806. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9807. return CACHE_MATCH_ERROR;
  9808. }
  9809. if (wc_LockMutex(&cm->caLock) != 0) {
  9810. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9811. return BAD_MUTEX_E;
  9812. }
  9813. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9814. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9815. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9816. if (added < 0) {
  9817. WOLFSSL_MSG("RestoreCertRow error");
  9818. ret = added;
  9819. break;
  9820. }
  9821. current += added;
  9822. }
  9823. wc_UnLockMutex(&cm->caLock);
  9824. return ret;
  9825. }
  9826. /* get how big the the cert cache save buffer needs to be */
  9827. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9828. {
  9829. int sz;
  9830. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9831. if (wc_LockMutex(&cm->caLock) != 0) {
  9832. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9833. return BAD_MUTEX_E;
  9834. }
  9835. sz = GetCertCacheMemSize(cm);
  9836. wc_UnLockMutex(&cm->caLock);
  9837. return sz;
  9838. }
  9839. #endif /* PERSIST_CERT_CACHE */
  9840. #endif /* NO_CERTS */
  9841. #ifdef OPENSSL_EXTRA
  9842. /*
  9843. * build enabled cipher list w/ TLS13 or w/o TLS13 suites
  9844. * @param ctx a pointer to WOLFSSL_CTX structure
  9845. * @param suites currently enabled suites
  9846. * @param onlytlsv13suites flag whether correcting w/ TLS13 suites
  9847. * or w/o TLS13 suties
  9848. * @param list suites list that user wants to update
  9849. * @return suites list on success, otherwise NULL
  9850. */
  9851. static char* buildEnabledCipherList(WOLFSSL_CTX* ctx, Suites* suites,
  9852. int tls13Only, const char* list)
  9853. {
  9854. word32 idx = 0;
  9855. word32 listsz = 0;
  9856. word32 len = 0;
  9857. word32 ianasz = 0;
  9858. const char* enabledcs = NULL;
  9859. char* locallist = NULL;
  9860. char* head = NULL;
  9861. byte cipherSuite0;
  9862. byte cipherSuite;
  9863. /* sanity check */
  9864. if (ctx == NULL || suites == NULL || list == NULL)
  9865. return NULL;
  9866. if (!suites->setSuites)
  9867. return NULL;
  9868. listsz = (word32)XSTRLEN(list);
  9869. /* calculate necessary buffer length */
  9870. for(idx = 0; idx < suites->suiteSz; idx++) {
  9871. cipherSuite0 = suites->suites[idx];
  9872. cipherSuite = suites->suites[++idx];
  9873. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  9874. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9875. }
  9876. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  9877. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9878. }
  9879. else
  9880. continue;
  9881. if (XSTRCMP(enabledcs, "None") != 0) {
  9882. len += (word32)XSTRLEN(enabledcs) + 2;
  9883. }
  9884. }
  9885. len += listsz + 2;
  9886. /* build string */
  9887. if (len > (listsz + 2)) {
  9888. locallist = (char*)XMALLOC(len, ctx->heap,
  9889. DYNAMIC_TYPE_TMP_BUFFER);
  9890. /* sanity check */
  9891. if (!locallist)
  9892. return NULL;
  9893. XMEMSET(locallist, 0, len);
  9894. head = locallist;
  9895. if (!tls13Only)
  9896. {
  9897. /* always tls13 suites in the head position */
  9898. XSTRNCPY(locallist, list, len);
  9899. locallist += listsz;
  9900. *locallist++ = ':';
  9901. *locallist = 0;
  9902. len -= listsz + 1;
  9903. }
  9904. for(idx = 0; idx < suites->suiteSz; idx++) {
  9905. cipherSuite0 = suites->suites[idx];
  9906. cipherSuite = suites->suites[++idx];
  9907. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  9908. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9909. }
  9910. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  9911. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9912. }
  9913. else
  9914. continue;
  9915. ianasz = (int)XSTRLEN(enabledcs);
  9916. if (ianasz + 1 < len) {
  9917. XSTRNCPY(locallist, enabledcs, len);
  9918. locallist += ianasz;
  9919. *locallist++ = ':';
  9920. *locallist = 0;
  9921. len -= ianasz + 1;
  9922. }
  9923. else{
  9924. XFREE(locallist, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9925. return NULL;
  9926. }
  9927. }
  9928. if (tls13Only) {
  9929. XSTRNCPY(locallist, list, len);
  9930. locallist += listsz;
  9931. *locallist = 0;
  9932. }
  9933. return head;
  9934. }
  9935. else
  9936. return NULL;
  9937. }
  9938. /*
  9939. * check if the list has TLS13 and pre-TLS13 suites
  9940. * @param list cipher suite list that user want to set
  9941. * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2
  9942. */
  9943. static int CheckcipherList(const char* list)
  9944. {
  9945. int ret;
  9946. int findTLSv13Suites = 0;
  9947. int findbeforeSuites = 0;
  9948. byte cipherSuite0;
  9949. byte cipherSuite1;
  9950. int flags;
  9951. char* next = (char*)list;
  9952. do {
  9953. char* current = next;
  9954. char name[MAX_SUITE_NAME + 1];
  9955. word32 length = MAX_SUITE_NAME;
  9956. word32 current_length;
  9957. next = XSTRSTR(next, ":");
  9958. current_length = (!next) ? (word32)XSTRLEN(current)
  9959. : (word32)(next - current);
  9960. if (current_length < length) {
  9961. length = current_length;
  9962. }
  9963. XMEMCPY(name, current, length);
  9964. name[length] = 0;
  9965. ret = wolfSSL_get_cipher_suite_from_name(name, &cipherSuite0,
  9966. &cipherSuite1, &flags);
  9967. if (ret == 0) {
  9968. if (cipherSuite0 == TLS13_BYTE) {
  9969. /* TLSv13 suite */
  9970. findTLSv13Suites = 1;
  9971. break;
  9972. }
  9973. else {
  9974. findbeforeSuites = 1;
  9975. break;
  9976. }
  9977. }
  9978. if (findTLSv13Suites == 1 && findbeforeSuites == 1) {
  9979. /* list has mixed suites */
  9980. return 0;
  9981. }
  9982. } while (next++); /* ++ needed to skip ':' */
  9983. if (findTLSv13Suites == 0 && findbeforeSuites == 1) {
  9984. return 1;/* only before TLSv13 suites */
  9985. }
  9986. else if (findTLSv13Suites == 1 && findbeforeSuites == 0) {
  9987. return 2;/* only TLSv13 suties */
  9988. }
  9989. else {
  9990. return 0;/* handle as mixed */
  9991. }
  9992. }
  9993. /* parse some bulk lists like !eNULL / !aNULL
  9994. *
  9995. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9996. */
  9997. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9998. const char* list)
  9999. {
  10000. int ret = 0;
  10001. int listattribute = 0;
  10002. char* buildcipherList = NULL;
  10003. int tls13Only = 0;
  10004. if (suites == NULL || list == NULL) {
  10005. WOLFSSL_MSG("NULL argument");
  10006. return WOLFSSL_FAILURE;
  10007. }
  10008. listattribute = CheckcipherList(list);
  10009. if (listattribute == 0) {
  10010. /* list has mixed(pre-TLSv13 and TLSv13) suites
  10011. * update cipher suites the same as before
  10012. */
  10013. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  10014. WOLFSSL_FAILURE;
  10015. }
  10016. else if (listattribute == 1) {
  10017. /* list has only pre-TLSv13 suites.
  10018. * Only update before TLSv13 suites.
  10019. */
  10020. tls13Only = 1;
  10021. }
  10022. else if (listattribute == 2) {
  10023. /* list has only TLSv13 suites. Only update TLv13 suites
  10024. * simulate set_ciphersuites() compatibility layer API
  10025. */
  10026. tls13Only = 0;
  10027. }
  10028. buildcipherList = buildEnabledCipherList(ctx, ctx->suites,
  10029. tls13Only, list);
  10030. if (buildcipherList) {
  10031. ret = SetCipherList(ctx, suites, buildcipherList);
  10032. XFREE(buildcipherList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10033. }
  10034. else {
  10035. ret = SetCipherList(ctx, suites, list);
  10036. }
  10037. return ret;
  10038. }
  10039. #endif
  10040. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  10041. {
  10042. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  10043. if (ctx == NULL)
  10044. return WOLFSSL_FAILURE;
  10045. /* alloc/init on demand only */
  10046. if (ctx->suites == NULL) {
  10047. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  10048. DYNAMIC_TYPE_SUITES);
  10049. if (ctx->suites == NULL) {
  10050. WOLFSSL_MSG("Memory alloc for Suites failed");
  10051. return WOLFSSL_FAILURE;
  10052. }
  10053. XMEMSET(ctx->suites, 0, sizeof(Suites));
  10054. }
  10055. #ifdef OPENSSL_EXTRA
  10056. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  10057. #else
  10058. return (SetCipherList(ctx, ctx->suites, list)) ?
  10059. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10060. #endif
  10061. }
  10062. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10063. int wolfSSL_CTX_set_cipher_list_bytes(WOLFSSL_CTX* ctx, const byte* list,
  10064. const int listSz)
  10065. {
  10066. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list_bytes");
  10067. if (ctx == NULL)
  10068. return WOLFSSL_FAILURE;
  10069. /* alloc/init on demand only */
  10070. if (ctx->suites == NULL) {
  10071. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  10072. DYNAMIC_TYPE_SUITES);
  10073. if (ctx->suites == NULL) {
  10074. WOLFSSL_MSG("Memory alloc for Suites failed");
  10075. return WOLFSSL_FAILURE;
  10076. }
  10077. XMEMSET(ctx->suites, 0, sizeof(Suites));
  10078. }
  10079. return (SetCipherListFromBytes(ctx, ctx->suites, list, listSz)) ?
  10080. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10081. }
  10082. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10083. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  10084. {
  10085. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  10086. if (ssl == NULL || ssl->ctx == NULL) {
  10087. return WOLFSSL_FAILURE;
  10088. }
  10089. #ifdef SINGLE_THREADED
  10090. if (ssl->ctx->suites == ssl->suites) {
  10091. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  10092. DYNAMIC_TYPE_SUITES);
  10093. if (ssl->suites == NULL) {
  10094. WOLFSSL_MSG("Suites Memory error");
  10095. return MEMORY_E;
  10096. }
  10097. *ssl->suites = *ssl->ctx->suites;
  10098. ssl->options.ownSuites = 1;
  10099. }
  10100. #endif
  10101. #ifdef OPENSSL_EXTRA
  10102. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  10103. #else
  10104. return (SetCipherList(ssl->ctx, ssl->suites, list)) ?
  10105. WOLFSSL_SUCCESS :
  10106. WOLFSSL_FAILURE;
  10107. #endif
  10108. }
  10109. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  10110. int wolfSSL_set_cipher_list_bytes(WOLFSSL* ssl, const byte* list,
  10111. const int listSz)
  10112. {
  10113. WOLFSSL_ENTER("wolfSSL_set_cipher_list_bytes");
  10114. if (ssl == NULL || ssl->ctx == NULL) {
  10115. return WOLFSSL_FAILURE;
  10116. }
  10117. #ifdef SINGLE_THREADED
  10118. if (ssl->ctx->suites == ssl->suites) {
  10119. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  10120. DYNAMIC_TYPE_SUITES);
  10121. if (ssl->suites == NULL) {
  10122. WOLFSSL_MSG("Suites Memory error");
  10123. return MEMORY_E;
  10124. }
  10125. *ssl->suites = *ssl->ctx->suites;
  10126. ssl->options.ownSuites = 1;
  10127. }
  10128. #endif
  10129. return (SetCipherListFromBytes(ssl->ctx, ssl->suites, list, listSz))
  10130. ? WOLFSSL_SUCCESS
  10131. : WOLFSSL_FAILURE;
  10132. }
  10133. #endif /* OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES */
  10134. #ifdef HAVE_KEYING_MATERIAL
  10135. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  10136. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  10137. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  10138. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  10139. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  10140. static const struct ForbiddenLabels {
  10141. const char* label;
  10142. size_t labelLen;
  10143. } forbiddenLabels[] = {
  10144. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  10145. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  10146. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  10147. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  10148. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  10149. {NULL, 0},
  10150. };
  10151. /**
  10152. * Implement RFC 5705
  10153. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  10154. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  10155. */
  10156. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  10157. unsigned char *out, size_t outLen,
  10158. const char *label, size_t labelLen,
  10159. const unsigned char *context, size_t contextLen,
  10160. int use_context)
  10161. {
  10162. byte* seed = NULL;
  10163. word32 seedLen;
  10164. const struct ForbiddenLabels* fl;
  10165. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  10166. if (ssl == NULL || out == NULL || label == NULL ||
  10167. (use_context && contextLen && context == NULL)) {
  10168. WOLFSSL_MSG("Bad argument");
  10169. return WOLFSSL_FAILURE;
  10170. }
  10171. /* clientRandom + serverRandom
  10172. * OR
  10173. * clientRandom + serverRandom + ctx len encoding + ctx */
  10174. seedLen = !use_context ? (word32)SEED_LEN :
  10175. (word32)SEED_LEN + 2 + (word32)contextLen;
  10176. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  10177. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  10178. "data. Call wolfSSL_KeepArrays before attempting to "
  10179. "export keyid material.");
  10180. return WOLFSSL_FAILURE;
  10181. }
  10182. /* check forbidden labels */
  10183. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  10184. if (labelLen >= fl->labelLen &&
  10185. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  10186. WOLFSSL_MSG("Forbidden label");
  10187. return WOLFSSL_FAILURE;
  10188. }
  10189. }
  10190. #ifdef WOLFSSL_TLS13
  10191. if (IsAtLeastTLSv1_3(ssl->version)) {
  10192. /* Path for TLS 1.3 */
  10193. if (!use_context) {
  10194. contextLen = 0;
  10195. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  10196. }
  10197. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  10198. context, contextLen) != 0) {
  10199. WOLFSSL_MSG("Tls13_Exporter error");
  10200. return WOLFSSL_FAILURE;
  10201. }
  10202. return WOLFSSL_SUCCESS;
  10203. }
  10204. #endif
  10205. /* Path for <=TLS 1.2 */
  10206. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10207. if (seed == NULL) {
  10208. WOLFSSL_MSG("malloc error");
  10209. return WOLFSSL_FAILURE;
  10210. }
  10211. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  10212. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  10213. if (use_context) {
  10214. /* Encode len in big endian */
  10215. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  10216. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  10217. if (contextLen) {
  10218. /* 0 length context is allowed */
  10219. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  10220. }
  10221. }
  10222. PRIVATE_KEY_UNLOCK();
  10223. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  10224. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  10225. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  10226. WOLFSSL_MSG("wc_PRF_TLS error");
  10227. PRIVATE_KEY_LOCK();
  10228. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10229. return WOLFSSL_FAILURE;
  10230. }
  10231. PRIVATE_KEY_LOCK();
  10232. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10233. return WOLFSSL_SUCCESS;
  10234. }
  10235. #endif /* HAVE_KEYING_MATERIAL */
  10236. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  10237. {
  10238. int useNb = 0;
  10239. if (ssl == NULL)
  10240. return WOLFSSL_FAILURE;
  10241. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  10242. if (ssl->options.dtls) {
  10243. #ifdef WOLFSSL_DTLS
  10244. useNb = ssl->options.dtlsUseNonblock;
  10245. #endif
  10246. }
  10247. else {
  10248. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  10249. "DEPRECATED for non-DTLS use.");
  10250. }
  10251. return useNb;
  10252. }
  10253. #ifndef WOLFSSL_LEANPSK
  10254. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  10255. {
  10256. (void)nonblock;
  10257. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  10258. if (ssl == NULL)
  10259. return;
  10260. if (ssl->options.dtls) {
  10261. #ifdef WOLFSSL_DTLS
  10262. ssl->options.dtlsUseNonblock = (nonblock != 0);
  10263. #endif
  10264. }
  10265. else {
  10266. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  10267. "DEPRECATED for non-DTLS use.");
  10268. }
  10269. }
  10270. #ifdef WOLFSSL_DTLS
  10271. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  10272. {
  10273. int timeout = 0;
  10274. if (ssl)
  10275. timeout = ssl->dtls_timeout;
  10276. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  10277. return timeout;
  10278. }
  10279. #ifdef WOLFSSL_DTLS13
  10280. /*
  10281. * This API returns 1 when the user should set a short timeout for receiving
  10282. * data. It is recommended that it is at most 1/4 the value returned by
  10283. * wolfSSL_dtls_get_current_timeout().
  10284. */
  10285. int wolfSSL_dtls13_use_quick_timeout(WOLFSSL* ssl)
  10286. {
  10287. return ssl->dtls13FastTimeout;
  10288. }
  10289. /*
  10290. * When this is set, a DTLS 1.3 connection will send acks immediately when a
  10291. * disruption is detected to shortcut timeouts. This results in potentially
  10292. * more traffic but may make the handshake quicker.
  10293. */
  10294. void wolfSSL_dtls13_set_send_more_acks(WOLFSSL* ssl, int value)
  10295. {
  10296. if (ssl != NULL)
  10297. ssl->options.dtls13SendMoreAcks = !!value;
  10298. }
  10299. #endif /* WOLFSSL_DTLS13 */
  10300. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  10301. {
  10302. if (ssl && timeleft) {
  10303. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  10304. timeleft->tv_sec = ssl->dtls_timeout;
  10305. }
  10306. return 0;
  10307. }
  10308. #ifndef NO_WOLFSSL_STUB
  10309. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10310. {
  10311. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10312. (void)ssl;
  10313. return 0;
  10314. }
  10315. #endif
  10316. #ifndef NO_WOLFSSL_STUB
  10317. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10318. {
  10319. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10320. (void)ssl;
  10321. (void)duration_ms;
  10322. }
  10323. #endif
  10324. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10325. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10326. {
  10327. if (ssl == NULL || timeout < 0)
  10328. return BAD_FUNC_ARG;
  10329. if (timeout > ssl->dtls_timeout_max) {
  10330. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10331. return BAD_FUNC_ARG;
  10332. }
  10333. ssl->dtls_timeout_init = timeout;
  10334. ssl->dtls_timeout = timeout;
  10335. return WOLFSSL_SUCCESS;
  10336. }
  10337. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10338. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10339. {
  10340. if (ssl == NULL || timeout < 0)
  10341. return BAD_FUNC_ARG;
  10342. if (timeout < ssl->dtls_timeout_init) {
  10343. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10344. return BAD_FUNC_ARG;
  10345. }
  10346. ssl->dtls_timeout_max = timeout;
  10347. return WOLFSSL_SUCCESS;
  10348. }
  10349. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10350. {
  10351. int result = WOLFSSL_SUCCESS;
  10352. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  10353. if (ssl == NULL)
  10354. return WOLFSSL_FATAL_ERROR;
  10355. #ifdef WOLFSSL_DTLS13
  10356. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  10357. result = Dtls13RtxTimeout(ssl);
  10358. if (result < 0) {
  10359. if (result == WANT_WRITE)
  10360. ssl->dtls13SendingAckOrRtx = 1;
  10361. ssl->error = result;
  10362. WOLFSSL_ERROR(result);
  10363. return WOLFSSL_FATAL_ERROR;
  10364. }
  10365. return WOLFSSL_SUCCESS;
  10366. }
  10367. #endif /* WOLFSSL_DTLS13 */
  10368. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  10369. if (DtlsMsgPoolTimeout(ssl) < 0){
  10370. ssl->error = SOCKET_ERROR_E;
  10371. WOLFSSL_ERROR(ssl->error);
  10372. result = WOLFSSL_FATAL_ERROR;
  10373. }
  10374. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  10375. ssl->error = result;
  10376. WOLFSSL_ERROR(result);
  10377. result = WOLFSSL_FATAL_ERROR;
  10378. }
  10379. else {
  10380. /* Reset return value to success */
  10381. result = WOLFSSL_SUCCESS;
  10382. }
  10383. }
  10384. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  10385. return result;
  10386. }
  10387. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10388. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10389. {
  10390. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  10391. if (ssl == NULL)
  10392. return WOLFSSL_FATAL_ERROR;
  10393. if (!ssl->options.handShakeDone) {
  10394. int result = DtlsMsgPoolSend(ssl, 0);
  10395. if (result < 0) {
  10396. ssl->error = result;
  10397. WOLFSSL_ERROR(result);
  10398. return WOLFSSL_FATAL_ERROR;
  10399. }
  10400. }
  10401. return 0;
  10402. }
  10403. #endif /* DTLS */
  10404. #endif /* LEANPSK */
  10405. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10406. /* Not an SSL function, return 0 for success, error code otherwise */
  10407. /* Prereq: ssl's RNG needs to be initialized. */
  10408. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10409. const byte* secret, word32 secretSz)
  10410. {
  10411. int ret = 0;
  10412. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10413. if (ssl == NULL) {
  10414. WOLFSSL_MSG("need a SSL object");
  10415. return BAD_FUNC_ARG;
  10416. }
  10417. if (secret != NULL && secretSz == 0) {
  10418. WOLFSSL_MSG("can't have a new secret without a size");
  10419. return BAD_FUNC_ARG;
  10420. }
  10421. /* If secretSz is 0, use the default size. */
  10422. if (secretSz == 0)
  10423. secretSz = COOKIE_SECRET_SZ;
  10424. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10425. byte* newSecret;
  10426. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10427. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10428. ssl->buffers.dtlsCookieSecret.length);
  10429. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10430. ssl->heap, DYNAMIC_TYPE_NONE);
  10431. }
  10432. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10433. if (newSecret == NULL) {
  10434. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10435. ssl->buffers.dtlsCookieSecret.length = 0;
  10436. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10437. return MEMORY_ERROR;
  10438. }
  10439. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10440. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10441. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10442. wc_MemZero_Add("wolfSSL_DTLS_SetCookieSecret secret",
  10443. ssl->buffers.dtlsCookieSecret.buffer,
  10444. ssl->buffers.dtlsCookieSecret.length);
  10445. #endif
  10446. }
  10447. /* If the supplied secret is NULL, randomly generate a new secret. */
  10448. if (secret == NULL) {
  10449. ret = wc_RNG_GenerateBlock(ssl->rng,
  10450. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10451. }
  10452. else
  10453. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10454. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10455. return ret;
  10456. }
  10457. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10458. /* EITHER SIDE METHODS */
  10459. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10460. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10461. {
  10462. return wolfSSLv23_method_ex(NULL);
  10463. }
  10464. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10465. {
  10466. WOLFSSL_METHOD* m = NULL;
  10467. WOLFSSL_ENTER("SSLv23_method");
  10468. #if !defined(NO_WOLFSSL_CLIENT)
  10469. m = wolfSSLv23_client_method_ex(heap);
  10470. #elif !defined(NO_WOLFSSL_SERVER)
  10471. m = wolfSSLv23_server_method_ex(heap);
  10472. #else
  10473. (void)heap;
  10474. #endif
  10475. if (m != NULL) {
  10476. m->side = WOLFSSL_NEITHER_END;
  10477. }
  10478. return m;
  10479. }
  10480. #ifdef WOLFSSL_ALLOW_SSLV3
  10481. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10482. {
  10483. return wolfSSLv3_method_ex(NULL);
  10484. }
  10485. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10486. {
  10487. WOLFSSL_METHOD* m = NULL;
  10488. WOLFSSL_ENTER("SSLv3_method");
  10489. #if !defined(NO_WOLFSSL_CLIENT)
  10490. m = wolfSSLv3_client_method_ex(heap);
  10491. #elif !defined(NO_WOLFSSL_SERVER)
  10492. m = wolfSSLv3_server_method_ex(heap);
  10493. #endif
  10494. if (m != NULL) {
  10495. m->side = WOLFSSL_NEITHER_END;
  10496. }
  10497. return m;
  10498. }
  10499. #endif
  10500. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10501. /* client only parts */
  10502. #ifndef NO_WOLFSSL_CLIENT
  10503. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  10504. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10505. {
  10506. WOLFSSL_STUB("wolfSSLv2_client_method");
  10507. return NULL;
  10508. }
  10509. #endif
  10510. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10511. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10512. {
  10513. return wolfSSLv3_client_method_ex(NULL);
  10514. }
  10515. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10516. {
  10517. WOLFSSL_METHOD* method =
  10518. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10519. heap, DYNAMIC_TYPE_METHOD);
  10520. (void)heap;
  10521. WOLFSSL_ENTER("SSLv3_client_method_ex");
  10522. if (method)
  10523. InitSSL_Method(method, MakeSSLv3());
  10524. return method;
  10525. }
  10526. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10527. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10528. {
  10529. return wolfSSLv23_client_method_ex(NULL);
  10530. }
  10531. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10532. {
  10533. WOLFSSL_METHOD* method =
  10534. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10535. heap, DYNAMIC_TYPE_METHOD);
  10536. (void)heap;
  10537. WOLFSSL_ENTER("SSLv23_client_method_ex");
  10538. if (method) {
  10539. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10540. #if defined(WOLFSSL_TLS13)
  10541. InitSSL_Method(method, MakeTLSv1_3());
  10542. #elif !defined(WOLFSSL_NO_TLS12)
  10543. InitSSL_Method(method, MakeTLSv1_2());
  10544. #elif !defined(NO_OLD_TLS)
  10545. InitSSL_Method(method, MakeTLSv1_1());
  10546. #endif
  10547. #else
  10548. #ifndef NO_OLD_TLS
  10549. InitSSL_Method(method, MakeTLSv1_1());
  10550. #endif
  10551. #endif
  10552. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10553. method->downgrade = 1;
  10554. #endif
  10555. }
  10556. return method;
  10557. }
  10558. /* please see note at top of README if you get an error from connect */
  10559. WOLFSSL_ABI
  10560. int wolfSSL_connect(WOLFSSL* ssl)
  10561. {
  10562. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10563. int neededState;
  10564. byte advanceState;
  10565. #endif
  10566. int ret = 0;
  10567. (void)ret;
  10568. #ifdef HAVE_ERRNO_H
  10569. errno = 0;
  10570. #endif
  10571. if (ssl == NULL)
  10572. return BAD_FUNC_ARG;
  10573. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10574. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10575. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10576. if (ssl->error != WOLFSSL_SUCCESS) {
  10577. WOLFSSL_ERROR(ssl->error);
  10578. return WOLFSSL_FATAL_ERROR;
  10579. }
  10580. ssl->error = 0; /* expected to be zero here */
  10581. }
  10582. #ifdef OPENSSL_EXTRA
  10583. if (ssl->CBIS != NULL) {
  10584. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10585. ssl->cbmode = SSL_CB_WRITE;
  10586. }
  10587. #endif
  10588. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10589. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10590. return wolfSSL_connect_TLSv13(ssl);
  10591. #else
  10592. #ifdef WOLFSSL_TLS13
  10593. if (ssl->options.tls1_3)
  10594. return wolfSSL_connect_TLSv13(ssl);
  10595. #endif
  10596. WOLFSSL_ENTER("SSL_connect()");
  10597. /* make sure this wolfSSL object has arrays and rng setup. Protects
  10598. * case where the WOLFSSL object is re-used via wolfSSL_clear() */
  10599. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  10600. return ret;
  10601. }
  10602. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10603. if ((ssl->ConnectFilter != NULL) &&
  10604. (ssl->options.connectState == CONNECT_BEGIN)) {
  10605. wolfSSL_netfilter_decision_t res;
  10606. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  10607. WOLFSSL_SUCCESS) &&
  10608. (res == WOLFSSL_NETFILTER_REJECT)) {
  10609. ssl->error = SOCKET_FILTERED_E;
  10610. WOLFSSL_ERROR(ssl->error);
  10611. return WOLFSSL_FATAL_ERROR;
  10612. }
  10613. }
  10614. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10615. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10616. ssl->error = SIDE_ERROR;
  10617. WOLFSSL_ERROR(ssl->error);
  10618. return WOLFSSL_FATAL_ERROR;
  10619. }
  10620. #ifdef WOLFSSL_DTLS
  10621. if (ssl->version.major == DTLS_MAJOR) {
  10622. ssl->options.dtls = 1;
  10623. ssl->options.tls = 1;
  10624. ssl->options.tls1_1 = 1;
  10625. }
  10626. #endif
  10627. /* fragOffset is non-zero when sending fragments. On the last
  10628. * fragment, fragOffset is zero again, and the state can be
  10629. * advanced. */
  10630. advanceState = ssl->fragOffset == 0 &&
  10631. (ssl->options.connectState == CONNECT_BEGIN ||
  10632. ssl->options.connectState == HELLO_AGAIN ||
  10633. (ssl->options.connectState >= FIRST_REPLY_DONE &&
  10634. ssl->options.connectState <= FIRST_REPLY_FOURTH));
  10635. #ifdef WOLFSSL_DTLS13
  10636. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
  10637. advanceState = advanceState && !ssl->dtls13SendingAckOrRtx;
  10638. #endif /* WOLFSSL_DTLS13 */
  10639. if (ssl->buffers.outputBuffer.length > 0
  10640. #ifdef WOLFSSL_ASYNC_CRYPT
  10641. /* do not send buffered or advance state if last error was an
  10642. async pending operation */
  10643. && ssl->error != WC_PENDING_E
  10644. #endif
  10645. ) {
  10646. ret = SendBuffered(ssl);
  10647. if (ret == 0) {
  10648. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  10649. if (advanceState) {
  10650. ssl->options.connectState++;
  10651. WOLFSSL_MSG("connect state: "
  10652. "Advanced from last buffered fragment send");
  10653. #ifdef WOLFSSL_ASYNC_IO
  10654. /* Cleanup async */
  10655. FreeAsyncCtx(ssl, 0);
  10656. #endif
  10657. }
  10658. }
  10659. else {
  10660. WOLFSSL_MSG("connect state: "
  10661. "Not advanced, more fragments to send");
  10662. }
  10663. }
  10664. else {
  10665. ssl->error = ret;
  10666. WOLFSSL_ERROR(ssl->error);
  10667. return WOLFSSL_FATAL_ERROR;
  10668. }
  10669. #ifdef WOLFSSL_DTLS13
  10670. if (ssl->options.dtls)
  10671. ssl->dtls13SendingAckOrRtx = 0;
  10672. #endif /* WOLFSSL_DTLS13 */
  10673. }
  10674. ret = RetrySendAlert(ssl);
  10675. if (ret != 0) {
  10676. ssl->error = ret;
  10677. WOLFSSL_ERROR(ssl->error);
  10678. return WOLFSSL_FATAL_ERROR;
  10679. }
  10680. switch (ssl->options.connectState) {
  10681. case CONNECT_BEGIN :
  10682. /* always send client hello first */
  10683. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10684. WOLFSSL_ERROR(ssl->error);
  10685. return WOLFSSL_FATAL_ERROR;
  10686. }
  10687. ssl->options.connectState = CLIENT_HELLO_SENT;
  10688. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10689. FALL_THROUGH;
  10690. case CLIENT_HELLO_SENT :
  10691. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10692. SERVER_HELLODONE_COMPLETE;
  10693. #ifdef WOLFSSL_DTLS
  10694. /* In DTLS, when resuming, we can go straight to FINISHED,
  10695. * or do a cookie exchange and then skip to FINISHED, assume
  10696. * we need the cookie exchange first. */
  10697. if (IsDtlsNotSctpMode(ssl))
  10698. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10699. #endif
  10700. /* get response */
  10701. while (ssl->options.serverState < neededState) {
  10702. #ifdef WOLFSSL_TLS13
  10703. if (ssl->options.tls1_3)
  10704. return wolfSSL_connect_TLSv13(ssl);
  10705. #endif
  10706. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10707. WOLFSSL_ERROR(ssl->error);
  10708. return WOLFSSL_FATAL_ERROR;
  10709. }
  10710. /* if resumption failed, reset needed state */
  10711. else if (neededState == SERVER_FINISHED_COMPLETE)
  10712. if (!ssl->options.resuming) {
  10713. #ifdef WOLFSSL_DTLS
  10714. if (IsDtlsNotSctpMode(ssl))
  10715. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10716. else
  10717. #endif
  10718. neededState = SERVER_HELLODONE_COMPLETE;
  10719. }
  10720. #ifdef WOLFSSL_DTLS13
  10721. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)
  10722. && ssl->dtls13Rtx.sendAcks == 1) {
  10723. ssl->dtls13Rtx.sendAcks = 0;
  10724. /* we aren't negotiated the version yet, so we aren't sure
  10725. * the other end can speak v1.3. On the other side we have
  10726. * received a unified records, assuming that the
  10727. * ServerHello got lost, we will send an empty ACK. In case
  10728. * the server is a DTLS with version less than 1.3, it
  10729. * should just ignore the message */
  10730. if ((ssl->error = SendDtls13Ack(ssl)) < 0) {
  10731. if (ssl->error == WANT_WRITE)
  10732. ssl->dtls13SendingAckOrRtx = 1;
  10733. WOLFSSL_ERROR(ssl->error);
  10734. return WOLFSSL_FATAL_ERROR;
  10735. }
  10736. }
  10737. #endif /* WOLFSSL_DTLS13 */
  10738. }
  10739. ssl->options.connectState = HELLO_AGAIN;
  10740. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10741. FALL_THROUGH;
  10742. case HELLO_AGAIN :
  10743. #ifdef WOLFSSL_TLS13
  10744. if (ssl->options.tls1_3)
  10745. return wolfSSL_connect_TLSv13(ssl);
  10746. #endif
  10747. #ifdef WOLFSSL_DTLS
  10748. if (ssl->options.serverState ==
  10749. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10750. if (IsDtlsNotSctpMode(ssl)) {
  10751. /* re-init hashes, exclude first hello and verify request */
  10752. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10753. WOLFSSL_ERROR(ssl->error);
  10754. return WOLFSSL_FATAL_ERROR;
  10755. }
  10756. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10757. WOLFSSL_ERROR(ssl->error);
  10758. return WOLFSSL_FATAL_ERROR;
  10759. }
  10760. }
  10761. }
  10762. #endif
  10763. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10764. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10765. FALL_THROUGH;
  10766. case HELLO_AGAIN_REPLY :
  10767. #ifdef WOLFSSL_DTLS
  10768. if (IsDtlsNotSctpMode(ssl)) {
  10769. neededState = ssl->options.resuming ?
  10770. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10771. /* get response */
  10772. while (ssl->options.serverState < neededState) {
  10773. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10774. WOLFSSL_ERROR(ssl->error);
  10775. return WOLFSSL_FATAL_ERROR;
  10776. }
  10777. /* if resumption failed, reset needed state */
  10778. if (neededState == SERVER_FINISHED_COMPLETE) {
  10779. if (!ssl->options.resuming)
  10780. neededState = SERVER_HELLODONE_COMPLETE;
  10781. }
  10782. }
  10783. }
  10784. #endif
  10785. ssl->options.connectState = FIRST_REPLY_DONE;
  10786. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10787. FALL_THROUGH;
  10788. case FIRST_REPLY_DONE :
  10789. if (ssl->options.certOnly)
  10790. return WOLFSSL_SUCCESS;
  10791. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10792. #ifdef WOLFSSL_TLS13
  10793. if (ssl->options.tls1_3)
  10794. return wolfSSL_connect_TLSv13(ssl);
  10795. #endif
  10796. if (ssl->options.sendVerify) {
  10797. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10798. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10799. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10800. #endif
  10801. WOLFSSL_ERROR(ssl->error);
  10802. return WOLFSSL_FATAL_ERROR;
  10803. }
  10804. WOLFSSL_MSG("sent: certificate");
  10805. }
  10806. #endif
  10807. ssl->options.connectState = FIRST_REPLY_FIRST;
  10808. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10809. FALL_THROUGH;
  10810. case FIRST_REPLY_FIRST :
  10811. #ifdef WOLFSSL_TLS13
  10812. if (ssl->options.tls1_3)
  10813. return wolfSSL_connect_TLSv13(ssl);
  10814. #endif
  10815. if (!ssl->options.resuming) {
  10816. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10817. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10818. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10819. #endif
  10820. WOLFSSL_ERROR(ssl->error);
  10821. return WOLFSSL_FATAL_ERROR;
  10822. }
  10823. WOLFSSL_MSG("sent: client key exchange");
  10824. }
  10825. ssl->options.connectState = FIRST_REPLY_SECOND;
  10826. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  10827. FALL_THROUGH;
  10828. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  10829. case FIRST_REPLY_SECOND :
  10830. /* CLIENT: Fail-safe for Server Authentication. */
  10831. if (!ssl->options.peerAuthGood) {
  10832. WOLFSSL_MSG("Server authentication did not happen");
  10833. ssl->error = NO_PEER_VERIFY;
  10834. return WOLFSSL_FATAL_ERROR;
  10835. }
  10836. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10837. if (ssl->options.sendVerify) {
  10838. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  10839. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10840. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10841. #endif
  10842. WOLFSSL_ERROR(ssl->error);
  10843. return WOLFSSL_FATAL_ERROR;
  10844. }
  10845. WOLFSSL_MSG("sent: certificate verify");
  10846. }
  10847. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  10848. ssl->options.connectState = FIRST_REPLY_THIRD;
  10849. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  10850. FALL_THROUGH;
  10851. case FIRST_REPLY_THIRD :
  10852. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10853. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10854. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10855. #endif
  10856. WOLFSSL_ERROR(ssl->error);
  10857. return WOLFSSL_FATAL_ERROR;
  10858. }
  10859. WOLFSSL_MSG("sent: change cipher spec");
  10860. ssl->options.connectState = FIRST_REPLY_FOURTH;
  10861. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  10862. FALL_THROUGH;
  10863. case FIRST_REPLY_FOURTH :
  10864. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10865. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10866. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10867. #endif
  10868. WOLFSSL_ERROR(ssl->error);
  10869. return WOLFSSL_FATAL_ERROR;
  10870. }
  10871. WOLFSSL_MSG("sent: finished");
  10872. ssl->options.connectState = FINISHED_DONE;
  10873. WOLFSSL_MSG("connect state: FINISHED_DONE");
  10874. FALL_THROUGH;
  10875. #ifdef WOLFSSL_DTLS13
  10876. case WAIT_FINISHED_ACK:
  10877. ssl->options.connectState = FINISHED_DONE;
  10878. FALL_THROUGH;
  10879. #endif /* WOLFSSL_DTLS13 */
  10880. case FINISHED_DONE :
  10881. /* get response */
  10882. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  10883. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10884. WOLFSSL_ERROR(ssl->error);
  10885. return WOLFSSL_FATAL_ERROR;
  10886. }
  10887. ssl->options.connectState = SECOND_REPLY_DONE;
  10888. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  10889. FALL_THROUGH;
  10890. case SECOND_REPLY_DONE:
  10891. #ifndef NO_HANDSHAKE_DONE_CB
  10892. if (ssl->hsDoneCb) {
  10893. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10894. if (cbret < 0) {
  10895. ssl->error = cbret;
  10896. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10897. return WOLFSSL_FATAL_ERROR;
  10898. }
  10899. }
  10900. #endif /* NO_HANDSHAKE_DONE_CB */
  10901. if (!ssl->options.dtls) {
  10902. if (!ssl->options.keepResources) {
  10903. FreeHandshakeResources(ssl);
  10904. }
  10905. }
  10906. #ifdef WOLFSSL_DTLS
  10907. else {
  10908. ssl->options.dtlsHsRetain = 1;
  10909. }
  10910. #endif /* WOLFSSL_DTLS */
  10911. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10912. /* This may be necessary in async so that we don't try to
  10913. * renegotiate again */
  10914. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10915. ssl->secure_renegotiation->startScr = 0;
  10916. }
  10917. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10918. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  10919. /* Free the remaining async context if not using it for crypto */
  10920. FreeAsyncCtx(ssl, 1);
  10921. #endif
  10922. ssl->error = 0; /* clear the error */
  10923. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  10924. return WOLFSSL_SUCCESS;
  10925. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10926. default:
  10927. WOLFSSL_MSG("Unknown connect state ERROR");
  10928. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  10929. }
  10930. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  10931. }
  10932. #endif /* NO_WOLFSSL_CLIENT */
  10933. /* server only parts */
  10934. #ifndef NO_WOLFSSL_SERVER
  10935. #if defined(OPENSSL_EXTRA) && !defined(NO_OLD_TLS)
  10936. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  10937. {
  10938. WOLFSSL_STUB("wolfSSLv2_server_method");
  10939. return 0;
  10940. }
  10941. #endif
  10942. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10943. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  10944. {
  10945. return wolfSSLv3_server_method_ex(NULL);
  10946. }
  10947. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  10948. {
  10949. WOLFSSL_METHOD* method =
  10950. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10951. heap, DYNAMIC_TYPE_METHOD);
  10952. (void)heap;
  10953. WOLFSSL_ENTER("SSLv3_server_method_ex");
  10954. if (method) {
  10955. InitSSL_Method(method, MakeSSLv3());
  10956. method->side = WOLFSSL_SERVER_END;
  10957. }
  10958. return method;
  10959. }
  10960. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10961. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10962. {
  10963. return wolfSSLv23_server_method_ex(NULL);
  10964. }
  10965. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10966. {
  10967. WOLFSSL_METHOD* method =
  10968. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10969. heap, DYNAMIC_TYPE_METHOD);
  10970. (void)heap;
  10971. WOLFSSL_ENTER("SSLv23_server_method_ex");
  10972. if (method) {
  10973. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10974. #ifdef WOLFSSL_TLS13
  10975. InitSSL_Method(method, MakeTLSv1_3());
  10976. #elif !defined(WOLFSSL_NO_TLS12)
  10977. InitSSL_Method(method, MakeTLSv1_2());
  10978. #elif !defined(NO_OLD_TLS)
  10979. InitSSL_Method(method, MakeTLSv1_1());
  10980. #endif
  10981. #else
  10982. #ifndef NO_OLD_TLS
  10983. InitSSL_Method(method, MakeTLSv1_1());
  10984. #else
  10985. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10986. #endif
  10987. #endif
  10988. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10989. method->downgrade = 1;
  10990. #endif
  10991. method->side = WOLFSSL_SERVER_END;
  10992. }
  10993. return method;
  10994. }
  10995. WOLFSSL_ABI
  10996. int wolfSSL_accept(WOLFSSL* ssl)
  10997. {
  10998. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10999. word16 havePSK = 0;
  11000. word16 haveAnon = 0;
  11001. word16 haveMcast = 0;
  11002. #endif
  11003. int ret = 0;
  11004. (void)ret;
  11005. if (ssl == NULL)
  11006. return WOLFSSL_FATAL_ERROR;
  11007. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  11008. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  11009. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  11010. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  11011. if (ssl->error != WOLFSSL_SUCCESS) {
  11012. WOLFSSL_ERROR(ssl->error);
  11013. return WOLFSSL_FATAL_ERROR;
  11014. }
  11015. ssl->error = 0; /* expected to be zero here */
  11016. }
  11017. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  11018. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  11019. return wolfSSL_accept_TLSv13(ssl);
  11020. #else
  11021. #ifdef WOLFSSL_TLS13
  11022. if (ssl->options.tls1_3)
  11023. return wolfSSL_accept_TLSv13(ssl);
  11024. #endif
  11025. WOLFSSL_ENTER("SSL_accept()");
  11026. /* make sure this wolfSSL object has arrays and rng setup. Protects
  11027. * case where the WOLFSSL object is re-used via wolfSSL_clear() */
  11028. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  11029. return ret;
  11030. }
  11031. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  11032. if ((ssl->AcceptFilter != NULL) &&
  11033. ((ssl->options.acceptState == ACCEPT_BEGIN)
  11034. #ifdef HAVE_SECURE_RENEGOTIATION
  11035. || (ssl->options.acceptState == ACCEPT_BEGIN_RENEG)
  11036. #endif
  11037. ))
  11038. {
  11039. wolfSSL_netfilter_decision_t res;
  11040. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  11041. WOLFSSL_SUCCESS) &&
  11042. (res == WOLFSSL_NETFILTER_REJECT)) {
  11043. ssl->error = SOCKET_FILTERED_E;
  11044. WOLFSSL_ERROR(ssl->error);
  11045. return WOLFSSL_FATAL_ERROR;
  11046. }
  11047. }
  11048. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  11049. #ifdef HAVE_ERRNO_H
  11050. errno = 0;
  11051. #endif
  11052. #ifndef NO_PSK
  11053. havePSK = ssl->options.havePSK;
  11054. #endif
  11055. (void)havePSK;
  11056. #ifdef HAVE_ANON
  11057. haveAnon = ssl->options.haveAnon;
  11058. #endif
  11059. (void)haveAnon;
  11060. #ifdef WOLFSSL_MULTICAST
  11061. haveMcast = ssl->options.haveMcast;
  11062. #endif
  11063. (void)haveMcast;
  11064. if (ssl->options.side != WOLFSSL_SERVER_END) {
  11065. ssl->error = SIDE_ERROR;
  11066. WOLFSSL_ERROR(ssl->error);
  11067. return WOLFSSL_FATAL_ERROR;
  11068. }
  11069. #ifndef NO_CERTS
  11070. /* in case used set_accept_state after init */
  11071. if (!havePSK && !haveAnon && !haveMcast) {
  11072. #ifdef OPENSSL_EXTRA
  11073. if (ssl->ctx->certSetupCb != NULL) {
  11074. WOLFSSL_MSG("CertSetupCb set. server cert and "
  11075. "key not checked");
  11076. }
  11077. else
  11078. #endif
  11079. {
  11080. if (!ssl->buffers.certificate ||
  11081. !ssl->buffers.certificate->buffer) {
  11082. WOLFSSL_MSG("accept error: server cert required");
  11083. ssl->error = NO_PRIVATE_KEY;
  11084. WOLFSSL_ERROR(ssl->error);
  11085. return WOLFSSL_FATAL_ERROR;
  11086. }
  11087. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  11088. /* allow no private key if using existing key */
  11089. #ifdef WOLF_PRIVATE_KEY_ID
  11090. if (ssl->devId != INVALID_DEVID
  11091. #ifdef HAVE_PK_CALLBACKS
  11092. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  11093. #endif
  11094. ) {
  11095. WOLFSSL_MSG("Allowing no server private key "
  11096. "(external)");
  11097. }
  11098. else
  11099. #endif
  11100. {
  11101. WOLFSSL_MSG("accept error: server key required");
  11102. ssl->error = NO_PRIVATE_KEY;
  11103. WOLFSSL_ERROR(ssl->error);
  11104. return WOLFSSL_FATAL_ERROR;
  11105. }
  11106. }
  11107. }
  11108. }
  11109. #endif
  11110. #ifdef WOLFSSL_DTLS
  11111. if (ssl->version.major == DTLS_MAJOR) {
  11112. ssl->options.dtls = 1;
  11113. ssl->options.tls = 1;
  11114. ssl->options.tls1_1 = 1;
  11115. }
  11116. #endif
  11117. if (ssl->buffers.outputBuffer.length > 0
  11118. #ifdef WOLFSSL_ASYNC_CRYPT
  11119. /* do not send buffered or advance state if last error was an
  11120. async pending operation */
  11121. && ssl->error != WC_PENDING_E
  11122. #endif
  11123. ) {
  11124. ret = SendBuffered(ssl);
  11125. if (ret == 0) {
  11126. /* fragOffset is non-zero when sending fragments. On the last
  11127. * fragment, fragOffset is zero again, and the state can be
  11128. * advanced. */
  11129. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  11130. if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE ||
  11131. ssl->options.acceptState == SERVER_HELLO_SENT ||
  11132. ssl->options.acceptState == CERT_SENT ||
  11133. ssl->options.acceptState == CERT_STATUS_SENT ||
  11134. ssl->options.acceptState == KEY_EXCHANGE_SENT ||
  11135. ssl->options.acceptState == CERT_REQ_SENT ||
  11136. ssl->options.acceptState == ACCEPT_SECOND_REPLY_DONE ||
  11137. ssl->options.acceptState == TICKET_SENT ||
  11138. ssl->options.acceptState == CHANGE_CIPHER_SENT) {
  11139. ssl->options.acceptState++;
  11140. WOLFSSL_MSG("accept state: "
  11141. "Advanced from last buffered fragment send");
  11142. #ifdef WOLFSSL_ASYNC_IO
  11143. /* Cleanup async */
  11144. FreeAsyncCtx(ssl, 0);
  11145. #endif
  11146. }
  11147. }
  11148. else {
  11149. WOLFSSL_MSG("accept state: "
  11150. "Not advanced, more fragments to send");
  11151. }
  11152. }
  11153. else {
  11154. ssl->error = ret;
  11155. WOLFSSL_ERROR(ssl->error);
  11156. return WOLFSSL_FATAL_ERROR;
  11157. }
  11158. #ifdef WOLFSSL_DTLS13
  11159. if (ssl->options.dtls)
  11160. ssl->dtls13SendingAckOrRtx = 0;
  11161. #endif /* WOLFSSL_DTLS13 */
  11162. }
  11163. ret = RetrySendAlert(ssl);
  11164. if (ret != 0) {
  11165. ssl->error = ret;
  11166. WOLFSSL_ERROR(ssl->error);
  11167. return WOLFSSL_FATAL_ERROR;
  11168. }
  11169. switch (ssl->options.acceptState) {
  11170. case ACCEPT_BEGIN :
  11171. #ifdef HAVE_SECURE_RENEGOTIATION
  11172. case ACCEPT_BEGIN_RENEG:
  11173. #endif
  11174. /* get response */
  11175. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  11176. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11177. WOLFSSL_ERROR(ssl->error);
  11178. return WOLFSSL_FATAL_ERROR;
  11179. }
  11180. #ifdef WOLFSSL_TLS13
  11181. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  11182. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  11183. FALL_THROUGH;
  11184. case ACCEPT_CLIENT_HELLO_DONE :
  11185. if (ssl->options.tls1_3) {
  11186. return wolfSSL_accept_TLSv13(ssl);
  11187. }
  11188. #endif
  11189. #ifdef WOLFSSL_DTLS
  11190. if (ssl->chGoodCb != NULL && !IsSCR(ssl)) {
  11191. int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
  11192. if (cbret < 0) {
  11193. ssl->error = cbret;
  11194. WOLFSSL_MSG("ClientHello Good Cb don't continue error");
  11195. return WOLFSSL_FATAL_ERROR;
  11196. }
  11197. }
  11198. #endif
  11199. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  11200. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  11201. FALL_THROUGH;
  11202. case ACCEPT_FIRST_REPLY_DONE :
  11203. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  11204. WOLFSSL_ERROR(ssl->error);
  11205. return WOLFSSL_FATAL_ERROR;
  11206. }
  11207. ssl->options.acceptState = SERVER_HELLO_SENT;
  11208. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  11209. FALL_THROUGH;
  11210. case SERVER_HELLO_SENT :
  11211. #ifdef WOLFSSL_TLS13
  11212. if (ssl->options.tls1_3) {
  11213. return wolfSSL_accept_TLSv13(ssl);
  11214. }
  11215. #endif
  11216. #ifndef NO_CERTS
  11217. if (!ssl->options.resuming)
  11218. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  11219. WOLFSSL_ERROR(ssl->error);
  11220. return WOLFSSL_FATAL_ERROR;
  11221. }
  11222. #endif
  11223. ssl->options.acceptState = CERT_SENT;
  11224. WOLFSSL_MSG("accept state CERT_SENT");
  11225. FALL_THROUGH;
  11226. case CERT_SENT :
  11227. #ifndef NO_CERTS
  11228. if (!ssl->options.resuming)
  11229. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  11230. WOLFSSL_ERROR(ssl->error);
  11231. return WOLFSSL_FATAL_ERROR;
  11232. }
  11233. #endif
  11234. ssl->options.acceptState = CERT_STATUS_SENT;
  11235. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  11236. FALL_THROUGH;
  11237. case CERT_STATUS_SENT :
  11238. #ifdef WOLFSSL_TLS13
  11239. if (ssl->options.tls1_3) {
  11240. return wolfSSL_accept_TLSv13(ssl);
  11241. }
  11242. #endif
  11243. if (!ssl->options.resuming)
  11244. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  11245. WOLFSSL_ERROR(ssl->error);
  11246. return WOLFSSL_FATAL_ERROR;
  11247. }
  11248. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  11249. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  11250. FALL_THROUGH;
  11251. case KEY_EXCHANGE_SENT :
  11252. #ifndef NO_CERTS
  11253. if (!ssl->options.resuming) {
  11254. if (ssl->options.verifyPeer) {
  11255. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  11256. WOLFSSL_ERROR(ssl->error);
  11257. return WOLFSSL_FATAL_ERROR;
  11258. }
  11259. }
  11260. else {
  11261. /* SERVER: Peer auth good if not verifying client. */
  11262. ssl->options.peerAuthGood = 1;
  11263. }
  11264. }
  11265. #endif
  11266. ssl->options.acceptState = CERT_REQ_SENT;
  11267. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  11268. FALL_THROUGH;
  11269. case CERT_REQ_SENT :
  11270. if (!ssl->options.resuming)
  11271. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  11272. WOLFSSL_ERROR(ssl->error);
  11273. return WOLFSSL_FATAL_ERROR;
  11274. }
  11275. ssl->options.acceptState = SERVER_HELLO_DONE;
  11276. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  11277. FALL_THROUGH;
  11278. case SERVER_HELLO_DONE :
  11279. if (!ssl->options.resuming) {
  11280. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  11281. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11282. WOLFSSL_ERROR(ssl->error);
  11283. return WOLFSSL_FATAL_ERROR;
  11284. }
  11285. }
  11286. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  11287. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  11288. FALL_THROUGH;
  11289. case ACCEPT_SECOND_REPLY_DONE :
  11290. #ifndef NO_CERTS
  11291. /* SERVER: When not resuming and verifying peer but no certificate
  11292. * received and not failing when not received then peer auth good.
  11293. */
  11294. if (!ssl->options.resuming && ssl->options.verifyPeer &&
  11295. !ssl->options.havePeerCert && !ssl->options.failNoCert) {
  11296. ssl->options.peerAuthGood = 1;
  11297. }
  11298. #endif /* !NO_CERTS */
  11299. #ifdef WOLFSSL_NO_CLIENT_AUTH
  11300. if (!ssl->options.resuming) {
  11301. ssl->options.peerAuthGood = 1;
  11302. }
  11303. #endif
  11304. #ifdef HAVE_SESSION_TICKET
  11305. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  11306. if ( (ssl->error = SendTicket(ssl)) != 0) {
  11307. WOLFSSL_ERROR(ssl->error);
  11308. return WOLFSSL_FATAL_ERROR;
  11309. }
  11310. }
  11311. #endif /* HAVE_SESSION_TICKET */
  11312. ssl->options.acceptState = TICKET_SENT;
  11313. WOLFSSL_MSG("accept state TICKET_SENT");
  11314. FALL_THROUGH;
  11315. case TICKET_SENT:
  11316. /* SERVER: Fail-safe for CLient Authentication. */
  11317. if (!ssl->options.peerAuthGood) {
  11318. WOLFSSL_MSG("Client authentication did not happen");
  11319. return WOLFSSL_FATAL_ERROR;
  11320. }
  11321. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  11322. WOLFSSL_ERROR(ssl->error);
  11323. return WOLFSSL_FATAL_ERROR;
  11324. }
  11325. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  11326. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  11327. FALL_THROUGH;
  11328. case CHANGE_CIPHER_SENT :
  11329. if ( (ssl->error = SendFinished(ssl)) != 0) {
  11330. WOLFSSL_ERROR(ssl->error);
  11331. return WOLFSSL_FATAL_ERROR;
  11332. }
  11333. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  11334. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  11335. FALL_THROUGH;
  11336. case ACCEPT_FINISHED_DONE :
  11337. if (ssl->options.resuming) {
  11338. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  11339. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11340. WOLFSSL_ERROR(ssl->error);
  11341. return WOLFSSL_FATAL_ERROR;
  11342. }
  11343. }
  11344. }
  11345. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  11346. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  11347. FALL_THROUGH;
  11348. case ACCEPT_THIRD_REPLY_DONE :
  11349. #ifndef NO_HANDSHAKE_DONE_CB
  11350. if (ssl->hsDoneCb) {
  11351. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11352. if (cbret < 0) {
  11353. ssl->error = cbret;
  11354. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11355. return WOLFSSL_FATAL_ERROR;
  11356. }
  11357. }
  11358. #endif /* NO_HANDSHAKE_DONE_CB */
  11359. if (!ssl->options.dtls) {
  11360. if (!ssl->options.keepResources) {
  11361. FreeHandshakeResources(ssl);
  11362. }
  11363. }
  11364. #ifdef WOLFSSL_DTLS
  11365. else {
  11366. ssl->options.dtlsHsRetain = 1;
  11367. }
  11368. #endif /* WOLFSSL_DTLS */
  11369. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11370. /* This may be necessary in async so that we don't try to
  11371. * renegotiate again */
  11372. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11373. ssl->secure_renegotiation->startScr = 0;
  11374. }
  11375. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11376. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11377. /* Free the remaining async context if not using it for crypto */
  11378. FreeAsyncCtx(ssl, 1);
  11379. #endif
  11380. #if defined(WOLFSSL_SESSION_EXPORT) && defined(WOLFSSL_DTLS)
  11381. if (ssl->dtls_export) {
  11382. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  11383. WOLFSSL_MSG("Export DTLS session error");
  11384. WOLFSSL_ERROR(ssl->error);
  11385. return WOLFSSL_FATAL_ERROR;
  11386. }
  11387. }
  11388. #endif
  11389. ssl->error = 0; /* clear the error */
  11390. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  11391. return WOLFSSL_SUCCESS;
  11392. default :
  11393. WOLFSSL_MSG("Unknown accept state ERROR");
  11394. return WOLFSSL_FATAL_ERROR;
  11395. }
  11396. #endif /* !WOLFSSL_NO_TLS12 */
  11397. }
  11398. #endif /* NO_WOLFSSL_SERVER */
  11399. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  11400. int wolfDTLS_SetChGoodCb(WOLFSSL* ssl, ClientHelloGoodCb cb, void* user_ctx)
  11401. {
  11402. WOLFSSL_ENTER("wolfDTLS_SetChGoodCb");
  11403. if (ssl == NULL)
  11404. return BAD_FUNC_ARG;
  11405. ssl->chGoodCb = cb;
  11406. ssl->chGoodCtx = user_ctx;
  11407. return WOLFSSL_SUCCESS;
  11408. }
  11409. #endif
  11410. #ifndef NO_HANDSHAKE_DONE_CB
  11411. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  11412. {
  11413. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  11414. if (ssl == NULL)
  11415. return BAD_FUNC_ARG;
  11416. ssl->hsDoneCb = cb;
  11417. ssl->hsDoneCtx = user_ctx;
  11418. return WOLFSSL_SUCCESS;
  11419. }
  11420. #endif /* NO_HANDSHAKE_DONE_CB */
  11421. WOLFSSL_ABI
  11422. int wolfSSL_Cleanup(void)
  11423. {
  11424. int ret = WOLFSSL_SUCCESS; /* Only the first error will be returned */
  11425. int release = 0;
  11426. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  11427. int i;
  11428. #endif
  11429. WOLFSSL_ENTER("wolfSSL_Cleanup");
  11430. if (initRefCount == 0)
  11431. return ret; /* possibly no init yet, but not failure either way */
  11432. if ((count_mutex_valid == 1) && (wc_LockMutex(&count_mutex) != 0)) {
  11433. WOLFSSL_MSG("Bad Lock Mutex count");
  11434. ret = BAD_MUTEX_E;
  11435. }
  11436. release = initRefCount-- == 1;
  11437. if (initRefCount < 0)
  11438. initRefCount = 0;
  11439. if (count_mutex_valid == 1) {
  11440. wc_UnLockMutex(&count_mutex);
  11441. }
  11442. if (!release)
  11443. return ret;
  11444. #ifdef OPENSSL_EXTRA
  11445. if (bn_one) {
  11446. wolfSSL_BN_free(bn_one);
  11447. bn_one = NULL;
  11448. }
  11449. #endif
  11450. #ifndef NO_SESSION_CACHE
  11451. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  11452. for (i = 0; i < SESSION_ROWS; ++i) {
  11453. if ((SessionCache[i].mutex_valid == 1) &&
  11454. (wc_FreeMutex(&SessionCache[i].row_mutex) != 0)) {
  11455. if (ret == WOLFSSL_SUCCESS)
  11456. ret = BAD_MUTEX_E;
  11457. }
  11458. SessionCache[i].mutex_valid = 0;
  11459. }
  11460. #else
  11461. if ((session_mutex_valid == 1) && (wc_FreeMutex(&session_mutex) != 0)) {
  11462. if (ret == WOLFSSL_SUCCESS)
  11463. ret = BAD_MUTEX_E;
  11464. }
  11465. session_mutex_valid = 0;
  11466. #endif
  11467. #ifndef NO_CLIENT_CACHE
  11468. if ((clisession_mutex_valid == 1) &&
  11469. (wc_FreeMutex(&clisession_mutex) != 0)) {
  11470. if (ret == WOLFSSL_SUCCESS)
  11471. ret = BAD_MUTEX_E;
  11472. }
  11473. clisession_mutex_valid = 0;
  11474. #endif
  11475. #endif /* !NO_SESSION_CACHE */
  11476. if ((count_mutex_valid == 1) && (wc_FreeMutex(&count_mutex) != 0)) {
  11477. if (ret == WOLFSSL_SUCCESS)
  11478. ret = BAD_MUTEX_E;
  11479. }
  11480. count_mutex_valid = 0;
  11481. #ifdef OPENSSL_EXTRA
  11482. wolfSSL_RAND_Cleanup();
  11483. #endif
  11484. if (wolfCrypt_Cleanup() != 0) {
  11485. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11486. if (ret == WOLFSSL_SUCCESS)
  11487. ret = WC_CLEANUP_E;
  11488. }
  11489. #if FIPS_VERSION_GE(5,1)
  11490. if (wolfCrypt_SetPrivateKeyReadEnable_fips(0, WC_KEYTYPE_ALL) < 0) {
  11491. if (ret == WOLFSSL_SUCCESS)
  11492. ret = WC_CLEANUP_E;
  11493. }
  11494. #endif
  11495. #ifdef HAVE_GLOBAL_RNG
  11496. if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) {
  11497. if (ret == WOLFSSL_SUCCESS)
  11498. ret = BAD_MUTEX_E;
  11499. }
  11500. globalRNGMutex_valid = 0;
  11501. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  11502. wolfSSL_FIPS_drbg_free(gDrbgDefCtx);
  11503. gDrbgDefCtx = NULL;
  11504. #endif
  11505. #endif
  11506. return ret;
  11507. }
  11508. #ifndef NO_SESSION_CACHE
  11509. WOLFSSL_ABI
  11510. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11511. {
  11512. /* static table now, no flushing needed */
  11513. (void)ctx;
  11514. (void)tm;
  11515. }
  11516. /* set ssl session timeout in seconds */
  11517. WOLFSSL_ABI
  11518. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11519. {
  11520. if (ssl == NULL)
  11521. return BAD_FUNC_ARG;
  11522. if (to == 0)
  11523. to = WOLFSSL_SESSION_TIMEOUT;
  11524. ssl->timeout = to;
  11525. return WOLFSSL_SUCCESS;
  11526. }
  11527. /**
  11528. * Sets ctx session timeout in seconds.
  11529. * The timeout value set here should be reflected in the
  11530. * "session ticket lifetime hint" if this API works in the openssl compat-layer.
  11531. * Therefore wolfSSL_CTX_set_TicketHint is called internally.
  11532. * Arguments:
  11533. * - ctx WOLFSSL_CTX object which the timeout is set to
  11534. * - to timeout value in second
  11535. * Returns:
  11536. * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure.
  11537. * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value
  11538. * on success, BAD_FUNC_ARG on failure.
  11539. */
  11540. WOLFSSL_ABI
  11541. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11542. {
  11543. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11544. word32 prev_timeout = 0;
  11545. #endif
  11546. int ret = WOLFSSL_SUCCESS;
  11547. (void)ret;
  11548. if (ctx == NULL)
  11549. ret = BAD_FUNC_ARG;
  11550. if (ret == WOLFSSL_SUCCESS) {
  11551. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11552. prev_timeout = ctx->timeout;
  11553. #endif
  11554. if (to == 0) {
  11555. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  11556. }
  11557. else {
  11558. ctx->timeout = to;
  11559. }
  11560. }
  11561. #if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \
  11562. !defined(NO_WOLFSSL_SERVER)
  11563. if (ret == WOLFSSL_SUCCESS) {
  11564. if (to == 0) {
  11565. ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT);
  11566. }
  11567. else {
  11568. ret = wolfSSL_CTX_set_TicketHint(ctx, to);
  11569. }
  11570. }
  11571. #endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */
  11572. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11573. if (ret == WOLFSSL_SUCCESS) {
  11574. return prev_timeout;
  11575. }
  11576. else {
  11577. return ret;
  11578. }
  11579. #else
  11580. return ret;
  11581. #endif /* WOLFSSL_ERROR_CODE_OPENSSL */
  11582. }
  11583. #ifndef NO_CLIENT_CACHE
  11584. /* Get Session from Client cache based on id/len, return NULL on failure */
  11585. WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11586. {
  11587. WOLFSSL_SESSION* ret = NULL;
  11588. word32 row;
  11589. int idx;
  11590. int count;
  11591. int error = 0;
  11592. ClientSession* clSess;
  11593. WOLFSSL_ENTER("GetSessionClient");
  11594. if (ssl->ctx->sessionCacheOff) {
  11595. WOLFSSL_MSG("Session Cache off");
  11596. return NULL;
  11597. }
  11598. if (ssl->options.side == WOLFSSL_SERVER_END)
  11599. return NULL;
  11600. len = min(SERVER_ID_LEN, (word32)len);
  11601. #ifdef HAVE_EXT_CACHE
  11602. if (ssl->ctx->get_sess_cb != NULL) {
  11603. int copy = 0;
  11604. WOLFSSL_MSG("Calling external session cache");
  11605. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  11606. if (ret != NULL) {
  11607. WOLFSSL_MSG("Session found in external cache");
  11608. return ret;
  11609. }
  11610. WOLFSSL_MSG("Session not found in external cache");
  11611. }
  11612. if (ssl->ctx->internalCacheLookupOff) {
  11613. WOLFSSL_MSG("Internal cache turned off");
  11614. return NULL;
  11615. }
  11616. #endif
  11617. row = HashObject(id, len, &error) % CLIENT_SESSION_ROWS;
  11618. if (error != 0) {
  11619. WOLFSSL_MSG("Hash session failed");
  11620. return NULL;
  11621. }
  11622. if (wc_LockMutex(&clisession_mutex) != 0) {
  11623. WOLFSSL_MSG("Client cache mutex lock failed");
  11624. return NULL;
  11625. }
  11626. /* start from most recently used */
  11627. count = min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW);
  11628. idx = ClientCache[row].nextIdx - 1;
  11629. if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) {
  11630. idx = CLIENT_SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11631. }
  11632. clSess = ClientCache[row].Clients;
  11633. for (; count > 0; --count) {
  11634. WOLFSSL_SESSION* current;
  11635. SessionRow* sessRow;
  11636. if (clSess[idx].serverRow >= SESSION_ROWS) {
  11637. WOLFSSL_MSG("Client cache serverRow invalid");
  11638. break;
  11639. }
  11640. /* lock row */
  11641. sessRow = &SessionCache[clSess[idx].serverRow];
  11642. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11643. WOLFSSL_MSG("Session cache row lock failure");
  11644. break;
  11645. }
  11646. current = &sessRow->Sessions[clSess[idx].serverIdx];
  11647. if (XMEMCMP(current->serverID, id, len) == 0) {
  11648. WOLFSSL_MSG("Found a serverid match for client");
  11649. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11650. WOLFSSL_MSG("Session valid");
  11651. ret = current;
  11652. SESSION_ROW_UNLOCK(sessRow);
  11653. break;
  11654. } else {
  11655. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11656. }
  11657. } else {
  11658. WOLFSSL_MSG("ServerID not a match from client table");
  11659. }
  11660. SESSION_ROW_UNLOCK(sessRow);
  11661. idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1;
  11662. }
  11663. wc_UnLockMutex(&clisession_mutex);
  11664. return ret;
  11665. }
  11666. #endif /* !NO_CLIENT_CACHE */
  11667. static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session)
  11668. {
  11669. (void)session;
  11670. return ssl->options.sessionCacheOff
  11671. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET)
  11672. && session->ticketLen == 0
  11673. #endif
  11674. #ifdef OPENSSL_EXTRA
  11675. && ssl->options.side != WOLFSSL_CLIENT_END
  11676. #endif
  11677. ;
  11678. }
  11679. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  11680. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11681. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11682. /**
  11683. * SessionTicketNoncePrealloc() - prealloc a buffer for ticket nonces
  11684. * @output: [in] pointer to WOLFSSL_SESSION object that will soon be a
  11685. * destination of a session duplication
  11686. * @buf: [out] address of the preallocated buf
  11687. * @len: [out] len of the preallocated buf
  11688. *
  11689. * prealloc a buffer that will likely suffice to contain a ticket nonce. It's
  11690. * used when copying session under lock, when syscalls need to be avoided. If
  11691. * output already has a dynamic buffer, it's reused.
  11692. */
  11693. static int SessionTicketNoncePrealloc(byte** buf, byte* len, void *heap)
  11694. {
  11695. (void)heap;
  11696. *buf = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_NONCE_LEN, heap,
  11697. DYNAMIC_TYPE_SESSION_TICK);
  11698. if (*buf == NULL) {
  11699. WOLFSSL_MSG("Failed to preallocate ticket nonce buffer");
  11700. *len = 0;
  11701. return WOLFSSL_FAILURE;
  11702. }
  11703. *len = PREALLOC_SESSION_TICKET_NONCE_LEN;
  11704. return 0;
  11705. }
  11706. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
  11707. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  11708. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  11709. byte* ticketNonceLen, byte* preallocUsed);
  11710. int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
  11711. {
  11712. WOLFSSL_SESSION* sess = NULL;
  11713. const byte* id = NULL;
  11714. word32 row;
  11715. int idx;
  11716. int count;
  11717. int error = 0;
  11718. SessionRow* sessRow;
  11719. #ifdef HAVE_SESSION_TICKET
  11720. #ifndef WOLFSSL_SMALL_STACK
  11721. byte tmpTicket[PREALLOC_SESSION_TICKET_LEN];
  11722. #else
  11723. byte* tmpTicket = NULL;
  11724. #endif
  11725. #ifdef WOLFSSL_TLS13
  11726. byte *preallocNonce = NULL;
  11727. byte preallocNonceLen = 0;
  11728. byte preallocNonceUsed = 0;
  11729. #endif /* WOLFSSL_TLS13 */
  11730. byte tmpBufSet = 0;
  11731. #endif
  11732. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11733. WOLFSSL_X509* peer = NULL;
  11734. #endif
  11735. byte bogusID[ID_LEN];
  11736. byte bogusIDSz = 0;
  11737. WOLFSSL_ENTER("wolfSSL_GetSessionFromCache");
  11738. if (output == NULL) {
  11739. WOLFSSL_MSG("NULL output");
  11740. return WOLFSSL_FAILURE;
  11741. }
  11742. if (SslSessionCacheOff(ssl, ssl->session))
  11743. return WOLFSSL_FAILURE;
  11744. if (ssl->options.haveSessionId == 0)
  11745. return WOLFSSL_FAILURE;
  11746. #ifdef HAVE_SESSION_TICKET
  11747. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11748. return WOLFSSL_FAILURE;
  11749. #endif
  11750. XMEMSET(bogusID, 0, sizeof(bogusID));
  11751. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  11752. id = ssl->arrays->sessionID;
  11753. else if (ssl->session->haveAltSessionID) {
  11754. id = ssl->session->altSessionID;
  11755. /* We want to restore the bogus ID for TLS compatibility */
  11756. if (output == ssl->session) {
  11757. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  11758. bogusIDSz = ssl->session->sessionIDSz;
  11759. }
  11760. }
  11761. else
  11762. id = ssl->session->sessionID;
  11763. #ifdef HAVE_EXT_CACHE
  11764. if (ssl->ctx->get_sess_cb != NULL) {
  11765. int copy = 0;
  11766. /* Attempt to retrieve the session from the external cache. */
  11767. WOLFSSL_MSG("Calling external session cache");
  11768. sess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  11769. if ((sess != NULL)
  11770. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11771. && (IsAtLeastTLSv1_3(ssl->version) ==
  11772. IsAtLeastTLSv1_3(sess->version))
  11773. #endif
  11774. ) {
  11775. WOLFSSL_MSG("Session found in external cache");
  11776. error = wolfSSL_DupSession(sess, output, 0);
  11777. #ifdef HAVE_EX_DATA
  11778. output->ownExData = 0; /* Session cache owns external data */
  11779. #endif
  11780. /* If copy not set then free immediately */
  11781. if (!copy)
  11782. wolfSSL_FreeSession(ssl->ctx, sess);
  11783. /* We want to restore the bogus ID for TLS compatibility */
  11784. if (ssl->session->haveAltSessionID &&
  11785. output == ssl->session) {
  11786. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  11787. ssl->session->sessionIDSz = bogusIDSz;
  11788. }
  11789. return error;
  11790. }
  11791. WOLFSSL_MSG("Session not found in external cache");
  11792. }
  11793. if (ssl->ctx->internalCacheLookupOff) {
  11794. WOLFSSL_MSG("Internal cache lookup turned off");
  11795. return WOLFSSL_FAILURE;
  11796. }
  11797. #endif
  11798. row = HashObject(id, ID_LEN, &error) % SESSION_ROWS;
  11799. if (error != 0) {
  11800. WOLFSSL_MSG("Hash session failed");
  11801. return WOLFSSL_FAILURE;
  11802. }
  11803. #ifdef HAVE_SESSION_TICKET
  11804. if (output->ticket == NULL ||
  11805. output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) {
  11806. #ifdef WOLFSSL_SMALL_STACK
  11807. tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap,
  11808. DYNAMIC_TYPE_TMP_BUFFER);
  11809. if (tmpTicket == NULL) {
  11810. WOLFSSL_MSG("tmpTicket malloc failed");
  11811. return WOLFSSL_FAILURE;
  11812. }
  11813. #endif
  11814. if (output->ticketLenAlloc)
  11815. XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11816. output->ticket = tmpTicket;
  11817. output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN;
  11818. output->ticketLen = 0;
  11819. tmpBufSet = 1;
  11820. }
  11821. #endif
  11822. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11823. if (output->peer != NULL) {
  11824. wolfSSL_X509_free(output->peer);
  11825. output->peer = NULL;
  11826. }
  11827. #endif
  11828. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \
  11829. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11830. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11831. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  11832. XFREE(output->ticketNonce.data, output->heap,
  11833. DYNAMIC_TYPE_SESSION_TICK);
  11834. output->ticketNonce.data = output->ticketNonce.dataStatic;
  11835. output->ticketNonce.len = 0;
  11836. }
  11837. error = SessionTicketNoncePrealloc(&preallocNonce, &preallocNonceLen,
  11838. output->heap);
  11839. if (error != 0) {
  11840. if (tmpBufSet) {
  11841. output->ticket = output->staticTicket;
  11842. output->ticketLenAlloc = 0;
  11843. }
  11844. #ifdef WOLFSSL_SMALL_STACK
  11845. if (tmpTicket != NULL)
  11846. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11847. #endif
  11848. return WOLFSSL_FAILURE;
  11849. }
  11850. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET*/
  11851. /* lock row */
  11852. sessRow = &SessionCache[row];
  11853. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11854. WOLFSSL_MSG("Session cache row lock failure");
  11855. #ifdef HAVE_SESSION_TICKET
  11856. if (tmpBufSet) {
  11857. output->ticket = output->staticTicket;
  11858. output->ticketLenAlloc = 0;
  11859. }
  11860. #ifdef WOLFSSL_TLS13
  11861. if (preallocNonce != NULL)
  11862. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11863. #endif /* WOLFSSL_TLS13 */
  11864. #ifdef WOLFSSL_SMALL_STACK
  11865. if (tmpTicket != NULL)
  11866. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11867. #endif
  11868. #endif
  11869. return WOLFSSL_FAILURE;
  11870. }
  11871. /* start from most recently used */
  11872. count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW);
  11873. idx = sessRow->nextIdx - 1;
  11874. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  11875. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11876. }
  11877. for (; count > 0; --count) {
  11878. WOLFSSL_SESSION* current;
  11879. current = &sessRow->Sessions[idx];
  11880. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0
  11881. && current->side == ssl->options.side
  11882. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11883. && (IsAtLeastTLSv1_3(ssl->version) ==
  11884. IsAtLeastTLSv1_3(current->version))
  11885. #endif
  11886. ) {
  11887. WOLFSSL_MSG("Found a session match");
  11888. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11889. WOLFSSL_MSG("Session valid");
  11890. sess = current;
  11891. } else {
  11892. WOLFSSL_MSG("Session timed out");
  11893. }
  11894. break; /* no more sessionIDs whether valid or not that match */
  11895. } else {
  11896. WOLFSSL_MSG("SessionID not a match at this idx");
  11897. }
  11898. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  11899. }
  11900. if (sess != NULL) {
  11901. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11902. /* We don't want the peer member. We will free it at the end. */
  11903. if (sess->peer != NULL) {
  11904. peer = sess->peer;
  11905. sess->peer = NULL;
  11906. }
  11907. #endif
  11908. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13)
  11909. error = wolfSSL_DupSessionEx(sess, output, 1,
  11910. preallocNonce, &preallocNonceLen, &preallocNonceUsed);
  11911. #else
  11912. error = wolfSSL_DupSession(sess, output, 1);
  11913. #endif /* WOLFSSL_TSL */
  11914. #ifdef HAVE_EX_DATA
  11915. output->ownExData = 0; /* Session cache owns external data */
  11916. #endif
  11917. }
  11918. else {
  11919. error = WOLFSSL_FAILURE;
  11920. }
  11921. SESSION_ROW_UNLOCK(sessRow);
  11922. /* We want to restore the bogus ID for TLS compatibility */
  11923. if (ssl->session->haveAltSessionID &&
  11924. output == ssl->session) {
  11925. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  11926. ssl->session->sessionIDSz = bogusIDSz;
  11927. }
  11928. #ifdef HAVE_SESSION_TICKET
  11929. if (tmpBufSet) {
  11930. if (error == WOLFSSL_SUCCESS) {
  11931. if (output->ticketLen > SESSION_TICKET_LEN) {
  11932. output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap,
  11933. DYNAMIC_TYPE_SESSION_TICK);
  11934. if (output->ticket == NULL) {
  11935. error = WOLFSSL_FAILURE;
  11936. output->ticket = output->staticTicket;
  11937. output->ticketLenAlloc = 0;
  11938. output->ticketLen = 0;
  11939. }
  11940. }
  11941. else {
  11942. output->ticket = output->staticTicket;
  11943. output->ticketLenAlloc = 0;
  11944. }
  11945. }
  11946. else {
  11947. output->ticket = output->staticTicket;
  11948. output->ticketLenAlloc = 0;
  11949. output->ticketLen = 0;
  11950. }
  11951. if (error == WOLFSSL_SUCCESS) {
  11952. XMEMCPY(output->ticket, tmpTicket, output->ticketLen);
  11953. }
  11954. }
  11955. #ifdef WOLFSSL_SMALL_STACK
  11956. if (tmpTicket != NULL)
  11957. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11958. #endif
  11959. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  11960. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  11961. if (error == WOLFSSL_SUCCESS && preallocNonceUsed) {
  11962. if (preallocNonceLen < PREALLOC_SESSION_TICKET_NONCE_LEN) {
  11963. /* buffer bigger than needed */
  11964. #ifndef XREALLOC
  11965. output->ticketNonce.data = (byte*)XMALLOC(preallocNonceLen,
  11966. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11967. if (output->ticketNonce.data != NULL)
  11968. XMEMCPY(output->ticketNonce.data, preallocNonce,
  11969. preallocNonceLen);
  11970. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11971. preallocNonce = NULL;
  11972. #else
  11973. output->ticketNonce.data = XREALLOC(preallocNonce,
  11974. preallocNonceLen, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11975. if (output->ticketNonce.data != NULL) {
  11976. /* don't free the reallocated pointer */
  11977. preallocNonce = NULL;
  11978. }
  11979. #endif /* !XREALLOC */
  11980. if (output->ticketNonce.data == NULL) {
  11981. output->ticketNonce.data = output->ticketNonce.dataStatic;
  11982. output->ticketNonce.len = 0;
  11983. error = WOLFSSL_FAILURE;
  11984. /* preallocNonce will be free'd after the if */
  11985. }
  11986. }
  11987. else {
  11988. output->ticketNonce.data = preallocNonce;
  11989. output->ticketNonce.len = preallocNonceLen;
  11990. preallocNonce = NULL;
  11991. }
  11992. }
  11993. if (preallocNonce != NULL)
  11994. XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11995. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  11996. #endif
  11997. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11998. if (peer != NULL) {
  11999. wolfSSL_X509_free(peer);
  12000. }
  12001. #endif
  12002. return error;
  12003. }
  12004. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12005. byte restoreSessionCerts)
  12006. {
  12007. WOLFSSL_SESSION* ret = NULL;
  12008. (void)restoreSessionCerts; /* Kept for compatibility */
  12009. if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) {
  12010. ret = ssl->session;
  12011. }
  12012. else {
  12013. WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session");
  12014. }
  12015. if (ret != NULL && masterSecret != NULL)
  12016. XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN);
  12017. return ret;
  12018. }
  12019. int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  12020. {
  12021. SessionRow* sessRow = NULL;
  12022. int ret = WOLFSSL_SUCCESS;
  12023. session = ClientSessionToSession(session);
  12024. if (ssl == NULL || session == NULL) {
  12025. return WOLFSSL_FAILURE;
  12026. }
  12027. if (session->type == WOLFSSL_SESSION_TYPE_CACHE) {
  12028. if (session->cacheRow < SESSION_ROWS) {
  12029. sessRow = &SessionCache[session->cacheRow];
  12030. if (SESSION_ROW_LOCK(sessRow) != 0) {
  12031. WOLFSSL_MSG("Session row lock failed");
  12032. return WOLFSSL_FAILURE;
  12033. }
  12034. }
  12035. }
  12036. if (ret == WOLFSSL_SUCCESS && SslSessionCacheOff(ssl, session)) {
  12037. WOLFSSL_MSG("Session cache off");
  12038. ret = WOLFSSL_FAILURE;
  12039. }
  12040. if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END &&
  12041. (byte)ssl->options.side != session->side) {
  12042. WOLFSSL_MSG("Setting session for wrong role");
  12043. ret = WOLFSSL_FAILURE;
  12044. }
  12045. if (ret == WOLFSSL_SUCCESS &&
  12046. wolfSSL_DupSession(session, ssl->session, 0) != WOLFSSL_SUCCESS) {
  12047. WOLFSSL_MSG("Session duplicate failed");
  12048. ret = WOLFSSL_FAILURE;
  12049. }
  12050. /* Let's copy over the altSessionID for local cache purposes */
  12051. if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID) {
  12052. ssl->session->haveAltSessionID = 1;
  12053. XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN);
  12054. }
  12055. if (sessRow != NULL) {
  12056. SESSION_ROW_UNLOCK(sessRow);
  12057. sessRow = NULL;
  12058. }
  12059. /* Note: the `session` variable cannot be used below, since the row is
  12060. * un-locked */
  12061. if (ret != WOLFSSL_SUCCESS)
  12062. return ret;
  12063. #ifdef OPENSSL_EXTRA
  12064. /* check for application context id */
  12065. if (ssl->sessionCtxSz > 0) {
  12066. if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, ssl->sessionCtxSz)) {
  12067. /* context id did not match! */
  12068. WOLFSSL_MSG("Session context did not match");
  12069. return WOLFSSL_FAILURE;
  12070. }
  12071. }
  12072. #endif /* OPENSSL_EXTRA */
  12073. if (LowResTimer() < (ssl->session->bornOn + ssl->session->timeout)) {
  12074. ssl->options.resuming = 1;
  12075. ssl->options.haveEMS = ssl->session->haveEMS;
  12076. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  12077. defined(HAVE_SESSION_TICKET))
  12078. ssl->version = ssl->session->version;
  12079. if (IsAtLeastTLSv1_3(ssl->version))
  12080. ssl->options.tls1_3 = 1;
  12081. #endif
  12082. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  12083. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12084. ssl->options.cipherSuite0 = ssl->session->cipherSuite0;
  12085. ssl->options.cipherSuite = ssl->session->cipherSuite;
  12086. #endif
  12087. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12088. ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet;
  12089. #endif
  12090. ret = WOLFSSL_SUCCESS;
  12091. }
  12092. else {
  12093. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12094. WOLFSSL_MSG("Session is expired but return success for \
  12095. OpenSSL compatibility");
  12096. ret = WOLFSSL_SUCCESS;
  12097. #else
  12098. ret = WOLFSSL_FAILURE; /* session timed out */
  12099. #endif /* OPENSSL_EXTRA && WOLFSSL_ERROR_CODE_OPENSSL */
  12100. }
  12101. return ret;
  12102. }
  12103. #ifdef WOLFSSL_SESSION_STATS
  12104. static int get_locked_session_stats(word32* active, word32* total,
  12105. word32* peak);
  12106. #endif
  12107. #ifndef NO_CLIENT_CACHE
  12108. ClientSession* AddSessionToClientCache(int side, int row, int idx, byte* serverID,
  12109. word16 idLen, const byte* sessionID,
  12110. word16 useTicket)
  12111. {
  12112. int error = -1;
  12113. word32 clientRow = 0, clientIdx = 0, sessionIDHash = 0;
  12114. (void)useTicket;
  12115. if (side == WOLFSSL_CLIENT_END
  12116. && row != INVALID_SESSION_ROW
  12117. && (idLen
  12118. #ifdef HAVE_SESSION_TICKET
  12119. || useTicket == 1
  12120. #endif
  12121. || serverID != NULL
  12122. )) {
  12123. WOLFSSL_MSG("Trying to add client cache entry");
  12124. if (idLen) {
  12125. clientRow = HashObject(serverID,
  12126. idLen, &error) % CLIENT_SESSION_ROWS;
  12127. }
  12128. else if (serverID != NULL) {
  12129. clientRow = HashObject(sessionID,
  12130. ID_LEN, &error) % CLIENT_SESSION_ROWS;
  12131. }
  12132. else {
  12133. error = -1;
  12134. }
  12135. if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) {
  12136. clientIdx = ClientCache[clientRow].nextIdx;
  12137. if (clientIdx < CLIENT_SESSIONS_PER_ROW) {
  12138. ClientCache[clientRow].Clients[clientIdx].serverRow =
  12139. (word16)row;
  12140. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  12141. (word16)idx;
  12142. if (sessionID != NULL) {
  12143. sessionIDHash = HashObject(sessionID, ID_LEN, &error);
  12144. if (error == 0) {
  12145. ClientCache[clientRow].Clients[clientIdx].sessionIDHash
  12146. = sessionIDHash;
  12147. }
  12148. }
  12149. }
  12150. else {
  12151. error = -1;
  12152. ClientCache[clientRow].nextIdx = 0; /* reset index as saftey */
  12153. WOLFSSL_MSG("Invalid client cache index! "
  12154. "Possible corrupted memory");
  12155. }
  12156. if (error == 0) {
  12157. WOLFSSL_MSG("Adding client cache entry");
  12158. if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW)
  12159. ClientCache[clientRow].totalCount++;
  12160. ClientCache[clientRow].nextIdx++;
  12161. ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW;
  12162. }
  12163. wc_UnLockMutex(&clisession_mutex);
  12164. }
  12165. else {
  12166. WOLFSSL_MSG("Hash session or lock failed");
  12167. error = -1;
  12168. }
  12169. }
  12170. else {
  12171. WOLFSSL_MSG("Skipping client cache");
  12172. }
  12173. if (error == 0)
  12174. return &ClientCache[clientRow].Clients[clientIdx];
  12175. else
  12176. return NULL;
  12177. }
  12178. #endif
  12179. /**
  12180. * For backwards compatibility, this API needs to be used in *ALL* functions
  12181. * that access the WOLFSSL_SESSION members directly.
  12182. *
  12183. * This API checks if the passed in session is actually a ClientSession object
  12184. * and returns the matching session cache object. Otherwise just return the
  12185. * input. ClientSession objects only occur in the ClientCache. They are not
  12186. * allocated anywhere else.
  12187. */
  12188. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12189. {
  12190. WOLFSSL_ENTER("ClientSessionToSession");
  12191. #ifdef NO_SESSION_CACHE_REF
  12192. return (WOLFSSL_SESSION*)session;
  12193. #else
  12194. #ifndef NO_CLIENT_CACHE
  12195. if (session == NULL)
  12196. return NULL;
  12197. /* Check if session points into ClientCache */
  12198. if ((byte*)session >= (byte*)ClientCache &&
  12199. /* Cast to byte* to make pointer arithmetic work per byte */
  12200. (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) {
  12201. ClientSession* clientSession = (ClientSession*)session;
  12202. SessionRow* sessRow = NULL;
  12203. WOLFSSL_SESSION* cacheSession = NULL;
  12204. word32 sessionIDHash = 0;
  12205. int error = 0;
  12206. session = NULL; /* Default to NULL for failure case */
  12207. if (wc_LockMutex(&clisession_mutex) != 0) {
  12208. WOLFSSL_MSG("Client cache mutex lock failed");
  12209. return NULL;
  12210. }
  12211. if (clientSession->serverRow >= SESSION_ROWS ||
  12212. clientSession->serverIdx >= SESSIONS_PER_ROW) {
  12213. WOLFSSL_MSG("Client cache serverRow or serverIdx invalid");
  12214. error = -1;
  12215. }
  12216. if (error == 0) {
  12217. /* Lock row */
  12218. sessRow = &SessionCache[clientSession->serverRow];
  12219. error = SESSION_ROW_LOCK(sessRow);
  12220. if (error != 0) {
  12221. WOLFSSL_MSG("Session cache row lock failure");
  12222. sessRow = NULL;
  12223. }
  12224. }
  12225. if (error == 0) {
  12226. cacheSession = &sessRow->Sessions[clientSession->serverIdx];
  12227. if (cacheSession->sessionIDSz == 0) {
  12228. cacheSession = NULL;
  12229. WOLFSSL_MSG("Session cache entry not set");
  12230. error = -1;
  12231. }
  12232. }
  12233. if (error == 0) {
  12234. /* Calculate the hash of the session ID */
  12235. sessionIDHash = HashObject(cacheSession->sessionID, ID_LEN,
  12236. &error);
  12237. }
  12238. if (error == 0) {
  12239. /* Check the session ID hash matches */
  12240. error = clientSession->sessionIDHash != sessionIDHash;
  12241. }
  12242. if (error == 0) {
  12243. /* Hashes match */
  12244. session = cacheSession;
  12245. WOLFSSL_MSG("Found session cache matching client session object");
  12246. }
  12247. if (sessRow != NULL) {
  12248. SESSION_ROW_UNLOCK(sessRow);
  12249. }
  12250. wc_UnLockMutex(&clisession_mutex);
  12251. return (WOLFSSL_SESSION*)session;
  12252. }
  12253. else {
  12254. /* Plain WOLFSSL_SESSION object */
  12255. return (WOLFSSL_SESSION*)session;
  12256. }
  12257. #else
  12258. return (WOLFSSL_SESSION*)session;
  12259. #endif
  12260. #endif
  12261. }
  12262. int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession,
  12263. const byte* id, byte idSz, int* sessionIndex, int side,
  12264. word16 useTicket, ClientSession** clientCacheEntry)
  12265. {
  12266. WOLFSSL_SESSION* cacheSession = NULL;
  12267. SessionRow* sessRow = NULL;
  12268. word32 idx = 0;
  12269. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12270. WOLFSSL_X509* peer = NULL;
  12271. #endif
  12272. #ifdef HAVE_SESSION_TICKET
  12273. byte* cacheTicBuff = NULL;
  12274. byte ticBuffUsed = 0;
  12275. byte* ticBuff = NULL;
  12276. int ticLen = 0;
  12277. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12278. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12279. byte *preallocNonce = NULL;
  12280. byte preallocNonceLen = 0;
  12281. byte preallocNonceUsed = 0;
  12282. byte *toFree = NULL;
  12283. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC */
  12284. #endif /* HAVE_SESSION_TICKET */
  12285. int ret = 0;
  12286. int row;
  12287. int i;
  12288. int overwrite = 0;
  12289. (void)ctx;
  12290. (void)sessionIndex;
  12291. (void)useTicket;
  12292. (void)clientCacheEntry;
  12293. if (idSz == 0) {
  12294. WOLFSSL_MSG("AddSessionToCache idSz == 0");
  12295. return BAD_FUNC_ARG;
  12296. }
  12297. addSession = ClientSessionToSession(addSession);
  12298. if (addSession == NULL) {
  12299. WOLFSSL_MSG("AddSessionToCache is NULL");
  12300. return MEMORY_E;
  12301. }
  12302. #ifdef HAVE_SESSION_TICKET
  12303. ticLen = addSession->ticketLen;
  12304. /* Alloc Memory here to avoid syscalls during lock */
  12305. if (ticLen > SESSION_TICKET_LEN) {
  12306. ticBuff = (byte*)XMALLOC(ticLen, NULL,
  12307. DYNAMIC_TYPE_SESSION_TICK);
  12308. if (ticBuff == NULL) {
  12309. return MEMORY_E;
  12310. }
  12311. }
  12312. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12313. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12314. if (addSession->ticketNonce.data != addSession->ticketNonce.dataStatic) {
  12315. /* use the AddSession->heap even if the buffer maybe saved in
  12316. * CachedSession objects. CachedSession heap and AddSession heap should
  12317. * be the same */
  12318. preallocNonce = (byte*)XMALLOC(addSession->ticketNonce.len,
  12319. addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12320. if (preallocNonce == NULL) {
  12321. if (ticBuff != NULL)
  12322. XFREE(ticBuff, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12323. return MEMORY_E;
  12324. }
  12325. preallocNonceLen = addSession->ticketNonce.len;
  12326. }
  12327. #endif /* WOLFSSL_TLS13 && WOLFSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
  12328. #endif /* HAVE_SESSION_TICKET */
  12329. /* Find a position for the new session in cache and use that */
  12330. /* Use the session object in the cache for external cache if required */
  12331. row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS);
  12332. if (ret != 0) {
  12333. WOLFSSL_MSG("Hash session failed");
  12334. #ifdef HAVE_SESSION_TICKET
  12335. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12336. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKE_NONCE_MALLOC)
  12337. if (preallocNonce != NULL)
  12338. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12339. #endif
  12340. #endif
  12341. return ret;
  12342. }
  12343. sessRow = &SessionCache[row];
  12344. if (SESSION_ROW_LOCK(sessRow) != 0) {
  12345. #ifdef HAVE_SESSION_TICKET
  12346. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12347. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKE_NONCE_MALLOC)
  12348. if (preallocNonce != NULL)
  12349. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12350. #endif
  12351. #endif
  12352. WOLFSSL_MSG("Session row lock failed");
  12353. return BAD_MUTEX_E;
  12354. }
  12355. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  12356. if (XMEMCMP(id,
  12357. sessRow->Sessions[i].sessionID, ID_LEN) == 0 &&
  12358. sessRow->Sessions[i].side == side) {
  12359. WOLFSSL_MSG("Session already exists. Overwriting.");
  12360. overwrite = 1;
  12361. idx = i;
  12362. break;
  12363. }
  12364. }
  12365. if (!overwrite)
  12366. idx = sessRow->nextIdx;
  12367. #ifdef SESSION_INDEX
  12368. if (sessionIndex != NULL)
  12369. *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  12370. #endif
  12371. cacheSession = &sessRow->Sessions[idx];
  12372. #ifdef HAVE_EX_DATA
  12373. if (cacheSession->rem_sess_cb && cacheSession->ownExData) {
  12374. cacheSession->rem_sess_cb(NULL, cacheSession);
  12375. /* Make sure not to call remove functions again */
  12376. cacheSession->ownExData = 0;
  12377. cacheSession->rem_sess_cb = NULL;
  12378. }
  12379. #endif
  12380. cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE;
  12381. cacheSession->cacheRow = row;
  12382. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12383. /* Save the peer field to free after unlocking the row */
  12384. if (cacheSession->peer != NULL)
  12385. peer = cacheSession->peer;
  12386. cacheSession->peer = NULL;
  12387. #endif
  12388. #ifdef HAVE_SESSION_TICKET
  12389. /* If we can re-use the existing buffer in cacheSession then we won't touch
  12390. * ticBuff at all making it a very cheap malloc/free. The page on a modern
  12391. * OS will most likely not even be allocated to the process. */
  12392. if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) {
  12393. /* Save pointer only if separately allocated */
  12394. if (cacheSession->ticket != cacheSession->staticTicket)
  12395. cacheTicBuff = cacheSession->ticket;
  12396. ticBuffUsed = 1;
  12397. cacheSession->ticket = ticBuff;
  12398. cacheSession->ticketLenAlloc = (word16) ticLen;
  12399. }
  12400. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12401. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12402. /* cache entry never used */
  12403. if (cacheSession->ticketNonce.data == NULL)
  12404. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12405. if (cacheSession->ticketNonce.data !=
  12406. cacheSession->ticketNonce.dataStatic) {
  12407. toFree = cacheSession->ticketNonce.data;
  12408. cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic;
  12409. cacheSession->ticketNonce.len = 0;
  12410. }
  12411. #endif /* WOFLSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12412. #endif
  12413. #ifdef SESSION_CERTS
  12414. if (overwrite &&
  12415. addSession->chain.count == 0 &&
  12416. cacheSession->chain.count > 0) {
  12417. /* Copy in the certs from the session */
  12418. addSession->chain.count = cacheSession->chain.count;
  12419. XMEMCPY(addSession->chain.certs, cacheSession->chain.certs,
  12420. sizeof(x509_buffer) * cacheSession->chain.count);
  12421. }
  12422. #endif /* SESSION_CERTS */
  12423. cacheSession->heap = NULL;
  12424. /* Copy data into the cache object */
  12425. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12426. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12427. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12428. ret = wolfSSL_DupSessionEx(addSession, cacheSession, 1, preallocNonce,
  12429. &preallocNonceLen, &preallocNonceUsed) == WOLFSSL_FAILURE;
  12430. #else
  12431. ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE;
  12432. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12433. && FIPS_VERSION_GE(5,3)*/
  12434. if (ret == 0) {
  12435. /* Increment the totalCount and the nextIdx */
  12436. if (sessRow->totalCount < SESSIONS_PER_ROW)
  12437. sessRow->totalCount++;
  12438. sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW;
  12439. if (id != addSession->sessionID) {
  12440. /* ssl->session->sessionID may contain the bogus ID or we want the
  12441. * ID from the arrays object */
  12442. XMEMCPY(cacheSession->sessionID, id, ID_LEN);
  12443. cacheSession->sessionIDSz = ID_LEN;
  12444. }
  12445. #ifdef HAVE_EX_DATA
  12446. if (ctx->rem_sess_cb != NULL) {
  12447. addSession->ownExData = 0;
  12448. cacheSession->ownExData = 1;
  12449. cacheSession->rem_sess_cb = ctx->rem_sess_cb;
  12450. }
  12451. #endif
  12452. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  12453. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12454. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12455. if (preallocNonce != NULL && preallocNonceUsed) {
  12456. cacheSession->ticketNonce.data = preallocNonce;
  12457. cacheSession->ticketNonce.len = preallocNonceLen;
  12458. preallocNonce = NULL;
  12459. preallocNonceLen = 0;
  12460. }
  12461. #endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC
  12462. * && FIPS_VERSION_GE(5,3)*/
  12463. }
  12464. #ifdef HAVE_SESSION_TICKET
  12465. else if (ticBuffUsed) {
  12466. /* Error occured. Need to clean up the ticket buffer. */
  12467. cacheSession->ticket = cacheSession->staticTicket;
  12468. cacheSession->ticketLenAlloc = 0;
  12469. cacheSession->ticketLen = 0;
  12470. }
  12471. #endif
  12472. SESSION_ROW_UNLOCK(sessRow);
  12473. cacheSession = NULL; /* Can't access after unlocked */
  12474. #ifndef NO_CLIENT_CACHE
  12475. if (ret == 0 && clientCacheEntry != NULL) {
  12476. ClientSession* clientCache = AddSessionToClientCache(side, row, idx,
  12477. addSession->serverID, addSession->idLen, id, useTicket);
  12478. if (clientCache != NULL)
  12479. *clientCacheEntry = clientCache;
  12480. }
  12481. #endif
  12482. #ifdef HAVE_SESSION_TICKET
  12483. if (ticBuff != NULL && !ticBuffUsed)
  12484. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12485. if (cacheTicBuff != NULL)
  12486. XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12487. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  12488. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  12489. if (preallocNonce != NULL)
  12490. XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12491. if (toFree != NULL)
  12492. XFREE(toFree, addSession->heap, DYNAMIC_TYPE_SESSION_TICK);
  12493. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  12494. #endif
  12495. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12496. if (peer != NULL) {
  12497. wolfSSL_X509_free(peer);
  12498. peer = NULL; /* Make sure not use after this point */
  12499. }
  12500. #endif
  12501. return ret;
  12502. }
  12503. #ifndef NO_CLIENT_CACHE
  12504. #endif
  12505. void AddSession(WOLFSSL* ssl)
  12506. {
  12507. int error = 0;
  12508. const byte* id = NULL;
  12509. byte idSz = 0;
  12510. WOLFSSL_SESSION* session = ssl->session;
  12511. #ifdef HAVE_EXT_CACHE
  12512. int cbRet = 0;
  12513. #endif
  12514. (void)error;
  12515. WOLFSSL_ENTER("AddSession");
  12516. if (SslSessionCacheOff(ssl, session)) {
  12517. WOLFSSL_MSG("Cache off");
  12518. return;
  12519. }
  12520. if (ssl->options.haveSessionId == 0) {
  12521. WOLFSSL_MSG("Don't have session id");
  12522. return;
  12523. }
  12524. #if defined(HAVE_SESSION_TICKET) && !defined(OPENSSL_EXTRA)
  12525. /* For the compat layer generate a session object to use */
  12526. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) {
  12527. WOLFSSL_MSG("Using tickets instead of cache");
  12528. return;
  12529. }
  12530. #endif
  12531. if (session->haveAltSessionID) {
  12532. id = session->altSessionID;
  12533. idSz = ID_LEN;
  12534. }
  12535. else {
  12536. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  12537. /* Make sure the session ID is available when the user calls any
  12538. * get_session API */
  12539. XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN);
  12540. session->sessionIDSz = ssl->arrays->sessionIDSz;
  12541. }
  12542. id = session->sessionID;
  12543. idSz = session->sessionIDSz;
  12544. }
  12545. session->timeout = ssl->timeout;
  12546. session->side = (byte)ssl->options.side;
  12547. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  12548. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  12549. session->haveEMS = ssl->options.haveEMS;
  12550. #ifdef OPENSSL_EXTRA
  12551. /* If using compatibility layer then check for and copy over session context
  12552. * id. */
  12553. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  12554. XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  12555. session->sessionCtxSz = ssl->sessionCtxSz;
  12556. }
  12557. #endif
  12558. session->timeout = ssl->timeout;
  12559. session->bornOn = LowResTimer();
  12560. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  12561. defined(HAVE_SESSION_TICKET))
  12562. session->version = ssl->version;
  12563. #endif
  12564. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  12565. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12566. session->cipherSuite0 = ssl->options.cipherSuite0;
  12567. session->cipherSuite = ssl->options.cipherSuite;
  12568. #endif
  12569. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12570. session->peerVerifyRet = (byte)ssl->peerVerifyRet;
  12571. #endif
  12572. /* Do this last so that if it fails, the rest of the session is setup. Do
  12573. * this only for the client because if the server doesn't have an ID at
  12574. * this point, it won't on resumption. */
  12575. if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12576. WC_RNG* rng = NULL;
  12577. if (ssl->rng != NULL)
  12578. rng = ssl->rng;
  12579. #if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA)
  12580. else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) {
  12581. rng = &globalRNG;
  12582. }
  12583. #endif
  12584. if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID,
  12585. ID_LEN) != 0)
  12586. return;
  12587. ssl->session->haveAltSessionID = 1;
  12588. id = ssl->session->altSessionID;
  12589. idSz = ID_LEN;
  12590. }
  12591. /* Setup done */
  12592. if (ssl->options.side == WOLFSSL_SERVER_END /* No point in adding a
  12593. * client session */
  12594. #ifdef HAVE_EXT_CACHE
  12595. && !ssl->options.internalCacheOff
  12596. #endif
  12597. )
  12598. {
  12599. /* Try to add the session to cache. Its ok if we don't succeed. */
  12600. (void)AddSessionToCache(ssl->ctx, session, id, idSz,
  12601. #ifdef SESSION_INDEX
  12602. &ssl->sessionIndex,
  12603. #else
  12604. NULL,
  12605. #endif
  12606. ssl->options.side,
  12607. #ifdef HAVE_SESSION_TICKET
  12608. ssl->options.useTicket,
  12609. #else
  12610. 0,
  12611. #endif
  12612. NULL
  12613. );
  12614. }
  12615. #ifdef HAVE_EXT_CACHE
  12616. if (error == 0 && ssl->ctx->new_sess_cb != NULL) {
  12617. wolfSSL_SESSION_up_ref(session);
  12618. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  12619. if (cbRet == 0)
  12620. wolfSSL_FreeSession(ssl->ctx, session);
  12621. }
  12622. #endif
  12623. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  12624. if (error == 0) {
  12625. word32 active = 0;
  12626. error = get_locked_session_stats(&active, NULL, NULL);
  12627. if (error == WOLFSSL_SUCCESS) {
  12628. error = 0; /* back to this function ok */
  12629. if (PeakSessions < active) {
  12630. PeakSessions = active;
  12631. }
  12632. }
  12633. }
  12634. #endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */
  12635. (void)error;
  12636. }
  12637. #ifdef SESSION_INDEX
  12638. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  12639. {
  12640. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  12641. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  12642. return ssl->sessionIndex;
  12643. }
  12644. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  12645. {
  12646. int row, col, result = WOLFSSL_FAILURE;
  12647. SessionRow* sessRow;
  12648. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  12649. session = ClientSessionToSession(session);
  12650. row = idx >> SESSIDX_ROW_SHIFT;
  12651. col = idx & SESSIDX_IDX_MASK;
  12652. if (session == NULL ||
  12653. row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) {
  12654. return WOLFSSL_FAILURE;
  12655. }
  12656. sessRow = &SessionCache[row];
  12657. if (SESSION_ROW_LOCK(sessRow) != 0) {
  12658. return BAD_MUTEX_E;
  12659. }
  12660. XMEMCPY(session, &sessRow->Sessions[col], sizeof(WOLFSSL_SESSION));
  12661. result = WOLFSSL_SUCCESS;
  12662. SESSION_ROW_UNLOCK(sessRow);
  12663. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  12664. return result;
  12665. }
  12666. #endif /* SESSION_INDEX */
  12667. #if defined(SESSION_CERTS)
  12668. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  12669. {
  12670. WOLFSSL_X509_CHAIN* chain = NULL;
  12671. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12672. session = ClientSessionToSession(session);
  12673. if (session)
  12674. chain = &session->chain;
  12675. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  12676. return chain;
  12677. }
  12678. #ifdef OPENSSL_EXTRA
  12679. /* gets the peer certificate associated with the session passed in
  12680. * returns null on failure, the caller should not free the returned pointer */
  12681. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  12682. {
  12683. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12684. session = ClientSessionToSession(session);
  12685. if (session) {
  12686. int count;
  12687. count = wolfSSL_get_chain_count(&session->chain);
  12688. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  12689. WOLFSSL_MSG("bad count found");
  12690. return NULL;
  12691. }
  12692. if (session->peer == NULL) {
  12693. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  12694. }
  12695. return session->peer;
  12696. }
  12697. WOLFSSL_MSG("No session passed in");
  12698. return NULL;
  12699. }
  12700. #endif /* OPENSSL_EXTRA */
  12701. #endif /* SESSION_INDEX && SESSION_CERTS */
  12702. #ifdef WOLFSSL_SESSION_STATS
  12703. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  12704. {
  12705. int result = WOLFSSL_SUCCESS;
  12706. int i;
  12707. int count;
  12708. int idx;
  12709. word32 now = 0;
  12710. word32 seen = 0;
  12711. word32 ticks = LowResTimer();
  12712. WOLFSSL_ENTER("get_locked_session_stats");
  12713. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12714. wc_LockMutex(&session_mutex);
  12715. #endif
  12716. for (i = 0; i < SESSION_ROWS; i++) {
  12717. SessionRow* row = &SessionCache[i];
  12718. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12719. if (SESSION_ROW_LOCK(row) != 0) {
  12720. WOLFSSL_MSG("Session row cache mutex lock failed");
  12721. return BAD_MUTEX_E;
  12722. }
  12723. #endif
  12724. seen += row->totalCount;
  12725. if (active == NULL) {
  12726. SESSION_ROW_UNLOCK(row);
  12727. continue;
  12728. }
  12729. count = min((word32)row->totalCount, SESSIONS_PER_ROW);
  12730. idx = row->nextIdx - 1;
  12731. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  12732. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  12733. }
  12734. for (; count > 0; --count) {
  12735. /* if not expired then good */
  12736. if (ticks < (row->Sessions[idx].bornOn +
  12737. row->Sessions[idx].timeout) ) {
  12738. now++;
  12739. }
  12740. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  12741. }
  12742. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12743. SESSION_ROW_UNLOCK(row);
  12744. #endif
  12745. }
  12746. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12747. wc_UnLockMutex(&session_mutex);
  12748. #endif
  12749. if (active) {
  12750. *active = now;
  12751. }
  12752. if (total) {
  12753. *total = seen;
  12754. }
  12755. #ifdef WOLFSSL_PEAK_SESSIONS
  12756. if (peak) {
  12757. *peak = PeakSessions;
  12758. }
  12759. #else
  12760. (void)peak;
  12761. #endif
  12762. WOLFSSL_LEAVE("get_locked_session_stats", result);
  12763. return result;
  12764. }
  12765. /* return WOLFSSL_SUCCESS on ok */
  12766. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  12767. word32* maxSessions)
  12768. {
  12769. int result = WOLFSSL_SUCCESS;
  12770. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  12771. if (maxSessions) {
  12772. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  12773. if (active == NULL && total == NULL && peak == NULL)
  12774. return result; /* we're done */
  12775. }
  12776. /* user must provide at least one query value */
  12777. if (active == NULL && total == NULL && peak == NULL) {
  12778. return BAD_FUNC_ARG;
  12779. }
  12780. result = get_locked_session_stats(active, total, peak);
  12781. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  12782. return result;
  12783. }
  12784. #endif /* WOLFSSL_SESSION_STATS */
  12785. #ifdef PRINT_SESSION_STATS
  12786. /* WOLFSSL_SUCCESS on ok */
  12787. int wolfSSL_PrintSessionStats(void)
  12788. {
  12789. word32 totalSessionsSeen = 0;
  12790. word32 totalSessionsNow = 0;
  12791. word32 peak = 0;
  12792. word32 maxSessions = 0;
  12793. int i;
  12794. int ret;
  12795. double E; /* expected freq */
  12796. double chiSquare = 0;
  12797. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  12798. &peak, &maxSessions);
  12799. if (ret != WOLFSSL_SUCCESS)
  12800. return ret;
  12801. printf("Total Sessions Seen = %u\n", totalSessionsSeen);
  12802. printf("Total Sessions Now = %u\n", totalSessionsNow);
  12803. #ifdef WOLFSSL_PEAK_SESSIONS
  12804. printf("Peak Sessions = %u\n", peak);
  12805. #endif
  12806. printf("Max Sessions = %u\n", maxSessions);
  12807. E = (double)totalSessionsSeen / SESSION_ROWS;
  12808. for (i = 0; i < SESSION_ROWS; i++) {
  12809. double diff = SessionCache[i].totalCount - E;
  12810. diff *= diff; /* square */
  12811. diff /= E; /* normalize */
  12812. chiSquare += diff;
  12813. }
  12814. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  12815. SESSION_ROWS - 1);
  12816. #if (SESSION_ROWS == 11)
  12817. printf(" .05 p value = 18.3, chi-square should be less\n");
  12818. #elif (SESSION_ROWS == 211)
  12819. printf(".05 p value = 244.8, chi-square should be less\n");
  12820. #elif (SESSION_ROWS == 5981)
  12821. printf(".05 p value = 6161.0, chi-square should be less\n");
  12822. #elif (SESSION_ROWS == 3)
  12823. printf(".05 p value = 6.0, chi-square should be less\n");
  12824. #elif (SESSION_ROWS == 2861)
  12825. printf(".05 p value = 2985.5, chi-square should be less\n");
  12826. #endif
  12827. printf("\n");
  12828. return ret;
  12829. }
  12830. #endif /* SESSION_STATS */
  12831. #else /* NO_SESSION_CACHE */
  12832. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12833. {
  12834. return (WOLFSSL_SESSION*)session;
  12835. }
  12836. /* No session cache version */
  12837. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12838. byte restoreSessionCerts)
  12839. {
  12840. (void)ssl;
  12841. (void)masterSecret;
  12842. (void)restoreSessionCerts;
  12843. return NULL;
  12844. }
  12845. #endif /* NO_SESSION_CACHE */
  12846. /* call before SSL_connect, if verifying will add name check to
  12847. date check and signature check */
  12848. WOLFSSL_ABI
  12849. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  12850. {
  12851. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  12852. if (ssl == NULL || dn == NULL) {
  12853. WOLFSSL_MSG("Bad function argument: NULL");
  12854. return WOLFSSL_FAILURE;
  12855. }
  12856. if (ssl->buffers.domainName.buffer)
  12857. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  12858. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  12859. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  12860. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  12861. if (ssl->buffers.domainName.buffer) {
  12862. unsigned char* domainName = ssl->buffers.domainName.buffer;
  12863. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  12864. domainName[ssl->buffers.domainName.length] = '\0';
  12865. return WOLFSSL_SUCCESS;
  12866. }
  12867. else {
  12868. ssl->error = MEMORY_ERROR;
  12869. return WOLFSSL_FAILURE;
  12870. }
  12871. }
  12872. /* turn on wolfSSL zlib compression
  12873. returns WOLFSSL_SUCCESS for success, else error (not built in)
  12874. */
  12875. int wolfSSL_set_compression(WOLFSSL* ssl)
  12876. {
  12877. WOLFSSL_ENTER("wolfSSL_set_compression");
  12878. (void)ssl;
  12879. #ifdef HAVE_LIBZ
  12880. ssl->options.usingCompression = 1;
  12881. return WOLFSSL_SUCCESS;
  12882. #else
  12883. return NOT_COMPILED_IN;
  12884. #endif
  12885. }
  12886. #ifndef USE_WINDOWS_API
  12887. #ifndef NO_WRITEV
  12888. /* simulate writev semantics, doesn't actually do block at a time though
  12889. because of SSL_write behavior and because front adds may be small */
  12890. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  12891. {
  12892. #ifdef WOLFSSL_SMALL_STACK
  12893. byte staticBuffer[1]; /* force heap usage */
  12894. #else
  12895. byte staticBuffer[FILE_BUFFER_SIZE];
  12896. #endif
  12897. byte* myBuffer = staticBuffer;
  12898. int dynamic = 0;
  12899. int sending = 0;
  12900. int idx = 0;
  12901. int i;
  12902. int ret;
  12903. WOLFSSL_ENTER("wolfSSL_writev");
  12904. for (i = 0; i < iovcnt; i++)
  12905. sending += (int)iov[i].iov_len;
  12906. if (sending > (int)sizeof(staticBuffer)) {
  12907. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  12908. DYNAMIC_TYPE_WRITEV);
  12909. if (!myBuffer)
  12910. return MEMORY_ERROR;
  12911. dynamic = 1;
  12912. }
  12913. for (i = 0; i < iovcnt; i++) {
  12914. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  12915. idx += (int)iov[i].iov_len;
  12916. }
  12917. /* myBuffer may not be initialized fully, but the span up to the
  12918. * sending length will be.
  12919. */
  12920. PRAGMA_GCC_DIAG_PUSH;
  12921. PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
  12922. ret = wolfSSL_write(ssl, myBuffer, sending);
  12923. PRAGMA_GCC_DIAG_POP;
  12924. if (dynamic)
  12925. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  12926. return ret;
  12927. }
  12928. #endif
  12929. #endif
  12930. #ifdef WOLFSSL_CALLBACKS
  12931. typedef struct itimerval Itimerval;
  12932. /* don't keep calling simple functions while setting up timer and signals
  12933. if no inlining these are the next best */
  12934. #define AddTimes(a, b, c) \
  12935. do { \
  12936. (c).tv_sec = (a).tv_sec + (b).tv_sec; \
  12937. (c).tv_usec = (a).tv_usec + (b).tv_usec;\
  12938. if ((c).tv_usec >= 1000000) { \
  12939. (c).tv_sec++; \
  12940. (c).tv_usec -= 1000000; \
  12941. } \
  12942. } while (0)
  12943. #define SubtractTimes(a, b, c) \
  12944. do { \
  12945. (c).tv_sec = (a).tv_sec - (b).tv_sec; \
  12946. (c).tv_usec = (a).tv_usec - (b).tv_usec;\
  12947. if ((c).tv_usec < 0) { \
  12948. (c).tv_sec--; \
  12949. (c).tv_usec += 1000000; \
  12950. } \
  12951. } while (0)
  12952. #define CmpTimes(a, b, cmp) \
  12953. (((a).tv_sec == (b).tv_sec) ? \
  12954. ((a).tv_usec cmp (b).tv_usec) : \
  12955. ((a).tv_sec cmp (b).tv_sec)) \
  12956. /* do nothing handler */
  12957. static void myHandler(int signo)
  12958. {
  12959. (void)signo;
  12960. return;
  12961. }
  12962. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12963. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12964. {
  12965. int ret = WOLFSSL_FATAL_ERROR;
  12966. int oldTimerOn = 0; /* was timer already on */
  12967. WOLFSSL_TIMEVAL startTime;
  12968. WOLFSSL_TIMEVAL endTime;
  12969. WOLFSSL_TIMEVAL totalTime;
  12970. Itimerval myTimeout;
  12971. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  12972. struct sigaction act, oact;
  12973. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  12974. if (hsCb) {
  12975. ssl->hsInfoOn = 1;
  12976. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  12977. }
  12978. if (toCb) {
  12979. ssl->toInfoOn = 1;
  12980. InitTimeoutInfo(&ssl->timeoutInfo);
  12981. if (gettimeofday(&startTime, 0) < 0)
  12982. ERR_OUT(GETTIME_ERROR);
  12983. /* use setitimer to simulate getitimer, init 0 myTimeout */
  12984. myTimeout.it_interval.tv_sec = 0;
  12985. myTimeout.it_interval.tv_usec = 0;
  12986. myTimeout.it_value.tv_sec = 0;
  12987. myTimeout.it_value.tv_usec = 0;
  12988. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  12989. ERR_OUT(SETITIMER_ERROR);
  12990. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  12991. oldTimerOn = 1;
  12992. /* is old timer going to expire before ours */
  12993. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  12994. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  12995. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  12996. }
  12997. }
  12998. myTimeout.it_value.tv_sec = timeout.tv_sec;
  12999. myTimeout.it_value.tv_usec = timeout.tv_usec;
  13000. /* set up signal handler, don't restart socket send/recv */
  13001. act.sa_handler = myHandler;
  13002. sigemptyset(&act.sa_mask);
  13003. act.sa_flags = 0;
  13004. #ifdef SA_INTERRUPT
  13005. act.sa_flags |= SA_INTERRUPT;
  13006. #endif
  13007. if (sigaction(SIGALRM, &act, &oact) < 0)
  13008. ERR_OUT(SIGACT_ERROR);
  13009. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  13010. ERR_OUT(SETITIMER_ERROR);
  13011. }
  13012. /* do main work */
  13013. #ifndef NO_WOLFSSL_CLIENT
  13014. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13015. ret = wolfSSL_connect(ssl);
  13016. #endif
  13017. #ifndef NO_WOLFSSL_SERVER
  13018. if (ssl->options.side == WOLFSSL_SERVER_END)
  13019. ret = wolfSSL_accept(ssl);
  13020. #endif
  13021. /* do callbacks */
  13022. if (toCb) {
  13023. if (oldTimerOn) {
  13024. if (gettimeofday(&endTime, 0) < 0)
  13025. ERR_OUT(SYSLIB_FAILED_E);
  13026. SubtractTimes(endTime, startTime, totalTime);
  13027. /* adjust old timer for elapsed time */
  13028. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  13029. SubtractTimes(oldTimeout.it_value, totalTime,
  13030. oldTimeout.it_value);
  13031. else {
  13032. /* reset value to interval, may be off */
  13033. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  13034. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  13035. }
  13036. /* keep iter the same whether there or not */
  13037. }
  13038. /* restore old handler */
  13039. if (sigaction(SIGALRM, &oact, 0) < 0)
  13040. ret = SIGACT_ERROR; /* more pressing error, stomp */
  13041. else
  13042. /* use old settings which may turn off (expired or not there) */
  13043. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  13044. ret = SETITIMER_ERROR;
  13045. /* if we had a timeout call callback */
  13046. if (ssl->timeoutInfo.timeoutName[0]) {
  13047. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  13048. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  13049. (toCb)(&ssl->timeoutInfo);
  13050. }
  13051. ssl->toInfoOn = 0;
  13052. }
  13053. /* clean up buffers allocated by AddPacketInfo */
  13054. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  13055. if (hsCb) {
  13056. FinishHandShakeInfo(&ssl->handShakeInfo);
  13057. (hsCb)(&ssl->handShakeInfo);
  13058. ssl->hsInfoOn = 0;
  13059. }
  13060. return ret;
  13061. }
  13062. #ifndef NO_WOLFSSL_CLIENT
  13063. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13064. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13065. {
  13066. WOLFSSL_ENTER("wolfSSL_connect_ex");
  13067. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13068. }
  13069. #endif
  13070. #ifndef NO_WOLFSSL_SERVER
  13071. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13072. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13073. {
  13074. WOLFSSL_ENTER("wolfSSL_accept_ex");
  13075. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13076. }
  13077. #endif
  13078. #endif /* WOLFSSL_CALLBACKS */
  13079. #ifndef NO_PSK
  13080. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  13081. wc_psk_client_callback cb)
  13082. {
  13083. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  13084. if (ctx == NULL)
  13085. return;
  13086. ctx->havePSK = 1;
  13087. ctx->client_psk_cb = cb;
  13088. }
  13089. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  13090. {
  13091. byte haveRSA = 1;
  13092. int keySz = 0;
  13093. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  13094. if (ssl == NULL)
  13095. return;
  13096. ssl->options.havePSK = 1;
  13097. ssl->options.client_psk_cb = cb;
  13098. #ifdef NO_RSA
  13099. haveRSA = 0;
  13100. #endif
  13101. #ifndef NO_CERTS
  13102. keySz = ssl->buffers.keySz;
  13103. #endif
  13104. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13105. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13106. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13107. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13108. ssl->options.haveAnon, TRUE, ssl->options.side);
  13109. }
  13110. #ifdef OPENSSL_EXTRA
  13111. /**
  13112. * set call back function for psk session use
  13113. * @param ssl a pointer to WOLFSSL structure
  13114. * @param cb a function pointer to wc_psk_use_session_cb
  13115. * @return none
  13116. */
  13117. void wolfSSL_set_psk_use_session_callback(WOLFSSL* ssl,
  13118. wc_psk_use_session_cb_func cb)
  13119. {
  13120. WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback");
  13121. ssl->options.havePSK = 1;
  13122. ssl->options.session_psk_cb = cb;
  13123. WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS);
  13124. }
  13125. #endif
  13126. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  13127. wc_psk_server_callback cb)
  13128. {
  13129. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  13130. if (ctx == NULL)
  13131. return;
  13132. ctx->havePSK = 1;
  13133. ctx->server_psk_cb = cb;
  13134. }
  13135. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  13136. {
  13137. byte haveRSA = 1;
  13138. int keySz = 0;
  13139. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  13140. if (ssl == NULL)
  13141. return;
  13142. ssl->options.havePSK = 1;
  13143. ssl->options.server_psk_cb = cb;
  13144. #ifdef NO_RSA
  13145. haveRSA = 0;
  13146. #endif
  13147. #ifndef NO_CERTS
  13148. keySz = ssl->buffers.keySz;
  13149. #endif
  13150. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13151. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13152. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  13153. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  13154. ssl->options.haveAnon, TRUE, ssl->options.side);
  13155. }
  13156. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  13157. {
  13158. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  13159. if (ssl == NULL || ssl->arrays == NULL)
  13160. return NULL;
  13161. return ssl->arrays->server_hint;
  13162. }
  13163. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  13164. {
  13165. WOLFSSL_ENTER("SSL_get_psk_identity");
  13166. if (ssl == NULL || ssl->arrays == NULL)
  13167. return NULL;
  13168. return ssl->arrays->client_identity;
  13169. }
  13170. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  13171. {
  13172. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  13173. if (hint == 0)
  13174. ctx->server_hint[0] = '\0';
  13175. else {
  13176. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  13177. #ifdef WOLFSSL_QT
  13178. ctx->havePSK=1;
  13179. #endif
  13180. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  13181. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  13182. }
  13183. return WOLFSSL_SUCCESS;
  13184. }
  13185. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  13186. {
  13187. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  13188. if (ssl == NULL || ssl->arrays == NULL)
  13189. return WOLFSSL_FAILURE;
  13190. if (hint == 0)
  13191. ssl->arrays->server_hint[0] = 0;
  13192. else {
  13193. XSTRNCPY(ssl->arrays->server_hint, hint,
  13194. sizeof(ssl->arrays->server_hint)-1);
  13195. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  13196. }
  13197. return WOLFSSL_SUCCESS;
  13198. }
  13199. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  13200. {
  13201. return ssl ? ssl->options.psk_ctx : NULL;
  13202. }
  13203. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  13204. {
  13205. return ctx ? ctx->psk_ctx : NULL;
  13206. }
  13207. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  13208. {
  13209. if (ssl == NULL)
  13210. return WOLFSSL_FAILURE;
  13211. ssl->options.psk_ctx = psk_ctx;
  13212. return WOLFSSL_SUCCESS;
  13213. }
  13214. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  13215. {
  13216. if (ctx == NULL)
  13217. return WOLFSSL_FAILURE;
  13218. ctx->psk_ctx = psk_ctx;
  13219. return WOLFSSL_SUCCESS;
  13220. }
  13221. #endif /* NO_PSK */
  13222. #ifdef HAVE_ANON
  13223. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  13224. {
  13225. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  13226. if (ctx == NULL)
  13227. return WOLFSSL_FAILURE;
  13228. ctx->haveAnon = 1;
  13229. return WOLFSSL_SUCCESS;
  13230. }
  13231. #endif /* HAVE_ANON */
  13232. #ifndef NO_CERTS
  13233. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  13234. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  13235. const unsigned char* in,
  13236. long sz, int format, int userChain,
  13237. word32 flags)
  13238. {
  13239. int verify;
  13240. int ret = WOLFSSL_FAILURE;
  13241. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  13242. verify = GET_VERIFY_SETTING_CTX(ctx);
  13243. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  13244. verify = VERIFY_SKIP_DATE;
  13245. if (format == WOLFSSL_FILETYPE_PEM)
  13246. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  13247. verify);
  13248. else
  13249. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  13250. userChain, verify);
  13251. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  13252. if (ret == WOLFSSL_SUCCESS)
  13253. ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format);
  13254. #endif
  13255. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  13256. return ret;
  13257. }
  13258. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  13259. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  13260. const unsigned char* in,
  13261. long sz, int format)
  13262. {
  13263. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  13264. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13265. }
  13266. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  13267. const unsigned char* in,
  13268. long sz, int format)
  13269. {
  13270. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  13271. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  13272. }
  13273. #ifdef WOLFSSL_TRUST_PEER_CERT
  13274. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  13275. const unsigned char* in,
  13276. long sz, int format)
  13277. {
  13278. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  13279. /* sanity check on arguments */
  13280. if (sz < 0 || in == NULL || ctx == NULL) {
  13281. return BAD_FUNC_ARG;
  13282. }
  13283. if (format == WOLFSSL_FILETYPE_PEM)
  13284. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  13285. NULL, GET_VERIFY_SETTING_CTX(ctx));
  13286. else
  13287. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  13288. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  13289. }
  13290. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13291. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  13292. const unsigned char* in, long sz, int format)
  13293. {
  13294. int ret = WOLFSSL_FAILURE;
  13295. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  13296. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  13297. GET_VERIFY_SETTING_CTX(ctx));
  13298. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  13299. return ret;
  13300. }
  13301. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  13302. const unsigned char* in, long sz, int format)
  13303. {
  13304. int ret = WOLFSSL_FAILURE;
  13305. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  13306. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  13307. 0, GET_VERIFY_SETTING_CTX(ctx));
  13308. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  13309. return ret;
  13310. }
  13311. #ifdef WOLF_PRIVATE_KEY_ID
  13312. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13313. long sz, int devId, long keySz)
  13314. {
  13315. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  13316. if (ret == WOLFSSL_SUCCESS)
  13317. ctx->privateKeySz = (word32)keySz;
  13318. return ret;
  13319. }
  13320. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  13321. long sz, int devId)
  13322. {
  13323. int ret = WOLFSSL_FAILURE;
  13324. FreeDer(&ctx->privateKey);
  13325. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13326. ctx->heap) == 0) {
  13327. XMEMCPY(ctx->privateKey->buffer, id, sz);
  13328. ctx->privateKeyId = 1;
  13329. if (devId != INVALID_DEVID)
  13330. ctx->privateKeyDevId = devId;
  13331. else
  13332. ctx->privateKeyDevId = ctx->devId;
  13333. ret = WOLFSSL_SUCCESS;
  13334. }
  13335. return ret;
  13336. }
  13337. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  13338. int devId)
  13339. {
  13340. int ret = WOLFSSL_FAILURE;
  13341. word32 sz = (word32)XSTRLEN(label) + 1;
  13342. FreeDer(&ctx->privateKey);
  13343. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  13344. ctx->heap) == 0) {
  13345. XMEMCPY(ctx->privateKey->buffer, label, sz);
  13346. ctx->privateKeyLabel = 1;
  13347. if (devId != INVALID_DEVID)
  13348. ctx->privateKeyDevId = devId;
  13349. else
  13350. ctx->privateKeyDevId = ctx->devId;
  13351. ret = WOLFSSL_SUCCESS;
  13352. }
  13353. return ret;
  13354. }
  13355. #endif /* WOLF_PRIVATE_KEY_ID */
  13356. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  13357. const unsigned char* in, long sz, int format)
  13358. {
  13359. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  13360. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  13361. GET_VERIFY_SETTING_CTX(ctx));
  13362. }
  13363. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  13364. const unsigned char* in, long sz)
  13365. {
  13366. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  13367. WOLFSSL_FILETYPE_PEM);
  13368. }
  13369. #ifndef NO_DH
  13370. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  13371. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  13372. const unsigned char* buf,
  13373. long sz, int format)
  13374. {
  13375. DerBuffer* der = NULL;
  13376. int ret = 0;
  13377. word32 pSz = MAX_DH_SIZE;
  13378. word32 gSz = MAX_DH_SIZE;
  13379. #ifdef WOLFSSL_SMALL_STACK
  13380. byte* p = NULL;
  13381. byte* g = NULL;
  13382. #else
  13383. byte p[MAX_DH_SIZE];
  13384. byte g[MAX_DH_SIZE];
  13385. #endif
  13386. if (ctx == NULL || buf == NULL)
  13387. return BAD_FUNC_ARG;
  13388. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  13389. if (ret != 0) {
  13390. return ret;
  13391. }
  13392. der->buffer = (byte*)buf;
  13393. der->length = (word32)sz;
  13394. #ifdef WOLFSSL_SMALL_STACK
  13395. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13396. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13397. if (p == NULL || g == NULL) {
  13398. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13399. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13400. return MEMORY_E;
  13401. }
  13402. #endif
  13403. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  13404. ret = WOLFSSL_BAD_FILETYPE;
  13405. else {
  13406. if (format == WOLFSSL_FILETYPE_PEM) {
  13407. #ifdef WOLFSSL_PEM_TO_DER
  13408. FreeDer(&der);
  13409. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  13410. NULL, NULL);
  13411. if (ret < 0) {
  13412. /* Also try X9.42 format */
  13413. ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap,
  13414. NULL, NULL);
  13415. }
  13416. #ifdef WOLFSSL_WPAS
  13417. #ifndef NO_DSA
  13418. if (ret < 0) {
  13419. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  13420. NULL, NULL);
  13421. }
  13422. #endif
  13423. #endif /* WOLFSSL_WPAS */
  13424. #else
  13425. ret = NOT_COMPILED_IN;
  13426. #endif /* WOLFSSL_PEM_TO_DER */
  13427. }
  13428. if (ret == 0) {
  13429. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  13430. ret = WOLFSSL_BAD_FILETYPE;
  13431. else if (ssl)
  13432. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  13433. else
  13434. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  13435. }
  13436. }
  13437. FreeDer(&der);
  13438. #ifdef WOLFSSL_SMALL_STACK
  13439. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13440. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  13441. #endif
  13442. return ret;
  13443. }
  13444. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13445. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  13446. int format)
  13447. {
  13448. if (ssl == NULL)
  13449. return BAD_FUNC_ARG;
  13450. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  13451. }
  13452. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  13453. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  13454. long sz, int format)
  13455. {
  13456. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  13457. }
  13458. #endif /* NO_DH */
  13459. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  13460. const unsigned char* in, long sz, int format)
  13461. {
  13462. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  13463. if (ssl == NULL)
  13464. return BAD_FUNC_ARG;
  13465. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  13466. GET_VERIFY_SETTING_SSL(ssl));
  13467. }
  13468. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  13469. const unsigned char* in, long sz, int format)
  13470. {
  13471. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  13472. if (ssl == NULL)
  13473. return BAD_FUNC_ARG;
  13474. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  13475. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  13476. }
  13477. #ifdef WOLF_PRIVATE_KEY_ID
  13478. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  13479. long sz, int devId, long keySz)
  13480. {
  13481. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  13482. if (ret == WOLFSSL_SUCCESS)
  13483. ssl->buffers.keySz = (word32)keySz;
  13484. return ret;
  13485. }
  13486. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  13487. long sz, int devId)
  13488. {
  13489. int ret = WOLFSSL_FAILURE;
  13490. if (ssl->buffers.weOwnKey)
  13491. FreeDer(&ssl->buffers.key);
  13492. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13493. ssl->heap) == 0) {
  13494. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  13495. ssl->buffers.weOwnKey = 1;
  13496. ssl->buffers.keyId = 1;
  13497. if (devId != INVALID_DEVID)
  13498. ssl->buffers.keyDevId = devId;
  13499. else
  13500. ssl->buffers.keyDevId = ssl->devId;
  13501. ret = WOLFSSL_SUCCESS;
  13502. }
  13503. return ret;
  13504. }
  13505. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  13506. {
  13507. int ret = WOLFSSL_FAILURE;
  13508. word32 sz = (word32)XSTRLEN(label) + 1;
  13509. if (ssl->buffers.weOwnKey)
  13510. FreeDer(&ssl->buffers.key);
  13511. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13512. ssl->heap) == 0) {
  13513. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  13514. ssl->buffers.weOwnKey = 1;
  13515. ssl->buffers.keyLabel = 1;
  13516. if (devId != INVALID_DEVID)
  13517. ssl->buffers.keyDevId = devId;
  13518. else
  13519. ssl->buffers.keyDevId = ssl->devId;
  13520. ret = WOLFSSL_SUCCESS;
  13521. }
  13522. return ret;
  13523. }
  13524. #endif /* WOLF_PRIVATE_KEY_ID */
  13525. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  13526. const unsigned char* in, long sz, int format)
  13527. {
  13528. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  13529. if (ssl == NULL)
  13530. return BAD_FUNC_ARG;
  13531. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  13532. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  13533. }
  13534. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  13535. const unsigned char* in, long sz)
  13536. {
  13537. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  13538. WOLFSSL_FILETYPE_PEM);
  13539. }
  13540. /* unload any certs or keys that SSL owns, leave CTX as is
  13541. WOLFSSL_SUCCESS on ok */
  13542. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  13543. {
  13544. if (ssl == NULL) {
  13545. WOLFSSL_MSG("Null function arg");
  13546. return BAD_FUNC_ARG;
  13547. }
  13548. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  13549. WOLFSSL_MSG("Unloading cert");
  13550. FreeDer(&ssl->buffers.certificate);
  13551. #ifdef KEEP_OUR_CERT
  13552. wolfSSL_X509_free(ssl->ourCert);
  13553. ssl->ourCert = NULL;
  13554. #endif
  13555. ssl->buffers.weOwnCert = 0;
  13556. }
  13557. if (ssl->buffers.weOwnCertChain) {
  13558. WOLFSSL_MSG("Unloading cert chain");
  13559. FreeDer(&ssl->buffers.certChain);
  13560. ssl->buffers.weOwnCertChain = 0;
  13561. }
  13562. if (ssl->buffers.weOwnKey) {
  13563. WOLFSSL_MSG("Unloading key");
  13564. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  13565. FreeDer(&ssl->buffers.key);
  13566. ssl->buffers.weOwnKey = 0;
  13567. }
  13568. return WOLFSSL_SUCCESS;
  13569. }
  13570. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  13571. {
  13572. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  13573. if (ctx == NULL)
  13574. return BAD_FUNC_ARG;
  13575. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  13576. }
  13577. #ifdef WOLFSSL_TRUST_PEER_CERT
  13578. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  13579. {
  13580. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13581. if (ctx == NULL)
  13582. return BAD_FUNC_ARG;
  13583. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  13584. }
  13585. #ifdef WOLFSSL_LOCAL_X509_STORE
  13586. int wolfSSL_Unload_trust_peers(WOLFSSL* ssl)
  13587. {
  13588. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13589. if (ssl == NULL)
  13590. return BAD_FUNC_ARG;
  13591. return wolfSSL_CertManagerUnload_trust_peers(SSL_CM(ssl));
  13592. }
  13593. #endif /* WOLFSSL_LOCAL_X509_STORE */
  13594. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13595. /* old NO_FILESYSTEM end */
  13596. #endif /* !NO_CERTS */
  13597. #ifdef OPENSSL_EXTRA
  13598. int wolfSSL_add_all_algorithms(void)
  13599. {
  13600. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  13601. if (initRefCount != 0 || wolfSSL_Init() == WOLFSSL_SUCCESS)
  13602. return WOLFSSL_SUCCESS;
  13603. else
  13604. return WOLFSSL_FATAL_ERROR;
  13605. }
  13606. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  13607. {
  13608. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  13609. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  13610. return WOLFSSL_FATAL_ERROR;
  13611. return WOLFSSL_SUCCESS;
  13612. }
  13613. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  13614. {
  13615. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  13616. /* This function is currently the same as
  13617. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  13618. the use of a wolfssl.cnf type configuration file and is only used for
  13619. OpenSSL compatability. */
  13620. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  13621. return WOLFSSL_FATAL_ERROR;
  13622. }
  13623. return WOLFSSL_SUCCESS;
  13624. }
  13625. /* returns previous set cache size which stays constant */
  13626. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  13627. {
  13628. /* cache size fixed at compile time in wolfSSL */
  13629. (void)ctx;
  13630. (void)sz;
  13631. WOLFSSL_MSG("session cache is set at compile time");
  13632. #ifndef NO_SESSION_CACHE
  13633. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  13634. #else
  13635. return 0;
  13636. #endif
  13637. }
  13638. #endif
  13639. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  13640. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13641. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  13642. {
  13643. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  13644. if (mode)
  13645. ctx->quietShutdown = 1;
  13646. }
  13647. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  13648. {
  13649. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  13650. if (mode)
  13651. ssl->options.quietShutdown = 1;
  13652. }
  13653. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL ||
  13654. WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13655. #ifdef OPENSSL_EXTRA
  13656. #ifndef NO_BIO
  13657. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  13658. {
  13659. WOLFSSL_ENTER("wolfSSL_set_bio");
  13660. if (ssl == NULL) {
  13661. WOLFSSL_MSG("Bad argument, ssl was NULL");
  13662. return;
  13663. }
  13664. /* free any existing WOLFSSL_BIOs in use but don't free those in
  13665. * a chain */
  13666. if (ssl->biord != NULL) {
  13667. if (ssl->biord != ssl->biowr) {
  13668. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  13669. wolfSSL_BIO_free(ssl->biowr);
  13670. ssl->biowr = NULL;
  13671. }
  13672. if (ssl->biord->prev != NULL)
  13673. wolfSSL_BIO_free(ssl->biord);
  13674. ssl->biord = NULL;
  13675. }
  13676. /* set flag obviously */
  13677. if (rd && !(rd->flags & WOLFSSL_BIO_FLAG_READ))
  13678. rd->flags |= WOLFSSL_BIO_FLAG_READ;
  13679. if (wr && !(wr->flags & WOLFSSL_BIO_FLAG_WRITE))
  13680. wr->flags |= WOLFSSL_BIO_FLAG_WRITE;
  13681. ssl->biord = rd;
  13682. ssl->biowr = wr;
  13683. /* set SSL to use BIO callbacks instead */
  13684. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  13685. ssl->CBIORecv = BioReceive;
  13686. }
  13687. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  13688. ssl->CBIOSend = BioSend;
  13689. }
  13690. /* User programs should always retry reading from these BIOs */
  13691. if (rd) {
  13692. /* User writes to rd */
  13693. BIO_set_retry_write(rd);
  13694. }
  13695. if (wr) {
  13696. /* User reads from wr */
  13697. BIO_set_retry_read(wr);
  13698. }
  13699. }
  13700. #endif /* !NO_BIO */
  13701. #endif /* OPENSSL_EXTRA */
  13702. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  13703. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  13704. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13705. {
  13706. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  13707. if (ctx != NULL) {
  13708. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  13709. ctx->ca_names = names;
  13710. }
  13711. }
  13712. void wolfSSL_set_client_CA_list(WOLFSSL* ssl,
  13713. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13714. {
  13715. WOLFSSL_ENTER("wolfSSL_set_client_CA_list");
  13716. if (ssl != NULL) {
  13717. if (ssl->ca_names != ssl->ctx->ca_names)
  13718. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  13719. ssl->ca_names = names;
  13720. }
  13721. }
  13722. #ifdef OPENSSL_EXTRA
  13723. /* registers client cert callback, called during handshake if server
  13724. requests client auth but user has not loaded client cert/key */
  13725. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  13726. {
  13727. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  13728. if (ctx != NULL) {
  13729. ctx->CBClientCert = cb;
  13730. }
  13731. }
  13732. void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx,
  13733. CertSetupCallback cb, void *arg)
  13734. {
  13735. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_cb");
  13736. if (ctx == NULL)
  13737. return;
  13738. ctx->certSetupCb = cb;
  13739. ctx->certSetupCbArg = arg;
  13740. }
  13741. /**
  13742. * Internal wrapper for calling certSetupCb
  13743. * @param ssl The SSL/TLS Object
  13744. * @return 0 on success
  13745. */
  13746. int CertSetupCbWrapper(WOLFSSL* ssl)
  13747. {
  13748. int ret = 0;
  13749. if (ssl->ctx->certSetupCb != NULL) {
  13750. WOLFSSL_MSG("Calling user cert setup callback");
  13751. ret = ssl->ctx->certSetupCb(ssl, ssl->ctx->certSetupCbArg);
  13752. if (ret == 1) {
  13753. WOLFSSL_MSG("User cert callback returned success");
  13754. ret = 0;
  13755. }
  13756. else if (ret == 0) {
  13757. SendAlert(ssl, alert_fatal, internal_error);
  13758. ret = CLIENT_CERT_CB_ERROR;
  13759. }
  13760. else if (ret < 0) {
  13761. ret = WOLFSSL_ERROR_WANT_X509_LOOKUP;
  13762. }
  13763. else {
  13764. WOLFSSL_MSG("Unexpected user callback return");
  13765. ret = CLIENT_CERT_CB_ERROR;
  13766. }
  13767. }
  13768. return ret;
  13769. }
  13770. #endif /* OPENSSL_EXTRA */
  13771. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  13772. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  13773. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  13774. const WOLFSSL_CTX *ctx)
  13775. {
  13776. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  13777. if (ctx == NULL) {
  13778. WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list");
  13779. return NULL;
  13780. }
  13781. return ctx->ca_names;
  13782. }
  13783. /* returns the CA's set on server side or the CA's sent from server when
  13784. * on client side */
  13785. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  13786. const WOLFSSL* ssl)
  13787. {
  13788. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  13789. if (ssl == NULL) {
  13790. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  13791. return NULL;
  13792. }
  13793. return SSL_CA_NAMES(ssl);
  13794. }
  13795. #if !defined(NO_CERTS)
  13796. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  13797. {
  13798. WOLFSSL_X509_NAME *nameCopy = NULL;
  13799. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  13800. if (ctx == NULL || x509 == NULL){
  13801. WOLFSSL_MSG("Bad argument");
  13802. return WOLFSSL_FAILURE;
  13803. }
  13804. if (ctx->ca_names == NULL) {
  13805. ctx->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  13806. if (ctx->ca_names == NULL) {
  13807. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  13808. return WOLFSSL_FAILURE;
  13809. }
  13810. }
  13811. nameCopy = wolfSSL_X509_NAME_dup(wolfSSL_X509_get_subject_name(x509));
  13812. if (nameCopy == NULL) {
  13813. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  13814. return WOLFSSL_FAILURE;
  13815. }
  13816. if (wolfSSL_sk_X509_NAME_push(ctx->ca_names, nameCopy) != WOLFSSL_SUCCESS) {
  13817. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  13818. wolfSSL_X509_NAME_free(nameCopy);
  13819. return WOLFSSL_FAILURE;
  13820. }
  13821. return WOLFSSL_SUCCESS;
  13822. }
  13823. #endif
  13824. #ifndef NO_BIO
  13825. #if !defined(NO_RSA) && !defined(NO_CERTS)
  13826. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  13827. {
  13828. /* The webserver build is using this to load a CA into the server
  13829. * for client authentication as an option. Have this return NULL in
  13830. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  13831. * the function. */
  13832. #ifdef OPENSSL_EXTRA
  13833. WOLFSSL_STACK *list = NULL;
  13834. WOLFSSL_BIO* bio = NULL;
  13835. WOLFSSL_X509 *cert = NULL;
  13836. WOLFSSL_X509_NAME *nameCopy = NULL;
  13837. unsigned long err = WOLFSSL_FAILURE;
  13838. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  13839. bio = wolfSSL_BIO_new_file(fname, "rb");
  13840. if (bio == NULL) {
  13841. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  13842. goto cleanup;
  13843. }
  13844. list = wolfSSL_sk_X509_NAME_new(NULL);
  13845. if (list == NULL) {
  13846. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  13847. goto cleanup;
  13848. }
  13849. /* Read each certificate in the chain out of the file. */
  13850. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  13851. /* Need a persistent copy of the subject name. */
  13852. nameCopy = wolfSSL_X509_NAME_dup(
  13853. wolfSSL_X509_get_subject_name(cert));
  13854. if (nameCopy == NULL) {
  13855. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  13856. goto cleanup;
  13857. }
  13858. /*
  13859. * Original cert will be freed so make sure not to try to access
  13860. * it in the future.
  13861. */
  13862. nameCopy->x509 = NULL;
  13863. if (wolfSSL_sk_X509_NAME_push(list, nameCopy) !=
  13864. WOLFSSL_SUCCESS) {
  13865. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  13866. /* Do free in loop because nameCopy is now responsibility
  13867. * of list to free and adding jumps to cleanup after this
  13868. * might result in a double free. */
  13869. wolfSSL_X509_NAME_free(nameCopy);
  13870. goto cleanup;
  13871. }
  13872. wolfSSL_X509_free(cert);
  13873. cert = NULL;
  13874. }
  13875. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  13876. err = WOLFSSL_SUCCESS;
  13877. cleanup:
  13878. wolfSSL_X509_free(cert);
  13879. wolfSSL_BIO_free(bio);
  13880. if (err != WOLFSSL_SUCCESS) {
  13881. /* We failed so return NULL */
  13882. wolfSSL_sk_X509_NAME_pop_free(list, NULL);
  13883. list = NULL;
  13884. }
  13885. return list;
  13886. #else
  13887. (void)fname;
  13888. return NULL;
  13889. #endif
  13890. }
  13891. #endif
  13892. #endif /* !NO_BIO */
  13893. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
  13894. #ifdef OPENSSL_EXTRA
  13895. #ifdef WOLFSSL_SYS_CA_CERTS
  13896. /*
  13897. * This is an OpenSSL compatibility layer function, but it doesn't mirror
  13898. * the exact functionality of its OpenSSL counterpart. We don't support the
  13899. * notion of an "OpenSSL directory," nor do we support the environment
  13900. * variables SSL_CERT_DIR or SSL_CERT_FILE. This function is simply a
  13901. * wrapper around our native wolfSSL_CTX_load_system_CA_certs function. This
  13902. * function does conform to OpenSSL's return value conventions, though.
  13903. */
  13904. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  13905. {
  13906. int ret;
  13907. WOLFSSL_ENTER("wolfSSL_CTX_set_default_verify_paths");
  13908. ret = wolfSSL_CTX_load_system_CA_certs(ctx);
  13909. if (ret == WOLFSSL_BAD_PATH) {
  13910. /*
  13911. * OpenSSL doesn't treat the lack of a system CA cert directory as a
  13912. * failure. We do the same here.
  13913. */
  13914. ret = WOLFSSL_SUCCESS;
  13915. }
  13916. WOLFSSL_LEAVE("wolfSSL_CTX_set_default_verify_paths", ret);
  13917. return ret;
  13918. }
  13919. #endif /* WOLFSSL_SYS_CA_CERTS */
  13920. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  13921. && !defined(WC_NO_RNG)
  13922. static const byte srp_N[] = {
  13923. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  13924. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  13925. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  13926. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  13927. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  13928. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  13929. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  13930. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  13931. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  13932. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  13933. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  13934. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  13935. };
  13936. static const byte srp_g[] = {
  13937. 0x02
  13938. };
  13939. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  13940. {
  13941. int r = 0;
  13942. SrpSide srp_side = SRP_CLIENT_SIDE;
  13943. byte salt[SRP_SALT_SIZE];
  13944. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  13945. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  13946. return SSL_FAILURE;
  13947. if (ctx->method->side == WOLFSSL_SERVER_END){
  13948. srp_side = SRP_SERVER_SIDE;
  13949. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  13950. srp_side = SRP_CLIENT_SIDE;
  13951. } else {
  13952. WOLFSSL_MSG("Init CTX failed");
  13953. return SSL_FAILURE;
  13954. }
  13955. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  13956. WOLFSSL_MSG("Init SRP CTX failed");
  13957. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  13958. ctx->srp = NULL;
  13959. return SSL_FAILURE;
  13960. }
  13961. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  13962. (word32)XSTRLEN(username));
  13963. if (r < 0) {
  13964. WOLFSSL_MSG("fail to set srp username.");
  13965. return SSL_FAILURE;
  13966. }
  13967. /* if wolfSSL_CTX_set_srp_password has already been called, */
  13968. /* execute wc_SrpSetPassword here */
  13969. if (ctx->srp_password != NULL) {
  13970. WC_RNG rng;
  13971. if (wc_InitRng(&rng) < 0){
  13972. WOLFSSL_MSG("wc_InitRng failed");
  13973. return SSL_FAILURE;
  13974. }
  13975. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  13976. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  13977. wc_FreeRng(&rng);
  13978. if (r < 0) {
  13979. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  13980. return SSL_FAILURE;
  13981. }
  13982. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  13983. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  13984. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  13985. WOLFSSL_MSG("wc_SrpSetParam failed");
  13986. return SSL_FAILURE;
  13987. }
  13988. r = wc_SrpSetPassword(ctx->srp,
  13989. (const byte*)ctx->srp_password,
  13990. (word32)XSTRLEN((char *)ctx->srp_password));
  13991. if (r < 0) {
  13992. WOLFSSL_MSG("fail to set srp password.");
  13993. return SSL_FAILURE;
  13994. }
  13995. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  13996. ctx->srp_password = NULL;
  13997. }
  13998. return WOLFSSL_SUCCESS;
  13999. }
  14000. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  14001. {
  14002. int r;
  14003. byte salt[SRP_SALT_SIZE];
  14004. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  14005. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  14006. return SSL_FAILURE;
  14007. if (ctx->srp->user != NULL) {
  14008. WC_RNG rng;
  14009. if (wc_InitRng(&rng) < 0) {
  14010. WOLFSSL_MSG("wc_InitRng failed");
  14011. return SSL_FAILURE;
  14012. }
  14013. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14014. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14015. wc_FreeRng(&rng);
  14016. if (r < 0) {
  14017. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14018. return SSL_FAILURE;
  14019. }
  14020. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14021. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14022. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  14023. WOLFSSL_MSG("wc_SrpSetParam failed");
  14024. wc_FreeRng(&rng);
  14025. return SSL_FAILURE;
  14026. }
  14027. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  14028. (word32)XSTRLEN(password));
  14029. if (r < 0) {
  14030. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  14031. wc_FreeRng(&rng);
  14032. return SSL_FAILURE;
  14033. }
  14034. if (ctx->srp_password != NULL){
  14035. XFREE(ctx->srp_password,NULL,
  14036. DYNAMIC_TYPE_SRP);
  14037. ctx->srp_password = NULL;
  14038. }
  14039. wc_FreeRng(&rng);
  14040. } else {
  14041. /* save password for wolfSSL_set_srp_username */
  14042. if (ctx->srp_password != NULL)
  14043. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  14044. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  14045. DYNAMIC_TYPE_SRP);
  14046. if (ctx->srp_password == NULL){
  14047. WOLFSSL_MSG("memory allocation error");
  14048. return SSL_FAILURE;
  14049. }
  14050. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  14051. }
  14052. return WOLFSSL_SUCCESS;
  14053. }
  14054. /**
  14055. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  14056. * that the requested strength is less than or equal to the size of the
  14057. * static modulus size.
  14058. * @param ctx Not used
  14059. * @param strength Minimum number of bits for the modulus
  14060. * @return 1 if strength is less than or equal to static modulus
  14061. * 0 if strength is greater than static modulus
  14062. */
  14063. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  14064. {
  14065. (void)ctx;
  14066. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  14067. if (strength > (int)(sizeof(srp_N)*8)) {
  14068. WOLFSSL_MSG("Bad Parameter");
  14069. return WOLFSSL_FAILURE;
  14070. }
  14071. return WOLFSSL_SUCCESS;
  14072. }
  14073. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  14074. {
  14075. if (ssl && ssl->ctx && ssl->ctx->srp) {
  14076. return (char*) ssl->ctx->srp->user;
  14077. }
  14078. return NULL;
  14079. }
  14080. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  14081. /* keyblock size in bytes or -1 */
  14082. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  14083. {
  14084. if (ssl == NULL)
  14085. return WOLFSSL_FATAL_ERROR;
  14086. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  14087. ssl->specs.hash_size);
  14088. }
  14089. #endif /* OPENSSL_EXTRA */
  14090. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14091. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  14092. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  14093. unsigned char** sr, unsigned int* srLen,
  14094. unsigned char** cr, unsigned int* crLen)
  14095. {
  14096. if (ssl == NULL || ssl->arrays == NULL)
  14097. return WOLFSSL_FATAL_ERROR;
  14098. *ms = ssl->arrays->masterSecret;
  14099. *sr = ssl->arrays->serverRandom;
  14100. *cr = ssl->arrays->clientRandom;
  14101. *msLen = SECRET_LEN;
  14102. *srLen = RAN_LEN;
  14103. *crLen = RAN_LEN;
  14104. return WOLFSSL_SUCCESS;
  14105. }
  14106. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  14107. {
  14108. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  14109. if (ssl == NULL)
  14110. return;
  14111. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14112. #ifdef HAVE_ECC
  14113. #ifdef WOLFSSL_SMALL_STACK
  14114. ecc_key* key = NULL;
  14115. #else
  14116. ecc_key key[1];
  14117. #endif
  14118. word32 idx = 0;
  14119. #ifdef WOLFSSL_SMALL_STACK
  14120. key = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  14121. DYNAMIC_TYPE_ECC);
  14122. if (key == NULL) {
  14123. WOLFSSL_MSG("Error allocating memory for ecc_key");
  14124. }
  14125. #endif
  14126. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  14127. if (wc_ecc_init(key) >= 0) {
  14128. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  14129. key, ssl->buffers.key->length) != 0) {
  14130. ssl->options.haveECDSAsig = 0;
  14131. ssl->options.haveECC = 0;
  14132. ssl->options.haveStaticECC = 0;
  14133. }
  14134. wc_ecc_free(key);
  14135. }
  14136. }
  14137. #ifdef WOLFSSL_SMALL_STACK
  14138. XFREE(key, ssl->heap, DYNAMIC_TYPE_ECC);
  14139. #endif
  14140. #endif
  14141. #ifndef NO_DH
  14142. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  14143. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  14144. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  14145. ssl->options.haveDH = 1;
  14146. }
  14147. #endif
  14148. }
  14149. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  14150. WOLFSSL_MSG("Error initializing server side");
  14151. }
  14152. }
  14153. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14154. /* return true if connection established */
  14155. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  14156. {
  14157. if (ssl == NULL)
  14158. return 0;
  14159. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  14160. return 1;
  14161. return 0;
  14162. }
  14163. #ifdef OPENSSL_EXTRA
  14164. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  14165. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  14166. {
  14167. /* wolfSSL verifies all these internally */
  14168. (void)ctx;
  14169. (void)f;
  14170. }
  14171. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  14172. {
  14173. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  14174. if(ssl==NULL) {
  14175. WOLFSSL_MSG("Shutdown not set. ssl is null");
  14176. return;
  14177. }
  14178. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  14179. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  14180. }
  14181. #endif
  14182. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  14183. {
  14184. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  14185. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  14186. if(ctx == NULL)
  14187. return BAD_FUNC_ARG;
  14188. return ctx->mask;
  14189. }
  14190. static long wolf_set_options(long old_op, long op);
  14191. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  14192. {
  14193. WOLFSSL_ENTER("SSL_CTX_set_options");
  14194. if (ctx == NULL)
  14195. return BAD_FUNC_ARG;
  14196. ctx->mask = wolf_set_options(ctx->mask, opt);
  14197. return ctx->mask;
  14198. }
  14199. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  14200. {
  14201. WOLFSSL_ENTER("SSL_CTX_clear_options");
  14202. if(ctx == NULL)
  14203. return BAD_FUNC_ARG;
  14204. ctx->mask &= ~opt;
  14205. return ctx->mask;
  14206. }
  14207. #ifdef OPENSSL_EXTRA
  14208. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  14209. {
  14210. WOLFSSL_ENTER("SSL_set_rfd");
  14211. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  14212. ssl->IOCB_ReadCtx = &ssl->rfd;
  14213. #ifdef WOLFSSL_DTLS
  14214. if (ssl->options.dtls) {
  14215. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  14216. ssl->buffers.dtlsCtx.rfd = rfd;
  14217. }
  14218. #endif
  14219. return WOLFSSL_SUCCESS;
  14220. }
  14221. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  14222. {
  14223. WOLFSSL_ENTER("SSL_set_wfd");
  14224. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  14225. ssl->IOCB_WriteCtx = &ssl->wfd;
  14226. return WOLFSSL_SUCCESS;
  14227. }
  14228. #endif /* OPENSSL_EXTRA */
  14229. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  14230. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  14231. /**
  14232. * Implemented in a similar way that ngx_ssl_ocsp_validate does it when
  14233. * SSL_get0_verified_chain is not available.
  14234. * @param ssl WOLFSSL object to extract certs from
  14235. * @return Stack of verified certs
  14236. */
  14237. WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
  14238. {
  14239. WOLF_STACK_OF(WOLFSSL_X509)* chain = NULL;
  14240. WOLFSSL_X509_STORE_CTX* storeCtx = NULL;
  14241. WOLFSSL_X509* peerCert = NULL;
  14242. WOLFSSL_ENTER("wolfSSL_get0_verified_chain");
  14243. if (ssl == NULL || ssl->ctx == NULL) {
  14244. WOLFSSL_MSG("Bad parameter");
  14245. return NULL;
  14246. }
  14247. peerCert = wolfSSL_get_peer_certificate((WOLFSSL*)ssl);
  14248. if (peerCert == NULL) {
  14249. WOLFSSL_MSG("wolfSSL_get_peer_certificate error");
  14250. return NULL;
  14251. }
  14252. /* wolfSSL_get_peer_certificate returns a copy. We want the internal
  14253. * member so that we don't have to worry about free'ing it. We call
  14254. * wolfSSL_get_peer_certificate so that we don't have to worry about
  14255. * setting up the internal pointer. */
  14256. wolfSSL_X509_free(peerCert);
  14257. peerCert = (WOLFSSL_X509*)&ssl->peerCert;
  14258. chain = wolfSSL_get_peer_cert_chain(ssl);
  14259. if (chain == NULL) {
  14260. WOLFSSL_MSG("wolfSSL_get_peer_cert_chain error");
  14261. return NULL;
  14262. }
  14263. storeCtx = wolfSSL_X509_STORE_CTX_new();
  14264. if (storeCtx == NULL) {
  14265. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_new error");
  14266. return NULL;
  14267. }
  14268. if (wolfSSL_X509_STORE_CTX_init(storeCtx, SSL_STORE(ssl),
  14269. peerCert, chain) != WOLFSSL_SUCCESS) {
  14270. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init error");
  14271. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14272. return NULL;
  14273. }
  14274. if (wolfSSL_X509_verify_cert(storeCtx) <= 0) {
  14275. WOLFSSL_MSG("wolfSSL_X509_verify_cert error");
  14276. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14277. return NULL;
  14278. }
  14279. wolfSSL_X509_STORE_CTX_free(storeCtx);
  14280. return chain;
  14281. }
  14282. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  14283. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  14284. {
  14285. if (ctx == NULL) {
  14286. return NULL;
  14287. }
  14288. if (ctx->x509_store_pt != NULL)
  14289. return ctx->x509_store_pt;
  14290. return &ctx->x509_store;
  14291. }
  14292. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  14293. {
  14294. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_store");
  14295. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  14296. return;
  14297. }
  14298. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  14299. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  14300. return;
  14301. }
  14302. /* free cert manager if have one */
  14303. if (ctx->cm != NULL) {
  14304. wolfSSL_CertManagerFree(ctx->cm);
  14305. }
  14306. ctx->cm = str->cm;
  14307. ctx->x509_store.cm = str->cm;
  14308. /* free existing store if it exists */
  14309. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  14310. ctx->x509_store.cache = str->cache;
  14311. ctx->x509_store_pt = str; /* take ownership of store and free it
  14312. with CTX free */
  14313. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has onwership
  14314. and free it with CTX free*/
  14315. }
  14316. int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  14317. {
  14318. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  14319. if (ssl == NULL || str == NULL) {
  14320. WOLFSSL_MSG("Bad parameter");
  14321. return WOLFSSL_FAILURE;
  14322. }
  14323. /* NO-OP when setting existing store */
  14324. if (str == SSL_STORE(ssl))
  14325. return WOLFSSL_SUCCESS;
  14326. /* free existing store if it exists */
  14327. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  14328. if (str == ssl->ctx->x509_store_pt)
  14329. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  14330. to using that instead */
  14331. else
  14332. ssl->x509_store_pt = str; /* take ownership of store and free it
  14333. with SSL free */
  14334. return WOLFSSL_SUCCESS;
  14335. }
  14336. int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  14337. {
  14338. WOLFSSL_ENTER("wolfSSL_set1_verify_cert_store");
  14339. if (ssl == NULL || str == NULL) {
  14340. WOLFSSL_MSG("Bad parameter");
  14341. return WOLFSSL_FAILURE;
  14342. }
  14343. /* NO-OP when setting existing store */
  14344. if (str == SSL_STORE(ssl))
  14345. return WOLFSSL_SUCCESS;
  14346. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  14347. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  14348. return WOLFSSL_FAILURE;
  14349. }
  14350. /* free existing store if it exists */
  14351. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  14352. if (str == ssl->ctx->x509_store_pt)
  14353. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  14354. to using that instead */
  14355. else
  14356. ssl->x509_store_pt = str; /* take ownership of store and free it
  14357. with SSL free */
  14358. return WOLFSSL_SUCCESS;
  14359. }
  14360. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  14361. #ifdef WOLFSSL_ENCRYPTED_KEYS
  14362. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  14363. void* userdata)
  14364. {
  14365. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  14366. if (ctx)
  14367. ctx->passwd_userdata = userdata;
  14368. }
  14369. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx, wc_pem_password_cb*
  14370. cb)
  14371. {
  14372. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  14373. if (ctx)
  14374. ctx->passwd_cb = cb;
  14375. }
  14376. wc_pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  14377. {
  14378. if (ctx == NULL || ctx->passwd_cb == NULL) {
  14379. return NULL;
  14380. }
  14381. return ctx->passwd_cb;
  14382. }
  14383. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  14384. {
  14385. if (ctx == NULL) {
  14386. return NULL;
  14387. }
  14388. return ctx->passwd_userdata;
  14389. }
  14390. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  14391. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  14392. int wolfSSL_num_locks(void)
  14393. {
  14394. return 0;
  14395. }
  14396. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  14397. {
  14398. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  14399. if (wc_SetMutexCb(f) != 0) {
  14400. WOLFSSL_MSG("Error when setting mutex call back");
  14401. }
  14402. }
  14403. typedef unsigned long (idCb)(void);
  14404. static idCb* inner_idCb = NULL;
  14405. unsigned long wolfSSL_thread_id(void)
  14406. {
  14407. if (inner_idCb != NULL) {
  14408. return inner_idCb();
  14409. }
  14410. else {
  14411. return 0;
  14412. }
  14413. }
  14414. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  14415. {
  14416. inner_idCb = f;
  14417. }
  14418. unsigned long wolfSSL_ERR_get_error(void)
  14419. {
  14420. int ret;
  14421. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  14422. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  14423. ret = wc_PullErrorNode(NULL, NULL, NULL);
  14424. if (ret < 0) {
  14425. if (ret == BAD_STATE_E) {
  14426. ret = 0; /* no errors in queue */
  14427. }
  14428. else {
  14429. WOLFSSL_MSG("Error with pulling error node!");
  14430. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  14431. ret = 0 - ret; /* return absolute value of error */
  14432. /* panic and try to clear out nodes */
  14433. wc_ClearErrorNodes();
  14434. }
  14435. }
  14436. else {
  14437. wc_RemoveErrorNode(0);
  14438. }
  14439. return ret;
  14440. #else
  14441. (void)ret;
  14442. return (unsigned long)(0 - NOT_COMPILED_IN);
  14443. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  14444. }
  14445. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  14446. #ifndef NO_BIO
  14447. /* print out and clear all errors */
  14448. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  14449. {
  14450. const char* file = NULL;
  14451. const char* reason = NULL;
  14452. int ret;
  14453. int line = 0;
  14454. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  14455. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  14456. if (bio == NULL) {
  14457. WOLFSSL_MSG("BIO passed in was null");
  14458. return;
  14459. }
  14460. do {
  14461. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  14462. if (ret >= 0) {
  14463. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  14464. if (XSNPRINTF(buf, sizeof(buf),
  14465. "error:%d:wolfSSL library:%s:%s:%d\n",
  14466. ret, r, file, line)
  14467. >= (int)sizeof(buf))
  14468. {
  14469. WOLFSSL_MSG("Buffer overrun formatting error message");
  14470. }
  14471. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  14472. wc_RemoveErrorNode(0);
  14473. }
  14474. } while (ret >= 0);
  14475. if (wolfSSL_BIO_write(bio, "", 1) != 1) {
  14476. WOLFSSL_MSG("Issue writing final string terminator");
  14477. }
  14478. }
  14479. #endif /* !NO_BIO */
  14480. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  14481. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  14482. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  14483. defined(HAVE_SECRET_CALLBACK)
  14484. #if !defined(NO_WOLFSSL_SERVER)
  14485. /* Return the amount of random bytes copied over or error case.
  14486. * ssl : ssl struct after handshake
  14487. * out : buffer to hold random bytes
  14488. * outSz : either 0 (return max buffer sz) or size of out buffer
  14489. */
  14490. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  14491. size_t outSz)
  14492. {
  14493. size_t size;
  14494. /* return max size of buffer */
  14495. if (outSz == 0) {
  14496. return RAN_LEN;
  14497. }
  14498. if (ssl == NULL || out == NULL) {
  14499. return 0;
  14500. }
  14501. if (ssl->arrays == NULL) {
  14502. WOLFSSL_MSG("Arrays struct not saved after handshake");
  14503. return 0;
  14504. }
  14505. if (outSz > RAN_LEN) {
  14506. size = RAN_LEN;
  14507. }
  14508. else {
  14509. size = outSz;
  14510. }
  14511. XMEMCPY(out, ssl->arrays->serverRandom, size);
  14512. return size;
  14513. }
  14514. #endif /* !NO_WOLFSSL_SERVER */
  14515. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  14516. #ifdef OPENSSL_EXTRA
  14517. #if !defined(NO_WOLFSSL_SERVER)
  14518. /* Used to get the peer ephemeral public key sent during the connection
  14519. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  14520. * before the ephemeral key is stored.
  14521. * return WOLFSSL_SUCCESS on success */
  14522. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  14523. {
  14524. WOLFSSL_EVP_PKEY* ret = NULL;
  14525. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  14526. if (ssl == NULL || pkey == NULL) {
  14527. WOLFSSL_MSG("Bad argument passed in");
  14528. return WOLFSSL_FAILURE;
  14529. }
  14530. #ifdef HAVE_ECC
  14531. if (ssl->peerEccKey != NULL) {
  14532. unsigned char* der;
  14533. const unsigned char* pt;
  14534. unsigned int derSz = 0;
  14535. int sz;
  14536. PRIVATE_KEY_UNLOCK();
  14537. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  14538. LENGTH_ONLY_E) {
  14539. WOLFSSL_MSG("get ecc der size failed");
  14540. PRIVATE_KEY_LOCK();
  14541. return WOLFSSL_FAILURE;
  14542. }
  14543. PRIVATE_KEY_LOCK();
  14544. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  14545. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  14546. if (der == NULL) {
  14547. WOLFSSL_MSG("Memory error");
  14548. return WOLFSSL_FAILURE;
  14549. }
  14550. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  14551. WOLFSSL_MSG("get ecc der failed");
  14552. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14553. return WOLFSSL_FAILURE;
  14554. }
  14555. pt = der; /* in case pointer gets advanced */
  14556. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  14557. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14558. }
  14559. #endif
  14560. *pkey = ret;
  14561. #ifdef HAVE_ECC
  14562. if (ret != NULL)
  14563. return WOLFSSL_SUCCESS;
  14564. else
  14565. #endif
  14566. return WOLFSSL_FAILURE;
  14567. }
  14568. #endif /* !NO_WOLFSSL_SERVER */
  14569. /**
  14570. * This function checks if any compiled in protocol versions are
  14571. * left enabled after calls to set_min or set_max API.
  14572. * @param major The SSL/TLS major version
  14573. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14574. * protocol versions are left enabled.
  14575. */
  14576. static int CheckSslMethodVersion(byte major, unsigned long options)
  14577. {
  14578. int sanityConfirmed = 0;
  14579. (void)options;
  14580. switch (major) {
  14581. #ifndef NO_TLS
  14582. case SSLv3_MAJOR:
  14583. #ifdef WOLFSSL_ALLOW_SSLV3
  14584. if (!(options & WOLFSSL_OP_NO_SSLv3)) {
  14585. sanityConfirmed = 1;
  14586. }
  14587. #endif
  14588. #ifndef NO_OLD_TLS
  14589. if (!(options & WOLFSSL_OP_NO_TLSv1))
  14590. sanityConfirmed = 1;
  14591. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  14592. sanityConfirmed = 1;
  14593. #endif
  14594. #ifndef WOLFSSL_NO_TLS12
  14595. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  14596. sanityConfirmed = 1;
  14597. #endif
  14598. #ifdef WOLFSSL_TLS13
  14599. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  14600. sanityConfirmed = 1;
  14601. #endif
  14602. break;
  14603. #endif
  14604. #ifdef WOLFSSL_DTLS
  14605. case DTLS_MAJOR:
  14606. sanityConfirmed = 1;
  14607. break;
  14608. #endif
  14609. default:
  14610. WOLFSSL_MSG("Invalid major version");
  14611. return WOLFSSL_FAILURE;
  14612. }
  14613. if (!sanityConfirmed) {
  14614. WOLFSSL_MSG("All compiled in TLS versions disabled");
  14615. return WOLFSSL_FAILURE;
  14616. }
  14617. return WOLFSSL_SUCCESS;
  14618. }
  14619. /**
  14620. * protoVerTbl holds (D)TLS version numbers in ascending order.
  14621. * Except DTLS versions, the newer version is located in the latter part of
  14622. * the table. This table is referred by wolfSSL_CTX_set_min_proto_version and
  14623. * wolfSSL_CTX_set_max_proto_version.
  14624. */
  14625. static const int protoVerTbl[] = {
  14626. SSL3_VERSION,
  14627. TLS1_VERSION,
  14628. TLS1_1_VERSION,
  14629. TLS1_2_VERSION,
  14630. TLS1_3_VERSION,
  14631. DTLS1_VERSION,
  14632. DTLS1_2_VERSION
  14633. };
  14634. /* number of protocol versions listed in protoVerTbl */
  14635. #define NUMBER_OF_PROTOCOLS (sizeof(protoVerTbl)/sizeof(int))
  14636. /**
  14637. * wolfSSL_CTX_set_min_proto_version attempts to set the minimum protocol
  14638. * version to use by SSL objects created from this WOLFSSL_CTX.
  14639. * This API guarantees that a version of SSL/TLS lower than specified
  14640. * here will not be allowed. If the version specified is not compiled in
  14641. * then this API sets the lowest compiled in protocol version.
  14642. * This API also accept 0 as version, to set the minimum version automatically.
  14643. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  14644. * are enabled.
  14645. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  14646. * @param version Any of the following
  14647. * * 0
  14648. * * SSL3_VERSION
  14649. * * TLS1_VERSION
  14650. * * TLS1_1_VERSION
  14651. * * TLS1_2_VERSION
  14652. * * TLS1_3_VERSION
  14653. * * DTLS1_VERSION
  14654. * * DTLS1_2_VERSION
  14655. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14656. * protocol versions are left enabled.
  14657. */
  14658. static int Set_CTX_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14659. {
  14660. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version_ex");
  14661. if (ctx == NULL) {
  14662. return WOLFSSL_FAILURE;
  14663. }
  14664. switch (version) {
  14665. #ifndef NO_TLS
  14666. case SSL3_VERSION:
  14667. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  14668. ctx->minDowngrade = SSLv3_MINOR;
  14669. break;
  14670. #endif
  14671. case TLS1_VERSION:
  14672. #ifdef WOLFSSL_ALLOW_TLSV10
  14673. ctx->minDowngrade = TLSv1_MINOR;
  14674. break;
  14675. #endif
  14676. case TLS1_1_VERSION:
  14677. #ifndef NO_OLD_TLS
  14678. ctx->minDowngrade = TLSv1_1_MINOR;
  14679. break;
  14680. #endif
  14681. case TLS1_2_VERSION:
  14682. #ifndef WOLFSSL_NO_TLS12
  14683. ctx->minDowngrade = TLSv1_2_MINOR;
  14684. break;
  14685. #endif
  14686. case TLS1_3_VERSION:
  14687. #ifdef WOLFSSL_TLS13
  14688. ctx->minDowngrade = TLSv1_3_MINOR;
  14689. break;
  14690. #endif
  14691. #endif
  14692. #ifdef WOLFSSL_DTLS
  14693. case DTLS1_VERSION:
  14694. #ifndef NO_OLD_TLS
  14695. ctx->minDowngrade = DTLS_MINOR;
  14696. break;
  14697. #endif
  14698. case DTLS1_2_VERSION:
  14699. ctx->minDowngrade = DTLSv1_2_MINOR;
  14700. break;
  14701. #endif
  14702. default:
  14703. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14704. return WOLFSSL_FAILURE;
  14705. }
  14706. switch (version) {
  14707. #ifndef NO_TLS
  14708. case TLS1_3_VERSION:
  14709. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  14710. FALL_THROUGH;
  14711. case TLS1_2_VERSION:
  14712. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  14713. FALL_THROUGH;
  14714. case TLS1_1_VERSION:
  14715. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  14716. FALL_THROUGH;
  14717. case TLS1_VERSION:
  14718. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  14719. break;
  14720. case SSL3_VERSION:
  14721. case SSL2_VERSION:
  14722. /* Nothing to do here */
  14723. break;
  14724. #endif
  14725. #ifdef WOLFSSL_DTLS
  14726. case DTLS1_VERSION:
  14727. case DTLS1_2_VERSION:
  14728. break;
  14729. #endif
  14730. default:
  14731. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14732. return WOLFSSL_FAILURE;
  14733. }
  14734. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  14735. }
  14736. /* Sets the min protocol version allowed with WOLFSSL_CTX
  14737. * returns WOLFSSL_SUCCESS on success */
  14738. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14739. {
  14740. int ret;
  14741. int proto = 0;
  14742. int maxProto = 0;
  14743. int i;
  14744. int idx = 0;
  14745. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  14746. if (ctx == NULL) {
  14747. return WOLFSSL_FAILURE;
  14748. }
  14749. if (version != 0) {
  14750. proto = version;
  14751. ctx->minProto = 0; /* turn min proto flag off */
  14752. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14753. if (protoVerTbl[i] == version) {
  14754. break;
  14755. }
  14756. }
  14757. }
  14758. else {
  14759. /* when 0 is specified as version, try to find out the min version */
  14760. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14761. ret = Set_CTX_min_proto_version(ctx, protoVerTbl[i]);
  14762. if (ret == WOLFSSL_SUCCESS) {
  14763. proto = protoVerTbl[i];
  14764. ctx->minProto = 1; /* turn min proto flag on */
  14765. break;
  14766. }
  14767. }
  14768. }
  14769. /* check case where max > min , if so then clear the NO_* options
  14770. * i is the index into the table for proto version used, see if the max
  14771. * proto version index found is smaller */
  14772. maxProto = wolfSSL_CTX_get_max_proto_version(ctx);
  14773. for (idx = 0; (unsigned)idx < NUMBER_OF_PROTOCOLS; idx++) {
  14774. if (protoVerTbl[idx] == maxProto) {
  14775. break;
  14776. }
  14777. }
  14778. if (idx < i) {
  14779. wolfSSL_CTX_clear_options(ctx, WOLFSSL_OP_NO_TLSv1 |
  14780. WOLFSSL_OP_NO_TLSv1_1 | WOLFSSL_OP_NO_TLSv1_2 |
  14781. WOLFSSL_OP_NO_TLSv1_3);
  14782. }
  14783. ret = Set_CTX_min_proto_version(ctx, proto);
  14784. return ret;
  14785. }
  14786. /**
  14787. * wolfSSL_CTX_set_max_proto_version attempts to set the maximum protocol
  14788. * version to use by SSL objects created from this WOLFSSL_CTX.
  14789. * This API guarantees that a version of SSL/TLS higher than specified
  14790. * here will not be allowed. If the version specified is not compiled in
  14791. * then this API sets the highest compiled in protocol version.
  14792. * This API also accept 0 as version, to set the maximum version automatically.
  14793. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  14794. * are enabled.
  14795. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  14796. * @param ver Any of the following
  14797. * * 0
  14798. * * SSL3_VERSION
  14799. * * TLS1_VERSION
  14800. * * TLS1_1_VERSION
  14801. * * TLS1_2_VERSION
  14802. * * TLS1_3_VERSION
  14803. * * DTLS1_VERSION
  14804. * * DTLS1_2_VERSION
  14805. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14806. * protocol versions are left enabled.
  14807. */
  14808. static int Set_CTX_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  14809. {
  14810. WOLFSSL_ENTER("Set_CTX_max_proto_version");
  14811. if (!ctx || !ctx->method) {
  14812. WOLFSSL_MSG("Bad parameter");
  14813. return WOLFSSL_FAILURE;
  14814. }
  14815. switch (ver) {
  14816. case SSL2_VERSION:
  14817. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  14818. return WOLFSSL_FAILURE;
  14819. #ifndef NO_TLS
  14820. case SSL3_VERSION:
  14821. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  14822. FALL_THROUGH;
  14823. case TLS1_VERSION:
  14824. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  14825. FALL_THROUGH;
  14826. case TLS1_1_VERSION:
  14827. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  14828. FALL_THROUGH;
  14829. case TLS1_2_VERSION:
  14830. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  14831. FALL_THROUGH;
  14832. case TLS1_3_VERSION:
  14833. /* Nothing to do here */
  14834. break;
  14835. #endif
  14836. #ifdef WOLFSSL_DTLS
  14837. case DTLS1_VERSION:
  14838. case DTLS1_2_VERSION:
  14839. break;
  14840. #endif
  14841. default:
  14842. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14843. return WOLFSSL_FAILURE;
  14844. }
  14845. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  14846. }
  14847. /* Sets the max protocol version allowed with WOLFSSL_CTX
  14848. * returns WOLFSSL_SUCCESS on success */
  14849. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version)
  14850. {
  14851. int i;
  14852. int ret = WOLFSSL_FAILURE;
  14853. int minProto;
  14854. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  14855. if (ctx == NULL) {
  14856. return ret;
  14857. }
  14858. /* clear out flags and reset min protocol version */
  14859. minProto = wolfSSL_CTX_get_min_proto_version(ctx);
  14860. wolfSSL_CTX_clear_options(ctx,
  14861. WOLFSSL_OP_NO_TLSv1 | WOLFSSL_OP_NO_TLSv1_1 |
  14862. WOLFSSL_OP_NO_TLSv1_2 | WOLFSSL_OP_NO_TLSv1_3);
  14863. wolfSSL_CTX_set_min_proto_version(ctx, minProto);
  14864. if (version != 0) {
  14865. ctx->maxProto = 0; /* turn max proto flag off */
  14866. return Set_CTX_max_proto_version(ctx, version);
  14867. }
  14868. /* when 0 is specified as version, try to find out the min version from
  14869. * the bottom to top of the protoverTbl.
  14870. */
  14871. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  14872. ret = Set_CTX_max_proto_version(ctx, protoVerTbl[i]);
  14873. if (ret == WOLFSSL_SUCCESS) {
  14874. ctx->maxProto = 1; /* turn max proto flag on */
  14875. break;
  14876. }
  14877. }
  14878. return ret;
  14879. }
  14880. static int Set_SSL_min_proto_version(WOLFSSL* ssl, int ver)
  14881. {
  14882. WOLFSSL_ENTER("Set_SSL_min_proto_version");
  14883. if (ssl == NULL) {
  14884. return WOLFSSL_FAILURE;
  14885. }
  14886. switch (ver) {
  14887. #ifndef NO_TLS
  14888. case SSL3_VERSION:
  14889. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  14890. ssl->options.minDowngrade = SSLv3_MINOR;
  14891. break;
  14892. #endif
  14893. case TLS1_VERSION:
  14894. #ifdef WOLFSSL_ALLOW_TLSV10
  14895. ssl->options.minDowngrade = TLSv1_MINOR;
  14896. break;
  14897. #endif
  14898. case TLS1_1_VERSION:
  14899. #ifndef NO_OLD_TLS
  14900. ssl->options.minDowngrade = TLSv1_1_MINOR;
  14901. break;
  14902. #endif
  14903. case TLS1_2_VERSION:
  14904. #ifndef WOLFSSL_NO_TLS12
  14905. ssl->options.minDowngrade = TLSv1_2_MINOR;
  14906. break;
  14907. #endif
  14908. case TLS1_3_VERSION:
  14909. #ifdef WOLFSSL_TLS13
  14910. ssl->options.minDowngrade = TLSv1_3_MINOR;
  14911. break;
  14912. #endif
  14913. #endif
  14914. #ifdef WOLFSSL_DTLS
  14915. case DTLS1_VERSION:
  14916. #ifndef NO_OLD_TLS
  14917. ssl->options.minDowngrade = DTLS_MINOR;
  14918. break;
  14919. #endif
  14920. case DTLS1_2_VERSION:
  14921. ssl->options.minDowngrade = DTLSv1_2_MINOR;
  14922. break;
  14923. #endif
  14924. default:
  14925. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14926. return WOLFSSL_FAILURE;
  14927. }
  14928. switch (ver) {
  14929. #ifndef NO_TLS
  14930. case TLS1_3_VERSION:
  14931. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  14932. FALL_THROUGH;
  14933. case TLS1_2_VERSION:
  14934. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  14935. FALL_THROUGH;
  14936. case TLS1_1_VERSION:
  14937. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  14938. FALL_THROUGH;
  14939. case TLS1_VERSION:
  14940. ssl->options.mask |= WOLFSSL_OP_NO_SSLv3;
  14941. break;
  14942. case SSL3_VERSION:
  14943. case SSL2_VERSION:
  14944. /* Nothing to do here */
  14945. break;
  14946. #endif
  14947. #ifdef WOLFSSL_DTLS
  14948. case DTLS1_VERSION:
  14949. case DTLS1_2_VERSION:
  14950. break;
  14951. #endif
  14952. default:
  14953. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14954. return WOLFSSL_FAILURE;
  14955. }
  14956. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  14957. }
  14958. int wolfSSL_set_min_proto_version(WOLFSSL* ssl, int version)
  14959. {
  14960. int i;
  14961. int ret = WOLFSSL_FAILURE;;
  14962. WOLFSSL_ENTER("wolfSSL_set_min_proto_version");
  14963. if (ssl == NULL) {
  14964. return WOLFSSL_FAILURE;
  14965. }
  14966. if (version != 0) {
  14967. return Set_SSL_min_proto_version(ssl, version);
  14968. }
  14969. /* when 0 is specified as version, try to find out the min version */
  14970. for (i= 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14971. ret = Set_SSL_min_proto_version(ssl, protoVerTbl[i]);
  14972. if (ret == WOLFSSL_SUCCESS)
  14973. break;
  14974. }
  14975. return ret;
  14976. }
  14977. static int Set_SSL_max_proto_version(WOLFSSL* ssl, int ver)
  14978. {
  14979. WOLFSSL_ENTER("Set_SSL_max_proto_version");
  14980. if (!ssl) {
  14981. WOLFSSL_MSG("Bad parameter");
  14982. return WOLFSSL_FAILURE;
  14983. }
  14984. switch (ver) {
  14985. case SSL2_VERSION:
  14986. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  14987. return WOLFSSL_FAILURE;
  14988. #ifndef NO_TLS
  14989. case SSL3_VERSION:
  14990. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  14991. FALL_THROUGH;
  14992. case TLS1_VERSION:
  14993. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  14994. FALL_THROUGH;
  14995. case TLS1_1_VERSION:
  14996. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  14997. FALL_THROUGH;
  14998. case TLS1_2_VERSION:
  14999. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3;
  15000. FALL_THROUGH;
  15001. case TLS1_3_VERSION:
  15002. /* Nothing to do here */
  15003. break;
  15004. #endif
  15005. #ifdef WOLFSSL_DTLS
  15006. case DTLS1_VERSION:
  15007. case DTLS1_2_VERSION:
  15008. break;
  15009. #endif
  15010. default:
  15011. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15012. return WOLFSSL_FAILURE;
  15013. }
  15014. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15015. }
  15016. int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version)
  15017. {
  15018. int i;
  15019. int ret = WOLFSSL_FAILURE;;
  15020. WOLFSSL_ENTER("wolfSSL_set_max_proto_version");
  15021. if (ssl == NULL) {
  15022. return WOLFSSL_FAILURE;
  15023. }
  15024. if (version != 0) {
  15025. return Set_SSL_max_proto_version(ssl, version);
  15026. }
  15027. /* when 0 is specified as version, try to find out the min version from
  15028. * the bottom to top of the protoverTbl.
  15029. */
  15030. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15031. ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]);
  15032. if (ret == WOLFSSL_SUCCESS)
  15033. break;
  15034. }
  15035. return ret;
  15036. }
  15037. static int GetMinProtoVersion(int minDowngrade)
  15038. {
  15039. int ret;
  15040. switch (minDowngrade) {
  15041. #ifndef NO_OLD_TLS
  15042. #ifdef WOLFSSL_ALLOW_SSLV3
  15043. case SSLv3_MINOR:
  15044. ret = SSL3_VERSION;
  15045. break;
  15046. #endif
  15047. #ifdef WOLFSSL_ALLOW_TLSV10
  15048. case TLSv1_MINOR:
  15049. ret = TLS1_VERSION;
  15050. break;
  15051. #endif
  15052. case TLSv1_1_MINOR:
  15053. ret = TLS1_1_VERSION;
  15054. break;
  15055. #endif
  15056. #ifndef WOLFSSL_NO_TLS12
  15057. case TLSv1_2_MINOR:
  15058. ret = TLS1_2_VERSION;
  15059. break;
  15060. #endif
  15061. #ifdef WOLFSSL_TLS13
  15062. case TLSv1_3_MINOR:
  15063. ret = TLS1_3_VERSION;
  15064. break;
  15065. #endif
  15066. default:
  15067. ret = 0;
  15068. break;
  15069. }
  15070. return ret;
  15071. }
  15072. WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  15073. {
  15074. int ret = 0;
  15075. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  15076. if (ctx != NULL) {
  15077. if (ctx->minProto) {
  15078. ret = 0;
  15079. }
  15080. else {
  15081. ret = GetMinProtoVersion(ctx->minDowngrade);
  15082. }
  15083. }
  15084. else {
  15085. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  15086. }
  15087. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  15088. return ret;
  15089. }
  15090. /* returns the maximum allowed protocol version given the 'options' used
  15091. * returns WOLFSSL_FATAL_ERROR on no match */
  15092. static int GetMaxProtoVersion(long options)
  15093. {
  15094. #ifndef NO_TLS
  15095. #ifdef WOLFSSL_TLS13
  15096. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15097. return TLS1_3_VERSION;
  15098. #endif
  15099. #ifndef WOLFSSL_NO_TLS12
  15100. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15101. return TLS1_2_VERSION;
  15102. #endif
  15103. #ifndef NO_OLD_TLS
  15104. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15105. return TLS1_1_VERSION;
  15106. #ifdef WOLFSSL_ALLOW_TLSV10
  15107. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15108. return TLS1_VERSION;
  15109. #endif
  15110. #ifdef WOLFSSL_ALLOW_SSLV3
  15111. if (!(options & WOLFSSL_OP_NO_SSLv3))
  15112. return SSL3_VERSION;
  15113. #endif
  15114. #endif
  15115. #else
  15116. (void)options;
  15117. #endif /* NO_TLS */
  15118. return WOLFSSL_FATAL_ERROR;
  15119. }
  15120. /* returns the maximum protocol version for 'ctx' */
  15121. int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx)
  15122. {
  15123. int ret = 0;
  15124. long options = 0; /* default to nothing set */
  15125. WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version");
  15126. if (ctx != NULL) {
  15127. options = wolfSSL_CTX_get_options(ctx);
  15128. }
  15129. if ((ctx != NULL) && ctx->maxProto) {
  15130. ret = 0;
  15131. }
  15132. else {
  15133. ret = GetMaxProtoVersion(options);
  15134. }
  15135. WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret);
  15136. if (ret == WOLFSSL_FATAL_ERROR) {
  15137. WOLFSSL_MSG("Error getting max proto version");
  15138. ret = 0; /* setting ret to 0 to match compat return */
  15139. }
  15140. return ret;
  15141. }
  15142. #endif /* OPENSSL_EXTRA */
  15143. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15144. defined(HAVE_SECRET_CALLBACK)
  15145. #if !defined(NO_WOLFSSL_CLIENT)
  15146. /* Return the amount of random bytes copied over or error case.
  15147. * ssl : ssl struct after handshake
  15148. * out : buffer to hold random bytes
  15149. * outSz : either 0 (return max buffer sz) or size of out buffer
  15150. */
  15151. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  15152. size_t outSz)
  15153. {
  15154. size_t size;
  15155. /* return max size of buffer */
  15156. if (outSz == 0) {
  15157. return RAN_LEN;
  15158. }
  15159. if (ssl == NULL || out == NULL) {
  15160. return 0;
  15161. }
  15162. if (ssl->arrays == NULL) {
  15163. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15164. return 0;
  15165. }
  15166. if (outSz > RAN_LEN) {
  15167. size = RAN_LEN;
  15168. }
  15169. else {
  15170. size = outSz;
  15171. }
  15172. XMEMCPY(out, ssl->arrays->clientRandom, size);
  15173. return size;
  15174. }
  15175. #endif /* !NO_WOLFSSL_CLIENT */
  15176. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15177. #ifdef OPENSSL_EXTRA
  15178. unsigned long wolfSSLeay(void)
  15179. {
  15180. return SSLEAY_VERSION_NUMBER;
  15181. }
  15182. unsigned long wolfSSL_OpenSSL_version_num(void)
  15183. {
  15184. return OPENSSL_VERSION_NUMBER;
  15185. }
  15186. const char* wolfSSLeay_version(int type)
  15187. {
  15188. (void)type;
  15189. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  15190. return wolfSSL_OpenSSL_version(type);
  15191. #else
  15192. return wolfSSL_OpenSSL_version();
  15193. #endif
  15194. }
  15195. #ifndef NO_MD5
  15196. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  15197. {
  15198. int ret;
  15199. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  15200. (void)sizeof(md5_test);
  15201. WOLFSSL_ENTER("MD5_Init");
  15202. ret = wc_InitMd5((wc_Md5*)md5);
  15203. /* return 1 on success, 0 otherwise */
  15204. if (ret == 0)
  15205. return 1;
  15206. return 0;
  15207. }
  15208. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  15209. unsigned long sz)
  15210. {
  15211. int ret;
  15212. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  15213. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  15214. /* return 1 on success, 0 otherwise */
  15215. if (ret == 0)
  15216. return 1;
  15217. return 0;
  15218. }
  15219. int wolfSSL_MD5_Final(byte* output, WOLFSSL_MD5_CTX* md5)
  15220. {
  15221. int ret;
  15222. WOLFSSL_ENTER("MD5_Final");
  15223. ret = wc_Md5Final((wc_Md5*)md5, output);
  15224. /* have to actually free the resources (if any) here, because the
  15225. * OpenSSL API doesn't include SHA*_Free().
  15226. */
  15227. wc_Md5Free((wc_Md5*)md5);
  15228. /* return 1 on success, 0 otherwise */
  15229. if (ret == 0)
  15230. return 1;
  15231. return 0;
  15232. }
  15233. /* Apply MD5 transformation to the data */
  15234. int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data)
  15235. {
  15236. int ret;
  15237. WOLFSSL_ENTER("MD5_Transform");
  15238. /* sanity check */
  15239. if (md5 == NULL || data == NULL) {
  15240. return 0;
  15241. }
  15242. #if defined(BIG_ENDIAN_ORDER)
  15243. {
  15244. ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE);
  15245. }
  15246. #endif
  15247. ret = wc_Md5Transform((wc_Md5*)md5, data);
  15248. /* return 1 on success, 0 otherwise */
  15249. if (ret == 0)
  15250. return 1;
  15251. else
  15252. return 0;
  15253. }
  15254. unsigned char *wolfSSL_MD5(const unsigned char* data, size_t len,
  15255. unsigned char* hash)
  15256. {
  15257. static unsigned char out[WC_MD5_DIGEST_SIZE];
  15258. WOLFSSL_ENTER("wolfSSL_MD5");
  15259. if (hash == NULL)
  15260. hash = out;
  15261. if (wc_Md5Hash(data, (word32)len, hash) != 0) {
  15262. WOLFSSL_MSG("wc_Md5Hash error");
  15263. return NULL;
  15264. }
  15265. return hash;
  15266. }
  15267. #endif /* !NO_MD5 */
  15268. #ifndef NO_SHA
  15269. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  15270. {
  15271. int ret;
  15272. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  15273. (void)sizeof(sha_test);
  15274. WOLFSSL_ENTER("SHA_Init");
  15275. ret = wc_InitSha((wc_Sha*)sha);
  15276. /* return 1 on success, 0 otherwise */
  15277. if (ret == 0)
  15278. return 1;
  15279. return 0;
  15280. }
  15281. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  15282. unsigned long sz)
  15283. {
  15284. int ret;
  15285. WOLFSSL_ENTER("SHA_Update");
  15286. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  15287. /* return 1 on success, 0 otherwise */
  15288. if (ret == 0)
  15289. return 1;
  15290. return 0;
  15291. }
  15292. int wolfSSL_SHA_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  15293. {
  15294. int ret;
  15295. WOLFSSL_ENTER("SHA_Final");
  15296. ret = wc_ShaFinal((wc_Sha*)sha, output);
  15297. /* have to actually free the resources (if any) here, because the
  15298. * OpenSSL API doesn't include SHA*_Free().
  15299. */
  15300. wc_ShaFree((wc_Sha*)sha);
  15301. /* return 1 on success, 0 otherwise */
  15302. if (ret == 0)
  15303. return 1;
  15304. return 0;
  15305. }
  15306. #if defined(OPENSSL_EXTRA)
  15307. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15308. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15309. /* Apply SHA1 transformation to the data */
  15310. int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha,
  15311. const unsigned char* data)
  15312. {
  15313. int ret;
  15314. WOLFSSL_ENTER("SHA_Transform");
  15315. /* sanity check */
  15316. if (sha == NULL || data == NULL) {
  15317. return 0;
  15318. }
  15319. #if defined(LITTLE_ENDIAN_ORDER)
  15320. {
  15321. ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE);
  15322. }
  15323. #endif
  15324. ret = wc_ShaTransform((wc_Sha*)sha, data);
  15325. /* return 1 on success, 0 otherwise */
  15326. if (ret == 0)
  15327. return 1;
  15328. else
  15329. return 0;
  15330. }
  15331. #endif
  15332. #endif
  15333. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  15334. {
  15335. WOLFSSL_ENTER("SHA1_Init");
  15336. return SHA_Init(sha);
  15337. }
  15338. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  15339. unsigned long sz)
  15340. {
  15341. WOLFSSL_ENTER("SHA1_Update");
  15342. return SHA_Update(sha, input, sz);
  15343. }
  15344. int wolfSSL_SHA1_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  15345. {
  15346. WOLFSSL_ENTER("SHA1_Final");
  15347. return SHA_Final(output, sha);
  15348. }
  15349. #if defined(OPENSSL_EXTRA)
  15350. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15351. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15352. /* Apply SHA1 transformation to the data */
  15353. int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha,
  15354. const unsigned char* data)
  15355. {
  15356. WOLFSSL_ENTER("SHA1_Transform");
  15357. return (wolfSSL_SHA_Transform(sha, data));
  15358. }
  15359. #endif
  15360. #endif
  15361. #endif /* !NO_SHA */
  15362. #ifdef WOLFSSL_SHA224
  15363. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  15364. {
  15365. int ret;
  15366. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  15367. (void)sizeof(sha_test);
  15368. WOLFSSL_ENTER("SHA224_Init");
  15369. ret = wc_InitSha224((wc_Sha224*)sha);
  15370. /* return 1 on success, 0 otherwise */
  15371. if (ret == 0)
  15372. return 1;
  15373. return 0;
  15374. }
  15375. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  15376. unsigned long sz)
  15377. {
  15378. int ret;
  15379. WOLFSSL_ENTER("SHA224_Update");
  15380. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  15381. /* return 1 on success, 0 otherwise */
  15382. if (ret == 0)
  15383. return 1;
  15384. return 0;
  15385. }
  15386. int wolfSSL_SHA224_Final(byte* output, WOLFSSL_SHA224_CTX* sha)
  15387. {
  15388. int ret;
  15389. WOLFSSL_ENTER("SHA224_Final");
  15390. ret = wc_Sha224Final((wc_Sha224*)sha, output);
  15391. /* have to actually free the resources (if any) here, because the
  15392. * OpenSSL API doesn't include SHA*_Free().
  15393. */
  15394. wc_Sha224Free((wc_Sha224*)sha);
  15395. /* return 1 on success, 0 otherwise */
  15396. if (ret == 0)
  15397. return 1;
  15398. return 0;
  15399. }
  15400. #endif /* WOLFSSL_SHA224 */
  15401. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  15402. {
  15403. int ret;
  15404. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  15405. (void)sizeof(sha_test);
  15406. WOLFSSL_ENTER("SHA256_Init");
  15407. ret = wc_InitSha256((wc_Sha256*)sha256);
  15408. /* return 1 on success, 0 otherwise */
  15409. if (ret == 0)
  15410. return 1;
  15411. return 0;
  15412. }
  15413. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  15414. unsigned long sz)
  15415. {
  15416. int ret;
  15417. WOLFSSL_ENTER("SHA256_Update");
  15418. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  15419. /* return 1 on success, 0 otherwise */
  15420. if (ret == 0)
  15421. return 1;
  15422. return 0;
  15423. }
  15424. int wolfSSL_SHA256_Final(byte* output, WOLFSSL_SHA256_CTX* sha)
  15425. {
  15426. int ret;
  15427. WOLFSSL_ENTER("SHA256_Final");
  15428. ret = wc_Sha256Final((wc_Sha256*)sha, output);
  15429. /* have to actually free the resources (if any) here, because the
  15430. * OpenSSL API doesn't include SHA*_Free().
  15431. */
  15432. wc_Sha256Free((wc_Sha256*)sha);
  15433. /* return 1 on success, 0 otherwise */
  15434. if (ret == 0)
  15435. return 1;
  15436. return 0;
  15437. }
  15438. #if defined(OPENSSL_EXTRA)
  15439. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15440. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \
  15441. !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH)
  15442. /* Apply SHA256 transformation to the data */
  15443. int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256,
  15444. const unsigned char* data)
  15445. {
  15446. int ret;
  15447. WOLFSSL_ENTER("SHA256_Transform");
  15448. /* sanity check */
  15449. if (sha256 == NULL || data == NULL) {
  15450. return 0;
  15451. }
  15452. #if defined(LITTLE_ENDIAN_ORDER)
  15453. {
  15454. ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE);
  15455. }
  15456. #endif
  15457. ret = wc_Sha256Transform((wc_Sha256*)sha256, data);
  15458. /* return 1 on success, 0 otherwise */
  15459. if (ret == 0)
  15460. return 1;
  15461. else
  15462. return 0;
  15463. }
  15464. #endif
  15465. #endif
  15466. #ifdef WOLFSSL_SHA384
  15467. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  15468. {
  15469. int ret;
  15470. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  15471. (void)sizeof(sha_test);
  15472. WOLFSSL_ENTER("SHA384_Init");
  15473. ret = wc_InitSha384((wc_Sha384*)sha);
  15474. /* return 1 on success, 0 otherwise */
  15475. if (ret == 0)
  15476. return 1;
  15477. return 0;
  15478. }
  15479. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  15480. unsigned long sz)
  15481. {
  15482. int ret;
  15483. WOLFSSL_ENTER("SHA384_Update");
  15484. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  15485. /* return 1 on success, 0 otherwise */
  15486. if (ret == 0)
  15487. return 1;
  15488. return 0;
  15489. }
  15490. int wolfSSL_SHA384_Final(byte* output, WOLFSSL_SHA384_CTX* sha)
  15491. {
  15492. int ret;
  15493. WOLFSSL_ENTER("SHA384_Final");
  15494. ret = wc_Sha384Final((wc_Sha384*)sha, output);
  15495. /* have to actually free the resources (if any) here, because the
  15496. * OpenSSL API doesn't include SHA*_Free().
  15497. */
  15498. wc_Sha384Free((wc_Sha384*)sha);
  15499. /* return 1 on success, 0 otherwise */
  15500. if (ret == 0)
  15501. return 1;
  15502. return 0;
  15503. }
  15504. #endif /* WOLFSSL_SHA384 */
  15505. #ifdef WOLFSSL_SHA512
  15506. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  15507. {
  15508. int ret;
  15509. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  15510. (void)sizeof(sha_test);
  15511. WOLFSSL_ENTER("SHA512_Init");
  15512. ret = wc_InitSha512((wc_Sha512*)sha);
  15513. /* return 1 on success, 0 otherwise */
  15514. if (ret == 0)
  15515. return 1;
  15516. return 0;
  15517. }
  15518. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  15519. unsigned long sz)
  15520. {
  15521. int ret;
  15522. WOLFSSL_ENTER("SHA512_Update");
  15523. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15524. /* return 1 on success, 0 otherwise */
  15525. if (ret == 0)
  15526. return 1;
  15527. return 0;
  15528. }
  15529. int wolfSSL_SHA512_Final(byte* output, WOLFSSL_SHA512_CTX* sha)
  15530. {
  15531. int ret;
  15532. WOLFSSL_ENTER("SHA512_Final");
  15533. ret = wc_Sha512Final((wc_Sha512*)sha, output);
  15534. /* have to actually free the resources (if any) here, because the
  15535. * OpenSSL API doesn't include SHA*_Free().
  15536. */
  15537. wc_Sha512Free((wc_Sha512*)sha);
  15538. /* return 1 on success, 0 otherwise */
  15539. if (ret == 0)
  15540. return 1;
  15541. return 0;
  15542. }
  15543. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15544. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15545. /* Apply SHA512 transformation to the data */
  15546. int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512,
  15547. const unsigned char* data)
  15548. {
  15549. int ret;
  15550. WOLFSSL_ENTER("SHA512_Transform");
  15551. /* sanity check */
  15552. if (sha512 == NULL || data == NULL) {
  15553. return WOLFSSL_FAILURE;
  15554. }
  15555. ret = wc_Sha512Transform((wc_Sha512*)sha512, data);
  15556. /* return 1 on success, 0 otherwise */
  15557. if (ret == 0)
  15558. return WOLFSSL_SUCCESS;
  15559. else
  15560. return WOLFSSL_FAILURE;
  15561. }
  15562. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15563. (HAVE_FIPS_VERSION > 2)) */
  15564. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  15565. #if !defined(WOLFSSL_NOSHA512_224)
  15566. int wolfSSL_SHA512_224_Init(WOLFSSL_SHA512_224_CTX* sha)
  15567. {
  15568. int ret;
  15569. WOLFSSL_ENTER("wolfSSL_SHA512_224_Init");
  15570. ret = wc_InitSha512_224((wc_Sha512*)sha);
  15571. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15572. if (ret == 0)
  15573. return WOLFSSL_SUCCESS;
  15574. return WOLFSSL_FAILURE;
  15575. }
  15576. int wolfSSL_SHA512_224_Update(WOLFSSL_SHA512_224_CTX* sha,
  15577. const void* input, unsigned long sz)
  15578. {
  15579. int ret;
  15580. WOLFSSL_ENTER("wolfSSL_SHA512_224_Update");
  15581. ret = wc_Sha512_224Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15582. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15583. if (ret == 0)
  15584. return WOLFSSL_SUCCESS;
  15585. return WOLFSSL_FAILURE;
  15586. }
  15587. int wolfSSL_SHA512_224_Final(byte* output, WOLFSSL_SHA512_224_CTX* sha)
  15588. {
  15589. int ret;
  15590. WOLFSSL_ENTER("wolfSSL_SHA512_224_Final");
  15591. ret = wc_Sha512_224Final((wc_Sha512*)sha, output);
  15592. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15593. if (ret == 0)
  15594. return WOLFSSL_SUCCESS;
  15595. return WOLFSSL_FAILURE;
  15596. }
  15597. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15598. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15599. /* Apply SHA512 transformation to the data */
  15600. int wolfSSL_SHA512_224_Transform(WOLFSSL_SHA512_CTX* sha512,
  15601. const unsigned char* data)
  15602. {
  15603. int ret;
  15604. WOLFSSL_ENTER("SHA512_224_Transform");
  15605. /* sanity check */
  15606. if (sha512 == NULL || data == NULL) {
  15607. return WOLFSSL_FAILURE;
  15608. }
  15609. ret = wc_Sha512_224Transform((wc_Sha512*)sha512, data);
  15610. /* return 1 on success, 0 otherwise */
  15611. if (ret == 0)
  15612. return WOLFSSL_SUCCESS;
  15613. else
  15614. return WOLFSSL_FAILURE;
  15615. }
  15616. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15617. (HAVE_FIPS_VERSION > 2)) */
  15618. #endif /* !WOLFSSL_NOSHA512_224 */
  15619. #if !defined(WOLFSSL_NOSHA512_256)
  15620. int wolfSSL_SHA512_256_Init(WOLFSSL_SHA512_256_CTX* sha)
  15621. {
  15622. int ret;
  15623. WOLFSSL_ENTER("wolfSSL_SHA512_256_Init");
  15624. ret = wc_InitSha512_256((wc_Sha512*)sha);
  15625. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15626. if (ret == 0)
  15627. return WOLFSSL_SUCCESS;
  15628. return WOLFSSL_FAILURE;
  15629. }
  15630. int wolfSSL_SHA512_256_Update(WOLFSSL_SHA512_256_CTX* sha,
  15631. const void* input, unsigned long sz)
  15632. {
  15633. int ret;
  15634. WOLFSSL_ENTER("wolfSSL_SHA512_256_Update");
  15635. ret = wc_Sha512_256Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15636. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15637. if (ret == 0)
  15638. return WOLFSSL_SUCCESS;
  15639. return WOLFSSL_FAILURE;
  15640. }
  15641. int wolfSSL_SHA512_256_Final(byte* output, WOLFSSL_SHA512_256_CTX* sha)
  15642. {
  15643. int ret;
  15644. WOLFSSL_ENTER("wolfSSL_SHA512_256_Final");
  15645. ret = wc_Sha512_256Final((wc_Sha512*)sha, output);
  15646. /* return WOLFSSL_SUCCESS on success, 0 otherwise */
  15647. if (ret == 0)
  15648. return WOLFSSL_SUCCESS;
  15649. return WOLFSSL_FAILURE;
  15650. }
  15651. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15652. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15653. /* Apply SHA512 transformation to the data */
  15654. int wolfSSL_SHA512_256_Transform(WOLFSSL_SHA512_CTX* sha512,
  15655. const unsigned char* data)
  15656. {
  15657. int ret;
  15658. WOLFSSL_ENTER("SHA512_256_Transform");
  15659. /* sanity check */
  15660. if (sha512 == NULL || data == NULL) {
  15661. return WOLFSSL_FAILURE;
  15662. }
  15663. ret = wc_Sha512_256Transform((wc_Sha512*)sha512, data);
  15664. /* return 1 on success, 0 otherwise */
  15665. if (ret == 0)
  15666. return WOLFSSL_SUCCESS;
  15667. else
  15668. return WOLFSSL_FAILURE;
  15669. }
  15670. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15671. (HAVE_FIPS_VERSION > 2)) */
  15672. #endif /* !WOLFSSL_NOSHA512_256 */
  15673. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  15674. #endif /* WOLFSSL_SHA512 */
  15675. #ifdef WOLFSSL_SHA3
  15676. #ifndef WOLFSSL_NOSHA3_224
  15677. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  15678. {
  15679. int ret;
  15680. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15681. (void)sizeof(sha_test);
  15682. WOLFSSL_ENTER("SHA3_224_Init");
  15683. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15684. /* return 1 on success, 0 otherwise */
  15685. if (ret == 0)
  15686. return 1;
  15687. return 0;
  15688. }
  15689. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  15690. unsigned long sz)
  15691. {
  15692. int ret;
  15693. WOLFSSL_ENTER("SHA3_224_Update");
  15694. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15695. /* return 1 on success, 0 otherwise */
  15696. if (ret == 0)
  15697. return 1;
  15698. return 0;
  15699. }
  15700. int wolfSSL_SHA3_224_Final(byte* output, WOLFSSL_SHA3_224_CTX* sha)
  15701. {
  15702. int ret;
  15703. WOLFSSL_ENTER("SHA3_224_Final");
  15704. ret = wc_Sha3_224_Final((wc_Sha3*)sha, output);
  15705. /* have to actually free the resources (if any) here, because the
  15706. * OpenSSL API doesn't include SHA*_Free().
  15707. */
  15708. wc_Sha3_224_Free((wc_Sha3*)sha);
  15709. /* return 1 on success, 0 otherwise */
  15710. if (ret == 0)
  15711. return 1;
  15712. return 0;
  15713. }
  15714. #endif /* WOLFSSL_NOSHA3_224 */
  15715. #ifndef WOLFSSL_NOSHA3_256
  15716. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  15717. {
  15718. int ret;
  15719. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15720. (void)sizeof(sha_test);
  15721. WOLFSSL_ENTER("SHA3_256_Init");
  15722. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  15723. /* return 1 on success, 0 otherwise */
  15724. if (ret == 0)
  15725. return 1;
  15726. return 0;
  15727. }
  15728. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  15729. unsigned long sz)
  15730. {
  15731. int ret;
  15732. WOLFSSL_ENTER("SHA3_256_Update");
  15733. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15734. /* return 1 on success, 0 otherwise */
  15735. if (ret == 0)
  15736. return 1;
  15737. return 0;
  15738. }
  15739. int wolfSSL_SHA3_256_Final(byte* output, WOLFSSL_SHA3_256_CTX* sha)
  15740. {
  15741. int ret;
  15742. WOLFSSL_ENTER("SHA3_256_Final");
  15743. ret = wc_Sha3_256_Final((wc_Sha3*)sha, output);
  15744. /* have to actually free the resources (if any) here, because the
  15745. * OpenSSL API doesn't include SHA*_Free().
  15746. */
  15747. wc_Sha3_256_Free((wc_Sha3*)sha);
  15748. /* return 1 on success, 0 otherwise */
  15749. if (ret == 0)
  15750. return 1;
  15751. return 0;
  15752. }
  15753. #endif /* WOLFSSL_NOSHA3_256 */
  15754. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  15755. {
  15756. int ret;
  15757. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15758. (void)sizeof(sha_test);
  15759. WOLFSSL_ENTER("SHA3_384_Init");
  15760. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15761. /* return 1 on success, 0 otherwise */
  15762. if (ret == 0)
  15763. return 1;
  15764. return 0;
  15765. }
  15766. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  15767. unsigned long sz)
  15768. {
  15769. int ret;
  15770. WOLFSSL_ENTER("SHA3_384_Update");
  15771. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15772. /* return 1 on success, 0 otherwise */
  15773. if (ret == 0)
  15774. return 1;
  15775. return 0;
  15776. }
  15777. int wolfSSL_SHA3_384_Final(byte* output, WOLFSSL_SHA3_384_CTX* sha)
  15778. {
  15779. int ret;
  15780. WOLFSSL_ENTER("SHA3_384_Final");
  15781. ret = wc_Sha3_384_Final((wc_Sha3*)sha, output);
  15782. /* have to actually free the resources (if any) here, because the
  15783. * OpenSSL API doesn't include SHA*_Free().
  15784. */
  15785. wc_Sha3_384_Free((wc_Sha3*)sha);
  15786. /* return 1 on success, 0 otherwise */
  15787. if (ret == 0)
  15788. return 1;
  15789. return 0;
  15790. }
  15791. #ifndef WOLFSSL_NOSHA3_512
  15792. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  15793. {
  15794. int ret;
  15795. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15796. (void)sizeof(sha_test);
  15797. WOLFSSL_ENTER("SHA3_512_Init");
  15798. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15799. /* return 1 on success, 0 otherwise */
  15800. if (ret == 0)
  15801. return 1;
  15802. return 0;
  15803. }
  15804. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  15805. unsigned long sz)
  15806. {
  15807. int ret;
  15808. WOLFSSL_ENTER("SHA3_512_Update");
  15809. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15810. /* return 1 on success, 0 otherwise */
  15811. if (ret == 0)
  15812. return 1;
  15813. return 0;
  15814. }
  15815. int wolfSSL_SHA3_512_Final(byte* output, WOLFSSL_SHA3_512_CTX* sha)
  15816. {
  15817. int ret;
  15818. WOLFSSL_ENTER("SHA3_512_Final");
  15819. ret = wc_Sha3_512_Final((wc_Sha3*)sha, output);
  15820. /* have to actually free the resources (if any) here, because the
  15821. * OpenSSL API doesn't include SHA*_Free().
  15822. */
  15823. wc_Sha3_512_Free((wc_Sha3*)sha);
  15824. /* return 1 on success, 0 otherwise */
  15825. if (ret == 0)
  15826. return 1;
  15827. return 0;
  15828. }
  15829. #endif /* WOLFSSL_NOSHA3_512 */
  15830. #endif /* WOLFSSL_SHA3 */
  15831. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  15832. int key_len, const unsigned char* d, int n,
  15833. unsigned char* md, unsigned int* md_len)
  15834. {
  15835. int type;
  15836. int mdlen;
  15837. unsigned char* ret = NULL;
  15838. #ifdef WOLFSSL_SMALL_STACK
  15839. Hmac* hmac = NULL;
  15840. #else
  15841. Hmac hmac[1];
  15842. #endif
  15843. void* heap = NULL;
  15844. WOLFSSL_ENTER("wolfSSL_HMAC");
  15845. if (!md) {
  15846. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  15847. return NULL; /* no static buffer support */
  15848. }
  15849. #ifndef NO_MD5
  15850. if (XSTRCMP(evp_md, "MD5") == 0) {
  15851. type = WC_MD5;
  15852. mdlen = WC_MD5_DIGEST_SIZE;
  15853. } else
  15854. #endif
  15855. #ifdef WOLFSSL_SHA224
  15856. if (XSTRCMP(evp_md, "SHA224") == 0) {
  15857. type = WC_SHA224;
  15858. mdlen = WC_SHA224_DIGEST_SIZE;
  15859. } else
  15860. #endif
  15861. #ifndef NO_SHA256
  15862. if (XSTRCMP(evp_md, "SHA256") == 0) {
  15863. type = WC_SHA256;
  15864. mdlen = WC_SHA256_DIGEST_SIZE;
  15865. } else
  15866. #endif
  15867. #ifdef WOLFSSL_SHA384
  15868. if (XSTRCMP(evp_md, "SHA384") == 0) {
  15869. type = WC_SHA384;
  15870. mdlen = WC_SHA384_DIGEST_SIZE;
  15871. } else
  15872. #endif
  15873. #ifdef WOLFSSL_SHA512
  15874. if (XSTRCMP(evp_md, "SHA512") == 0) {
  15875. type = WC_SHA512;
  15876. mdlen = WC_SHA512_DIGEST_SIZE;
  15877. } else
  15878. #endif
  15879. #ifdef WOLFSSL_SHA3
  15880. #ifndef WOLFSSL_NOSHA3_224
  15881. if (XSTRCMP(evp_md, "SHA3_224") == 0) {
  15882. type = WC_SHA3_224;
  15883. mdlen = WC_SHA3_224_DIGEST_SIZE;
  15884. } else
  15885. #endif
  15886. #ifndef WOLFSSL_NOSHA3_256
  15887. if (XSTRCMP(evp_md, "SHA3_256") == 0) {
  15888. type = WC_SHA3_256;
  15889. mdlen = WC_SHA3_256_DIGEST_SIZE;
  15890. } else
  15891. #endif
  15892. if (XSTRCMP(evp_md, "SHA3_384") == 0) {
  15893. type = WC_SHA3_384;
  15894. mdlen = WC_SHA3_384_DIGEST_SIZE;
  15895. } else
  15896. #ifndef WOLFSSL_NOSHA3_512
  15897. if (XSTRCMP(evp_md, "SHA3_512") == 0) {
  15898. type = WC_SHA3_512;
  15899. mdlen = WC_SHA3_512_DIGEST_SIZE;
  15900. } else
  15901. #endif
  15902. #endif
  15903. #ifndef NO_SHA
  15904. if (XSTRCMP(evp_md, "SHA") == 0 || XSTRCMP(evp_md, "SHA1") == 0) {
  15905. type = WC_SHA;
  15906. mdlen = WC_SHA_DIGEST_SIZE;
  15907. }
  15908. else
  15909. #endif
  15910. {
  15911. return NULL;
  15912. }
  15913. #ifdef WOLFSSL_SMALL_STACK
  15914. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  15915. if (hmac == NULL)
  15916. return NULL;
  15917. #endif
  15918. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  15919. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  15920. if (wc_HmacUpdate(hmac, d, n) == 0) {
  15921. if (wc_HmacFinal(hmac, md) == 0) {
  15922. if (md_len)
  15923. *md_len = mdlen;
  15924. ret = md;
  15925. }
  15926. }
  15927. }
  15928. wc_HmacFree(hmac);
  15929. }
  15930. #ifdef WOLFSSL_SMALL_STACK
  15931. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  15932. #endif
  15933. (void)evp_md;
  15934. return ret;
  15935. }
  15936. #ifndef NO_DES3
  15937. /* 0 on ok */
  15938. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  15939. WOLFSSL_DES_key_schedule* schedule)
  15940. {
  15941. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  15942. if (key == NULL || schedule == NULL) {
  15943. WOLFSSL_MSG("Null argument passed in");
  15944. }
  15945. else {
  15946. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  15947. }
  15948. return 0;
  15949. }
  15950. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  15951. * return the last 4 bytes of cipher text */
  15952. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  15953. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  15954. WOLFSSL_const_DES_cblock* iv)
  15955. {
  15956. WOLFSSL_DES_LONG ret;
  15957. unsigned char* tmp;
  15958. unsigned char* data = (unsigned char*)in;
  15959. long dataSz = length;
  15960. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  15961. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  15962. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  15963. WOLFSSL_MSG("Bad argument passed in");
  15964. return 0;
  15965. }
  15966. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  15967. if (dataSz % DES_BLOCK_SIZE) {
  15968. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  15969. data = (unsigned char*)XMALLOC(dataSz, NULL,
  15970. DYNAMIC_TYPE_TMP_BUFFER);
  15971. if (data == NULL) {
  15972. WOLFSSL_MSG("Issue creating temporary buffer");
  15973. return 0;
  15974. }
  15975. dynamicFlag = 1; /* set to free buffer at end */
  15976. XMEMCPY(data, in, length);
  15977. XMEMSET(data + length, 0, dataSz - length); /* padding */
  15978. }
  15979. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15980. if (tmp == NULL) {
  15981. WOLFSSL_MSG("Issue creating temporary buffer");
  15982. if (dynamicFlag == 1) {
  15983. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15984. }
  15985. return 0;
  15986. }
  15987. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  15988. (WOLFSSL_DES_cblock*)iv, 1);
  15989. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  15990. DES_BLOCK_SIZE);
  15991. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  15992. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  15993. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  15994. (*((unsigned char*)out + 7) & 0xFF));
  15995. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15996. if (dynamicFlag == 1) {
  15997. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15998. }
  15999. return ret;
  16000. }
  16001. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  16002. unsigned char* output, long length,
  16003. WOLFSSL_DES_key_schedule* schedule,
  16004. WOLFSSL_DES_cblock* ivec, int enc)
  16005. {
  16006. Des myDes;
  16007. byte lastblock[DES_BLOCK_SIZE];
  16008. int lb_sz;
  16009. long blk;
  16010. WOLFSSL_ENTER("DES_cbc_encrypt");
  16011. /* OpenSSL compat, no ret */
  16012. if (wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec,
  16013. !enc) != 0) {
  16014. WOLFSSL_MSG("wc_Des_SetKey return error.");
  16015. return;
  16016. }
  16017. lb_sz = length%DES_BLOCK_SIZE;
  16018. blk = length/DES_BLOCK_SIZE;
  16019. if (enc == DES_ENCRYPT){
  16020. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  16021. if(lb_sz){
  16022. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16023. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  16024. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  16025. lastblock, (word32)DES_BLOCK_SIZE);
  16026. }
  16027. }
  16028. else {
  16029. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  16030. if(lb_sz){
  16031. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  16032. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  16033. }
  16034. }
  16035. }
  16036. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  16037. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  16038. unsigned char* output, long sz,
  16039. WOLFSSL_DES_key_schedule* ks1,
  16040. WOLFSSL_DES_key_schedule* ks2,
  16041. WOLFSSL_DES_key_schedule* ks3,
  16042. WOLFSSL_DES_cblock* ivec, int enc)
  16043. {
  16044. int ret;
  16045. Des3 des;
  16046. byte key[24];/* EDE uses 24 size key */
  16047. byte lastblock[DES_BLOCK_SIZE];
  16048. int lb_sz;
  16049. long blk;
  16050. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  16051. XMEMSET(key, 0, sizeof(key));
  16052. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  16053. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  16054. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  16055. lb_sz = sz%DES_BLOCK_SIZE;
  16056. blk = sz/DES_BLOCK_SIZE;
  16057. /* OpenSSL compat, no ret */
  16058. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  16059. if (enc == DES_ENCRYPT) {
  16060. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  16061. DES_ENCRYPTION) == 0) {
  16062. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  16063. #if defined(WOLFSSL_ASYNC_CRYPT)
  16064. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16065. #endif
  16066. (void)ret; /* ignore return codes for processing */
  16067. if(lb_sz){
  16068. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16069. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  16070. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  16071. lastblock, (word32)DES_BLOCK_SIZE);
  16072. #if defined(WOLFSSL_ASYNC_CRYPT)
  16073. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16074. #endif
  16075. (void)ret; /* ignore return codes for processing */
  16076. }
  16077. }
  16078. }
  16079. else {
  16080. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  16081. DES_DECRYPTION) == 0) {
  16082. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  16083. #if defined(WOLFSSL_ASYNC_CRYPT)
  16084. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16085. #endif
  16086. (void)ret; /* ignore return codes for processing */
  16087. if(lb_sz){
  16088. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  16089. #if defined(WOLFSSL_ASYNC_CRYPT)
  16090. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16091. #endif
  16092. (void)ret; /* ignore return codes for processing */
  16093. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  16094. }
  16095. }
  16096. }
  16097. wc_Des3Free(&des);
  16098. }
  16099. /* correctly sets ivec for next call */
  16100. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  16101. unsigned char* output, long length,
  16102. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  16103. int enc)
  16104. {
  16105. Des myDes;
  16106. byte lastblock[DES_BLOCK_SIZE];
  16107. int lb_sz;
  16108. long idx = length;
  16109. long blk;
  16110. WOLFSSL_ENTER("DES_ncbc_encrypt");
  16111. /* OpenSSL compat, no ret */
  16112. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  16113. (const byte*)ivec, !enc) != 0) {
  16114. WOLFSSL_MSG("wc_Des_SetKey return error.");
  16115. return;
  16116. }
  16117. lb_sz = length%DES_BLOCK_SIZE;
  16118. blk = length/DES_BLOCK_SIZE;
  16119. idx -= sizeof(DES_cblock);
  16120. if (lb_sz) {
  16121. idx += DES_BLOCK_SIZE - lb_sz;
  16122. }
  16123. if (enc == DES_ENCRYPT){
  16124. wc_Des_CbcEncrypt(&myDes, output, input,
  16125. (word32)blk * DES_BLOCK_SIZE);
  16126. if (lb_sz){
  16127. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16128. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  16129. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  16130. lastblock, (word32)DES_BLOCK_SIZE);
  16131. }
  16132. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  16133. } else {
  16134. WOLFSSL_DES_cblock tmp;
  16135. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  16136. wc_Des_CbcDecrypt(&myDes, output, input,
  16137. (word32)blk * DES_BLOCK_SIZE);
  16138. if (lb_sz){
  16139. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  16140. (word32)DES_BLOCK_SIZE);
  16141. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  16142. }
  16143. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  16144. }
  16145. }
  16146. #endif /* NO_DES3 */
  16147. void wolfSSL_ERR_free_strings(void)
  16148. {
  16149. /* handled internally */
  16150. }
  16151. void wolfSSL_cleanup_all_ex_data(void)
  16152. {
  16153. /* nothing to do here */
  16154. }
  16155. #endif /* OPENSSL_EXTRA */
  16156. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  16157. void wolfSSL_ERR_clear_error(void)
  16158. {
  16159. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  16160. wc_ClearErrorNodes();
  16161. }
  16162. #endif
  16163. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16164. int wolfSSL_clear(WOLFSSL* ssl)
  16165. {
  16166. WOLFSSL_ENTER("wolfSSL_clear");
  16167. if (ssl == NULL) {
  16168. return WOLFSSL_FAILURE;
  16169. }
  16170. if (!ssl->options.handShakeDone) {
  16171. /* Only reset the session if we didn't complete a handshake */
  16172. wolfSSL_SESSION_free(ssl->session);
  16173. ssl->session = wolfSSL_NewSession(ssl->heap);
  16174. if (ssl->session == NULL) {
  16175. return WOLFSSL_FAILURE;
  16176. }
  16177. }
  16178. /* reset option bits */
  16179. ssl->options.isClosed = 0;
  16180. ssl->options.connReset = 0;
  16181. ssl->options.sentNotify = 0;
  16182. ssl->options.closeNotify = 0;
  16183. ssl->options.sendVerify = 0;
  16184. ssl->options.serverState = NULL_STATE;
  16185. ssl->options.clientState = NULL_STATE;
  16186. ssl->options.connectState = CONNECT_BEGIN;
  16187. ssl->options.acceptState = ACCEPT_BEGIN;
  16188. ssl->options.handShakeState = NULL_STATE;
  16189. ssl->options.handShakeDone = 0;
  16190. ssl->options.processReply = 0; /* doProcessInit */
  16191. ssl->options.havePeerVerify = 0;
  16192. ssl->options.havePeerCert = 0;
  16193. ssl->options.peerAuthGood = 0;
  16194. ssl->options.tls1_3 = 0;
  16195. ssl->options.haveSessionId = 0;
  16196. ssl->options.tls = 0;
  16197. ssl->options.tls1_1 = 0;
  16198. ssl->options.noPskDheKe = 0;
  16199. #ifdef HAVE_SESSION_TICKET
  16200. #ifdef WOLFSSL_TLS13
  16201. ssl->options.ticketsSent = 0;
  16202. #endif
  16203. ssl->options.rejectTicket = 0;
  16204. #endif
  16205. #ifdef WOLFSSL_EARLY_DATA
  16206. ssl->earlyData = no_early_data;
  16207. ssl->earlyDataSz = 0;
  16208. #endif
  16209. #if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS)
  16210. TLSX_FreeAll(ssl->extensions, ssl->heap);
  16211. ssl->extensions = NULL;
  16212. #endif
  16213. ssl->keys.encryptionOn = 0;
  16214. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  16215. if (InitSSL_Suites(ssl) != WOLFSSL_SUCCESS)
  16216. return WOLFSSL_FAILURE;
  16217. if (InitHandshakeHashes(ssl) != 0)
  16218. return WOLFSSL_FAILURE;
  16219. #ifdef KEEP_PEER_CERT
  16220. FreeX509(&ssl->peerCert);
  16221. InitX509(&ssl->peerCert, 0, ssl->heap);
  16222. #endif
  16223. #ifdef WOLFSSL_QUIC
  16224. wolfSSL_quic_clear(ssl);
  16225. #endif
  16226. return WOLFSSL_SUCCESS;
  16227. }
  16228. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16229. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  16230. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  16231. {
  16232. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  16233. WOLFSSL_ENTER("SSL_CTX_set_mode");
  16234. switch(mode) {
  16235. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  16236. ctx->partialWrite = 1;
  16237. break;
  16238. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16239. case SSL_MODE_RELEASE_BUFFERS:
  16240. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  16241. break;
  16242. #endif
  16243. case SSL_MODE_AUTO_RETRY:
  16244. ctx->autoRetry = 1;
  16245. break;
  16246. default:
  16247. WOLFSSL_MSG("Mode Not Implemented");
  16248. }
  16249. /* SSL_MODE_AUTO_RETRY
  16250. * Should not return -1 with renegotiation on read/write */
  16251. return mode;
  16252. }
  16253. long wolfSSL_CTX_clear_mode(WOLFSSL_CTX* ctx, long mode)
  16254. {
  16255. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  16256. WOLFSSL_ENTER("SSL_CTX_set_mode");
  16257. switch(mode) {
  16258. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  16259. ctx->partialWrite = 0;
  16260. break;
  16261. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16262. case SSL_MODE_RELEASE_BUFFERS:
  16263. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  16264. break;
  16265. #endif
  16266. case SSL_MODE_AUTO_RETRY:
  16267. ctx->autoRetry = 0;
  16268. break;
  16269. default:
  16270. WOLFSSL_MSG("Mode Not Implemented");
  16271. }
  16272. /* SSL_MODE_AUTO_RETRY
  16273. * Should not return -1 with renegotiation on read/write */
  16274. return 0;
  16275. }
  16276. #endif
  16277. #ifdef OPENSSL_EXTRA
  16278. #ifndef NO_WOLFSSL_STUB
  16279. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  16280. {
  16281. /* TODO: */
  16282. (void)ssl;
  16283. WOLFSSL_STUB("SSL_get_mode");
  16284. return 0;
  16285. }
  16286. #endif
  16287. #ifndef NO_WOLFSSL_STUB
  16288. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  16289. {
  16290. /* TODO: */
  16291. (void)ctx;
  16292. WOLFSSL_STUB("SSL_CTX_get_mode");
  16293. return 0;
  16294. }
  16295. #endif
  16296. #ifndef NO_WOLFSSL_STUB
  16297. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  16298. {
  16299. /* TODO: maybe? */
  16300. (void)ctx;
  16301. (void)m;
  16302. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  16303. }
  16304. #endif
  16305. /* Storing app session context id, this value is inherited by WOLFSSL
  16306. * objects created from WOLFSSL_CTX. Any session that is imported with a
  16307. * different session context id will be rejected.
  16308. *
  16309. * ctx structure to set context in
  16310. * sid_ctx value of context to set
  16311. * sid_ctx_len length of sid_ctx buffer
  16312. *
  16313. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  16314. */
  16315. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  16316. const unsigned char* sid_ctx,
  16317. unsigned int sid_ctx_len)
  16318. {
  16319. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  16320. /* No application specific context needed for wolfSSL */
  16321. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  16322. return SSL_FAILURE;
  16323. }
  16324. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  16325. ctx->sessionCtxSz = (byte)sid_ctx_len;
  16326. return WOLFSSL_SUCCESS;
  16327. }
  16328. /* Storing app session context id. Any session that is imported with a
  16329. * different session context id will be rejected.
  16330. *
  16331. * ssl structure to set context in
  16332. * id value of context to set
  16333. * len length of sid_ctx buffer
  16334. *
  16335. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  16336. */
  16337. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  16338. unsigned int len)
  16339. {
  16340. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  16341. if (len > ID_LEN || ssl == NULL || id == NULL) {
  16342. return SSL_FAILURE;
  16343. }
  16344. XMEMCPY(ssl->sessionCtx, id, len);
  16345. ssl->sessionCtxSz = (byte)len;
  16346. return WOLFSSL_SUCCESS;
  16347. }
  16348. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  16349. {
  16350. (void)ctx;
  16351. #ifndef NO_SESSION_CACHE
  16352. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  16353. #else
  16354. return 0;
  16355. #endif
  16356. }
  16357. /* returns the unsigned error value and increments the pointer into the
  16358. * error queue.
  16359. *
  16360. * file pointer to file name
  16361. * line gets set to line number of error when not NULL
  16362. */
  16363. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  16364. {
  16365. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  16366. int ret = wc_PullErrorNode(file, NULL, line);
  16367. if (ret < 0) {
  16368. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  16369. WOLFSSL_MSG("Issue getting error node");
  16370. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  16371. ret = 0 - ret; /* return absolute value of error */
  16372. /* panic and try to clear out nodes */
  16373. wc_ClearErrorNodes();
  16374. }
  16375. return (unsigned long)ret;
  16376. #else
  16377. (void)file;
  16378. (void)line;
  16379. return 0;
  16380. #endif
  16381. }
  16382. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  16383. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  16384. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  16385. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  16386. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  16387. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  16388. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  16389. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  16390. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  16391. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  16392. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  16393. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  16394. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  16395. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  16396. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  16397. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  16398. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  16399. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  16400. /* switch with int mapped to function name for compatibility */
  16401. static const char* wolfSSL_ERR_sys_func(int fun)
  16402. {
  16403. switch (fun) {
  16404. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  16405. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  16406. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  16407. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  16408. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  16409. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  16410. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  16411. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  16412. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  16413. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  16414. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  16415. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  16416. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  16417. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  16418. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  16419. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  16420. default:
  16421. return "NULL";
  16422. }
  16423. }
  16424. #endif /* DEBUG_WOLFSSL */
  16425. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  16426. int line)
  16427. {
  16428. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  16429. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  16430. (void)fun;
  16431. (void)err;
  16432. (void)file;
  16433. (void)line;
  16434. WOLFSSL_MSG("Not compiled in debug mode");
  16435. #elif defined(OPENSSL_EXTRA) && \
  16436. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  16437. (void)fun;
  16438. (void)file;
  16439. (void)line;
  16440. WOLFSSL_ERROR(err);
  16441. #else
  16442. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  16443. file, NULL);
  16444. #endif
  16445. (void)lib;
  16446. }
  16447. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  16448. * more flexibility.
  16449. *
  16450. * file output pointer to file where error happened
  16451. * line output to line number of error
  16452. * data output data. Is a string if ERR_TXT_STRING flag is used
  16453. * flags output format of output
  16454. *
  16455. * Returns the error value or 0 if no errors are in the queue
  16456. */
  16457. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  16458. const char** data, int *flags)
  16459. {
  16460. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  16461. int ret;
  16462. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  16463. if (flags != NULL)
  16464. *flags = ERR_TXT_STRING; /* Clear the flags */
  16465. ret = wc_PullErrorNode(file, data, line);
  16466. if (ret < 0) {
  16467. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  16468. WOLFSSL_MSG("Error with pulling error node!");
  16469. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  16470. ret = 0 - ret; /* return absolute value of error */
  16471. /* panic and try to clear out nodes */
  16472. wc_ClearErrorNodes();
  16473. }
  16474. return (unsigned long)ret;
  16475. #else
  16476. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  16477. WOLFSSL_MSG("Error queue turned off, can not get error line");
  16478. (void)file;
  16479. (void)line;
  16480. (void)data;
  16481. (void)flags;
  16482. return 0;
  16483. #endif
  16484. }
  16485. #endif /* OPENSSL_EXTRA */
  16486. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  16487. (defined(OPENSSL_EXTRA) && defined(SESSION_CERTS))
  16488. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  16489. *
  16490. * x509 WOLFSSL_X509 object to decode into.
  16491. * in X509 DER data.
  16492. * len Length of the X509 DER data.
  16493. * returns the new certificate on success, otherwise NULL.
  16494. */
  16495. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  16496. {
  16497. int ret;
  16498. #ifdef WOLFSSL_SMALL_STACK
  16499. DecodedCert* cert;
  16500. #else
  16501. DecodedCert cert[1];
  16502. #endif
  16503. if (x509 == NULL || in == NULL || len <= 0)
  16504. return BAD_FUNC_ARG;
  16505. #ifdef WOLFSSL_SMALL_STACK
  16506. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  16507. DYNAMIC_TYPE_DCERT);
  16508. if (cert == NULL)
  16509. return MEMORY_E;
  16510. #endif
  16511. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  16512. */
  16513. InitDecodedCert(cert, (byte*)in, len, NULL);
  16514. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  16515. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  16516. if (x509->dynamicMemory != TRUE)
  16517. InitX509(x509, 0, NULL);
  16518. ret = CopyDecodedToX509(x509, cert);
  16519. FreeDecodedCert(cert);
  16520. }
  16521. #ifdef WOLFSSL_SMALL_STACK
  16522. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  16523. #endif
  16524. return ret;
  16525. }
  16526. #endif /* (KEEP_PEER_CERT & SESSION_CERTS) || (OPENSSL_EXTRA & SESSION_CERTS) */
  16527. #ifdef KEEP_PEER_CERT
  16528. WOLFSSL_ABI
  16529. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  16530. {
  16531. WOLFSSL_X509* ret = NULL;
  16532. WOLFSSL_ENTER("SSL_get_peer_certificate");
  16533. if (ssl != NULL) {
  16534. if (ssl->peerCert.issuer.sz)
  16535. ret = wolfSSL_X509_dup(&ssl->peerCert);
  16536. #ifdef SESSION_CERTS
  16537. else if (ssl->session->chain.count > 0) {
  16538. if (DecodeToX509(&ssl->peerCert, ssl->session->chain.certs[0].buffer,
  16539. ssl->session->chain.certs[0].length) == 0) {
  16540. ret = wolfSSL_X509_dup(&ssl->peerCert);
  16541. }
  16542. }
  16543. #endif
  16544. }
  16545. WOLFSSL_LEAVE("SSL_get_peer_certificate", ret != NULL);
  16546. return ret;
  16547. }
  16548. #endif /* KEEP_PEER_CERT */
  16549. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16550. /* Return stack of peer certs.
  16551. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  16552. */
  16553. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  16554. {
  16555. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  16556. if (ssl == NULL)
  16557. return NULL;
  16558. /* Try to populate if NULL or empty */
  16559. if (ssl->peerCertChain == NULL ||
  16560. wolfSSL_sk_X509_num(ssl->peerCertChain) == 0)
  16561. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  16562. return ssl->peerCertChain;
  16563. }
  16564. #ifndef WOLFSSL_QT
  16565. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  16566. WOLFSSL_X509 *x);
  16567. /**
  16568. * Recursively push the issuer CA chain onto the stack
  16569. * @param cm The cert manager that is queried for the issuer
  16570. * @param x This cert's issuer will be queried in cm
  16571. * @param sk The issuer is pushed onto this stack
  16572. * @return WOLFSSL_SUCCESS on success
  16573. * WOLFSSL_FAILURE on no issuer found
  16574. * WOLFSSL_FATAL_ERROR on a fatal error
  16575. */
  16576. static int PushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  16577. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  16578. {
  16579. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  16580. int i;
  16581. int push = 1;
  16582. int ret = WOLFSSL_SUCCESS;
  16583. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  16584. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  16585. != WOLFSSL_SUCCESS)
  16586. break;
  16587. x = issuer[i];
  16588. }
  16589. if (i == 0) /* No further chain found */
  16590. return WOLFSSL_FAILURE;
  16591. i--;
  16592. for (; i >= 0; i--) {
  16593. if (push) {
  16594. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  16595. wolfSSL_X509_free(issuer[i]);
  16596. ret = WOLFSSL_FATAL_ERROR;
  16597. push = 0; /* Free the rest of the unpushed certs */
  16598. }
  16599. }
  16600. else {
  16601. wolfSSL_X509_free(issuer[i]);
  16602. }
  16603. }
  16604. return ret;
  16605. }
  16606. #endif /* !WOLFSSL_QT */
  16607. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  16608. based off of the ssl session chain. Attempts to place CA certificates
  16609. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  16610. NULL on failure */
  16611. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  16612. {
  16613. WOLFSSL_STACK* sk;
  16614. WOLFSSL_X509* x509;
  16615. int i = 0;
  16616. int ret;
  16617. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  16618. if ((ssl == NULL) || (ssl->session->chain.count == 0))
  16619. return NULL;
  16620. sk = wolfSSL_sk_X509_new_null();
  16621. i = ssl->session->chain.count-1;
  16622. for (; i >= 0; i--) {
  16623. x509 = wolfSSL_X509_new();
  16624. if (x509 == NULL) {
  16625. WOLFSSL_MSG("Error Creating X509");
  16626. wolfSSL_sk_X509_pop_free(sk, NULL);
  16627. return NULL;
  16628. }
  16629. ret = DecodeToX509(x509, ssl->session->chain.certs[i].buffer,
  16630. ssl->session->chain.certs[i].length);
  16631. #if !defined(WOLFSSL_QT)
  16632. if (ret == 0 && i == ssl->session->chain.count-1) {
  16633. /* On the last element in the chain try to add the CA chain
  16634. * first if we have one for this cert */
  16635. if (PushCAx509Chain(SSL_CM(ssl), x509, sk)
  16636. == WOLFSSL_FATAL_ERROR) {
  16637. ret = WOLFSSL_FATAL_ERROR;
  16638. }
  16639. }
  16640. #endif
  16641. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  16642. WOLFSSL_MSG("Error decoding cert");
  16643. wolfSSL_X509_free(x509);
  16644. wolfSSL_sk_X509_pop_free(sk, NULL);
  16645. return NULL;
  16646. }
  16647. }
  16648. if (sk == NULL) {
  16649. WOLFSSL_MSG("Null session chain");
  16650. }
  16651. #if defined(OPENSSL_ALL)
  16652. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  16653. /* to be compliant with openssl
  16654. first element is kept as peer cert on server side.*/
  16655. wolfSSL_sk_X509_pop(sk);
  16656. }
  16657. #endif
  16658. if (ssl->peerCertChain != NULL)
  16659. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  16660. /* This is Free'd when ssl is Free'd */
  16661. ssl->peerCertChain = sk;
  16662. return sk;
  16663. }
  16664. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  16665. #ifndef NO_CERTS
  16666. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16667. /* create a generic wolfSSL stack node
  16668. * returns a new WOLFSSL_STACK structure on success */
  16669. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16670. {
  16671. WOLFSSL_STACK* sk;
  16672. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16673. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16674. DYNAMIC_TYPE_OPENSSL);
  16675. if (sk != NULL) {
  16676. XMEMSET(sk, 0, sizeof(*sk));
  16677. sk->heap = heap;
  16678. }
  16679. return sk;
  16680. }
  16681. /* free's node but does not free internal data such as in->data.x509 */
  16682. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16683. {
  16684. if (in != NULL) {
  16685. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16686. }
  16687. }
  16688. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16689. * also handles internal "num" for number of nodes on stack
  16690. * return WOLFSSL_SUCCESS on success
  16691. */
  16692. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16693. {
  16694. if (stack == NULL || in == NULL) {
  16695. return WOLFSSL_FAILURE;
  16696. }
  16697. if (*stack == NULL) {
  16698. in->num = 1;
  16699. *stack = in;
  16700. return WOLFSSL_SUCCESS;
  16701. }
  16702. in->num = (*stack)->num + 1;
  16703. in->next = *stack;
  16704. *stack = in;
  16705. return WOLFSSL_SUCCESS;
  16706. }
  16707. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16708. static WC_INLINE int compare_WOLFSSL_CIPHER(
  16709. WOLFSSL_CIPHER *a,
  16710. WOLFSSL_CIPHER *b)
  16711. {
  16712. if ((a->cipherSuite0 == b->cipherSuite0) &&
  16713. (a->cipherSuite == b->cipherSuite) &&
  16714. (a->ssl == b->ssl) &&
  16715. (XMEMCMP(a->description, b->description, sizeof a->description) == 0) &&
  16716. (a->offset == b->offset) &&
  16717. (a->in_stack == b->in_stack) &&
  16718. (a->bits == b->bits))
  16719. return 0;
  16720. else
  16721. return -1;
  16722. }
  16723. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16724. /* return 1 on success 0 on fail */
  16725. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16726. {
  16727. WOLFSSL_STACK* node;
  16728. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16729. WOLFSSL_CIPHER ciph;
  16730. #endif
  16731. WOLFSSL_ENTER("wolfSSL_sk_push");
  16732. if (!sk) {
  16733. return WOLFSSL_FAILURE;
  16734. }
  16735. /* Check if empty data */
  16736. switch (sk->type) {
  16737. case STACK_TYPE_CIPHER:
  16738. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16739. /* check if entire struct is zero */
  16740. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16741. if (compare_WOLFSSL_CIPHER(&sk->data.cipher, &ciph) == 0) {
  16742. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16743. sk->num = 1;
  16744. if (sk->hash_fn) {
  16745. sk->hash = sk->hash_fn(&sk->data.cipher);
  16746. }
  16747. return WOLFSSL_SUCCESS;
  16748. }
  16749. break;
  16750. #endif
  16751. case STACK_TYPE_X509:
  16752. case STACK_TYPE_GEN_NAME:
  16753. case STACK_TYPE_BIO:
  16754. case STACK_TYPE_OBJ:
  16755. case STACK_TYPE_STRING:
  16756. case STACK_TYPE_ACCESS_DESCRIPTION:
  16757. case STACK_TYPE_X509_EXT:
  16758. case STACK_TYPE_X509_REQ_ATTR:
  16759. case STACK_TYPE_NULL:
  16760. case STACK_TYPE_X509_NAME:
  16761. case STACK_TYPE_X509_NAME_ENTRY:
  16762. case STACK_TYPE_CONF_VALUE:
  16763. case STACK_TYPE_X509_INFO:
  16764. case STACK_TYPE_BY_DIR_entry:
  16765. case STACK_TYPE_BY_DIR_hash:
  16766. case STACK_TYPE_X509_OBJ:
  16767. case STACK_TYPE_DIST_POINT:
  16768. case STACK_TYPE_X509_CRL:
  16769. default:
  16770. /* All other types are pointers */
  16771. if (!sk->data.generic) {
  16772. sk->data.generic = (void*)data;
  16773. sk->num = 1;
  16774. #ifdef OPENSSL_ALL
  16775. if (sk->hash_fn) {
  16776. sk->hash = sk->hash_fn(sk->data.generic);
  16777. }
  16778. #endif
  16779. return WOLFSSL_SUCCESS;
  16780. }
  16781. break;
  16782. }
  16783. /* stack already has value(s) create a new node and add more */
  16784. node = wolfSSL_sk_new_node(sk->heap);
  16785. if (!node) {
  16786. WOLFSSL_MSG("Memory error");
  16787. return WOLFSSL_FAILURE;
  16788. }
  16789. /* push new x509 onto head of stack */
  16790. node->next = sk->next;
  16791. node->type = sk->type;
  16792. sk->next = node;
  16793. sk->num += 1;
  16794. #ifdef OPENSSL_ALL
  16795. node->hash_fn = sk->hash_fn;
  16796. node->hash = sk->hash;
  16797. sk->hash = 0;
  16798. #endif
  16799. switch (sk->type) {
  16800. case STACK_TYPE_CIPHER:
  16801. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16802. node->data.cipher = sk->data.cipher;
  16803. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16804. if (sk->hash_fn) {
  16805. sk->hash = sk->hash_fn(&sk->data.cipher);
  16806. }
  16807. break;
  16808. #endif
  16809. case STACK_TYPE_X509:
  16810. case STACK_TYPE_GEN_NAME:
  16811. case STACK_TYPE_BIO:
  16812. case STACK_TYPE_OBJ:
  16813. case STACK_TYPE_STRING:
  16814. case STACK_TYPE_ACCESS_DESCRIPTION:
  16815. case STACK_TYPE_X509_EXT:
  16816. case STACK_TYPE_X509_REQ_ATTR:
  16817. case STACK_TYPE_NULL:
  16818. case STACK_TYPE_X509_NAME:
  16819. case STACK_TYPE_X509_NAME_ENTRY:
  16820. case STACK_TYPE_CONF_VALUE:
  16821. case STACK_TYPE_X509_INFO:
  16822. case STACK_TYPE_BY_DIR_entry:
  16823. case STACK_TYPE_BY_DIR_hash:
  16824. case STACK_TYPE_X509_OBJ:
  16825. case STACK_TYPE_DIST_POINT:
  16826. case STACK_TYPE_X509_CRL:
  16827. default:
  16828. /* All other types are pointers */
  16829. node->data.generic = sk->data.generic;
  16830. sk->data.generic = (void*)data;
  16831. #ifdef OPENSSL_ALL
  16832. if (sk->hash_fn) {
  16833. sk->hash = sk->hash_fn(sk->data.generic);
  16834. }
  16835. #endif
  16836. break;
  16837. }
  16838. return WOLFSSL_SUCCESS;
  16839. }
  16840. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16841. #ifdef OPENSSL_EXTRA
  16842. /* returns the node at index "idx", NULL if not found */
  16843. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16844. {
  16845. int i;
  16846. WOLFSSL_STACK* ret = NULL;
  16847. WOLFSSL_STACK* current;
  16848. current = sk;
  16849. for (i = 0; i <= idx && current != NULL; i++) {
  16850. if (i == idx) {
  16851. ret = current;
  16852. break;
  16853. }
  16854. current = current->next;
  16855. }
  16856. return ret;
  16857. }
  16858. #endif /* OPENSSL_EXTRA */
  16859. #ifdef OPENSSL_EXTRA
  16860. #if defined(OPENSSL_ALL)
  16861. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16862. {
  16863. unsigned long hash;
  16864. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16865. if (!sk || !data) {
  16866. WOLFSSL_MSG("Bad parameters");
  16867. return NULL;
  16868. }
  16869. if (!sk->hash_fn) {
  16870. WOLFSSL_MSG("No hash function defined");
  16871. return NULL;
  16872. }
  16873. hash = sk->hash_fn(data);
  16874. while (sk) {
  16875. /* Calc hash if not done so yet */
  16876. if (!sk->hash) {
  16877. switch (sk->type) {
  16878. case STACK_TYPE_CIPHER:
  16879. sk->hash = sk->hash_fn(&sk->data.cipher);
  16880. break;
  16881. case STACK_TYPE_X509:
  16882. case STACK_TYPE_GEN_NAME:
  16883. case STACK_TYPE_BIO:
  16884. case STACK_TYPE_OBJ:
  16885. case STACK_TYPE_STRING:
  16886. case STACK_TYPE_ACCESS_DESCRIPTION:
  16887. case STACK_TYPE_X509_EXT:
  16888. case STACK_TYPE_X509_REQ_ATTR:
  16889. case STACK_TYPE_NULL:
  16890. case STACK_TYPE_X509_NAME:
  16891. case STACK_TYPE_X509_NAME_ENTRY:
  16892. case STACK_TYPE_CONF_VALUE:
  16893. case STACK_TYPE_X509_INFO:
  16894. case STACK_TYPE_BY_DIR_entry:
  16895. case STACK_TYPE_BY_DIR_hash:
  16896. case STACK_TYPE_X509_OBJ:
  16897. case STACK_TYPE_DIST_POINT:
  16898. case STACK_TYPE_X509_CRL:
  16899. default:
  16900. sk->hash = sk->hash_fn(sk->data.generic);
  16901. break;
  16902. }
  16903. }
  16904. if (sk->hash == hash) {
  16905. switch (sk->type) {
  16906. case STACK_TYPE_CIPHER:
  16907. return &sk->data.cipher;
  16908. case STACK_TYPE_X509:
  16909. case STACK_TYPE_GEN_NAME:
  16910. case STACK_TYPE_BIO:
  16911. case STACK_TYPE_OBJ:
  16912. case STACK_TYPE_STRING:
  16913. case STACK_TYPE_ACCESS_DESCRIPTION:
  16914. case STACK_TYPE_X509_EXT:
  16915. case STACK_TYPE_X509_REQ_ATTR:
  16916. case STACK_TYPE_NULL:
  16917. case STACK_TYPE_X509_NAME:
  16918. case STACK_TYPE_X509_NAME_ENTRY:
  16919. case STACK_TYPE_CONF_VALUE:
  16920. case STACK_TYPE_X509_INFO:
  16921. case STACK_TYPE_BY_DIR_entry:
  16922. case STACK_TYPE_BY_DIR_hash:
  16923. case STACK_TYPE_X509_OBJ:
  16924. case STACK_TYPE_DIST_POINT:
  16925. case STACK_TYPE_X509_CRL:
  16926. default:
  16927. return sk->data.generic;
  16928. }
  16929. }
  16930. sk = sk->next;
  16931. }
  16932. return NULL;
  16933. }
  16934. #endif /* OPENSSL_ALL */
  16935. #endif /* OPENSSL_EXTRA */
  16936. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  16937. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  16938. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  16939. defined(KEEP_OUR_CERT)
  16940. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  16941. {
  16942. if (ssl == NULL) {
  16943. return NULL;
  16944. }
  16945. if (ssl->buffers.weOwnCert) {
  16946. if (ssl->ourCert == NULL) {
  16947. if (ssl->buffers.certificate == NULL) {
  16948. WOLFSSL_MSG("Certificate buffer not set!");
  16949. return NULL;
  16950. }
  16951. #ifndef WOLFSSL_X509_STORE_CERTS
  16952. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  16953. ssl->buffers.certificate->buffer,
  16954. ssl->buffers.certificate->length);
  16955. #endif
  16956. }
  16957. return ssl->ourCert;
  16958. }
  16959. else { /* if cert not owned get parent ctx cert or return null */
  16960. if (ssl->ctx) {
  16961. if (ssl->ctx->ourCert == NULL) {
  16962. if (ssl->ctx->certificate == NULL) {
  16963. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16964. return NULL;
  16965. }
  16966. #ifndef WOLFSSL_X509_STORE_CERTS
  16967. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16968. ssl->ctx->certificate->buffer,
  16969. ssl->ctx->certificate->length);
  16970. #endif
  16971. ssl->ctx->ownOurCert = 1;
  16972. }
  16973. return ssl->ctx->ourCert;
  16974. }
  16975. }
  16976. return NULL;
  16977. }
  16978. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  16979. {
  16980. if (ctx) {
  16981. if (ctx->ourCert == NULL) {
  16982. if (ctx->certificate == NULL) {
  16983. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16984. return NULL;
  16985. }
  16986. #ifndef WOLFSSL_X509_STORE_CERTS
  16987. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16988. ctx->certificate->buffer,
  16989. ctx->certificate->length);
  16990. #endif
  16991. ctx->ownOurCert = 1;
  16992. }
  16993. return ctx->ourCert;
  16994. }
  16995. return NULL;
  16996. }
  16997. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  16998. #endif /* NO_CERTS */
  16999. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  17000. defined(OPENSSL_EXTRA_X509_SMALL))
  17001. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  17002. {
  17003. if (obj == NULL) {
  17004. return;
  17005. }
  17006. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  17007. #ifdef WOLFSSL_DEBUG_OPENSSL
  17008. WOLFSSL_MSG("Freeing ASN1 data");
  17009. #endif
  17010. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  17011. obj->obj = NULL;
  17012. }
  17013. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17014. if (obj->pathlen != NULL) {
  17015. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  17016. obj->pathlen = NULL;
  17017. }
  17018. #endif
  17019. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  17020. #ifdef WOLFSSL_DEBUG_OPENSSL
  17021. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  17022. #endif
  17023. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  17024. }
  17025. }
  17026. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  17027. {
  17028. WOLFSSL_ASN1_OBJECT* obj;
  17029. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  17030. DYNAMIC_TYPE_ASN1);
  17031. if (obj == NULL) {
  17032. return NULL;
  17033. }
  17034. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  17035. obj->d.ia5 = &(obj->d.ia5_internal);
  17036. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17037. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  17038. #endif
  17039. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  17040. return obj;
  17041. }
  17042. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  17043. {
  17044. WOLFSSL_ASN1_OBJECT* dupl = NULL;
  17045. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  17046. if (!obj) {
  17047. WOLFSSL_MSG("Bad parameter");
  17048. return NULL;
  17049. }
  17050. dupl = wolfSSL_ASN1_OBJECT_new();
  17051. if (!dupl) {
  17052. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  17053. return NULL;
  17054. }
  17055. /* Copy data */
  17056. XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
  17057. dupl->type = obj->type;
  17058. dupl->grp = obj->grp;
  17059. dupl->nid = obj->nid;
  17060. dupl->objSz = obj->objSz;
  17061. if (obj->obj) {
  17062. dupl->obj = (const unsigned char*)XMALLOC(
  17063. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  17064. if (!dupl->obj) {
  17065. WOLFSSL_MSG("ASN1 obj malloc error");
  17066. wolfSSL_ASN1_OBJECT_free(dupl);
  17067. return NULL;
  17068. }
  17069. XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
  17070. dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  17071. }
  17072. return dupl;
  17073. }
  17074. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  17075. #ifndef NO_ASN
  17076. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17077. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17078. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  17079. {
  17080. WOLFSSL_STACK* sk;
  17081. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  17082. sk = wolfSSL_sk_new_null();
  17083. if (sk == NULL)
  17084. return NULL;
  17085. sk->type = STACK_TYPE_OBJ;
  17086. return sk;
  17087. }
  17088. /* return 1 on success 0 on fail */
  17089. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  17090. WOLFSSL_ASN1_OBJECT* obj)
  17091. {
  17092. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  17093. if (sk == NULL || obj == NULL) {
  17094. return WOLFSSL_FAILURE;
  17095. }
  17096. return wolfSSL_sk_push(sk, obj);
  17097. }
  17098. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  17099. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  17100. {
  17101. WOLFSSL_STACK* node;
  17102. WOLFSSL_ASN1_OBJECT* obj;
  17103. if (sk == NULL) {
  17104. return NULL;
  17105. }
  17106. node = sk->next;
  17107. obj = sk->data.obj;
  17108. if (node != NULL) { /* update sk and remove node from stack */
  17109. sk->data.obj = node->data.obj;
  17110. sk->next = node->next;
  17111. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  17112. }
  17113. else { /* last obj in stack */
  17114. sk->data.obj = NULL;
  17115. }
  17116. if (sk->num > 0) {
  17117. sk->num -= 1;
  17118. }
  17119. return obj;
  17120. }
  17121. /* Free the structure for ASN1_OBJECT stack
  17122. *
  17123. * sk stack to free nodes in
  17124. */
  17125. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  17126. {
  17127. wolfSSL_sk_free(sk);
  17128. }
  17129. /* Free's all nodes in ASN1_OBJECT stack.
  17130. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  17131. * choosing the function to use when freeing an ASN1_OBJECT stack.
  17132. *
  17133. * sk stack to free nodes in
  17134. * f X509 free function
  17135. */
  17136. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  17137. void (*f) (WOLFSSL_ASN1_OBJECT*))
  17138. {
  17139. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  17140. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  17141. }
  17142. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17143. #endif /* !NO_ASN */
  17144. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  17145. #ifndef NO_ASN
  17146. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  17147. {
  17148. /*
  17149. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  17150. the converted data is allocated in a buffer in *out.
  17151. The length of out is returned or a negative error code.
  17152. The buffer *out should be free using OPENSSL_free().
  17153. */
  17154. unsigned char* buf;
  17155. unsigned char* inPtr;
  17156. int inLen;
  17157. if (!out || !in) {
  17158. return -1;
  17159. }
  17160. inPtr = wolfSSL_ASN1_STRING_data(in);
  17161. inLen = wolfSSL_ASN1_STRING_length(in);
  17162. if (!inPtr || inLen < 0) {
  17163. return -1;
  17164. }
  17165. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  17166. if (!buf) {
  17167. return -1;
  17168. }
  17169. XMEMCPY(buf, inPtr, inLen + 1);
  17170. *out = buf;
  17171. return inLen;
  17172. }
  17173. #endif /* !NO_ASN */
  17174. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  17175. #if defined(OPENSSL_EXTRA)
  17176. #ifndef NO_ASN
  17177. int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
  17178. {
  17179. char *idx;
  17180. char *copy;
  17181. WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
  17182. if (!s) {
  17183. WOLFSSL_MSG("Bad parameter");
  17184. return WOLFSSL_FAILURE;
  17185. }
  17186. if (s->type != V_ASN1_UNIVERSALSTRING) {
  17187. WOLFSSL_MSG("Input is not a universal string");
  17188. return WOLFSSL_FAILURE;
  17189. }
  17190. if ((s->length % 4) != 0) {
  17191. WOLFSSL_MSG("Input string must be divisible by 4");
  17192. return WOLFSSL_FAILURE;
  17193. }
  17194. for (idx = s->data; idx < s->data + s->length; idx += 4)
  17195. if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
  17196. break;
  17197. if (idx != s->data + s->length) {
  17198. WOLFSSL_MSG("Wrong string format");
  17199. return WOLFSSL_FAILURE;
  17200. }
  17201. for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
  17202. *copy++ = idx[3];
  17203. *copy = '\0';
  17204. s->length /= 4;
  17205. s->type = V_ASN1_PRINTABLESTRING;
  17206. return WOLFSSL_SUCCESS;
  17207. }
  17208. /* Returns string representation of ASN1_STRING */
  17209. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  17210. const WOLFSSL_ASN1_STRING *s)
  17211. {
  17212. int i;
  17213. int tmpSz = 100;
  17214. int valSz = 5;
  17215. char* tmp;
  17216. char val[5];
  17217. unsigned char* str;
  17218. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  17219. (void)method;
  17220. if(s == NULL || s->data == NULL) {
  17221. WOLFSSL_MSG("Bad Function Argument");
  17222. return NULL;
  17223. }
  17224. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17225. if (str == NULL) {
  17226. WOLFSSL_MSG("Memory Error");
  17227. return NULL;
  17228. }
  17229. XMEMCPY(str, (unsigned char*)s->data, s->length);
  17230. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17231. if (tmp == NULL) {
  17232. WOLFSSL_MSG("Memory Error");
  17233. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17234. return NULL;
  17235. }
  17236. XMEMSET(tmp, 0, tmpSz);
  17237. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  17238. if (XSNPRINTF(val, valSz, "%02X:", str[i])
  17239. >= valSz)
  17240. {
  17241. WOLFSSL_MSG("Buffer overrun");
  17242. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17243. return NULL;
  17244. }
  17245. XSTRNCAT(tmp, val, valSz);
  17246. }
  17247. if (XSNPRINTF(val, valSz, "%02X", str[i])
  17248. >= valSz)
  17249. {
  17250. WOLFSSL_MSG("Buffer overrun");
  17251. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17252. return NULL;
  17253. }
  17254. XSTRNCAT(tmp, val, valSz);
  17255. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17256. return tmp;
  17257. }
  17258. #endif /* NO_ASN */
  17259. #endif /* OPENSSL_EXTRA */
  17260. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17261. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  17262. {
  17263. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  17264. if (ssl == NULL) {
  17265. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  17266. return;
  17267. }
  17268. #ifndef NO_DH
  17269. /* client creates its own DH parameters on handshake */
  17270. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  17271. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  17272. DYNAMIC_TYPE_PUBLIC_KEY);
  17273. }
  17274. ssl->buffers.serverDH_P.buffer = NULL;
  17275. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  17276. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  17277. DYNAMIC_TYPE_PUBLIC_KEY);
  17278. }
  17279. ssl->buffers.serverDH_G.buffer = NULL;
  17280. #endif
  17281. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  17282. WOLFSSL_MSG("Error initializing client side");
  17283. }
  17284. }
  17285. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17286. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  17287. {
  17288. int isShutdown = 0;
  17289. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  17290. if (ssl) {
  17291. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17292. if (ssl->options.handShakeState == NULL_STATE) {
  17293. /* The SSL object was possibly cleared with wolfSSL_clear after
  17294. * a successful shutdown. Simulate a response for a full
  17295. * bidirectional shutdown. */
  17296. isShutdown = WOLFSSL_SENT_SHUTDOWN | WOLFSSL_RECEIVED_SHUTDOWN;
  17297. }
  17298. else
  17299. #endif
  17300. {
  17301. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  17302. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  17303. if (ssl->options.sentNotify)
  17304. isShutdown |= WOLFSSL_SENT_SHUTDOWN;
  17305. if (ssl->options.closeNotify||ssl->options.connReset)
  17306. isShutdown |= WOLFSSL_RECEIVED_SHUTDOWN;
  17307. }
  17308. }
  17309. return isShutdown;
  17310. }
  17311. int wolfSSL_session_reused(WOLFSSL* ssl)
  17312. {
  17313. int resuming = 0;
  17314. WOLFSSL_ENTER("wolfSSL_session_reused");
  17315. if (ssl)
  17316. resuming = ssl->options.resuming;
  17317. WOLFSSL_LEAVE("wolfSSL_session_reused", resuming);
  17318. return resuming;
  17319. }
  17320. /* return a new malloc'd session with default settings on success */
  17321. WOLFSSL_SESSION* wolfSSL_NewSession(void* heap)
  17322. {
  17323. WOLFSSL_SESSION* ret = NULL;
  17324. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap,
  17325. DYNAMIC_TYPE_SESSION);
  17326. if (ret != NULL) {
  17327. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  17328. #ifndef SINGLE_THREADED
  17329. if (wc_InitMutex(&ret->refMutex) != 0) {
  17330. WOLFSSL_MSG("Error setting up session reference mutex");
  17331. XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION);
  17332. return NULL;
  17333. }
  17334. #endif
  17335. ret->refCount = 1;
  17336. #ifndef NO_SESSION_CACHE
  17337. ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */
  17338. #endif
  17339. ret->type = WOLFSSL_SESSION_TYPE_HEAP;
  17340. ret->heap = heap;
  17341. #ifdef WOLFSSL_CHECK_MEM_ZERO
  17342. wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN);
  17343. wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN);
  17344. #endif
  17345. #ifdef HAVE_SESSION_TICKET
  17346. ret->ticket = ret->staticTicket;
  17347. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17348. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17349. ret->ticketNonce.data = ret->ticketNonce.dataStatic;
  17350. #endif
  17351. #endif
  17352. #ifdef HAVE_STUNNEL
  17353. /* stunnel has this funny mechanism of storing the "is_authenticated"
  17354. * session info in the session ex data. This is basically their
  17355. * default so let's just hard code it. */
  17356. if (wolfSSL_SESSION_set_ex_data(ret, 0, (void *)(-1))
  17357. != WOLFSSL_SUCCESS) {
  17358. WOLFSSL_MSG("Error setting up ex data for stunnel");
  17359. XFREE(ret, NULL, DYNAMIC_TYPE_SESSION);
  17360. return NULL;
  17361. }
  17362. #endif
  17363. #ifdef HAVE_EX_DATA
  17364. ret->ownExData = 1;
  17365. #endif
  17366. }
  17367. return ret;
  17368. }
  17369. WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap)
  17370. {
  17371. return wolfSSL_NewSession(heap);
  17372. }
  17373. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  17374. {
  17375. return wolfSSL_SESSION_new_ex(NULL);
  17376. }
  17377. /* add one to session reference count
  17378. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  17379. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  17380. {
  17381. session = ClientSessionToSession(session);
  17382. if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP)
  17383. return WOLFSSL_FAILURE;
  17384. #ifndef SINGLE_THREADED
  17385. if (wc_LockMutex(&session->refMutex) != 0) {
  17386. WOLFSSL_MSG("Failed to lock session mutex");
  17387. return WOLFSSL_FAILURE;
  17388. }
  17389. #endif
  17390. session->refCount++;
  17391. #ifndef SINGLE_THREADED
  17392. wc_UnLockMutex(&session->refMutex);
  17393. #endif
  17394. return WOLFSSL_SUCCESS;
  17395. }
  17396. /**
  17397. * Deep copy the contents from input to output.
  17398. * @param input The source of the copy.
  17399. * @param output The destination of the copy.
  17400. * @param avoidSysCalls If true, then system calls will be avoided or an error
  17401. * will be returned if it is not possible to proceed
  17402. * without a system call. This is useful for fetching
  17403. * sessions from cache. When a cache row is locked, we
  17404. * don't want to block other threads with long running
  17405. * system calls.
  17406. * @param ticketNonceBuf If not null and @avoidSysCalls is true, the copy of the
  17407. * ticketNonce will happen in this pre allocated buffer
  17408. * @param ticketNonceLen @ticketNonceBuf len as input, used length on output
  17409. * @param ticketNonceUsed if @ticketNonceBuf was used to copy the ticket noncet
  17410. * @return WOLFSSL_SUCCESS on success
  17411. * WOLFSSL_FAILURE on failure
  17412. */
  17413. static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input,
  17414. WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf,
  17415. byte* ticketNonceLen, byte* preallocUsed)
  17416. {
  17417. #ifdef HAVE_SESSION_TICKET
  17418. int ticLenAlloc = 0;
  17419. byte *ticBuff = NULL;
  17420. #endif
  17421. const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + sizeof(input->heap);
  17422. int ret = WOLFSSL_SUCCESS;
  17423. (void)avoidSysCalls;
  17424. (void)ticketNonceBuf;
  17425. (void)ticketNonceLen;
  17426. (void)preallocUsed;
  17427. input = ClientSessionToSession(input);
  17428. output = ClientSessionToSession(output);
  17429. if (input == NULL || output == NULL || input == output) {
  17430. WOLFSSL_MSG("input or output are null or same");
  17431. return WOLFSSL_FAILURE;
  17432. }
  17433. #ifdef HAVE_SESSION_TICKET
  17434. if (output->ticket != output->staticTicket) {
  17435. ticBuff = output->ticket;
  17436. ticLenAlloc = output->ticketLenAlloc;
  17437. }
  17438. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17439. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17440. /* free the data, it would be better to re-use the buffer but this
  17441. * maintain the code simpler. A smart allocator should re-use the free'd
  17442. * buffer in the next malloc without much performance penalties. */
  17443. if (output->ticketNonce.data != output->ticketNonce.dataStatic) {
  17444. /* Callers that avoid syscall should never calls this with
  17445. * output->tickeNonce.data being a dynamic buffer.*/
  17446. if (avoidSysCalls) {
  17447. WOLFSSL_MSG("can't avoid syscalls with dynamic TicketNonce buffer");
  17448. return WOLFSSL_FAILURE;
  17449. }
  17450. XFREE(output->ticketNonce.data,
  17451. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17452. output->ticketNonce.data = output->ticketNonce.dataStatic;
  17453. output->ticketNonce.len = 0;
  17454. }
  17455. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  17456. #endif /* HAVE_SESSION_TICKET */
  17457. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17458. if (output->peer != NULL) {
  17459. if (avoidSysCalls) {
  17460. WOLFSSL_MSG("Can't free cert when avoiding syscalls");
  17461. return WOLFSSL_FAILURE;
  17462. }
  17463. wolfSSL_X509_free(output->peer);
  17464. output->peer = NULL;
  17465. }
  17466. #endif
  17467. XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset,
  17468. sizeof(WOLFSSL_SESSION) - copyOffset);
  17469. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \
  17470. defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17471. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17472. /* fix pointer to static after the copy */
  17473. output->ticketNonce.data = output->ticketNonce.dataStatic;
  17474. #endif
  17475. /* Set sane values for copy */
  17476. #ifndef NO_SESSION_CACHE
  17477. if (output->type != WOLFSSL_SESSION_TYPE_CACHE)
  17478. output->cacheRow = INVALID_SESSION_ROW;
  17479. #endif
  17480. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17481. if (input->peer != NULL && input->peer->dynamicMemory) {
  17482. if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) {
  17483. WOLFSSL_MSG("Can't increase peer cert ref count");
  17484. output->peer = NULL;
  17485. }
  17486. }
  17487. else if (!avoidSysCalls)
  17488. output->peer = wolfSSL_X509_dup(input->peer);
  17489. else
  17490. /* output->peer is not that important to copy */
  17491. output->peer = NULL;
  17492. #endif
  17493. #ifdef HAVE_SESSION_TICKET
  17494. if (input->ticketLen > SESSION_TICKET_LEN) {
  17495. /* Need dynamic buffer */
  17496. if (ticBuff == NULL || ticLenAlloc < input->ticketLen) {
  17497. /* allocate new one */
  17498. byte* tmp;
  17499. if (avoidSysCalls) {
  17500. WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding"
  17501. " syscalls");
  17502. output->ticket = ticBuff;
  17503. output->ticketLenAlloc = (word16) ticLenAlloc;
  17504. output->ticketLen = 0;
  17505. ret = WOLFSSL_FAILURE;
  17506. }
  17507. else {
  17508. tmp = (byte*)XREALLOC(ticBuff, input->ticketLen,
  17509. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17510. if (tmp == NULL) {
  17511. WOLFSSL_MSG("Failed to allocate memory for ticket");
  17512. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17513. output->ticket = NULL;
  17514. output->ticketLen = 0;
  17515. output->ticketLenAlloc = 0;
  17516. ret = WOLFSSL_FAILURE;
  17517. }
  17518. else {
  17519. ticBuff = tmp;
  17520. ticLenAlloc = input->ticketLen;
  17521. }
  17522. }
  17523. }
  17524. if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) {
  17525. XMEMCPY(ticBuff, input->ticket, input->ticketLen);
  17526. output->ticket = ticBuff;
  17527. output->ticketLenAlloc = (word16) ticLenAlloc;
  17528. }
  17529. }
  17530. else {
  17531. /* Default ticket to non dynamic */
  17532. if (avoidSysCalls) {
  17533. /* Try to use ticBuf if available. Caller can later move it to
  17534. * the static buffer. */
  17535. if (ticBuff != NULL) {
  17536. if (ticLenAlloc >= input->ticketLen) {
  17537. output->ticket = output->staticTicket;
  17538. output->ticketLenAlloc = 0;
  17539. }
  17540. else {
  17541. WOLFSSL_MSG("ticket dynamic buffer too small but we are "
  17542. "avoiding system calls");
  17543. ret = WOLFSSL_FAILURE;
  17544. output->ticket = ticBuff;
  17545. output->ticketLenAlloc = (word16) ticLenAlloc;
  17546. output->ticketLen = 0;
  17547. }
  17548. }
  17549. else {
  17550. output->ticket = output->staticTicket;
  17551. output->ticketLenAlloc = 0;
  17552. }
  17553. }
  17554. else {
  17555. if (ticBuff != NULL)
  17556. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17557. output->ticket = output->staticTicket;
  17558. output->ticketLenAlloc = 0;
  17559. }
  17560. if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) {
  17561. /* Shouldn't happen as session should have placed this in
  17562. * the static buffer */
  17563. XMEMCPY(output->ticket, input->ticket,
  17564. input->ticketLen);
  17565. }
  17566. }
  17567. ticBuff = NULL;
  17568. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17569. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17570. if (preallocUsed != NULL)
  17571. *preallocUsed = 0;
  17572. if (input->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ &&
  17573. ret == WOLFSSL_SUCCESS) {
  17574. /* TicketNonce does not fit in the static buffer */
  17575. if (!avoidSysCalls) {
  17576. output->ticketNonce.data = (byte*)XMALLOC(input->ticketNonce.len,
  17577. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  17578. if (output->ticketNonce.data == NULL) {
  17579. WOLFSSL_MSG("Failed to allocate space for ticket nonce");
  17580. output->ticketNonce.data = output->ticketNonce.dataStatic;
  17581. output->ticketNonce.len = 0;
  17582. ret = WOLFSSL_FAILURE;
  17583. }
  17584. else {
  17585. output->ticketNonce.len = input->ticketNonce.len;
  17586. XMEMCPY(output->ticketNonce.data, input->ticketNonce.data,
  17587. input->ticketNonce.len);
  17588. ret = WOLFSSL_SUCCESS;
  17589. }
  17590. }
  17591. /* we can't do syscalls. Use prealloc buffers if provided from the
  17592. * caller. */
  17593. else if (ticketNonceBuf != NULL &&
  17594. *ticketNonceLen >= input->ticketNonce.len) {
  17595. XMEMCPY(ticketNonceBuf, input->ticketNonce.data,
  17596. input->ticketNonce.len);
  17597. *ticketNonceLen = input->ticketNonce.len;
  17598. if (preallocUsed != NULL)
  17599. *preallocUsed = 1;
  17600. ret = WOLFSSL_SUCCESS;
  17601. }
  17602. else {
  17603. WOLFSSL_MSG("TicketNonce bigger than static buffer, and we can't "
  17604. "do syscalls");
  17605. ret = WOLFSSL_FAILURE;
  17606. }
  17607. }
  17608. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  17609. #endif /* HAVE_SESSION_TICKET */
  17610. return ret;
  17611. }
  17612. /**
  17613. * Deep copy the contents from input to output.
  17614. * @param input The source of the copy.
  17615. * @param output The destination of the copy.
  17616. * @param avoidSysCalls If true, then system calls will be avoided or an error
  17617. * will be returned if it is not possible to proceed
  17618. * without a system call. This is useful for fetching
  17619. * sessions from cache. When a cache row is locked, we
  17620. * don't want to block other threads with long running
  17621. * system calls.
  17622. * @return WOLFSSL_SUCCESS on success
  17623. * WOLFSSL_FAILURE on failure
  17624. */
  17625. int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output,
  17626. int avoidSysCalls)
  17627. {
  17628. return wolfSSL_DupSessionEx(input, output, avoidSysCalls, NULL, NULL, NULL);
  17629. }
  17630. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  17631. {
  17632. #ifdef HAVE_EXT_CACHE
  17633. WOLFSSL_SESSION* copy;
  17634. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  17635. session = ClientSessionToSession(session);
  17636. if (session == NULL)
  17637. return NULL;
  17638. #ifdef HAVE_SESSION_TICKET
  17639. if (session->ticketLenAlloc > 0 && !session->ticket) {
  17640. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  17641. return NULL;
  17642. }
  17643. #endif
  17644. copy = wolfSSL_NewSession(session->heap);
  17645. if (copy != NULL &&
  17646. wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) {
  17647. wolfSSL_FreeSession(NULL, copy);
  17648. copy = NULL;
  17649. }
  17650. return copy;
  17651. #else
  17652. WOLFSSL_MSG("wolfSSL_SESSION_dup feature not compiled in");
  17653. (void)session;
  17654. return NULL;
  17655. #endif /* HAVE_EXT_CACHE */
  17656. }
  17657. void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17658. {
  17659. session = ClientSessionToSession(session);
  17660. if (session == NULL)
  17661. return;
  17662. (void)ctx;
  17663. /* refCount will always be 1 or more if created externally.
  17664. * Internal cache sessions don't initialize a refMutex. */
  17665. if (session->refCount > 0) {
  17666. #ifndef SINGLE_THREADED
  17667. if (wc_LockMutex(&session->refMutex) != 0) {
  17668. WOLFSSL_MSG("Failed to lock session mutex");
  17669. return;
  17670. }
  17671. #endif
  17672. if (session->refCount > 1) {
  17673. session->refCount--;
  17674. #ifndef SINGLE_THREADED
  17675. wc_UnLockMutex(&session->refMutex);
  17676. #endif
  17677. return;
  17678. }
  17679. #ifndef SINGLE_THREADED
  17680. wc_UnLockMutex(&session->refMutex);
  17681. wc_FreeMutex(&session->refMutex);
  17682. #endif
  17683. }
  17684. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  17685. if (ctx != NULL && ctx->rem_sess_cb
  17686. #ifdef HAVE_EX_DATA
  17687. && session->ownExData /* This will be true if we are not using the
  17688. * internal cache so it will get called for
  17689. * externally cached sessions as well. */
  17690. #endif
  17691. ) {
  17692. ctx->rem_sess_cb(ctx, session);
  17693. }
  17694. #endif
  17695. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17696. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17697. #endif
  17698. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17699. if (session->peer) {
  17700. wolfSSL_X509_free(session->peer);
  17701. session->peer = NULL;
  17702. }
  17703. #endif
  17704. #ifdef HAVE_SESSION_TICKET
  17705. if (session->ticketLenAlloc > 0) {
  17706. XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK);
  17707. }
  17708. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  17709. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  17710. if (session->ticketNonce.data != session->ticketNonce.dataStatic) {
  17711. XFREE(session->ticketNonce.data, session->heap,
  17712. DYNAMIC_TYPE_SESSION_TICK);
  17713. }
  17714. #endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/
  17715. #endif
  17716. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17717. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17718. #endif
  17719. /* Make sure masterSecret is zeroed. */
  17720. ForceZero(session->masterSecret, SECRET_LEN);
  17721. /* Session ID is sensitive information too. */
  17722. ForceZero(session->sessionID, ID_LEN);
  17723. if (session->type == WOLFSSL_SESSION_TYPE_HEAP) {
  17724. XFREE(session, session->heap, DYNAMIC_TYPE_SESSION);
  17725. }
  17726. }
  17727. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  17728. {
  17729. session = ClientSessionToSession(session);
  17730. wolfSSL_FreeSession(NULL, session);
  17731. }
  17732. #ifndef NO_SESSION_CACHE
  17733. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17734. {
  17735. int error = 0;
  17736. const byte* id = NULL;
  17737. byte idSz = 0;
  17738. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  17739. session = ClientSessionToSession(session);
  17740. if (session == NULL)
  17741. return WOLFSSL_FAILURE;
  17742. /* Session cache is global */
  17743. (void)ctx;
  17744. id = session->sessionID;
  17745. idSz = session->sessionIDSz;
  17746. if (session->haveAltSessionID) {
  17747. id = session->altSessionID;
  17748. idSz = ID_LEN;
  17749. }
  17750. error = AddSessionToCache(ctx, session, id, idSz,
  17751. NULL, session->side,
  17752. #ifdef HAVE_SESSION_TICKET
  17753. session->ticketLen > 0,
  17754. #else
  17755. 0,
  17756. #endif
  17757. NULL);
  17758. return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  17759. }
  17760. #endif
  17761. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  17762. /**
  17763. * set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER
  17764. * @param session a pointer to WOLFSSL_SESSION structure
  17765. * @param cipher a function pointer to WOLFSSL_CIPHER
  17766. * @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE
  17767. */
  17768. int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session,
  17769. const WOLFSSL_CIPHER* cipher)
  17770. {
  17771. WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher");
  17772. session = ClientSessionToSession(session);
  17773. /* sanity check */
  17774. if (session == NULL || cipher == NULL) {
  17775. WOLFSSL_MSG("bad argument");
  17776. return WOLFSSL_FAILURE;
  17777. }
  17778. session->cipherSuite0 = cipher->cipherSuite0;
  17779. session->cipherSuite = cipher->cipherSuite;
  17780. WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS);
  17781. return WOLFSSL_SUCCESS;
  17782. }
  17783. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  17784. /* helper function that takes in a protocol version struct and returns string */
  17785. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  17786. {
  17787. WOLFSSL_ENTER("wolfSSL_get_version");
  17788. if (version == NULL) {
  17789. return "Bad arg";
  17790. }
  17791. if (version->major == SSLv3_MAJOR) {
  17792. switch (version->minor) {
  17793. case SSLv3_MINOR :
  17794. return "SSLv3";
  17795. case TLSv1_MINOR :
  17796. return "TLSv1";
  17797. case TLSv1_1_MINOR :
  17798. return "TLSv1.1";
  17799. case TLSv1_2_MINOR :
  17800. return "TLSv1.2";
  17801. case TLSv1_3_MINOR :
  17802. return "TLSv1.3";
  17803. default:
  17804. return "unknown";
  17805. }
  17806. }
  17807. #ifdef WOLFSSL_DTLS
  17808. else if (version->major == DTLS_MAJOR) {
  17809. switch (version->minor) {
  17810. case DTLS_MINOR :
  17811. return "DTLS";
  17812. case DTLSv1_2_MINOR :
  17813. return "DTLSv1.2";
  17814. case DTLSv1_3_MINOR :
  17815. return "DTLSv1.3";
  17816. default:
  17817. return "unknown";
  17818. }
  17819. }
  17820. #endif /* WOLFSSL_DTLS */
  17821. return "unknown";
  17822. }
  17823. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  17824. {
  17825. if (ssl == NULL) {
  17826. WOLFSSL_MSG("Bad argument");
  17827. return "unknown";
  17828. }
  17829. return wolfSSL_internal_get_version(&ssl->version);
  17830. }
  17831. /* current library version */
  17832. const char* wolfSSL_lib_version(void)
  17833. {
  17834. return LIBWOLFSSL_VERSION_STRING;
  17835. }
  17836. #ifdef OPENSSL_EXTRA
  17837. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  17838. const char* wolfSSL_OpenSSL_version(int a)
  17839. {
  17840. (void)a;
  17841. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17842. }
  17843. #else
  17844. const char* wolfSSL_OpenSSL_version(void)
  17845. {
  17846. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17847. }
  17848. #endif /* WOLFSSL_QT */
  17849. #endif
  17850. /* current library version in hex */
  17851. word32 wolfSSL_lib_version_hex(void)
  17852. {
  17853. return LIBWOLFSSL_VERSION_HEX;
  17854. }
  17855. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  17856. {
  17857. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  17858. if (ssl)
  17859. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  17860. return 0;
  17861. }
  17862. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  17863. {
  17864. WOLFSSL_ENTER("SSL_get_current_cipher");
  17865. if (ssl) {
  17866. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  17867. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  17868. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17869. ssl->cipher.bits = ssl->specs.key_size * 8;
  17870. #endif
  17871. return &ssl->cipher;
  17872. }
  17873. else
  17874. return NULL;
  17875. }
  17876. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  17877. {
  17878. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  17879. if (cipher == NULL) {
  17880. return NULL;
  17881. }
  17882. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  17883. !defined(WOLFSSL_QT)
  17884. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  17885. #else
  17886. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  17887. cipher->cipherSuite);
  17888. #endif
  17889. }
  17890. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  17891. {
  17892. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  17893. if (cipher == NULL || cipher->ssl == NULL) {
  17894. return NULL;
  17895. }
  17896. return wolfSSL_get_version(cipher->ssl);
  17897. }
  17898. const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session)
  17899. {
  17900. session = ClientSessionToSession(session);
  17901. if (session == NULL) {
  17902. return NULL;
  17903. }
  17904. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  17905. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  17906. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  17907. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  17908. #else
  17909. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  17910. #endif
  17911. #else
  17912. return NULL;
  17913. #endif
  17914. }
  17915. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  17916. {
  17917. WOLFSSL_ENTER("wolfSSL_get_cipher");
  17918. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  17919. }
  17920. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  17921. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  17922. {
  17923. /* get access to cipher_name_idx in internal.c */
  17924. return wolfSSL_get_cipher_name_internal(ssl);
  17925. }
  17926. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  17927. const byte cipherSuite)
  17928. {
  17929. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  17930. }
  17931. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  17932. const byte cipherSuite)
  17933. {
  17934. return GetCipherNameIana(cipherSuite0, cipherSuite);
  17935. }
  17936. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  17937. byte* cipherSuite, int *flags) {
  17938. if ((name == NULL) ||
  17939. (cipherSuite0 == NULL) ||
  17940. (cipherSuite == NULL) ||
  17941. (flags == NULL))
  17942. return BAD_FUNC_ARG;
  17943. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  17944. }
  17945. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17946. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17947. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  17948. {
  17949. WOLFSSL_STACK* sk;
  17950. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  17951. sk = wolfSSL_sk_new_null();
  17952. if (sk == NULL)
  17953. return NULL;
  17954. sk->type = STACK_TYPE_CIPHER;
  17955. return sk;
  17956. }
  17957. /* return 1 on success 0 on fail */
  17958. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  17959. WOLFSSL_CIPHER* cipher)
  17960. {
  17961. return wolfSSL_sk_push(sk, cipher);
  17962. }
  17963. #ifndef NO_WOLFSSL_STUB
  17964. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17965. {
  17966. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  17967. (void)sk;
  17968. return NULL;
  17969. }
  17970. #endif /* NO_WOLFSSL_STUB */
  17971. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17972. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  17973. {
  17974. word16 cipher_id = 0;
  17975. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  17976. if (cipher && cipher->ssl) {
  17977. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  17978. cipher->ssl->options.cipherSuite;
  17979. }
  17980. return cipher_id;
  17981. }
  17982. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  17983. {
  17984. const WOLFSSL_CIPHER* cipher = NULL;
  17985. byte cipherSuite0, cipherSuite;
  17986. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  17987. /* extract cipher id information */
  17988. cipherSuite = (value & 0xFF);
  17989. cipherSuite0 = ((value >> 8) & 0xFF);
  17990. /* TODO: lookup by cipherSuite0 / cipherSuite */
  17991. (void)cipherSuite0;
  17992. (void)cipherSuite;
  17993. return cipher;
  17994. }
  17995. #if defined(OPENSSL_EXTRA)
  17996. /* Free the structure for WOLFSSL_CIPHER stack
  17997. *
  17998. * sk stack to free nodes in
  17999. */
  18000. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  18001. {
  18002. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  18003. wolfSSL_sk_free(sk);
  18004. }
  18005. #endif /* OPENSSL_ALL */
  18006. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  18007. !defined(NO_DH)
  18008. #ifdef HAVE_FFDHE
  18009. static const char* wolfssl_ffdhe_name(word16 group)
  18010. {
  18011. const char* str = NULL;
  18012. switch (group) {
  18013. case WOLFSSL_FFDHE_2048:
  18014. str = "FFDHE_2048";
  18015. break;
  18016. case WOLFSSL_FFDHE_3072:
  18017. str = "FFDHE_3072";
  18018. break;
  18019. case WOLFSSL_FFDHE_4096:
  18020. str = "FFDHE_4096";
  18021. break;
  18022. case WOLFSSL_FFDHE_6144:
  18023. str = "FFDHE_6144";
  18024. break;
  18025. case WOLFSSL_FFDHE_8192:
  18026. str = "FFDHE_8192";
  18027. break;
  18028. default:
  18029. break;
  18030. }
  18031. return str;
  18032. }
  18033. #endif
  18034. /* Return the name of the curve used for key exchange as a printable string.
  18035. *
  18036. * ssl The SSL/TLS object.
  18037. * returns NULL if ECDH was not used, otherwise the name as a string.
  18038. */
  18039. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  18040. {
  18041. const char* cName = NULL;
  18042. if (ssl == NULL)
  18043. return NULL;
  18044. #if defined(WOLFSSL_TLS13) && defined(HAVE_PQC)
  18045. /* Check for post-quantum groups. Return now because we do not want the ECC
  18046. * check to override this result in the case of a hybrid. */
  18047. if (IsAtLeastTLSv1_3(ssl->version)) {
  18048. switch (ssl->namedGroup) {
  18049. #ifdef HAVE_LIBOQS
  18050. case WOLFSSL_KYBER_LEVEL1:
  18051. return "KYBER_LEVEL1";
  18052. case WOLFSSL_KYBER_LEVEL3:
  18053. return "KYBER_LEVEL3";
  18054. case WOLFSSL_KYBER_LEVEL5:
  18055. return "KYBER_LEVEL5";
  18056. case WOLFSSL_NTRU_HPS_LEVEL1:
  18057. return "NTRU_HPS_LEVEL1";
  18058. case WOLFSSL_NTRU_HPS_LEVEL3:
  18059. return "NTRU_HPS_LEVEL3";
  18060. case WOLFSSL_NTRU_HPS_LEVEL5:
  18061. return "NTRU_HPS_LEVEL5";
  18062. case WOLFSSL_NTRU_HRSS_LEVEL3:
  18063. return "NTRU_HRSS_LEVEL3";
  18064. case WOLFSSL_SABER_LEVEL1:
  18065. return "SABER_LEVEL1";
  18066. case WOLFSSL_SABER_LEVEL3:
  18067. return "SABER_LEVEL3";
  18068. case WOLFSSL_SABER_LEVEL5:
  18069. return "SABER_LEVEL5";
  18070. case WOLFSSL_KYBER_90S_LEVEL1:
  18071. return "KYBER_90S_LEVEL1";
  18072. case WOLFSSL_KYBER_90S_LEVEL3:
  18073. return "KYBER_90S_LEVEL3";
  18074. case WOLFSSL_KYBER_90S_LEVEL5:
  18075. return "KYBER_90S_LEVEL5";
  18076. case WOLFSSL_P256_NTRU_HPS_LEVEL1:
  18077. return "P256_NTRU_HPS_LEVEL1";
  18078. case WOLFSSL_P384_NTRU_HPS_LEVEL3:
  18079. return "P384_NTRU_HPS_LEVEL3";
  18080. case WOLFSSL_P521_NTRU_HPS_LEVEL5:
  18081. return "P521_NTRU_HPS_LEVEL5";
  18082. case WOLFSSL_P384_NTRU_HRSS_LEVEL3:
  18083. return "P384_NTRU_HRSS_LEVEL3";
  18084. case WOLFSSL_P256_SABER_LEVEL1:
  18085. return "P256_SABER_LEVEL1";
  18086. case WOLFSSL_P384_SABER_LEVEL3:
  18087. return "P384_SABER_LEVEL3";
  18088. case WOLFSSL_P521_SABER_LEVEL5:
  18089. return "P521_SABER_LEVEL5";
  18090. case WOLFSSL_P256_KYBER_LEVEL1:
  18091. return "P256_KYBER_LEVEL1";
  18092. case WOLFSSL_P384_KYBER_LEVEL3:
  18093. return "P384_KYBER_LEVEL3";
  18094. case WOLFSSL_P521_KYBER_LEVEL5:
  18095. return "P521_KYBER_LEVEL5";
  18096. case WOLFSSL_P256_KYBER_90S_LEVEL1:
  18097. return "P256_KYBER_90S_LEVEL1";
  18098. case WOLFSSL_P384_KYBER_90S_LEVEL3:
  18099. return "P384_KYBER_90S_LEVEL3";
  18100. case WOLFSSL_P521_KYBER_90S_LEVEL5:
  18101. return "P521_KYBER_90S_LEVEL5";
  18102. #elif defined(HAVE_PQM4)
  18103. case WOLFSSL_KYBER_LEVEL1:
  18104. return "KYBER_LEVEL1";
  18105. #elif defined(WOLFSSL_WC_KYBER)
  18106. #ifdef WOLFSSL_KYBER512
  18107. case WOLFSSL_KYBER_LEVEL1:
  18108. return "KYBER_LEVEL1";
  18109. #endif
  18110. #ifdef WOLFSSL_KYBER768
  18111. case WOLFSSL_KYBER_LEVEL3:
  18112. return "KYBER_LEVEL3";
  18113. #endif
  18114. #ifdef WOLFSSL_KYBER1024
  18115. case WOLFSSL_KYBER_LEVEL5:
  18116. return "KYBER_LEVEL5";
  18117. #endif
  18118. #endif
  18119. }
  18120. }
  18121. #endif /* WOLFSSL_TLS13 && HAVE_PQC */
  18122. #ifdef HAVE_FFDHE
  18123. if (ssl->namedGroup != 0) {
  18124. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  18125. }
  18126. #endif
  18127. #ifdef HAVE_CURVE25519
  18128. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  18129. cName = "X25519";
  18130. }
  18131. #endif
  18132. #ifdef HAVE_CURVE448
  18133. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  18134. cName = "X448";
  18135. }
  18136. #endif
  18137. #ifdef HAVE_ECC
  18138. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  18139. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  18140. NULL));
  18141. }
  18142. #endif
  18143. return cName;
  18144. }
  18145. #endif
  18146. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  18147. defined(OPENSSL_EXTRA_X509_SMALL)
  18148. /* Creates a new WOLFSSL_ASN1_STRING structure.
  18149. *
  18150. * returns a pointer to the new structure created on success or NULL if fail
  18151. */
  18152. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  18153. {
  18154. WOLFSSL_ASN1_STRING* asn1;
  18155. #ifdef WOLFSSL_DEBUG_OPENSSL
  18156. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  18157. #endif
  18158. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  18159. DYNAMIC_TYPE_OPENSSL);
  18160. if (asn1 != NULL) {
  18161. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  18162. }
  18163. return asn1; /* no check for null because error case is returning null*/
  18164. }
  18165. /**
  18166. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  18167. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  18168. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  18169. */
  18170. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  18171. {
  18172. WOLFSSL_ASN1_STRING* dupl = NULL;
  18173. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  18174. if (!asn1) {
  18175. WOLFSSL_MSG("Bad parameter");
  18176. return NULL;
  18177. }
  18178. dupl = wolfSSL_ASN1_STRING_new();
  18179. if (!dupl) {
  18180. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  18181. return NULL;
  18182. }
  18183. dupl->type = asn1->type;
  18184. dupl->flags = asn1->flags;
  18185. if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
  18186. != WOLFSSL_SUCCESS) {
  18187. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  18188. wolfSSL_ASN1_STRING_free(dupl);
  18189. return NULL;
  18190. }
  18191. return dupl;
  18192. }
  18193. /* used to free a WOLFSSL_ASN1_STRING structure */
  18194. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  18195. {
  18196. #ifdef WOLFSSL_DEBUG_OPENSSL
  18197. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  18198. #endif
  18199. if (asn1 != NULL) {
  18200. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  18201. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  18202. }
  18203. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  18204. }
  18205. }
  18206. int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
  18207. {
  18208. int i;
  18209. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
  18210. if (!a || !b) {
  18211. return WOLFSSL_FATAL_ERROR;
  18212. }
  18213. if (a->length != b->length) {
  18214. return a->length - b->length;
  18215. }
  18216. if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
  18217. return i;
  18218. }
  18219. return a->type - b->type;
  18220. }
  18221. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18222. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  18223. defined(OPENSSL_EXTRA_X509_SMALL))
  18224. int wolfSSL_ASN1_STRING_copy(WOLFSSL_ASN1_STRING* dest,
  18225. const WOLFSSL_ASN1_STRING* src)
  18226. {
  18227. if (src == NULL || dest == NULL) {
  18228. return WOLFSSL_FAILURE;
  18229. }
  18230. dest->type = src->type;
  18231. if(wolfSSL_ASN1_STRING_set(dest, src->data, src->length)
  18232. != WOLFSSL_SUCCESS) {
  18233. return WOLFSSL_FAILURE;
  18234. }
  18235. dest->flags = src->flags;
  18236. return WOLFSSL_SUCCESS;
  18237. }
  18238. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  18239. *
  18240. * type is the type of set when WOLFSSL_ASN1_STRING is created
  18241. *
  18242. * returns a pointer to the new structure created on success or NULL if fail
  18243. */
  18244. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  18245. {
  18246. WOLFSSL_ASN1_STRING* asn1;
  18247. #ifdef WOLFSSL_DEBUG_OPENSSL
  18248. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  18249. #endif
  18250. asn1 = wolfSSL_ASN1_STRING_new();
  18251. if (asn1 == NULL) {
  18252. return NULL;
  18253. }
  18254. asn1->type = type;
  18255. return asn1;
  18256. }
  18257. /******************************************************************************
  18258. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  18259. *
  18260. * RETURNS:
  18261. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  18262. */
  18263. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  18264. {
  18265. #ifdef WOLFSSL_DEBUG_OPENSSL
  18266. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  18267. #endif
  18268. if (asn1 == NULL) {
  18269. return WOLFSSL_FAILURE;
  18270. }
  18271. return asn1->type;
  18272. }
  18273. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  18274. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  18275. defined(OPENSSL_EXTRA_X509_SMALL)
  18276. /* if dataSz is negative then use XSTRLEN to find length of data
  18277. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  18278. /* `data` can be NULL and only buffer will be allocated */
  18279. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  18280. int dataSz)
  18281. {
  18282. int sz;
  18283. #ifdef WOLFSSL_DEBUG_OPENSSL
  18284. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  18285. #endif
  18286. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  18287. return WOLFSSL_FAILURE;
  18288. }
  18289. if (dataSz < 0) {
  18290. sz = (int)XSTRLEN((const char*)data);
  18291. }
  18292. else {
  18293. sz = dataSz;
  18294. }
  18295. if (sz < 0) {
  18296. return WOLFSSL_FAILURE;
  18297. }
  18298. /* free any existing data before copying */
  18299. if (asn1->data != NULL && asn1->isDynamic) {
  18300. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  18301. asn1->data = NULL;
  18302. }
  18303. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  18304. /* create new data buffer and copy over */
  18305. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  18306. if (asn1->data == NULL) {
  18307. return WOLFSSL_FAILURE;
  18308. }
  18309. asn1->isDynamic = 1;
  18310. }
  18311. else {
  18312. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  18313. asn1->data = asn1->strData;
  18314. asn1->isDynamic = 0;
  18315. }
  18316. if (data != NULL) {
  18317. XMEMCPY(asn1->data, data, sz);
  18318. asn1->data[sz] = '\0';
  18319. }
  18320. asn1->length = sz;
  18321. return WOLFSSL_SUCCESS;
  18322. }
  18323. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18324. #ifndef NO_CERTS
  18325. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  18326. const unsigned char* wolfSSL_ASN1_STRING_get0_data(
  18327. const WOLFSSL_ASN1_STRING* asn)
  18328. {
  18329. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_get0_data");
  18330. if (asn) {
  18331. return (const unsigned char*)asn->data;
  18332. } else {
  18333. return NULL;
  18334. }
  18335. }
  18336. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  18337. {
  18338. #ifdef WOLFSSL_DEBUG_OPENSSL
  18339. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  18340. #endif
  18341. if (asn) {
  18342. return (unsigned char*)asn->data;
  18343. }
  18344. else {
  18345. return NULL;
  18346. }
  18347. }
  18348. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  18349. {
  18350. #ifdef WOLFSSL_DEBUG_OPENSSL
  18351. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  18352. #endif
  18353. if (asn) {
  18354. return asn->length;
  18355. }
  18356. else {
  18357. return 0;
  18358. }
  18359. }
  18360. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  18361. #ifdef OPENSSL_EXTRA
  18362. #ifndef NO_WOLFSSL_STUB
  18363. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  18364. const unsigned char **in, long len)
  18365. {
  18366. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  18367. (void)asn;
  18368. (void)in;
  18369. (void)len;
  18370. return NULL;
  18371. }
  18372. #endif
  18373. #endif /* OPENSSL_EXTRA */
  18374. #endif /* !NO_CERTS */
  18375. #ifdef OPENSSL_EXTRA
  18376. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18377. /* return authentication NID corresponding to cipher suite
  18378. * @param cipher a pointer to WOLFSSL_CIPHER
  18379. * return NID if found, NID_undef if not found
  18380. */
  18381. int wolfSSL_CIPHER_get_auth_nid(const WOLFSSL_CIPHER* cipher)
  18382. {
  18383. static const struct authnid {
  18384. const char* alg_name;
  18385. const int nid;
  18386. } authnid_tbl[] = {
  18387. {"RSA", NID_auth_rsa},
  18388. {"PSK", NID_auth_psk},
  18389. {"SRP", NID_auth_srp},
  18390. {"ECDSA", NID_auth_ecdsa},
  18391. {"None", NID_auth_null},
  18392. {NULL, NID_undef}
  18393. };
  18394. const struct authnid* sa;
  18395. const char* authStr;
  18396. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18397. if (GetCipherSegment(cipher, n) == NULL) {
  18398. WOLFSSL_MSG("no suitable cipher name found");
  18399. return NID_undef;
  18400. }
  18401. authStr = GetCipherAuthStr(n);
  18402. if (authStr != NULL) {
  18403. for(sa = authnid_tbl; sa->alg_name != NULL; sa++) {
  18404. if (XSTRCMP(sa->alg_name, authStr) == 0) {
  18405. return sa->nid;
  18406. }
  18407. }
  18408. }
  18409. return NID_undef;
  18410. }
  18411. /* return cipher NID corresponding to cipher suite
  18412. * @param cipher a pointer to WOLFSSL_CIPHER
  18413. * return NID if found, NID_undef if not found
  18414. */
  18415. int wolfSSL_CIPHER_get_cipher_nid(const WOLFSSL_CIPHER* cipher)
  18416. {
  18417. static const struct ciphernid {
  18418. const char* alg_name;
  18419. const int nid;
  18420. } ciphernid_tbl[] = {
  18421. {"AESGCM(256)", NID_aes_256_gcm},
  18422. {"AESGCM(128)", NID_aes_128_gcm},
  18423. {"AESCCM(128)", NID_aes_128_ccm},
  18424. {"AES(128)", NID_aes_128_cbc},
  18425. {"AES(256)", NID_aes_256_cbc},
  18426. {"CAMELLIA(256)", NID_camellia_256_cbc},
  18427. {"CAMELLIA(128)", NID_camellia_128_cbc},
  18428. {"RC4", NID_rc4},
  18429. {"3DES", NID_des_ede3_cbc},
  18430. {"CHACHA20/POLY1305(256)", NID_chacha20_poly1305},
  18431. {"None", NID_undef},
  18432. {NULL, NID_undef}
  18433. };
  18434. const struct ciphernid* c;
  18435. const char* encStr;
  18436. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18437. WOLFSSL_ENTER("wolfSSL_CIPHER_get_cipher_nid");
  18438. if (GetCipherSegment(cipher, n) == NULL) {
  18439. WOLFSSL_MSG("no suitable cipher name found");
  18440. return NID_undef;
  18441. }
  18442. encStr = GetCipherEncStr(n);
  18443. if (encStr != NULL) {
  18444. for(c = ciphernid_tbl; c->alg_name != NULL; c++) {
  18445. if (XSTRCMP(c->alg_name, encStr) == 0) {
  18446. return c->nid;
  18447. }
  18448. }
  18449. }
  18450. return NID_undef;
  18451. }
  18452. /* return digest NID corresponding to cipher suite
  18453. * @param cipher a pointer to WOLFSSL_CIPHER
  18454. * return NID if found, NID_undef if not found
  18455. */
  18456. int wolfSSL_CIPHER_get_digest_nid(const WOLFSSL_CIPHER* cipher)
  18457. {
  18458. static const struct macnid {
  18459. const char* alg_name;
  18460. const int nid;
  18461. } macnid_tbl[] = {
  18462. {"SHA1", NID_sha1},
  18463. {"SHA256", NID_sha256},
  18464. {"SHA384", NID_sha384},
  18465. {NULL, NID_undef}
  18466. };
  18467. const struct macnid* mc;
  18468. const char* name;
  18469. const char* macStr;
  18470. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18471. (void)name;
  18472. WOLFSSL_ENTER("wolfSSL_CIPHER_get_digest_nid");
  18473. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  18474. WOLFSSL_MSG("no suitable cipher name found");
  18475. return NID_undef;
  18476. }
  18477. /* in MD5 case, NID will be NID_md5 */
  18478. if (XSTRSTR(name, "MD5") != NULL) {
  18479. return NID_md5;
  18480. }
  18481. macStr = GetCipherMacStr(n);
  18482. if (macStr != NULL) {
  18483. for(mc = macnid_tbl; mc->alg_name != NULL; mc++) {
  18484. if (XSTRCMP(mc->alg_name, macStr) == 0) {
  18485. return mc->nid;
  18486. }
  18487. }
  18488. }
  18489. return NID_undef;
  18490. }
  18491. /* return key exchange NID corresponding to cipher suite
  18492. * @param cipher a pointer to WOLFSSL_CIPHER
  18493. * return NID if found, NID_undef if not found
  18494. */
  18495. int wolfSSL_CIPHER_get_kx_nid(const WOLFSSL_CIPHER* cipher)
  18496. {
  18497. static const struct kxnid {
  18498. const char* name;
  18499. const int nid;
  18500. } kxnid_table[] = {
  18501. {"ECDHEPSK", NID_kx_ecdhe_psk},
  18502. {"ECDH", NID_kx_ecdhe},
  18503. {"DHEPSK", NID_kx_dhe_psk},
  18504. {"DH", NID_kx_dhe},
  18505. {"RSAPSK", NID_kx_rsa_psk},
  18506. {"SRP", NID_kx_srp},
  18507. {"EDH", NID_kx_dhe},
  18508. {"RSA", NID_kx_rsa},
  18509. {NULL, NID_undef}
  18510. };
  18511. const struct kxnid* k;
  18512. const char* keaStr;
  18513. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18514. WOLFSSL_ENTER("wolfSSL_CIPHER_get_kx_nid");
  18515. if (GetCipherSegment(cipher, n) == NULL) {
  18516. WOLFSSL_MSG("no suitable cipher name found");
  18517. return NID_undef;
  18518. }
  18519. /* in TLS 1.3 case, NID will be NID_kx_any */
  18520. if (XSTRCMP(n[0], "TLS13") == 0) {
  18521. return NID_kx_any;
  18522. }
  18523. keaStr = GetCipherKeaStr(n);
  18524. if (keaStr != NULL) {
  18525. for(k = kxnid_table; k->name != NULL; k++) {
  18526. if (XSTRCMP(k->name, keaStr) == 0) {
  18527. return k->nid;
  18528. }
  18529. }
  18530. }
  18531. return NID_undef;
  18532. }
  18533. /* check if cipher suite is AEAD
  18534. * @param cipher a pointer to WOLFSSL_CIPHER
  18535. * return 1 if cipher is AEAD, 0 otherwise
  18536. */
  18537. int wolfSSL_CIPHER_is_aead(const WOLFSSL_CIPHER* cipher)
  18538. {
  18539. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18540. WOLFSSL_ENTER("wolfSSL_CIPHER_is_aead");
  18541. if (GetCipherSegment(cipher, n) == NULL) {
  18542. WOLFSSL_MSG("no suitable cipher name found");
  18543. return NID_undef;
  18544. }
  18545. return IsCipherAEAD(n);
  18546. }
  18547. /* Creates cipher->description based on cipher->offset
  18548. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  18549. * to a stack of ciphers.
  18550. * @param [in] cipher: A cipher from a stack of ciphers.
  18551. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  18552. */
  18553. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  18554. {
  18555. int strLen;
  18556. unsigned long offset;
  18557. char* dp;
  18558. const char* name;
  18559. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  18560. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  18561. int len = MAX_DESCRIPTION_SZ-1;
  18562. const CipherSuiteInfo* cipher_names;
  18563. ProtocolVersion pv;
  18564. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  18565. if (cipher == NULL)
  18566. return WOLFSSL_FAILURE;
  18567. dp = cipher->description;
  18568. if (dp == NULL)
  18569. return WOLFSSL_FAILURE;
  18570. cipher_names = GetCipherNames();
  18571. offset = cipher->offset;
  18572. if (offset >= (unsigned long)GetCipherNamesSize())
  18573. return WOLFSSL_FAILURE;
  18574. pv.major = cipher_names[offset].major;
  18575. pv.minor = cipher_names[offset].minor;
  18576. protocol = wolfSSL_internal_get_version(&pv);
  18577. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  18578. WOLFSSL_MSG("no suitable cipher name found");
  18579. return WOLFSSL_FAILURE;
  18580. }
  18581. /* keaStr */
  18582. keaStr = GetCipherKeaStr(n);
  18583. /* authStr */
  18584. authStr = GetCipherAuthStr(n);
  18585. /* encStr */
  18586. encStr = GetCipherEncStr(n);
  18587. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  18588. WOLFSSL_MSG("Cipher Bits Not Set.");
  18589. }
  18590. /* macStr */
  18591. macStr = GetCipherMacStr(n);
  18592. /* Build up the string by copying onto the end. */
  18593. XSTRNCPY(dp, name, len);
  18594. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18595. len -= strLen; dp += strLen;
  18596. XSTRNCPY(dp, " ", len);
  18597. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18598. len -= strLen; dp += strLen;
  18599. XSTRNCPY(dp, protocol, len);
  18600. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18601. len -= strLen; dp += strLen;
  18602. XSTRNCPY(dp, " Kx=", len);
  18603. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18604. len -= strLen; dp += strLen;
  18605. XSTRNCPY(dp, keaStr, len);
  18606. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18607. len -= strLen; dp += strLen;
  18608. XSTRNCPY(dp, " Au=", len);
  18609. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18610. len -= strLen; dp += strLen;
  18611. XSTRNCPY(dp, authStr, len);
  18612. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18613. len -= strLen; dp += strLen;
  18614. XSTRNCPY(dp, " Enc=", len);
  18615. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18616. len -= strLen; dp += strLen;
  18617. XSTRNCPY(dp, encStr, len);
  18618. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18619. len -= strLen; dp += strLen;
  18620. XSTRNCPY(dp, " Mac=", len);
  18621. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18622. len -= strLen; dp += strLen;
  18623. XSTRNCPY(dp, macStr, len);
  18624. dp[len-1] = '\0';
  18625. return WOLFSSL_SUCCESS;
  18626. }
  18627. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  18628. static WC_INLINE const char* wolfssl_kea_to_string(int kea)
  18629. {
  18630. const char* keaStr;
  18631. switch (kea) {
  18632. case no_kea:
  18633. keaStr = "None";
  18634. break;
  18635. #ifndef NO_RSA
  18636. case rsa_kea:
  18637. keaStr = "RSA";
  18638. break;
  18639. #endif
  18640. #ifndef NO_DH
  18641. case diffie_hellman_kea:
  18642. keaStr = "DHE";
  18643. break;
  18644. #endif
  18645. case fortezza_kea:
  18646. keaStr = "FZ";
  18647. break;
  18648. #ifndef NO_PSK
  18649. case psk_kea:
  18650. keaStr = "PSK";
  18651. break;
  18652. #ifndef NO_DH
  18653. case dhe_psk_kea:
  18654. keaStr = "DHEPSK";
  18655. break;
  18656. #endif
  18657. #ifdef HAVE_ECC
  18658. case ecdhe_psk_kea:
  18659. keaStr = "ECDHEPSK";
  18660. break;
  18661. #endif
  18662. #endif
  18663. #ifdef HAVE_ECC
  18664. case ecc_diffie_hellman_kea:
  18665. keaStr = "ECDHE";
  18666. break;
  18667. case ecc_static_diffie_hellman_kea:
  18668. keaStr = "ECDH";
  18669. break;
  18670. #endif
  18671. default:
  18672. keaStr = "unknown";
  18673. break;
  18674. }
  18675. return keaStr;
  18676. }
  18677. static WC_INLINE const char* wolfssl_sigalg_to_string(int sig_algo)
  18678. {
  18679. const char* authStr;
  18680. switch (sig_algo) {
  18681. case anonymous_sa_algo:
  18682. authStr = "None";
  18683. break;
  18684. #ifndef NO_RSA
  18685. case rsa_sa_algo:
  18686. authStr = "RSA";
  18687. break;
  18688. #ifdef WC_RSA_PSS
  18689. case rsa_pss_sa_algo:
  18690. authStr = "RSA-PSS";
  18691. break;
  18692. #endif
  18693. #endif
  18694. #ifndef NO_DSA
  18695. case dsa_sa_algo:
  18696. authStr = "DSA";
  18697. break;
  18698. #endif
  18699. #ifdef HAVE_ECC
  18700. case ecc_dsa_sa_algo:
  18701. authStr = "ECDSA";
  18702. break;
  18703. #endif
  18704. #ifdef HAVE_ED25519
  18705. case ed25519_sa_algo:
  18706. authStr = "Ed25519";
  18707. break;
  18708. #endif
  18709. #ifdef HAVE_ED448
  18710. case ed448_sa_algo:
  18711. authStr = "Ed448";
  18712. break;
  18713. #endif
  18714. default:
  18715. authStr = "unknown";
  18716. break;
  18717. }
  18718. return authStr;
  18719. }
  18720. static WC_INLINE const char* wolfssl_cipher_to_string(int cipher, int key_size)
  18721. {
  18722. const char* encStr;
  18723. (void)key_size;
  18724. switch (cipher) {
  18725. case wolfssl_cipher_null:
  18726. encStr = "None";
  18727. break;
  18728. #ifndef NO_RC4
  18729. case wolfssl_rc4:
  18730. encStr = "RC4(128)";
  18731. break;
  18732. #endif
  18733. #ifndef NO_DES3
  18734. case wolfssl_triple_des:
  18735. encStr = "3DES(168)";
  18736. break;
  18737. #endif
  18738. #ifndef NO_AES
  18739. case wolfssl_aes:
  18740. if (key_size == 128)
  18741. encStr = "AES(128)";
  18742. else if (key_size == 256)
  18743. encStr = "AES(256)";
  18744. else
  18745. encStr = "AES(?)";
  18746. break;
  18747. #ifdef HAVE_AESGCM
  18748. case wolfssl_aes_gcm:
  18749. if (key_size == 128)
  18750. encStr = "AESGCM(128)";
  18751. else if (key_size == 256)
  18752. encStr = "AESGCM(256)";
  18753. else
  18754. encStr = "AESGCM(?)";
  18755. break;
  18756. #endif
  18757. #ifdef HAVE_AESCCM
  18758. case wolfssl_aes_ccm:
  18759. if (key_size == 128)
  18760. encStr = "AESCCM(128)";
  18761. else if (key_size == 256)
  18762. encStr = "AESCCM(256)";
  18763. else
  18764. encStr = "AESCCM(?)";
  18765. break;
  18766. #endif
  18767. #endif
  18768. #ifdef HAVE_CHACHA
  18769. case wolfssl_chacha:
  18770. encStr = "CHACHA20/POLY1305(256)";
  18771. break;
  18772. #endif
  18773. #ifdef HAVE_CAMELLIA
  18774. case wolfssl_camellia:
  18775. if (key_size == 128)
  18776. encStr = "Camellia(128)";
  18777. else if (key_size == 256)
  18778. encStr = "Camellia(256)";
  18779. else
  18780. encStr = "Camellia(?)";
  18781. break;
  18782. #endif
  18783. default:
  18784. encStr = "unknown";
  18785. break;
  18786. }
  18787. return encStr;
  18788. }
  18789. static WC_INLINE const char* wolfssl_mac_to_string(int mac)
  18790. {
  18791. const char* macStr;
  18792. switch (mac) {
  18793. case no_mac:
  18794. macStr = "None";
  18795. break;
  18796. #ifndef NO_MD5
  18797. case md5_mac:
  18798. macStr = "MD5";
  18799. break;
  18800. #endif
  18801. #ifndef NO_SHA
  18802. case sha_mac:
  18803. macStr = "SHA1";
  18804. break;
  18805. #endif
  18806. #ifdef HAVE_SHA224
  18807. case sha224_mac:
  18808. macStr = "SHA224";
  18809. break;
  18810. #endif
  18811. #ifndef NO_SHA256
  18812. case sha256_mac:
  18813. macStr = "SHA256";
  18814. break;
  18815. #endif
  18816. #ifdef HAVE_SHA384
  18817. case sha384_mac:
  18818. macStr = "SHA384";
  18819. break;
  18820. #endif
  18821. #ifdef HAVE_SHA512
  18822. case sha512_mac:
  18823. macStr = "SHA512";
  18824. break;
  18825. #endif
  18826. default:
  18827. macStr = "unknown";
  18828. break;
  18829. }
  18830. return macStr;
  18831. }
  18832. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  18833. int len)
  18834. {
  18835. char *ret = in;
  18836. const char *keaStr, *authStr, *encStr, *macStr;
  18837. size_t strLen;
  18838. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  18839. if (cipher == NULL || in == NULL)
  18840. return NULL;
  18841. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18842. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  18843. * Return the description based on cipher_names[cipher->offset]
  18844. */
  18845. if (cipher->in_stack == TRUE) {
  18846. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  18847. XSTRNCPY(in,cipher->description,len);
  18848. return ret;
  18849. }
  18850. #endif
  18851. /* Get the cipher description based on the SSL session cipher */
  18852. keaStr = wolfssl_kea_to_string(cipher->ssl->specs.kea);
  18853. authStr = wolfssl_sigalg_to_string(cipher->ssl->specs.sig_algo);
  18854. encStr = wolfssl_cipher_to_string(cipher->ssl->specs.bulk_cipher_algorithm,
  18855. cipher->ssl->specs.key_size);
  18856. macStr = wolfssl_mac_to_string(cipher->ssl->specs.mac_algorithm);
  18857. /* Build up the string by copying onto the end. */
  18858. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  18859. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18860. XSTRNCPY(in, " ", len);
  18861. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18862. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  18863. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18864. XSTRNCPY(in, " Kx=", len);
  18865. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18866. XSTRNCPY(in, keaStr, len);
  18867. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18868. XSTRNCPY(in, " Au=", len);
  18869. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18870. XSTRNCPY(in, authStr, len);
  18871. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18872. XSTRNCPY(in, " Enc=", len);
  18873. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18874. XSTRNCPY(in, encStr, len);
  18875. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18876. XSTRNCPY(in, " Mac=", len);
  18877. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18878. XSTRNCPY(in, macStr, len);
  18879. in[len-1] = '\0';
  18880. return ret;
  18881. }
  18882. #ifndef NO_WOLFSSL_STUB
  18883. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  18884. int* ssl)
  18885. {
  18886. (void)url;
  18887. (void)host;
  18888. (void)port;
  18889. (void)path;
  18890. (void)ssl;
  18891. WOLFSSL_STUB("OCSP_parse_url");
  18892. return 0;
  18893. }
  18894. #endif
  18895. #ifndef NO_MD4
  18896. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  18897. {
  18898. /* make sure we have a big enough buffer */
  18899. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  18900. (void) sizeof(ok);
  18901. WOLFSSL_ENTER("MD4_Init");
  18902. wc_InitMd4((Md4*)md4);
  18903. }
  18904. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  18905. unsigned long len)
  18906. {
  18907. WOLFSSL_ENTER("MD4_Update");
  18908. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  18909. }
  18910. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  18911. {
  18912. WOLFSSL_ENTER("MD4_Final");
  18913. wc_Md4Final((Md4*)md4, digest);
  18914. }
  18915. #endif /* NO_MD4 */
  18916. #ifndef NO_WOLFSSL_STUB
  18917. void wolfSSL_RAND_screen(void)
  18918. {
  18919. WOLFSSL_STUB("RAND_screen");
  18920. }
  18921. #endif
  18922. int wolfSSL_RAND_load_file(const char* fname, long len)
  18923. {
  18924. (void)fname;
  18925. /* wolfCrypt provides enough entropy internally or will report error */
  18926. if (len == -1)
  18927. return 1024;
  18928. else
  18929. return (int)len;
  18930. }
  18931. #ifndef NO_WOLFSSL_STUB
  18932. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  18933. {
  18934. WOLFSSL_STUB("COMP_zlib");
  18935. return 0;
  18936. }
  18937. #endif
  18938. #ifndef NO_WOLFSSL_STUB
  18939. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  18940. {
  18941. WOLFSSL_STUB("COMP_rle");
  18942. return 0;
  18943. }
  18944. #endif
  18945. #ifndef NO_WOLFSSL_STUB
  18946. int wolfSSL_COMP_add_compression_method(int method, void* data)
  18947. {
  18948. (void)method;
  18949. (void)data;
  18950. WOLFSSL_STUB("COMP_add_compression_method");
  18951. return 0;
  18952. }
  18953. #endif
  18954. /* wolfSSL_set_dynlock_create_callback
  18955. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  18956. * This function exists for compatibility purposes because wolfSSL satisfies
  18957. * thread safety without relying on the callback.
  18958. */
  18959. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  18960. const char*, int))
  18961. {
  18962. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  18963. (void)f;
  18964. }
  18965. /* wolfSSL_set_dynlock_lock_callback
  18966. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  18967. * This function exists for compatibility purposes because wolfSSL satisfies
  18968. * thread safety without relying on the callback.
  18969. */
  18970. void wolfSSL_set_dynlock_lock_callback(
  18971. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  18972. {
  18973. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  18974. (void)f;
  18975. }
  18976. /* wolfSSL_set_dynlock_destroy_callback
  18977. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  18978. * This function exists for compatibility purposes because wolfSSL satisfies
  18979. * thread safety without relying on the callback.
  18980. */
  18981. void wolfSSL_set_dynlock_destroy_callback(
  18982. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  18983. {
  18984. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  18985. (void)f;
  18986. }
  18987. #endif /* OPENSSL_EXTRA */
  18988. #ifdef OPENSSL_EXTRA
  18989. #ifndef NO_CERTS
  18990. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  18991. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  18992. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  18993. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  18994. *
  18995. * Returns size of key buffer on success
  18996. */
  18997. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18998. {
  18999. return wolfSSL_EVP_PKEY_get_der(key, der);
  19000. }
  19001. int wolfSSL_i2d_PublicKey(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  19002. {
  19003. return wolfSSL_EVP_PKEY_get_der(key, der);
  19004. }
  19005. #endif /* !NO_ASN && !NO_PWDBASED */
  19006. #endif /* !NO_CERTS */
  19007. #endif /* OPENSSL_EXTRA */
  19008. #ifdef OPENSSL_EXTRA
  19009. /* Sets the DNS hostname to name.
  19010. * Hostname is cleared if name is NULL or empty. */
  19011. int wolfSSL_set1_host(WOLFSSL * ssl, const char* name)
  19012. {
  19013. if (ssl == NULL) {
  19014. return WOLFSSL_FAILURE;
  19015. }
  19016. return wolfSSL_X509_VERIFY_PARAM_set1_host(ssl->param, name, 0);
  19017. }
  19018. /******************************************************************************
  19019. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  19020. *
  19021. * RETURNS:
  19022. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  19023. * Note: Returns WOLFSSL_SUCCESS, in case either parameter is NULL,
  19024. * same as openssl.
  19025. */
  19026. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  19027. {
  19028. if (ctx == NULL || vpm == NULL)
  19029. return WOLFSSL_SUCCESS;
  19030. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  19031. }
  19032. /******************************************************************************
  19033. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  19034. *
  19035. * RETURNS:
  19036. * returns pointer to the SSL verification parameters on success,
  19037. * otherwise returns NULL
  19038. */
  19039. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  19040. {
  19041. if (ctx == NULL) {
  19042. return NULL;
  19043. }
  19044. return ctx->param;
  19045. }
  19046. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  19047. {
  19048. if (ssl == NULL) {
  19049. return NULL;
  19050. }
  19051. return ssl->param;
  19052. }
  19053. #endif /* OPENSSL_EXTRA */
  19054. #if defined(OPENSSL_EXTRA)
  19055. int wolfSSL_i2d_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER* a, unsigned char** out)
  19056. {
  19057. int ret = 0;
  19058. word32 idx = 0;
  19059. int len;
  19060. int preAlloc = 1;
  19061. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_INTEGER");
  19062. if (a == NULL || a->data == NULL || a->length <= 0 || out == NULL) {
  19063. WOLFSSL_MSG("Bad parameter.");
  19064. ret = WOLFSSL_FATAL_ERROR;
  19065. }
  19066. if (ret == 0 && *out == NULL) {
  19067. preAlloc = 0;
  19068. *out = (unsigned char*)XMALLOC(a->length, NULL, DYNAMIC_TYPE_ASN1);
  19069. if (*out == NULL) {
  19070. WOLFSSL_MSG("Failed to allocate output buffer.");
  19071. ret = WOLFSSL_FATAL_ERROR;
  19072. }
  19073. }
  19074. if (ret == 0) {
  19075. /*
  19076. * A WOLFSSL_ASN1_INTEGER stores the DER buffer of the integer in its
  19077. * "data" field, but it's only the magnitude of the number (i.e. the
  19078. * sign isn't encoded). The "negative" field is 1 if the value should
  19079. * be interpreted as negative and 0 otherwise. If the value is negative,
  19080. * we need to output the 2's complement of the value in the DER output.
  19081. */
  19082. XMEMCPY(*out, a->data, a->length);
  19083. if (a->negative) {
  19084. if (GetLength(a->data, &idx, &len, a->length) < 0) {
  19085. ret = WOLFSSL_FATAL_ERROR;
  19086. }
  19087. else {
  19088. ++idx;
  19089. for (; (int)idx < a->length; ++idx) {
  19090. (*out)[idx] = ~(*out)[idx];
  19091. }
  19092. do {
  19093. --idx;
  19094. ++(*out)[idx];
  19095. } while ((*out)[idx] == 0);
  19096. }
  19097. }
  19098. }
  19099. if (ret == 0) {
  19100. ret = a->length;
  19101. if (preAlloc) {
  19102. *out += a->length;
  19103. }
  19104. }
  19105. WOLFSSL_LEAVE("wolfSSL_i2d_ASN1_INTEGER", ret);
  19106. return ret;
  19107. }
  19108. WOLFSSL_ASN1_INTEGER* wolfSSL_d2i_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER** a,
  19109. const unsigned char** in,
  19110. long inSz)
  19111. {
  19112. WOLFSSL_ASN1_INTEGER* ret = NULL;
  19113. int err = 0;
  19114. word32 idx = 0;
  19115. int len;
  19116. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_INTEGER");
  19117. if (in == NULL || *in == NULL || inSz <= 0) {
  19118. WOLFSSL_MSG("Bad parameter");
  19119. err = 1;
  19120. }
  19121. if (err == 0 && (*in)[0] != ASN_INTEGER) {
  19122. WOLFSSL_MSG("Tag doesn't indicate integer type.");
  19123. err = 1;
  19124. }
  19125. if (err == 0) {
  19126. ret = wolfSSL_ASN1_INTEGER_new();
  19127. if (ret == NULL) {
  19128. err = 1;
  19129. }
  19130. else {
  19131. ret->type = V_ASN1_INTEGER;
  19132. }
  19133. }
  19134. if (err == 0 && inSz > (long)sizeof(ret->intData)) {
  19135. ret->data = (unsigned char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_ASN1);
  19136. if (ret->data == NULL) {
  19137. err = 1;
  19138. }
  19139. else {
  19140. ret->isDynamic = 1;
  19141. ret->dataMax = (word32)inSz;
  19142. }
  19143. }
  19144. if (err == 0) {
  19145. XMEMCPY(ret->data, *in, inSz);
  19146. ret->length = (word32)inSz;
  19147. /* Advance to the end of the length field.*/
  19148. if (GetLength(*in, &idx, &len, (word32)inSz) < 0) {
  19149. err = 1;
  19150. }
  19151. else {
  19152. /* See 2's complement comment in wolfSSL_d2i_ASN1_INTEGER. */
  19153. ret->negative = (*in)[idx+1] & 0x80;
  19154. if (ret->negative) {
  19155. ++idx;
  19156. for (; (int)idx < inSz; ++idx) {
  19157. ret->data[idx] = ~ret->data[idx];
  19158. }
  19159. do {
  19160. --idx;
  19161. ++ret->data[idx];
  19162. } while (ret->data[idx] == 0);
  19163. ret->type |= V_ASN1_NEG_INTEGER;
  19164. }
  19165. if (a != NULL) {
  19166. *a = ret;
  19167. }
  19168. }
  19169. }
  19170. if (err != 0) {
  19171. wolfSSL_ASN1_INTEGER_free(ret);
  19172. ret = NULL;
  19173. }
  19174. return ret;
  19175. }
  19176. #endif /* OPENSSL_EXTRA */
  19177. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19178. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  19179. * returns a pointer to new structure on success and NULL on failure
  19180. */
  19181. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  19182. {
  19183. WOLFSSL_ASN1_INTEGER* a;
  19184. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  19185. DYNAMIC_TYPE_OPENSSL);
  19186. if (a == NULL) {
  19187. return NULL;
  19188. }
  19189. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  19190. a->data = a->intData;
  19191. a->isDynamic = 0;
  19192. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  19193. a->length = 0;
  19194. return a;
  19195. }
  19196. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  19197. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  19198. {
  19199. if (in != NULL) {
  19200. if (in->isDynamic) {
  19201. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19202. }
  19203. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  19204. }
  19205. }
  19206. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  19207. * src : WOLFSSL_ASN1_INTEGER to duplicate
  19208. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  19209. */
  19210. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  19211. {
  19212. WOLFSSL_ASN1_INTEGER* copy;
  19213. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  19214. if (!src)
  19215. return NULL;
  19216. copy = wolfSSL_ASN1_INTEGER_new();
  19217. if (copy == NULL)
  19218. return NULL;
  19219. copy->negative = src->negative;
  19220. copy->dataMax = src->dataMax;
  19221. copy->isDynamic = src->isDynamic;
  19222. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19223. copy->length = src->length;
  19224. #endif
  19225. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  19226. if (copy->isDynamic && src->data && copy->dataMax) {
  19227. copy->data = (unsigned char*)
  19228. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  19229. if (copy->data == NULL) {
  19230. wolfSSL_ASN1_INTEGER_free(copy);
  19231. return NULL;
  19232. }
  19233. XMEMCPY(copy->data, src->data, copy->dataMax);
  19234. }
  19235. return copy;
  19236. }
  19237. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  19238. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  19239. {
  19240. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  19241. int j;
  19242. unsigned int i = 0;
  19243. unsigned char tmp[sizeof(long)+1] = {0};
  19244. int pad = 0;
  19245. if (a != NULL) {
  19246. /* dynamically create data buffer, +2 for type and length */
  19247. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  19248. DYNAMIC_TYPE_OPENSSL);
  19249. if (a->data == NULL) {
  19250. wolfSSL_ASN1_INTEGER_free(a);
  19251. ret = WOLFSSL_FAILURE;
  19252. }
  19253. else {
  19254. a->dataMax = (int)(sizeof(long)+1) + 2;
  19255. a->isDynamic = 1;
  19256. }
  19257. }
  19258. else {
  19259. /* Invalid parameter */
  19260. ret = WOLFSSL_FAILURE;
  19261. }
  19262. if (ret != WOLFSSL_FAILURE) {
  19263. /* Set type */
  19264. a->data[i++] = ASN_INTEGER;
  19265. /* Check for negative */
  19266. if (v < 0) {
  19267. a->negative = 1;
  19268. v *= -1;
  19269. }
  19270. /* Create char buffer */
  19271. for (j = 0; j < (int)sizeof(long); j++) {
  19272. if (v == 0) {
  19273. break;
  19274. }
  19275. tmp[j] = (unsigned char)(v & 0xff);
  19276. v >>= 8;
  19277. }
  19278. /* 0 pad to indicate positive number when top bit set. */
  19279. if ((!a->negative) && (j > 0) && (tmp[j-1] & 0x80)) {
  19280. pad = 1;
  19281. }
  19282. /* Set length */
  19283. a->data[i++] = (unsigned char)(((j == 0) ? ++j : j) + pad);
  19284. /* +2 for type and length */
  19285. a->length = j + pad + 2;
  19286. /* Add padding if required. */
  19287. if (pad) {
  19288. a->data[i++] = 0;
  19289. }
  19290. /* Copy to data */
  19291. for (; j > 0; j--) {
  19292. a->data[i++] = tmp[j-1];
  19293. }
  19294. }
  19295. return ret;
  19296. }
  19297. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19298. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  19299. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  19300. #ifndef NO_ASN_TIME
  19301. #ifndef NO_BIO
  19302. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  19303. {
  19304. char buf[MAX_TIME_STRING_SZ];
  19305. int ret = WOLFSSL_SUCCESS;
  19306. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  19307. if (bio == NULL || asnTime == NULL) {
  19308. WOLFSSL_MSG("NULL function argument");
  19309. return WOLFSSL_FAILURE;
  19310. }
  19311. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  19312. sizeof(buf)) == NULL) {
  19313. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  19314. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  19315. ret = WOLFSSL_FAILURE;
  19316. }
  19317. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  19318. WOLFSSL_MSG("Unable to write to bio");
  19319. return WOLFSSL_FAILURE;
  19320. }
  19321. return ret;
  19322. }
  19323. #endif /* !NO_BIO */
  19324. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  19325. {
  19326. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  19327. if (t == NULL || buf == NULL || len < 5) {
  19328. WOLFSSL_MSG("Bad argument");
  19329. return NULL;
  19330. }
  19331. if (t->length > len) {
  19332. WOLFSSL_MSG("Length of date is longer then buffer");
  19333. return NULL;
  19334. }
  19335. if (!GetTimeString(t->data, t->type, buf, len)) {
  19336. return NULL;
  19337. }
  19338. return buf;
  19339. }
  19340. /* Converts a WOLFSSL_ASN1_TIME to a struct tm. Returns WOLFSSL_SUCCESS on
  19341. * success and WOLFSSL_FAILURE on failure. */
  19342. static int Asn1TimeToTm(WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  19343. {
  19344. unsigned char* asn1TimeBuf;
  19345. int asn1TimeBufLen;
  19346. int i = 0;
  19347. int bytesNeeded = 11;
  19348. if (asnTime == NULL) {
  19349. WOLFSSL_MSG("asnTime is NULL");
  19350. return WOLFSSL_FAILURE;
  19351. }
  19352. if (tm == NULL) {
  19353. WOLFSSL_MSG("tm is NULL");
  19354. return WOLFSSL_FAILURE;
  19355. }
  19356. asn1TimeBuf = wolfSSL_ASN1_TIME_get_data(asnTime);
  19357. if (asn1TimeBuf == NULL) {
  19358. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer.");
  19359. return WOLFSSL_FAILURE;
  19360. }
  19361. asn1TimeBufLen = wolfSSL_ASN1_TIME_get_length(asnTime);
  19362. if (asn1TimeBufLen <= 0) {
  19363. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer length.");
  19364. return WOLFSSL_FAILURE;
  19365. }
  19366. XMEMSET(tm, 0, sizeof(struct tm));
  19367. /* Convert ASN1_time to struct tm */
  19368. /* Check type */
  19369. if (asnTime->type == ASN_UTC_TIME) {
  19370. /* 2-digit year */
  19371. bytesNeeded += 2;
  19372. if (bytesNeeded > asn1TimeBufLen) {
  19373. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  19374. return WOLFSSL_FAILURE;
  19375. }
  19376. if (asn1TimeBuf[bytesNeeded-1] != 'Z') {
  19377. WOLFSSL_MSG("Expecting UTC time.");
  19378. return WOLFSSL_FAILURE;
  19379. }
  19380. tm->tm_year = (asn1TimeBuf[i] - '0') * 10; i++;
  19381. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  19382. if (tm->tm_year < 70) {
  19383. tm->tm_year += 100;
  19384. }
  19385. }
  19386. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  19387. /* 4-digit year */
  19388. bytesNeeded += 4;
  19389. if (bytesNeeded > asn1TimeBufLen) {
  19390. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  19391. return WOLFSSL_FAILURE;
  19392. }
  19393. if (asn1TimeBuf[bytesNeeded-1] != 'Z') {
  19394. WOLFSSL_MSG("Expecting UTC time.");
  19395. return WOLFSSL_FAILURE;
  19396. }
  19397. tm->tm_year = (asn1TimeBuf[i] - '0') * 1000; i++;
  19398. tm->tm_year += (asn1TimeBuf[i] - '0') * 100; i++;
  19399. tm->tm_year += (asn1TimeBuf[i] - '0') * 10; i++;
  19400. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  19401. tm->tm_year -= 1900;
  19402. }
  19403. else {
  19404. WOLFSSL_MSG("asnTime->type is invalid.");
  19405. return WOLFSSL_FAILURE;
  19406. }
  19407. tm->tm_mon = (asn1TimeBuf[i] - '0') * 10; i++;
  19408. tm->tm_mon += (asn1TimeBuf[i] - '0') - 1; i++; /* January is 0 not 1 */
  19409. tm->tm_mday = (asn1TimeBuf[i] - '0') * 10; i++;
  19410. tm->tm_mday += (asn1TimeBuf[i] - '0'); i++;
  19411. tm->tm_hour = (asn1TimeBuf[i] - '0') * 10; i++;
  19412. tm->tm_hour += (asn1TimeBuf[i] - '0'); i++;
  19413. tm->tm_min = (asn1TimeBuf[i] - '0') * 10; i++;
  19414. tm->tm_min += (asn1TimeBuf[i] - '0'); i++;
  19415. tm->tm_sec = (asn1TimeBuf[i] - '0') * 10; i++;
  19416. tm->tm_sec += (asn1TimeBuf[i] - '0');
  19417. #ifdef XMKTIME
  19418. /* Call XMKTIME on tm to get the tm_wday and tm_yday fields populated. */
  19419. XMKTIME(tm);
  19420. #endif
  19421. return WOLFSSL_SUCCESS;
  19422. }
  19423. int wolfSSL_ASN1_TIME_to_tm(const WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  19424. {
  19425. time_t currentTime;
  19426. struct tm *tmpTs;
  19427. #if defined(NEED_TMP_TIME)
  19428. /* for use with gmtime_r */
  19429. struct tm tmpTimeStorage;
  19430. tmpTs = &tmpTimeStorage;
  19431. #else
  19432. tmpTs = NULL;
  19433. #endif
  19434. (void)tmpTs;
  19435. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_tm");
  19436. /* If asnTime is NULL, then the current time is converted. */
  19437. if (asnTime == NULL) {
  19438. if (tm == NULL) {
  19439. WOLFSSL_MSG("asnTime and tm are both NULL");
  19440. return WOLFSSL_FAILURE;
  19441. }
  19442. currentTime = wc_Time(0);
  19443. if (currentTime <= 0) {
  19444. WOLFSSL_MSG("Failed to get current time.");
  19445. return WOLFSSL_FAILURE;
  19446. }
  19447. tm = XGMTIME(&currentTime, tmpTs);
  19448. if (tm == NULL) {
  19449. WOLFSSL_MSG("Failed to convert current time to UTC.");
  19450. return WOLFSSL_FAILURE;
  19451. }
  19452. return WOLFSSL_SUCCESS;
  19453. }
  19454. /* If tm is NULL this function performs a format check on asnTime only. */
  19455. if (tm == NULL) {
  19456. return wolfSSL_ASN1_TIME_check(asnTime);
  19457. }
  19458. return Asn1TimeToTm((WOLFSSL_ASN1_TIME*)asnTime, tm);
  19459. }
  19460. #endif /* !NO_ASN_TIME */
  19461. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  19462. OPENSSL_EXTRA*/
  19463. #ifdef OPENSSL_EXTRA
  19464. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  19465. const WOLFSSL_ASN1_INTEGER* b)
  19466. {
  19467. int ret = 0;
  19468. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_cmp");
  19469. if (a == NULL || b == NULL) {
  19470. WOLFSSL_MSG("Bad parameter.");
  19471. ret = WOLFSSL_FATAL_ERROR;
  19472. }
  19473. if (ret == 0 && ((a->length != b->length) ||
  19474. ((a->negative == 0) != (b->negative == 0)))) {
  19475. ret = WOLFSSL_FATAL_ERROR;
  19476. }
  19477. if (ret == 0) {
  19478. ret = XMEMCMP(a->data, b->data, a->length);
  19479. }
  19480. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_cmp", ret);
  19481. return ret;
  19482. }
  19483. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* a)
  19484. {
  19485. long ret = 1;
  19486. WOLFSSL_BIGNUM* bn = NULL;
  19487. WOLFSSL_ENTER("ASN1_INTEGER_get");
  19488. if (a == NULL) {
  19489. /* OpenSSL returns 0 when a is NULL and -1 if there is an error. Quoting
  19490. * the documentation:
  19491. *
  19492. * "ASN1_INTEGER_get() also returns the value of a but it returns 0 if a
  19493. * is NULL and -1 on error (which is ambiguous because -1 is a
  19494. * legitimate value for an ASN1_INTEGER). New applications should use
  19495. * ASN1_INTEGER_get_int64() instead."
  19496. * */
  19497. ret = 0;
  19498. }
  19499. if (ret > 0) {
  19500. bn = wolfSSL_ASN1_INTEGER_to_BN(a, NULL);
  19501. if (bn == NULL) {
  19502. ret = -1;
  19503. }
  19504. }
  19505. if (ret > 0) {
  19506. ret = wolfSSL_BN_get_word(bn);
  19507. if (a->negative == 1) {
  19508. ret = -ret;
  19509. }
  19510. }
  19511. if (bn != NULL) {
  19512. wolfSSL_BN_free(bn);
  19513. }
  19514. WOLFSSL_LEAVE("ASN1_INTEGER_get", (int)ret);
  19515. return ret;
  19516. }
  19517. #endif /* OPENSSL_EXTRA */
  19518. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19519. /* Gets an index to store SSL structure at.
  19520. *
  19521. * Returns positive index on success and negative values on failure
  19522. */
  19523. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  19524. {
  19525. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  19526. /* store SSL at index 0 */
  19527. return 0;
  19528. }
  19529. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19530. #ifdef OPENSSL_EXTRA
  19531. /* Sets a function callback that will send information about the state of all
  19532. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  19533. * in.
  19534. *
  19535. * ctx WOLFSSL_CTX structure to set callback function in
  19536. * f callback function to use
  19537. */
  19538. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  19539. void (*f)(const WOLFSSL* ssl, int type, int val))
  19540. {
  19541. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  19542. if (ctx == NULL) {
  19543. WOLFSSL_MSG("Bad function argument");
  19544. }
  19545. else {
  19546. ctx->CBIS = f;
  19547. }
  19548. }
  19549. unsigned long wolfSSL_ERR_peek_error(void)
  19550. {
  19551. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  19552. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  19553. }
  19554. int wolfSSL_ERR_GET_LIB(unsigned long err)
  19555. {
  19556. unsigned long value;
  19557. value = (err & 0xFFFFFFL);
  19558. switch (value) {
  19559. case -SSL_R_HTTP_REQUEST:
  19560. return ERR_LIB_SSL;
  19561. case PEM_R_NO_START_LINE:
  19562. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  19563. case PEM_R_BAD_PASSWORD_READ:
  19564. case PEM_R_BAD_DECRYPT:
  19565. return ERR_LIB_PEM;
  19566. case EVP_R_BAD_DECRYPT:
  19567. case EVP_R_BN_DECODE_ERROR:
  19568. case EVP_R_DECODE_ERROR:
  19569. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  19570. return ERR_LIB_EVP;
  19571. case ASN1_R_HEADER_TOO_LONG:
  19572. return ERR_LIB_ASN1;
  19573. default:
  19574. return 0;
  19575. }
  19576. }
  19577. /* This function is to find global error values that are the same through out
  19578. * all library version. With wolfSSL having only one set of error codes the
  19579. * return value is pretty straight forward. The only thing needed is all wolfSSL
  19580. * error values are typically negative.
  19581. *
  19582. * Returns the error reason
  19583. */
  19584. int wolfSSL_ERR_GET_REASON(unsigned long err)
  19585. {
  19586. int ret = (int)err;
  19587. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  19588. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  19589. /* Nginx looks for this error to know to stop parsing certificates. */
  19590. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  19591. return PEM_R_NO_START_LINE;
  19592. if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST))
  19593. return SSL_R_HTTP_REQUEST;
  19594. #endif
  19595. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  19596. if (err == ((ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG))
  19597. return ASN1_R_HEADER_TOO_LONG;
  19598. #endif
  19599. /* check if error value is in range of wolfSSL errors */
  19600. ret = 0 - ret; /* setting as negative value */
  19601. /* wolfCrypt range is less than MAX (-100)
  19602. wolfSSL range is MIN (-300) and lower */
  19603. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  19604. return ret;
  19605. }
  19606. else {
  19607. WOLFSSL_MSG("Not in range of typical error values");
  19608. ret = (int)err;
  19609. }
  19610. return ret;
  19611. }
  19612. /* returns a string that describes the alert
  19613. *
  19614. * alertID the alert value to look up
  19615. */
  19616. const char* wolfSSL_alert_type_string_long(int alertID)
  19617. {
  19618. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  19619. return AlertTypeToString(alertID);
  19620. }
  19621. const char* wolfSSL_alert_desc_string_long(int alertID)
  19622. {
  19623. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  19624. return AlertTypeToString(alertID);
  19625. }
  19626. #define STATE_STRINGS_PROTO(s) \
  19627. { \
  19628. {"SSLv3 " s, \
  19629. "SSLv3 " s, \
  19630. "SSLv3 " s}, \
  19631. {"TLSv1 " s, \
  19632. "TLSv1 " s, \
  19633. "TLSv1 " s}, \
  19634. {"TLSv1_1 " s, \
  19635. "TLSv1_1 " s, \
  19636. "TLSv1_1 " s}, \
  19637. {"TLSv1_2 " s, \
  19638. "TLSv1_2 " s, \
  19639. "TLSv1_2 " s}, \
  19640. {"TLSv1_3 " s, \
  19641. "TLSv1_3 " s, \
  19642. "TLSv1_3 " s}, \
  19643. {"DTLSv1 " s, \
  19644. "DTLSv1 " s, \
  19645. "DTLSv1 " s}, \
  19646. {"DTLSv1_2 " s, \
  19647. "DTLSv1_2 " s, \
  19648. "DTLSv1_2 " s}, \
  19649. {"DTLSv1_3 " s, \
  19650. "DTLSv1_3 " s, \
  19651. "DTLSv1_3 " s}, \
  19652. }
  19653. #define STATE_STRINGS_PROTO_RW(s) \
  19654. { \
  19655. {"SSLv3 read " s, \
  19656. "SSLv3 write " s, \
  19657. "SSLv3 " s}, \
  19658. {"TLSv1 read " s, \
  19659. "TLSv1 write " s, \
  19660. "TLSv1 " s}, \
  19661. {"TLSv1_1 read " s, \
  19662. "TLSv1_1 write " s, \
  19663. "TLSv1_1 " s}, \
  19664. {"TLSv1_2 read " s, \
  19665. "TLSv1_2 write " s, \
  19666. "TLSv1_2 " s}, \
  19667. {"TLSv1_3 read " s, \
  19668. "TLSv1_3 write " s, \
  19669. "TLSv1_3 " s}, \
  19670. {"DTLSv1 read " s, \
  19671. "DTLSv1 write " s, \
  19672. "DTLSv1 " s}, \
  19673. {"DTLSv1_2 read " s, \
  19674. "DTLSv1_2 write " s, \
  19675. "DTLSv1_2 " s}, \
  19676. {"DTLSv1_3 read " s, \
  19677. "DTLSv1_3 write " s, \
  19678. "DTLSv1_3 " s}, \
  19679. }
  19680. /* Gets the current state of the WOLFSSL structure
  19681. *
  19682. * ssl WOLFSSL structure to get state of
  19683. *
  19684. * Returns a human readable string of the WOLFSSL structure state
  19685. */
  19686. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  19687. {
  19688. static const char* OUTPUT_STR[24][8][3] = {
  19689. STATE_STRINGS_PROTO("Initialization"),
  19690. STATE_STRINGS_PROTO_RW("Server Hello Request"),
  19691. STATE_STRINGS_PROTO_RW("Server Hello Verify Request"),
  19692. STATE_STRINGS_PROTO_RW("Server Hello Retry Request"),
  19693. STATE_STRINGS_PROTO_RW("Server Hello"),
  19694. STATE_STRINGS_PROTO_RW("Server Certificate Status"),
  19695. STATE_STRINGS_PROTO_RW("Server Encrypted Extensions"),
  19696. STATE_STRINGS_PROTO_RW("Server Session Ticket"),
  19697. STATE_STRINGS_PROTO_RW("Server Certificate Request"),
  19698. STATE_STRINGS_PROTO_RW("Server Cert"),
  19699. STATE_STRINGS_PROTO_RW("Server Key Exchange"),
  19700. STATE_STRINGS_PROTO_RW("Server Hello Done"),
  19701. STATE_STRINGS_PROTO_RW("Server Change CipherSpec"),
  19702. STATE_STRINGS_PROTO_RW("Server Finished"),
  19703. STATE_STRINGS_PROTO_RW("server Key Update"),
  19704. STATE_STRINGS_PROTO_RW("Client Hello"),
  19705. STATE_STRINGS_PROTO_RW("Client Key Exchange"),
  19706. STATE_STRINGS_PROTO_RW("Client Cert"),
  19707. STATE_STRINGS_PROTO_RW("Client Change CipherSpec"),
  19708. STATE_STRINGS_PROTO_RW("Client Certificate Verify"),
  19709. STATE_STRINGS_PROTO_RW("Client End Of Early Data"),
  19710. STATE_STRINGS_PROTO_RW("Client Finished"),
  19711. STATE_STRINGS_PROTO_RW("Client Key Update"),
  19712. STATE_STRINGS_PROTO("Handshake Done"),
  19713. };
  19714. enum ProtocolVer {
  19715. SSL_V3 = 0,
  19716. TLS_V1,
  19717. TLS_V1_1,
  19718. TLS_V1_2,
  19719. TLS_V1_3,
  19720. DTLS_V1,
  19721. DTLS_V1_2,
  19722. DTLS_V1_3,
  19723. UNKNOWN = 100
  19724. };
  19725. enum IOMode {
  19726. SS_READ = 0,
  19727. SS_WRITE,
  19728. SS_NEITHER
  19729. };
  19730. enum SslState {
  19731. ss_null_state = 0,
  19732. ss_server_hellorequest,
  19733. ss_server_helloverify,
  19734. ss_server_helloretryrequest,
  19735. ss_server_hello,
  19736. ss_server_certificatestatus,
  19737. ss_server_encryptedextensions,
  19738. ss_server_sessionticket,
  19739. ss_server_certrequest,
  19740. ss_server_cert,
  19741. ss_server_keyexchange,
  19742. ss_server_hellodone,
  19743. ss_server_changecipherspec,
  19744. ss_server_finished,
  19745. ss_server_keyupdate,
  19746. ss_client_hello,
  19747. ss_client_keyexchange,
  19748. ss_client_cert,
  19749. ss_client_changecipherspec,
  19750. ss_client_certverify,
  19751. ss_client_endofearlydata,
  19752. ss_client_finished,
  19753. ss_client_keyupdate,
  19754. ss_handshake_done
  19755. };
  19756. int protocol = 0;
  19757. int cbmode = 0;
  19758. int state = 0;
  19759. WOLFSSL_ENTER("wolfSSL_state_string_long");
  19760. if (ssl == NULL) {
  19761. WOLFSSL_MSG("Null argument passed in");
  19762. return NULL;
  19763. }
  19764. /* Get state of callback */
  19765. if (ssl->cbmode == SSL_CB_MODE_WRITE) {
  19766. cbmode = SS_WRITE;
  19767. }
  19768. else if (ssl->cbmode == SSL_CB_MODE_READ) {
  19769. cbmode = SS_READ;
  19770. }
  19771. else {
  19772. cbmode = SS_NEITHER;
  19773. }
  19774. /* Get protocol version */
  19775. switch (ssl->version.major) {
  19776. case SSLv3_MAJOR:
  19777. switch (ssl->version.minor) {
  19778. case SSLv3_MINOR:
  19779. protocol = SSL_V3;
  19780. break;
  19781. case TLSv1_MINOR:
  19782. protocol = TLS_V1;
  19783. break;
  19784. case TLSv1_1_MINOR:
  19785. protocol = TLS_V1_1;
  19786. break;
  19787. case TLSv1_2_MINOR:
  19788. protocol = TLS_V1_2;
  19789. break;
  19790. case TLSv1_3_MINOR:
  19791. protocol = TLS_V1_3;
  19792. break;
  19793. default:
  19794. protocol = UNKNOWN;
  19795. }
  19796. break;
  19797. case DTLS_MAJOR:
  19798. switch (ssl->version.minor) {
  19799. case DTLS_MINOR:
  19800. protocol = DTLS_V1;
  19801. break;
  19802. case DTLSv1_2_MINOR:
  19803. protocol = DTLS_V1_2;
  19804. break;
  19805. case DTLSv1_3_MINOR:
  19806. protocol = DTLS_V1_3;
  19807. break;
  19808. default:
  19809. protocol = UNKNOWN;
  19810. }
  19811. break;
  19812. default:
  19813. protocol = UNKNOWN;
  19814. }
  19815. /* accept process */
  19816. if (ssl->cbmode == SSL_CB_MODE_READ) {
  19817. state = ssl->cbtype;
  19818. switch (state) {
  19819. case hello_request:
  19820. state = ss_server_hellorequest;
  19821. break;
  19822. case client_hello:
  19823. state = ss_client_hello;
  19824. break;
  19825. case server_hello:
  19826. state = ss_server_hello;
  19827. break;
  19828. case hello_verify_request:
  19829. state = ss_server_helloverify;
  19830. break;
  19831. case session_ticket:
  19832. state = ss_server_sessionticket;
  19833. break;
  19834. case end_of_early_data:
  19835. state = ss_client_endofearlydata;
  19836. break;
  19837. case hello_retry_request:
  19838. state = ss_server_helloretryrequest;
  19839. break;
  19840. case encrypted_extensions:
  19841. state = ss_server_encryptedextensions;
  19842. break;
  19843. case certificate:
  19844. if (ssl->options.side == WOLFSSL_SERVER_END)
  19845. state = ss_client_cert;
  19846. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  19847. state = ss_server_cert;
  19848. else {
  19849. WOLFSSL_MSG("Unknown State");
  19850. state = ss_null_state;
  19851. }
  19852. break;
  19853. case server_key_exchange:
  19854. state = ss_server_keyexchange;
  19855. break;
  19856. case certificate_request:
  19857. state = ss_server_certrequest;
  19858. break;
  19859. case server_hello_done:
  19860. state = ss_server_hellodone;
  19861. break;
  19862. case certificate_verify:
  19863. state = ss_client_certverify;
  19864. break;
  19865. case client_key_exchange:
  19866. state = ss_client_keyexchange;
  19867. break;
  19868. case finished:
  19869. if (ssl->options.side == WOLFSSL_SERVER_END)
  19870. state = ss_client_finished;
  19871. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  19872. state = ss_server_finished;
  19873. else {
  19874. WOLFSSL_MSG("Unknown State");
  19875. state = ss_null_state;
  19876. }
  19877. break;
  19878. case certificate_status:
  19879. state = ss_server_certificatestatus;
  19880. break;
  19881. case key_update:
  19882. if (ssl->options.side == WOLFSSL_SERVER_END)
  19883. state = ss_client_keyupdate;
  19884. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  19885. state = ss_server_keyupdate;
  19886. else {
  19887. WOLFSSL_MSG("Unknown State");
  19888. state = ss_null_state;
  19889. }
  19890. break;
  19891. case change_cipher_hs:
  19892. if (ssl->options.side == WOLFSSL_SERVER_END)
  19893. state = ss_client_changecipherspec;
  19894. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  19895. state = ss_server_changecipherspec;
  19896. else {
  19897. WOLFSSL_MSG("Unknown State");
  19898. state = ss_null_state;
  19899. }
  19900. break;
  19901. default:
  19902. WOLFSSL_MSG("Unknown State");
  19903. state = ss_null_state;
  19904. }
  19905. }
  19906. else {
  19907. /* Send process */
  19908. if (ssl->options.side == WOLFSSL_SERVER_END)
  19909. state = ssl->options.serverState;
  19910. else
  19911. state = ssl->options.clientState;
  19912. switch (state) {
  19913. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  19914. state = ss_server_helloverify;
  19915. break;
  19916. case SERVER_HELLO_RETRY_REQUEST_COMPLETE:
  19917. state = ss_server_helloretryrequest;
  19918. break;
  19919. case SERVER_HELLO_COMPLETE:
  19920. state = ss_server_hello;
  19921. break;
  19922. case SERVER_ENCRYPTED_EXTENSIONS_COMPLETE:
  19923. state = ss_server_encryptedextensions;
  19924. break;
  19925. case SERVER_CERT_COMPLETE:
  19926. state = ss_server_cert;
  19927. break;
  19928. case SERVER_KEYEXCHANGE_COMPLETE:
  19929. state = ss_server_keyexchange;
  19930. break;
  19931. case SERVER_HELLODONE_COMPLETE:
  19932. state = ss_server_hellodone;
  19933. break;
  19934. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  19935. state = ss_server_changecipherspec;
  19936. break;
  19937. case SERVER_FINISHED_COMPLETE:
  19938. state = ss_server_finished;
  19939. break;
  19940. case CLIENT_HELLO_RETRY:
  19941. case CLIENT_HELLO_COMPLETE:
  19942. state = ss_client_hello;
  19943. break;
  19944. case CLIENT_KEYEXCHANGE_COMPLETE:
  19945. state = ss_client_keyexchange;
  19946. break;
  19947. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  19948. state = ss_client_changecipherspec;
  19949. break;
  19950. case CLIENT_FINISHED_COMPLETE:
  19951. state = ss_client_finished;
  19952. break;
  19953. case HANDSHAKE_DONE:
  19954. state = ss_handshake_done;
  19955. break;
  19956. default:
  19957. WOLFSSL_MSG("Unknown State");
  19958. state = ss_null_state;
  19959. }
  19960. }
  19961. if (protocol == UNKNOWN) {
  19962. WOLFSSL_MSG("Unknown protocol");
  19963. return "";
  19964. }
  19965. else {
  19966. return OUTPUT_STR[state][protocol][cbmode];
  19967. }
  19968. }
  19969. /*
  19970. * Sets default PEM callback password if null is passed into
  19971. * the callback parameter of a PEM_read_bio_* function.
  19972. *
  19973. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  19974. */
  19975. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  19976. {
  19977. int sz;
  19978. (void)w;
  19979. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  19980. /* We assume that the user passes a default password as userdata */
  19981. if (key) {
  19982. sz = (int)XSTRLEN((const char*)key);
  19983. sz = (sz > num) ? num : sz;
  19984. XMEMCPY(name, key, sz);
  19985. return sz;
  19986. } else {
  19987. WOLFSSL_MSG("Error, default password cannot be created.");
  19988. return WOLFSSL_FAILURE;
  19989. }
  19990. }
  19991. #endif /* OPENSSL_EXTRA */
  19992. static long wolf_set_options(long old_op, long op)
  19993. {
  19994. /* if SSL_OP_ALL then turn all bug workarounds on */
  19995. if ((op & WOLFSSL_OP_ALL) == WOLFSSL_OP_ALL) {
  19996. WOLFSSL_MSG("\tSSL_OP_ALL");
  19997. }
  19998. /* by default cookie exchange is on with DTLS */
  19999. if ((op & WOLFSSL_OP_COOKIE_EXCHANGE) == WOLFSSL_OP_COOKIE_EXCHANGE) {
  20000. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  20001. }
  20002. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  20003. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  20004. }
  20005. #ifdef SSL_OP_NO_TLSv1_3
  20006. if ((op & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  20007. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  20008. }
  20009. #endif
  20010. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  20011. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  20012. }
  20013. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  20014. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  20015. }
  20016. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  20017. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  20018. }
  20019. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  20020. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  20021. }
  20022. if ((op & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) ==
  20023. WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  20024. WOLFSSL_MSG("\tWOLFSSL_OP_CIPHER_SERVER_PREFERENCE");
  20025. }
  20026. if ((op & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  20027. #ifdef HAVE_LIBZ
  20028. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  20029. #else
  20030. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  20031. #endif
  20032. }
  20033. return old_op | op;
  20034. }
  20035. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  20036. {
  20037. word16 haveRSA = 1;
  20038. word16 havePSK = 0;
  20039. int keySz = 0;
  20040. WOLFSSL_ENTER("wolfSSL_set_options");
  20041. if (ssl == NULL) {
  20042. return 0;
  20043. }
  20044. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  20045. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  20046. if (ssl->version.minor == TLSv1_3_MINOR)
  20047. ssl->version.minor = TLSv1_2_MINOR;
  20048. }
  20049. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  20050. if (ssl->version.minor == TLSv1_2_MINOR)
  20051. ssl->version.minor = TLSv1_1_MINOR;
  20052. }
  20053. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  20054. if (ssl->version.minor == TLSv1_1_MINOR)
  20055. ssl->version.minor = TLSv1_MINOR;
  20056. }
  20057. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  20058. if (ssl->version.minor == TLSv1_MINOR)
  20059. ssl->version.minor = SSLv3_MINOR;
  20060. }
  20061. if ((ssl->options.mask & WOLFSSL_OP_NO_COMPRESSION)
  20062. == WOLFSSL_OP_NO_COMPRESSION) {
  20063. #ifdef HAVE_LIBZ
  20064. ssl->options.usingCompression = 0;
  20065. #endif
  20066. }
  20067. /* in the case of a version change the cipher suites should be reset */
  20068. #ifndef NO_PSK
  20069. havePSK = ssl->options.havePSK;
  20070. #endif
  20071. #ifdef NO_RSA
  20072. haveRSA = 0;
  20073. #endif
  20074. #ifndef NO_CERTS
  20075. keySz = ssl->buffers.keySz;
  20076. #endif
  20077. if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
  20078. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  20079. ssl->options.haveDH, ssl->options.haveECDSAsig,
  20080. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  20081. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  20082. ssl->options.haveAnon, TRUE, ssl->options.side);
  20083. return ssl->options.mask;
  20084. }
  20085. long wolfSSL_get_options(const WOLFSSL* ssl)
  20086. {
  20087. WOLFSSL_ENTER("wolfSSL_get_options");
  20088. if(ssl == NULL)
  20089. return WOLFSSL_FAILURE;
  20090. return ssl->options.mask;
  20091. }
  20092. #if defined(HAVE_SECURE_RENEGOTIATION) \
  20093. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  20094. /* clears the counter for number of renegotiations done
  20095. * returns the current count before it is cleared */
  20096. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  20097. {
  20098. long total;
  20099. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  20100. if (s == NULL)
  20101. return 0;
  20102. total = s->secure_rene_count;
  20103. s->secure_rene_count = 0;
  20104. return total;
  20105. }
  20106. /* return the number of renegotiations since wolfSSL_new */
  20107. long wolfSSL_total_renegotiations(WOLFSSL *s)
  20108. {
  20109. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  20110. return wolfSSL_num_renegotiations(s);
  20111. }
  20112. /* return the number of renegotiations since wolfSSL_new */
  20113. long wolfSSL_num_renegotiations(WOLFSSL* s)
  20114. {
  20115. if (s == NULL) {
  20116. return 0;
  20117. }
  20118. return s->secure_rene_count;
  20119. }
  20120. /* Is there a renegotiation currently in progress? */
  20121. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  20122. {
  20123. return s && s->options.handShakeDone &&
  20124. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  20125. }
  20126. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  20127. #ifdef OPENSSL_EXTRA
  20128. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  20129. {
  20130. WOLFSSL_ENTER("SSL_clear_options");
  20131. if(ssl == NULL)
  20132. return WOLFSSL_FAILURE;
  20133. ssl->options.mask &= ~opt;
  20134. return ssl->options.mask;
  20135. }
  20136. #ifdef HAVE_PK_CALLBACKS
  20137. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  20138. {
  20139. if (ssl == NULL) {
  20140. return WOLFSSL_FAILURE;
  20141. }
  20142. ssl->loggingCtx = arg;
  20143. return WOLFSSL_SUCCESS;
  20144. }
  20145. #endif /* HAVE_PK_CALLBACKS */
  20146. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  20147. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  20148. {
  20149. sess = ClientSessionToSession(sess);
  20150. return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  20151. }
  20152. #endif
  20153. /*** TBD ***/
  20154. #ifndef NO_WOLFSSL_STUB
  20155. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  20156. {
  20157. (void)st;
  20158. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  20159. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  20160. return WOLFSSL_FAILURE;
  20161. }
  20162. #endif
  20163. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  20164. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  20165. {
  20166. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  20167. if (s == NULL){
  20168. return BAD_FUNC_ARG;
  20169. }
  20170. if (type == TLSEXT_STATUSTYPE_ocsp){
  20171. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  20172. s->heap, s->devId);
  20173. return (long)r;
  20174. } else {
  20175. WOLFSSL_MSG(
  20176. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  20177. return SSL_FAILURE;
  20178. }
  20179. }
  20180. long wolfSSL_get_tlsext_status_type(WOLFSSL *s)
  20181. {
  20182. TLSX* extension;
  20183. if (s == NULL)
  20184. return WOLFSSL_FATAL_ERROR;
  20185. extension = TLSX_Find(s->extensions, TLSX_STATUS_REQUEST);
  20186. return extension != NULL ? TLSEXT_STATUSTYPE_ocsp : WOLFSSL_FATAL_ERROR;
  20187. }
  20188. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  20189. #ifndef NO_WOLFSSL_STUB
  20190. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  20191. {
  20192. (void)s;
  20193. (void)arg;
  20194. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  20195. return WOLFSSL_FAILURE;
  20196. }
  20197. #endif
  20198. /*** TBD ***/
  20199. #ifndef NO_WOLFSSL_STUB
  20200. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  20201. {
  20202. (void)s;
  20203. (void)arg;
  20204. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  20205. return WOLFSSL_FAILURE;
  20206. }
  20207. #endif
  20208. /*** TBD ***/
  20209. #ifndef NO_WOLFSSL_STUB
  20210. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  20211. {
  20212. (void)s;
  20213. (void)arg;
  20214. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  20215. return WOLFSSL_FAILURE;
  20216. }
  20217. #endif
  20218. /*** TBD ***/
  20219. #ifndef NO_WOLFSSL_STUB
  20220. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  20221. {
  20222. (void)s;
  20223. (void)arg;
  20224. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  20225. return WOLFSSL_FAILURE;
  20226. }
  20227. #endif
  20228. /*** TBD ***/
  20229. #ifndef NO_WOLFSSL_STUB
  20230. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  20231. {
  20232. (void)s;
  20233. (void)sid;
  20234. (void)sid_len;
  20235. WOLFSSL_STUB("SSL_SESSION_set1_id");
  20236. return WOLFSSL_FAILURE;
  20237. }
  20238. #endif
  20239. #ifndef NO_WOLFSSL_STUB
  20240. /*** TBD ***/
  20241. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  20242. {
  20243. (void)s;
  20244. (void)sid_ctx;
  20245. (void)sid_ctx_len;
  20246. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  20247. return WOLFSSL_FAILURE;
  20248. }
  20249. #endif
  20250. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  20251. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  20252. /**
  20253. * Set `a` in a smart way.
  20254. *
  20255. * @param a Object to set
  20256. * @param type The type of object in value
  20257. * @param value Object to set
  20258. */
  20259. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  20260. {
  20261. if (!a) {
  20262. return;
  20263. }
  20264. switch (type) {
  20265. case V_ASN1_NULL:
  20266. a->value.ptr = (char *)value;
  20267. break;
  20268. case V_ASN1_SEQUENCE:
  20269. a->value.asn1_string = (WOLFSSL_ASN1_STRING*)value;
  20270. break;
  20271. case V_ASN1_OBJECT:
  20272. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  20273. break;
  20274. case V_ASN1_UTCTIME:
  20275. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  20276. break;
  20277. case V_ASN1_GENERALIZEDTIME:
  20278. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  20279. break;
  20280. default:
  20281. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  20282. return;
  20283. }
  20284. a->type = type;
  20285. }
  20286. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS */
  20287. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  20288. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) \
  20289. || defined(OPENSSL_EXTRA)
  20290. /**
  20291. * Allocate a new WOLFSSL_ASN1_TYPE object.
  20292. *
  20293. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  20294. */
  20295. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  20296. {
  20297. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  20298. NULL, DYNAMIC_TYPE_OPENSSL);
  20299. if (!ret)
  20300. return NULL;
  20301. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  20302. return ret;
  20303. }
  20304. /**
  20305. * Free WOLFSSL_ASN1_TYPE and all its members.
  20306. *
  20307. * @param at Object to free
  20308. */
  20309. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  20310. {
  20311. if (at) {
  20312. switch (at->type) {
  20313. case V_ASN1_OBJECT:
  20314. wolfSSL_ASN1_OBJECT_free(at->value.object);
  20315. break;
  20316. case V_ASN1_UTCTIME:
  20317. #ifndef NO_ASN_TIME
  20318. wolfSSL_ASN1_TIME_free(at->value.utctime);
  20319. #endif
  20320. break;
  20321. case V_ASN1_GENERALIZEDTIME:
  20322. #ifndef NO_ASN_TIME
  20323. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  20324. #endif
  20325. break;
  20326. case V_ASN1_UTF8STRING:
  20327. case V_ASN1_PRINTABLESTRING:
  20328. case V_ASN1_T61STRING:
  20329. case V_ASN1_IA5STRING:
  20330. case V_ASN1_UNIVERSALSTRING:
  20331. case V_ASN1_SEQUENCE:
  20332. wolfSSL_ASN1_STRING_free(at->value.asn1_string);
  20333. break;
  20334. default:
  20335. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  20336. break;
  20337. }
  20338. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  20339. }
  20340. }
  20341. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS
  20342. || OPENSSL_EXTRA */
  20343. #ifndef NO_WOLFSSL_STUB
  20344. /*** TBD ***/
  20345. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  20346. {
  20347. (void)ssl;
  20348. WOLFSSL_STUB("SSL_get_privatekey");
  20349. return NULL;
  20350. }
  20351. #endif
  20352. /**
  20353. * Get a textual representation of given WOLFSSL_ASN1_OBJECT then write it to
  20354. * buf at most buf_len bytes.
  20355. *
  20356. * params
  20357. * - buf: buffer where the textual representation is to be written to
  20358. * - buf_len: buffer size in bytes
  20359. * - a: WOLFSSL_ASN1_OBJECT
  20360. *
  20361. * return the string length written on success, WOLFSSL_FAILURE on failure.
  20362. */
  20363. WOLFSSL_API int wolfSSL_i2t_ASN1_OBJECT(char *buf, int buf_len,
  20364. WOLFSSL_ASN1_OBJECT *a)
  20365. {
  20366. WOLFSSL_ENTER("wolfSSL_i2t_ASN1_OBJECT");
  20367. return wolfSSL_OBJ_obj2txt(buf, buf_len, a, 0);
  20368. }
  20369. WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  20370. const unsigned char **der,
  20371. long length)
  20372. {
  20373. const unsigned char *d;
  20374. long len;
  20375. int tag, cls;
  20376. WOLFSSL_ASN1_OBJECT* ret = NULL;
  20377. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
  20378. if (!der || !*der || length <= 0) {
  20379. WOLFSSL_MSG("Bad parameter");
  20380. return NULL;
  20381. }
  20382. d = *der;
  20383. if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
  20384. WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
  20385. return NULL;
  20386. }
  20387. /* d now points to value */
  20388. if (tag != ASN_OBJECT_ID) {
  20389. WOLFSSL_MSG("Not an ASN object");
  20390. return NULL;
  20391. }
  20392. ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
  20393. if (ret)
  20394. *der = d;
  20395. return ret;
  20396. }
  20397. /**
  20398. * Parse an ASN1 encoded input and output information about the parsed object
  20399. * @param in ASN1 encoded data. *in is moved to the value of the ASN1 object
  20400. * @param len Length of parsed ASN1 object
  20401. * @param tag Tag value of parsed ASN1 object
  20402. * @param cls Class of parsed ASN1 object
  20403. * @param inLen Length of *in buffer
  20404. * @return int Depends on which bits are set in the returned int:
  20405. * 0x80 an error occurred during parsing
  20406. * 0x20 parsed object is constructed
  20407. * 0x01 the parsed object length is infinite
  20408. */
  20409. int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
  20410. int *cls, long inLen)
  20411. {
  20412. word32 inOutIdx = 0;
  20413. int l;
  20414. byte t;
  20415. int ret = 0x80;
  20416. WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
  20417. if (!in || !*in || !len || !tag || !cls || inLen == 0) {
  20418. WOLFSSL_MSG("Bad parameter");
  20419. return ret;
  20420. }
  20421. if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
  20422. WOLFSSL_MSG("GetASNTag error");
  20423. return ret;
  20424. }
  20425. if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
  20426. WOLFSSL_MSG("GetLength error");
  20427. return ret;
  20428. }
  20429. *tag = t & 0x1F; /* Tag number is 5 lsb */
  20430. *cls = t & 0xC0; /* Class is 2 msb */
  20431. *len = l;
  20432. ret = t & ASN_CONSTRUCTED;
  20433. if (l > (int)(inLen - inOutIdx)) {
  20434. /* Still return other values but indicate error in msb */
  20435. ret |= 0x80;
  20436. }
  20437. *in += inOutIdx;
  20438. return ret;
  20439. }
  20440. WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  20441. const unsigned char **pp, long len)
  20442. {
  20443. WOLFSSL_ASN1_OBJECT* ret = NULL;
  20444. WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
  20445. if (!pp || !*pp || len <= 0) {
  20446. WOLFSSL_MSG("Bad parameter");
  20447. return NULL;
  20448. }
  20449. if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
  20450. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  20451. return NULL;
  20452. }
  20453. ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  20454. if (!ret->obj) {
  20455. WOLFSSL_MSG("error allocating asn data memory");
  20456. wolfSSL_ASN1_OBJECT_free(ret);
  20457. return NULL;
  20458. }
  20459. XMEMCPY((byte*)ret->obj, *pp, len);
  20460. ret->objSz = (unsigned int)len;
  20461. ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  20462. *pp += len;
  20463. if (a)
  20464. *a = ret;
  20465. return ret;
  20466. }
  20467. #ifndef NO_BIO
  20468. /* Return number of bytes written to BIO on success. 0 on failure. */
  20469. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  20470. WOLFSSL_ASN1_OBJECT *a)
  20471. {
  20472. int length = 0;
  20473. word32 idx = 0;
  20474. const char null_str[] = "NULL";
  20475. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  20476. if (bp == NULL)
  20477. return WOLFSSL_FAILURE;
  20478. if (a == NULL) {
  20479. /* Write "NULL" */
  20480. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  20481. (int)XSTRLEN(null_str)) {
  20482. return (int)XSTRLEN(null_str);
  20483. }
  20484. else {
  20485. return WOLFSSL_FAILURE;
  20486. }
  20487. }
  20488. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  20489. WOLFSSL_MSG("Bad ASN1 Object");
  20490. return WOLFSSL_FAILURE;
  20491. }
  20492. if (GetLength((const byte*)a->obj, &idx, &length,
  20493. a->objSz) < 0 || length < 0) {
  20494. return WOLFSSL_FAILURE;
  20495. }
  20496. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  20497. return length;
  20498. }
  20499. return WOLFSSL_FAILURE;
  20500. }
  20501. #endif /* !NO_BIO */
  20502. /* Returns object data for an ASN1_OBJECT */
  20503. /* If pp is NULL then only the size is returned */
  20504. /* If pp has pointer to pointer then its used directly */
  20505. /* If pp has pointer to pointer that is NULL then new variable is allocated */
  20506. /* Failure returns WOLFSSL_FAILURE (0) */
  20507. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  20508. {
  20509. byte *p;
  20510. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  20511. if (!a || !a->obj) {
  20512. WOLFSSL_MSG("Bad parameters");
  20513. return WOLFSSL_FAILURE;
  20514. }
  20515. if (!pp)
  20516. return a->objSz;
  20517. if (*pp)
  20518. p = *pp;
  20519. else {
  20520. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  20521. if (!p) {
  20522. WOLFSSL_MSG("Bad malloc");
  20523. return WOLFSSL_FAILURE;
  20524. }
  20525. }
  20526. XMEMCPY(p, a->obj, a->objSz);
  20527. *pp = p + a->objSz;
  20528. return a->objSz;
  20529. }
  20530. #ifndef NO_WOLFSSL_STUB
  20531. /*** TBD ***/
  20532. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  20533. {
  20534. (void)ctx;
  20535. (void)dh;
  20536. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  20537. }
  20538. #endif
  20539. #ifndef NO_WOLFSSL_STUB
  20540. /*** TBD ***/
  20541. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  20542. {
  20543. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  20544. return NULL;
  20545. }
  20546. #endif
  20547. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  20548. {
  20549. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  20550. if (p == NULL) {
  20551. return WOLFSSL_FATAL_ERROR;
  20552. }
  20553. return (int)p->num;
  20554. }
  20555. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  20556. {
  20557. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  20558. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  20559. }
  20560. #if !defined(NETOS)
  20561. WOLFSSL_API void ERR_load_SSL_strings(void)
  20562. {
  20563. }
  20564. #endif
  20565. #ifdef HAVE_OCSP
  20566. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  20567. {
  20568. if (s == NULL || resp == NULL)
  20569. return 0;
  20570. *resp = s->ocspResp;
  20571. return s->ocspRespSz;
  20572. }
  20573. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  20574. {
  20575. if (s == NULL)
  20576. return WOLFSSL_FAILURE;
  20577. s->ocspResp = resp;
  20578. s->ocspRespSz = len;
  20579. return WOLFSSL_SUCCESS;
  20580. }
  20581. #endif /* HAVE_OCSP */
  20582. #ifdef HAVE_MAX_FRAGMENT
  20583. #ifndef NO_WOLFSSL_CLIENT
  20584. /**
  20585. * Set max fragment tls extension
  20586. * @param c a pointer to WOLFSSL_CTX object
  20587. * @param mode maximum fragment length mode
  20588. * @return 1 on success, otherwise 0 or negative error code
  20589. */
  20590. WOLFSSL_API int wolfSSL_CTX_set_tlsext_max_fragment_length(WOLFSSL_CTX *c,
  20591. unsigned char mode)
  20592. {
  20593. if (c == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  20594. return BAD_FUNC_ARG;
  20595. return wolfSSL_CTX_UseMaxFragment(c, mode);
  20596. }
  20597. /**
  20598. * Set max fragment tls extension
  20599. * @param c a pointer to WOLFSSL object
  20600. * @param mode maximum fragment length mode
  20601. * @return 1 on success, otherwise 0 or negative error code
  20602. */
  20603. WOLFSSL_API int wolfSSL_set_tlsext_max_fragment_length(WOLFSSL *s,
  20604. unsigned char mode)
  20605. {
  20606. if (s == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  20607. return BAD_FUNC_ARG;
  20608. return wolfSSL_UseMaxFragment(s, mode);
  20609. }
  20610. #endif /* NO_WOLFSSL_CLIENT */
  20611. #endif /* HAVE_MAX_FRAGMENT */
  20612. #endif /* OPENSSL_EXTRA */
  20613. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  20614. WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  20615. {
  20616. byte len = 0;
  20617. WOLFSSL_ENTER("SSL_get_finished");
  20618. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  20619. WOLFSSL_MSG("Bad parameter");
  20620. return WOLFSSL_FAILURE;
  20621. }
  20622. if (ssl->options.side == WOLFSSL_SERVER_END) {
  20623. len = ssl->serverFinished_len;
  20624. XMEMCPY(buf, ssl->serverFinished, len);
  20625. }
  20626. else {
  20627. len = ssl->clientFinished_len;
  20628. XMEMCPY(buf, ssl->clientFinished, len);
  20629. }
  20630. return len;
  20631. }
  20632. WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  20633. {
  20634. byte len = 0;
  20635. WOLFSSL_ENTER("SSL_get_peer_finished");
  20636. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  20637. WOLFSSL_MSG("Bad parameter");
  20638. return WOLFSSL_FAILURE;
  20639. }
  20640. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  20641. len = ssl->serverFinished_len;
  20642. XMEMCPY(buf, ssl->serverFinished, len);
  20643. }
  20644. else {
  20645. len = ssl->clientFinished_len;
  20646. XMEMCPY(buf, ssl->clientFinished, len);
  20647. }
  20648. return len;
  20649. }
  20650. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  20651. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20652. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  20653. {
  20654. if (ssl == NULL) {
  20655. return WOLFSSL_FAILURE;
  20656. }
  20657. return ssl->peerVerifyRet;
  20658. }
  20659. #endif
  20660. #ifdef OPENSSL_EXTRA
  20661. #ifndef NO_WOLFSSL_STUB
  20662. /* shows the number of accepts attempted by CTX in it's lifetime */
  20663. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  20664. {
  20665. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  20666. (void)ctx;
  20667. return 0;
  20668. }
  20669. #endif
  20670. #ifndef NO_WOLFSSL_STUB
  20671. /* shows the number of connects attempted CTX in it's lifetime */
  20672. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  20673. {
  20674. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  20675. (void)ctx;
  20676. return 0;
  20677. }
  20678. #endif
  20679. #ifndef NO_WOLFSSL_STUB
  20680. /* shows the number of accepts completed by CTX in it's lifetime */
  20681. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  20682. {
  20683. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  20684. (void)ctx;
  20685. return 0;
  20686. }
  20687. #endif
  20688. #ifndef NO_WOLFSSL_STUB
  20689. /* shows the number of connects completed by CTX in it's lifetime */
  20690. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  20691. {
  20692. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  20693. (void)ctx;
  20694. return 0;
  20695. }
  20696. #endif
  20697. #ifndef NO_WOLFSSL_STUB
  20698. /* shows the number of renegotiation accepts attempted by CTX */
  20699. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  20700. {
  20701. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  20702. (void)ctx;
  20703. return 0;
  20704. }
  20705. #endif
  20706. #ifndef NO_WOLFSSL_STUB
  20707. /* shows the number of renegotiation accepts attempted by CTX */
  20708. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  20709. {
  20710. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  20711. (void)ctx;
  20712. return 0;
  20713. }
  20714. #endif
  20715. #ifndef NO_WOLFSSL_STUB
  20716. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  20717. {
  20718. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  20719. (void)ctx;
  20720. return 0;
  20721. }
  20722. #endif
  20723. #ifndef NO_WOLFSSL_STUB
  20724. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  20725. {
  20726. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  20727. (void)ctx;
  20728. return 0;
  20729. }
  20730. #endif
  20731. #ifndef NO_WOLFSSL_STUB
  20732. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  20733. {
  20734. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  20735. (void)ctx;
  20736. return 0;
  20737. }
  20738. #endif
  20739. #ifndef NO_WOLFSSL_STUB
  20740. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  20741. {
  20742. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  20743. (void)ctx;
  20744. return 0;
  20745. }
  20746. #endif
  20747. #ifndef NO_WOLFSSL_STUB
  20748. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  20749. {
  20750. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  20751. (void)ctx;
  20752. return 0;
  20753. }
  20754. #endif
  20755. /* Return the total number of sessions */
  20756. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  20757. {
  20758. word32 total = 0;
  20759. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  20760. (void)ctx;
  20761. #if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE)
  20762. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  20763. WOLFSSL_MSG("Error getting session stats");
  20764. }
  20765. #else
  20766. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  20767. #endif
  20768. return (long)total;
  20769. }
  20770. #ifndef NO_CERTS
  20771. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  20772. {
  20773. byte* chain = NULL;
  20774. long chainSz = 0;
  20775. int derSz;
  20776. const byte* der;
  20777. int ret;
  20778. int idx = 0;
  20779. DerBuffer *derBuffer = NULL;
  20780. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  20781. if (ctx == NULL || x509 == NULL) {
  20782. WOLFSSL_MSG("Bad Argument");
  20783. return WOLFSSL_FAILURE;
  20784. }
  20785. der = wolfSSL_X509_get_der(x509, &derSz);
  20786. if (der == NULL || derSz <= 0) {
  20787. WOLFSSL_MSG("Error getting X509 DER");
  20788. return WOLFSSL_FAILURE;
  20789. }
  20790. if (ctx->certificate == NULL) {
  20791. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  20792. /* Process buffer makes first certificate the leaf. */
  20793. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  20794. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  20795. if (ret != WOLFSSL_SUCCESS) {
  20796. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  20797. return WOLFSSL_FAILURE;
  20798. }
  20799. }
  20800. else {
  20801. /* TODO: Do this elsewhere. */
  20802. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  20803. if (ret != 0) {
  20804. WOLFSSL_MSG("Memory Error");
  20805. return WOLFSSL_FAILURE;
  20806. }
  20807. XMEMCPY(derBuffer->buffer, der, derSz);
  20808. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  20809. GET_VERIFY_SETTING_CTX(ctx));
  20810. if (ret != WOLFSSL_SUCCESS) {
  20811. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  20812. return WOLFSSL_FAILURE;
  20813. }
  20814. /* adding cert to existing chain */
  20815. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  20816. chainSz += ctx->certChain->length;
  20817. }
  20818. chainSz += OPAQUE24_LEN + derSz;
  20819. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  20820. if (chain == NULL) {
  20821. WOLFSSL_MSG("Memory Error");
  20822. return WOLFSSL_FAILURE;
  20823. }
  20824. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  20825. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  20826. idx = ctx->certChain->length;
  20827. }
  20828. c32to24(derSz, chain + idx);
  20829. idx += OPAQUE24_LEN;
  20830. XMEMCPY(chain + idx, der, derSz);
  20831. idx += derSz;
  20832. #ifdef WOLFSSL_TLS13
  20833. ctx->certChainCnt++;
  20834. #endif
  20835. FreeDer(&ctx->certChain);
  20836. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  20837. if (ret == 0) {
  20838. XMEMCPY(ctx->certChain->buffer, chain, idx);
  20839. }
  20840. }
  20841. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  20842. wolfSSL_X509_free(x509);
  20843. if (chain != NULL)
  20844. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  20845. return WOLFSSL_SUCCESS;
  20846. }
  20847. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  20848. {
  20849. if (ctx == NULL || ctx->cm == NULL) {
  20850. return WOLFSSL_FAILURE;
  20851. }
  20852. ctx->cm->ocspIOCtx = arg;
  20853. return WOLFSSL_SUCCESS;
  20854. }
  20855. #endif /* NO_CERTS */
  20856. /* Get the session cache mode for CTX
  20857. *
  20858. * ctx WOLFSSL_CTX struct to get cache mode from
  20859. *
  20860. * Returns a bit mask that has the session cache mode */
  20861. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  20862. {
  20863. long m = 0;
  20864. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  20865. if (ctx == NULL) {
  20866. return m;
  20867. }
  20868. if (ctx->sessionCacheOff != 1) {
  20869. m |= SSL_SESS_CACHE_SERVER;
  20870. }
  20871. if (ctx->sessionCacheFlushOff == 1) {
  20872. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  20873. }
  20874. #ifdef HAVE_EXT_CACHE
  20875. if (ctx->internalCacheOff == 1) {
  20876. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  20877. }
  20878. if (ctx->internalCacheLookupOff == 1) {
  20879. m |= SSL_SESS_CACHE_NO_INTERNAL_LOOKUP;
  20880. }
  20881. #endif
  20882. return m;
  20883. }
  20884. int wolfSSL_get_read_ahead(const WOLFSSL* ssl)
  20885. {
  20886. if (ssl == NULL) {
  20887. return WOLFSSL_FAILURE;
  20888. }
  20889. return ssl->readAhead;
  20890. }
  20891. int wolfSSL_set_read_ahead(WOLFSSL* ssl, int v)
  20892. {
  20893. if (ssl == NULL) {
  20894. return WOLFSSL_FAILURE;
  20895. }
  20896. ssl->readAhead = (byte)v;
  20897. return WOLFSSL_SUCCESS;
  20898. }
  20899. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  20900. {
  20901. if (ctx == NULL) {
  20902. return WOLFSSL_FAILURE;
  20903. }
  20904. return ctx->readAhead;
  20905. }
  20906. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  20907. {
  20908. if (ctx == NULL) {
  20909. return WOLFSSL_FAILURE;
  20910. }
  20911. ctx->readAhead = (byte)v;
  20912. return WOLFSSL_SUCCESS;
  20913. }
  20914. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  20915. void* arg)
  20916. {
  20917. if (ctx == NULL) {
  20918. return WOLFSSL_FAILURE;
  20919. }
  20920. ctx->userPRFArg = arg;
  20921. return WOLFSSL_SUCCESS;
  20922. }
  20923. #ifndef NO_DES3
  20924. /* 0 on success */
  20925. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  20926. WOLFSSL_DES_key_schedule* key)
  20927. {
  20928. #ifdef WOLFSSL_CHECK_DESKEY
  20929. return wolfSSL_DES_set_key_checked(myDes, key);
  20930. #else
  20931. wolfSSL_DES_set_key_unchecked(myDes, key);
  20932. return 0;
  20933. #endif
  20934. }
  20935. /* return true in fail case (1) */
  20936. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  20937. {
  20938. word32 value[2];
  20939. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  20940. value[0] = mask;
  20941. value[1] = mask2;
  20942. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  20943. }
  20944. /* check that the key is odd parity and is not a weak key
  20945. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  20946. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  20947. WOLFSSL_DES_key_schedule* key)
  20948. {
  20949. if (myDes == NULL || key == NULL) {
  20950. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  20951. return -2;
  20952. }
  20953. else {
  20954. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  20955. /* sanity check before call to DES_check */
  20956. if (sz != (sizeof(word32) * 2)) {
  20957. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  20958. return -2;
  20959. }
  20960. /* check odd parity */
  20961. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  20962. WOLFSSL_MSG("Odd parity test fail");
  20963. return -1;
  20964. }
  20965. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  20966. WOLFSSL_MSG("Weak key found");
  20967. return -2;
  20968. }
  20969. /* passed tests, now copy over key */
  20970. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  20971. return 0;
  20972. }
  20973. }
  20974. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  20975. * Data Encryption Algorithm (TDEA) Block Cipher"
  20976. *
  20977. * returns 1 if is weak 0 if not
  20978. */
  20979. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  20980. {
  20981. word32 mask, mask2;
  20982. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  20983. if (key == NULL) {
  20984. WOLFSSL_MSG("NULL key passed in");
  20985. return 1;
  20986. }
  20987. mask = 0x01010101; mask2 = 0x01010101;
  20988. if (DES_check(mask, mask2, *key)) {
  20989. WOLFSSL_MSG("Weak key found");
  20990. return 1;
  20991. }
  20992. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  20993. if (DES_check(mask, mask2, *key)) {
  20994. WOLFSSL_MSG("Weak key found");
  20995. return 1;
  20996. }
  20997. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  20998. if (DES_check(mask, mask2, *key)) {
  20999. WOLFSSL_MSG("Weak key found");
  21000. return 1;
  21001. }
  21002. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  21003. if (DES_check(mask, mask2, *key)) {
  21004. WOLFSSL_MSG("Weak key found");
  21005. return 1;
  21006. }
  21007. /* semi-weak *key check (list from same Nist paper) */
  21008. mask = 0x011F011F; mask2 = 0x010E010E;
  21009. if (DES_check(mask, mask2, *key) ||
  21010. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21011. WOLFSSL_MSG("Weak key found");
  21012. return 1;
  21013. }
  21014. mask = 0x01E001E0; mask2 = 0x01F101F1;
  21015. if (DES_check(mask, mask2, *key) ||
  21016. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21017. WOLFSSL_MSG("Weak key found");
  21018. return 1;
  21019. }
  21020. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  21021. if (DES_check(mask, mask2, *key) ||
  21022. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21023. WOLFSSL_MSG("Weak key found");
  21024. return 1;
  21025. }
  21026. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  21027. if (DES_check(mask, mask2, *key) ||
  21028. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21029. WOLFSSL_MSG("Weak key found");
  21030. return 1;
  21031. }
  21032. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  21033. if (DES_check(mask, mask2, *key) ||
  21034. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21035. WOLFSSL_MSG("Weak key found");
  21036. return 1;
  21037. }
  21038. return 0;
  21039. }
  21040. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  21041. WOLFSSL_DES_key_schedule* key)
  21042. {
  21043. if (myDes != NULL && key != NULL) {
  21044. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  21045. }
  21046. }
  21047. /* Sets the parity of the DES key for use */
  21048. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  21049. {
  21050. word32 i;
  21051. word32 sz = sizeof(WOLFSSL_DES_cblock);
  21052. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  21053. for (i = 0; i < sz; i++) {
  21054. unsigned char c = (*myDes)[i];
  21055. if ((
  21056. ((c >> 1) & 0x01) ^
  21057. ((c >> 2) & 0x01) ^
  21058. ((c >> 3) & 0x01) ^
  21059. ((c >> 4) & 0x01) ^
  21060. ((c >> 5) & 0x01) ^
  21061. ((c >> 6) & 0x01) ^
  21062. ((c >> 7) & 0x01)) == (c & 0x01)) {
  21063. WOLFSSL_MSG("Flipping parity bit");
  21064. (*myDes)[i] = c ^ 0x01;
  21065. }
  21066. }
  21067. }
  21068. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  21069. {
  21070. word32 i;
  21071. word32 sz = sizeof(WOLFSSL_DES_cblock);
  21072. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  21073. for (i = 0; i < sz; i++) {
  21074. unsigned char c = (*myDes)[i];
  21075. if ((
  21076. ((c >> 1) & 0x01) ^
  21077. ((c >> 2) & 0x01) ^
  21078. ((c >> 3) & 0x01) ^
  21079. ((c >> 4) & 0x01) ^
  21080. ((c >> 5) & 0x01) ^
  21081. ((c >> 6) & 0x01) ^
  21082. ((c >> 7) & 0x01)) == (c & 0x01)) {
  21083. return 0;
  21084. }
  21085. }
  21086. return 1;
  21087. }
  21088. #ifdef WOLFSSL_DES_ECB
  21089. /* Encrypt or decrypt input message desa with key and get output in desb.
  21090. * if enc is DES_ENCRYPT,input message is encrypted or
  21091. * if enc is DES_DECRYPT,input message is decrypted.
  21092. * */
  21093. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  21094. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  21095. {
  21096. Des myDes;
  21097. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  21098. if (desa == NULL || key == NULL || desb == NULL ||
  21099. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  21100. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  21101. } else {
  21102. if (wc_Des_SetKey(&myDes, (const byte*) key,
  21103. (const byte*) NULL, !enc) != 0) {
  21104. WOLFSSL_MSG("wc_Des_SetKey return error.");
  21105. return;
  21106. }
  21107. if (enc == DES_ENCRYPT){
  21108. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  21109. sizeof(WOLFSSL_DES_cblock)) != 0){
  21110. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  21111. }
  21112. } else {
  21113. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  21114. sizeof(WOLFSSL_DES_cblock)) != 0){
  21115. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  21116. }
  21117. }
  21118. }
  21119. }
  21120. #endif
  21121. #endif /* NO_DES3 */
  21122. #ifndef NO_RC4
  21123. /* Set the key state for Arc4 structure.
  21124. *
  21125. * key Arc4 structure to use
  21126. * len length of data buffer
  21127. * data initial state to set Arc4 structure
  21128. */
  21129. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  21130. const unsigned char* data)
  21131. {
  21132. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  21133. (void)sizeof(rc4_test);
  21134. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  21135. if (key == NULL || len < 0) {
  21136. WOLFSSL_MSG("bad argument passed in");
  21137. return;
  21138. }
  21139. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  21140. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  21141. }
  21142. /* Encrypt/decrypt with Arc4 structure.
  21143. *
  21144. * len length of buffer to encrypt/decrypt (in/out)
  21145. * in buffer to encrypt/decrypt
  21146. * out results of encryption/decryption
  21147. */
  21148. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  21149. const unsigned char* in, unsigned char* out)
  21150. {
  21151. WOLFSSL_ENTER("wolfSSL_RC4");
  21152. if (key == NULL || in == NULL || out == NULL) {
  21153. WOLFSSL_MSG("Bad argument passed in");
  21154. return;
  21155. }
  21156. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  21157. }
  21158. #endif /* NO_RC4 */
  21159. #ifndef NO_AES
  21160. #ifdef WOLFSSL_AES_DIRECT
  21161. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  21162. *
  21163. * input Data to encrypt
  21164. * output Encrypted data after done
  21165. * key AES key to use for encryption
  21166. */
  21167. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  21168. AES_KEY *key)
  21169. {
  21170. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  21171. if (input == NULL || output == NULL || key == NULL) {
  21172. WOLFSSL_MSG("Null argument passed in");
  21173. return;
  21174. }
  21175. #if !defined(HAVE_SELFTEST) && \
  21176. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  21177. if (wc_AesEncryptDirect((Aes*)key, output, input) != 0) {
  21178. WOLFSSL_MSG("wc_AesEncryptDirect failed");
  21179. return;
  21180. }
  21181. #else
  21182. wc_AesEncryptDirect((Aes*)key, output, input);
  21183. #endif
  21184. }
  21185. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  21186. *
  21187. * input Data to decrypt
  21188. * output Decrypted data after done
  21189. * key AES key to use for encryption
  21190. */
  21191. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  21192. AES_KEY *key)
  21193. {
  21194. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  21195. if (input == NULL || output == NULL || key == NULL) {
  21196. WOLFSSL_MSG("Null argument passed in");
  21197. return;
  21198. }
  21199. #if !defined(HAVE_SELFTEST) && \
  21200. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  21201. if (wc_AesDecryptDirect((Aes*)key, output, input) != 0) {
  21202. WOLFSSL_MSG("wc_AesDecryptDirect failed");
  21203. return;
  21204. }
  21205. #else
  21206. wc_AesDecryptDirect((Aes*)key, output, input);
  21207. #endif
  21208. }
  21209. #endif /* WOLFSSL_AES_DIRECT */
  21210. /* Setup of an AES key to use for encryption.
  21211. *
  21212. * key key in bytes to use for encryption
  21213. * bits size of key in bits
  21214. * aes AES structure to initialize
  21215. */
  21216. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  21217. AES_KEY *aes)
  21218. {
  21219. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  21220. (void)sizeof(aes_test);
  21221. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  21222. if (key == NULL || aes == NULL) {
  21223. WOLFSSL_MSG("Null argument passed in");
  21224. return -1;
  21225. }
  21226. XMEMSET(aes, 0, sizeof(AES_KEY));
  21227. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPT) != 0) {
  21228. WOLFSSL_MSG("Error in setting AES key");
  21229. return -1;
  21230. }
  21231. return 0;
  21232. }
  21233. /* Setup of an AES key to use for decryption.
  21234. *
  21235. * key key in bytes to use for decryption
  21236. * bits size of key in bits
  21237. * aes AES structure to initialize
  21238. */
  21239. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  21240. AES_KEY *aes)
  21241. {
  21242. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  21243. (void)sizeof(aes_test);
  21244. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  21245. if (key == NULL || aes == NULL) {
  21246. WOLFSSL_MSG("Null argument passed in");
  21247. return -1;
  21248. }
  21249. XMEMSET(aes, 0, sizeof(AES_KEY));
  21250. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPT) != 0) {
  21251. WOLFSSL_MSG("Error in setting AES key");
  21252. return -1;
  21253. }
  21254. return 0;
  21255. }
  21256. #ifdef HAVE_AES_ECB
  21257. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  21258. *
  21259. * in buffer to encrypt/decrypt
  21260. * out buffer to hold result of encryption/decryption
  21261. * key AES structure to use with encryption/decryption
  21262. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  21263. */
  21264. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  21265. AES_KEY *key, const int enc)
  21266. {
  21267. Aes* aes;
  21268. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  21269. if (key == NULL || in == NULL || out == NULL) {
  21270. WOLFSSL_MSG("Error, Null argument passed in");
  21271. return;
  21272. }
  21273. aes = (Aes*)key;
  21274. if (enc == AES_ENCRYPT) {
  21275. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  21276. WOLFSSL_MSG("Error with AES CBC encrypt");
  21277. }
  21278. }
  21279. else {
  21280. #ifdef HAVE_AES_DECRYPT
  21281. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  21282. WOLFSSL_MSG("Error with AES CBC decrypt");
  21283. }
  21284. #else
  21285. WOLFSSL_MSG("AES decryption not compiled in");
  21286. #endif
  21287. }
  21288. }
  21289. #endif /* HAVE_AES_ECB */
  21290. #ifdef HAVE_AES_CBC
  21291. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  21292. * state after encryption/decryption.
  21293. *
  21294. * in buffer to encrypt/decrypt
  21295. * out buffer to hold result of encryption/decryption
  21296. * len length of input buffer
  21297. * key AES structure to use with encryption/decryption
  21298. * iv iv to use with operation
  21299. * enc 1 for encryption and 0 for decryption
  21300. */
  21301. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  21302. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  21303. {
  21304. Aes* aes;
  21305. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  21306. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  21307. WOLFSSL_MSG("Error, Null argument passed in");
  21308. return;
  21309. }
  21310. aes = (Aes*)key;
  21311. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  21312. WOLFSSL_MSG("Error with setting iv");
  21313. return;
  21314. }
  21315. if (enc == AES_ENCRYPT) {
  21316. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  21317. WOLFSSL_MSG("Error with AES CBC encrypt");
  21318. return;
  21319. }
  21320. }
  21321. else {
  21322. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  21323. WOLFSSL_MSG("Error with AES CBC decrypt");
  21324. return;
  21325. }
  21326. }
  21327. /* to be compatible copy iv to iv buffer after completing operation */
  21328. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  21329. }
  21330. #endif /* HAVE_AES_CBC */
  21331. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  21332. * most recent iv state after encryption/decryption.
  21333. *
  21334. * in buffer to encrypt/decrypt
  21335. * out buffer to hold result of encryption/decryption
  21336. * len length of input buffer
  21337. * key AES structure to use with encryption/decryption
  21338. * iv iv to use with operation
  21339. * num contains the amount of block used
  21340. * enc AES_ENCRYPT for encryption and AES_DECRYPT for decryption
  21341. */
  21342. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  21343. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  21344. const int enc)
  21345. {
  21346. #ifndef WOLFSSL_AES_CFB
  21347. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  21348. (void)in;
  21349. (void)out;
  21350. (void)len;
  21351. (void)key;
  21352. (void)iv;
  21353. (void)num;
  21354. (void)enc;
  21355. return;
  21356. #else
  21357. Aes* aes;
  21358. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  21359. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  21360. WOLFSSL_MSG("Error, Null argument passed in");
  21361. return;
  21362. }
  21363. aes = (Aes*)key;
  21364. /*
  21365. * We copy the IV directly into reg here because using wc_AesSetIV will
  21366. * clear the leftover bytes field "left", and this function relies on the
  21367. * leftover bytes being preserved between calls.
  21368. */
  21369. XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE);
  21370. if (enc == AES_ENCRYPT) {
  21371. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  21372. WOLFSSL_MSG("Error with AES CBC encrypt");
  21373. return;
  21374. }
  21375. }
  21376. else {
  21377. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  21378. WOLFSSL_MSG("Error with AES CBC decrypt");
  21379. return;
  21380. }
  21381. }
  21382. /* to be compatible copy iv to iv buffer after completing operation */
  21383. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  21384. /* store number of left over bytes to num */
  21385. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  21386. #endif /* WOLFSSL_AES_CFB */
  21387. }
  21388. /* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */
  21389. #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  21390. int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv,
  21391. unsigned char *out,
  21392. const unsigned char *in, unsigned int inlen)
  21393. {
  21394. int ret;
  21395. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  21396. if (out == NULL || in == NULL) {
  21397. WOLFSSL_MSG("Error, Null argument passed in");
  21398. return WOLFSSL_FAILURE;
  21399. }
  21400. ret = wc_AesKeyWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  21401. return ret < 0 ? WOLFSSL_FAILURE : ret;
  21402. }
  21403. int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
  21404. unsigned char *out,
  21405. const unsigned char *in, unsigned int inlen)
  21406. {
  21407. int ret;
  21408. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  21409. if (out == NULL || in == NULL) {
  21410. WOLFSSL_MSG("Error, Null argument passed in");
  21411. return WOLFSSL_FAILURE;
  21412. }
  21413. ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  21414. return ret < 0 ? WOLFSSL_FAILURE : ret;
  21415. }
  21416. #endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */
  21417. #ifdef HAVE_CTS
  21418. /*
  21419. * Ciphertext stealing interface compatible with RFC2040 and RFC3962.
  21420. */
  21421. size_t wolfSSL_CRYPTO_cts128_encrypt(const unsigned char *in,
  21422. unsigned char *out, size_t len, const void *key,
  21423. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  21424. {
  21425. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  21426. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  21427. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_encrypt");
  21428. if (in == NULL || out == NULL || len < WOLFSSL_CTS128_BLOCK_SZ ||
  21429. cbc == NULL) {
  21430. WOLFSSL_MSG("Bad parameter");
  21431. return WOLFSSL_FAILURE;
  21432. }
  21433. if (lastBlkLen == 0)
  21434. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  21435. /* Encrypt data up to last block */
  21436. (*cbc)(in, out, len - lastBlkLen, key, iv, AES_ENCRYPT);
  21437. /* Move to last block */
  21438. in += len - lastBlkLen;
  21439. out += len - lastBlkLen;
  21440. /* RFC2040: Pad Pn with zeros at the end to create P of length BB. */
  21441. XMEMCPY(lastBlk, in, lastBlkLen);
  21442. XMEMSET(lastBlk + lastBlkLen, 0, WOLFSSL_CTS128_BLOCK_SZ - lastBlkLen);
  21443. /* RFC2040: Select the first Ln bytes of En-1 to create Cn */
  21444. XMEMCPY(out, out - WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  21445. (*cbc)(lastBlk, out - WOLFSSL_CTS128_BLOCK_SZ, WOLFSSL_CTS128_BLOCK_SZ,
  21446. key, iv, AES_ENCRYPT);
  21447. return len;
  21448. }
  21449. size_t wolfSSL_CRYPTO_cts128_decrypt(const unsigned char *in,
  21450. unsigned char *out, size_t len, const void *key,
  21451. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  21452. {
  21453. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  21454. byte prevBlk[WOLFSSL_CTS128_BLOCK_SZ];
  21455. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  21456. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_decrypt");
  21457. if (in == NULL || out == NULL || len <= WOLFSSL_CTS128_BLOCK_SZ ||
  21458. cbc == NULL) {
  21459. WOLFSSL_MSG("Bad parameter");
  21460. return WOLFSSL_FAILURE;
  21461. }
  21462. if (lastBlkLen == 0)
  21463. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  21464. /* Decrypt up to last two blocks */
  21465. (*cbc)(in, out, len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ, key, iv,
  21466. AES_DECRYPTION);
  21467. /* Move to last two blocks */
  21468. in += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  21469. out += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  21470. /* RFC2040: Decrypt Cn-1 to create Dn.
  21471. * Use 0 buffer as IV to do straight decryption.
  21472. * This places the Cn-1 block at lastBlk */
  21473. XMEMSET(lastBlk, 0, WOLFSSL_CTS128_BLOCK_SZ);
  21474. (*cbc)(in, prevBlk, WOLFSSL_CTS128_BLOCK_SZ, key, lastBlk, AES_DECRYPT);
  21475. /* RFC2040: Append the tail (BB minus Ln) bytes of Xn to Cn
  21476. * to create En. */
  21477. XMEMCPY(prevBlk, in + WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  21478. /* Cn and Cn-1 can now be decrypted */
  21479. (*cbc)(prevBlk, out, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  21480. (*cbc)(lastBlk, lastBlk, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  21481. XMEMCPY(out + WOLFSSL_CTS128_BLOCK_SZ, lastBlk, lastBlkLen);
  21482. return len;
  21483. }
  21484. #endif /* HAVE_CTS */
  21485. #endif /* NO_AES */
  21486. #ifndef NO_ASN_TIME
  21487. #ifndef NO_BIO
  21488. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  21489. {
  21490. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  21491. if (bio == NULL || a == NULL) {
  21492. return WOLFSSL_FAILURE;
  21493. }
  21494. if (a->type != ASN_UTC_TIME) {
  21495. WOLFSSL_MSG("Error, not UTC_TIME");
  21496. return WOLFSSL_FAILURE;
  21497. }
  21498. return wolfSSL_ASN1_TIME_print(bio, a);
  21499. }
  21500. #endif /* !NO_BIO */
  21501. /* Checks the ASN1 syntax of "a"
  21502. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  21503. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  21504. {
  21505. char buf[MAX_TIME_STRING_SZ];
  21506. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  21507. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  21508. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  21509. MAX_TIME_STRING_SZ) == NULL) {
  21510. return WOLFSSL_FAILURE;
  21511. }
  21512. return WOLFSSL_SUCCESS;
  21513. }
  21514. /*
  21515. * Convert time to Unix time (GMT).
  21516. */
  21517. static long long TimeToUnixTime(int sec, int min, int hour, int mday, int mon,
  21518. int year)
  21519. {
  21520. /* Number of cumulative days from the previous months, starting from
  21521. * beginning of January. */
  21522. static const int monthDaysCumulative [12] = {
  21523. 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
  21524. };
  21525. int leapDays = year;
  21526. if (mon <= 1) {
  21527. --leapDays;
  21528. }
  21529. leapDays = leapDays / 4 - leapDays / 100 + leapDays / 400 - 1969 / 4 +
  21530. 1969 / 100 - 1969 / 400;
  21531. return ((((long long) (year - 1970) * 365 + leapDays +
  21532. monthDaysCumulative[mon] + mday - 1) * 24 + hour) * 60 + min) * 60 +
  21533. sec;
  21534. }
  21535. int wolfSSL_ASN1_TIME_diff(int *days, int *secs, const WOLFSSL_ASN1_TIME *from,
  21536. const WOLFSSL_ASN1_TIME *to)
  21537. {
  21538. const int SECS_PER_DAY = 24 * 60 * 60;
  21539. struct tm fromTm_s, *fromTmGmt = &fromTm_s;
  21540. struct tm toTm_s, *toTmGmt = &toTm_s;
  21541. time_t currTime;
  21542. long long fromSecs;
  21543. long long toSecs;
  21544. double diffSecs;
  21545. struct tm *tmpTs;
  21546. #if defined(NEED_TMP_TIME)
  21547. /* for use with gmtime_r */
  21548. struct tm tmpTimeStorage;
  21549. tmpTs = &tmpTimeStorage;
  21550. #else
  21551. tmpTs = NULL;
  21552. #endif
  21553. (void)tmpTs;
  21554. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_diff");
  21555. if (days == NULL) {
  21556. WOLFSSL_MSG("days is NULL");
  21557. return WOLFSSL_FAILURE;
  21558. }
  21559. if (secs == NULL) {
  21560. WOLFSSL_MSG("secs is NULL");
  21561. return WOLFSSL_FAILURE;
  21562. }
  21563. if (from == NULL && to == NULL) {
  21564. *days = 0;
  21565. *secs = 0;
  21566. return WOLFSSL_SUCCESS;
  21567. }
  21568. if (from == NULL) {
  21569. currTime = wc_Time(0);
  21570. fromTmGmt = XGMTIME(&currTime, tmpTs);
  21571. if (fromTmGmt == NULL) {
  21572. WOLFSSL_MSG("XGMTIME for from time failed.");
  21573. return WOLFSSL_FAILURE;
  21574. }
  21575. }
  21576. else if (wolfSSL_ASN1_TIME_to_tm(from, fromTmGmt) != WOLFSSL_SUCCESS) {
  21577. WOLFSSL_MSG("Failed to convert from time to struct tm.");
  21578. return WOLFSSL_FAILURE;
  21579. }
  21580. /* We use TimeToUnixTime here instead of XMKTIME to avoid the Year 2038
  21581. * Problem on platforms where time_t is 32 bits. struct tm stores the year
  21582. * as years since 1900, so we add 1900 to the year. */
  21583. fromSecs = TimeToUnixTime(fromTmGmt->tm_sec, fromTmGmt->tm_min,
  21584. fromTmGmt->tm_hour, fromTmGmt->tm_mday,
  21585. fromTmGmt->tm_mon, fromTmGmt->tm_year + 1900);
  21586. if (to == NULL) {
  21587. currTime = wc_Time(0);
  21588. toTmGmt = XGMTIME(&currTime, tmpTs);
  21589. if (toTmGmt == NULL) {
  21590. WOLFSSL_MSG("XGMTIME for to time failed.");
  21591. return WOLFSSL_FAILURE;
  21592. }
  21593. }
  21594. else if (wolfSSL_ASN1_TIME_to_tm(to, toTmGmt) != WOLFSSL_SUCCESS) {
  21595. WOLFSSL_MSG("Failed to convert to time to struct tm.");
  21596. return WOLFSSL_FAILURE;
  21597. }
  21598. toSecs = TimeToUnixTime(toTmGmt->tm_sec, toTmGmt->tm_min, toTmGmt->tm_hour,
  21599. toTmGmt->tm_mday, toTmGmt->tm_mon,
  21600. toTmGmt->tm_year + 1900);
  21601. diffSecs = (double)(toSecs - fromSecs);
  21602. *days = (int) (diffSecs / SECS_PER_DAY);
  21603. *secs = (int) (diffSecs - (((double)*days) * SECS_PER_DAY));
  21604. return WOLFSSL_SUCCESS;
  21605. }
  21606. int wolfSSL_ASN1_TIME_compare(const WOLFSSL_ASN1_TIME *a,
  21607. const WOLFSSL_ASN1_TIME *b)
  21608. {
  21609. int ret;
  21610. int days;
  21611. int secs;
  21612. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_compare");
  21613. if (wolfSSL_ASN1_TIME_diff(&days, &secs, a, b) != WOLFSSL_SUCCESS) {
  21614. WOLFSSL_MSG("Failed to get time difference.");
  21615. ret = -2;
  21616. }
  21617. else {
  21618. if (days == 0 && secs == 0) {
  21619. /* a and b are the same time. */
  21620. ret = 0;
  21621. }
  21622. else if (days >= 0 && secs >= 0) {
  21623. /* a is before b. */
  21624. ret = -1;
  21625. }
  21626. else if (days <= 0 && secs <= 0) {
  21627. /* a is after b. */
  21628. ret = 1;
  21629. }
  21630. else {
  21631. WOLFSSL_MSG("Incoherent time difference.");
  21632. ret = -2;
  21633. }
  21634. }
  21635. WOLFSSL_LEAVE("wolfSSL_ASN1_TIME_compare", ret);
  21636. return ret;
  21637. }
  21638. #endif /* !NO_ASN_TIME */
  21639. #ifndef NO_WOLFSSL_STUB
  21640. WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  21641. {
  21642. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  21643. (void)s;
  21644. (void)t;
  21645. return s;
  21646. }
  21647. #endif /* !NO_WOLFSSL_STUB */
  21648. int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
  21649. {
  21650. int slen;
  21651. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
  21652. if (!str) {
  21653. WOLFSSL_MSG("Bad parameter");
  21654. return WOLFSSL_FAILURE;
  21655. }
  21656. slen = (int)XSTRLEN(str)+1;
  21657. if (slen > CTC_DATE_SIZE) {
  21658. WOLFSSL_MSG("Date string too long");
  21659. return WOLFSSL_FAILURE;
  21660. }
  21661. if (s) {
  21662. XMEMCPY(s->data, str, slen);
  21663. s->length = slen - 1; /* do not include null terminator in length */
  21664. s->type = slen == ASN_UTC_TIME_SIZE ? V_ASN1_UTCTIME :
  21665. V_ASN1_GENERALIZEDTIME;
  21666. }
  21667. return WOLFSSL_SUCCESS;
  21668. }
  21669. #ifndef NO_BIO
  21670. /* Return the month as a string.
  21671. *
  21672. * n The number of the month as a two characters (1 based).
  21673. * returns the month as a string.
  21674. */
  21675. static WC_INLINE const char* MonthStr(const char* n)
  21676. {
  21677. static const char monthStr[12][4] = {
  21678. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  21679. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  21680. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  21681. }
  21682. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  21683. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  21684. {
  21685. const char* p;
  21686. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  21687. if (bio == NULL || asnTime == NULL)
  21688. return BAD_FUNC_ARG;
  21689. if (asnTime->type != ASN_GENERALIZED_TIME) {
  21690. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  21691. return WOLFSSL_FAILURE;
  21692. }
  21693. p = (const char *)(asnTime->data);
  21694. /* GetTimeString not always available. */
  21695. if (wolfSSL_BIO_write(bio, MonthStr(p + 4), 3) <= 0)
  21696. return WOLFSSL_FAILURE;
  21697. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21698. return WOLFSSL_FAILURE;
  21699. /* Day */
  21700. if (wolfSSL_BIO_write(bio, p + 6, 2) <= 0)
  21701. return WOLFSSL_FAILURE;
  21702. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21703. return WOLFSSL_FAILURE;
  21704. /* Hour */
  21705. if (wolfSSL_BIO_write(bio, p + 8, 2) <= 0)
  21706. return WOLFSSL_FAILURE;
  21707. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  21708. return WOLFSSL_FAILURE;
  21709. /* Min */
  21710. if (wolfSSL_BIO_write(bio, p + 10, 2) <= 0)
  21711. return WOLFSSL_FAILURE;
  21712. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  21713. return WOLFSSL_FAILURE;
  21714. /* Secs */
  21715. if (wolfSSL_BIO_write(bio, p + 12, 2) <= 0)
  21716. return WOLFSSL_FAILURE;
  21717. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21718. return WOLFSSL_FAILURE;
  21719. if (wolfSSL_BIO_write(bio, p, 4) <= 0)
  21720. return WOLFSSL_FAILURE;
  21721. return 0;
  21722. }
  21723. #endif /* !NO_BIO */
  21724. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  21725. {
  21726. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  21727. if (asn1Time == NULL)
  21728. return;
  21729. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  21730. }
  21731. #endif /* OPENSSL_EXTRA */
  21732. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21733. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  21734. {
  21735. WOLFSSL_ENTER("wolfSSL_sk_num");
  21736. if (sk == NULL)
  21737. return 0;
  21738. return (int)sk->num;
  21739. }
  21740. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  21741. {
  21742. WOLFSSL_ENTER("wolfSSL_sk_value");
  21743. for (; sk != NULL && i > 0; i--)
  21744. sk = sk->next;
  21745. if (sk == NULL)
  21746. return NULL;
  21747. switch (sk->type) {
  21748. case STACK_TYPE_X509:
  21749. return (void*)sk->data.x509;
  21750. case STACK_TYPE_GEN_NAME:
  21751. return (void*)sk->data.gn;
  21752. case STACK_TYPE_BIO:
  21753. return (void*)sk->data.bio;
  21754. case STACK_TYPE_OBJ:
  21755. return (void*)sk->data.obj;
  21756. case STACK_TYPE_STRING:
  21757. return (void*)sk->data.string;
  21758. case STACK_TYPE_CIPHER:
  21759. return (void*)&sk->data.cipher;
  21760. case STACK_TYPE_ACCESS_DESCRIPTION:
  21761. return (void*)sk->data.access;
  21762. case STACK_TYPE_X509_EXT:
  21763. return (void*)sk->data.ext;
  21764. case STACK_TYPE_X509_REQ_ATTR:
  21765. return (void*)sk->data.generic;
  21766. case STACK_TYPE_NULL:
  21767. return (void*)sk->data.generic;
  21768. case STACK_TYPE_X509_NAME:
  21769. return (void*)sk->data.name;
  21770. case STACK_TYPE_X509_NAME_ENTRY:
  21771. return (void*)sk->data.name_entry;
  21772. case STACK_TYPE_CONF_VALUE:
  21773. #ifdef OPENSSL_EXTRA
  21774. return (void*)sk->data.conf;
  21775. #else
  21776. return NULL;
  21777. #endif
  21778. case STACK_TYPE_X509_INFO:
  21779. return (void*)sk->data.info;
  21780. case STACK_TYPE_BY_DIR_entry:
  21781. return (void*)sk->data.dir_entry;
  21782. case STACK_TYPE_BY_DIR_hash:
  21783. return (void*)sk->data.dir_hash;
  21784. case STACK_TYPE_X509_OBJ:
  21785. return (void*)sk->data.x509_obj;
  21786. case STACK_TYPE_DIST_POINT:
  21787. return (void*)sk->data.dp;
  21788. case STACK_TYPE_X509_CRL:
  21789. return (void*)sk->data.crl;
  21790. default:
  21791. return (void*)sk->data.generic;
  21792. }
  21793. }
  21794. /* copies over data of "in" to "out" */
  21795. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  21796. {
  21797. if (in == NULL || out == NULL)
  21798. return;
  21799. *out = *in;
  21800. }
  21801. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  21802. {
  21803. WOLFSSL_STACK* ret = NULL;
  21804. WOLFSSL_STACK* last = NULL;
  21805. WOLFSSL_ENTER("wolfSSL_sk_dup");
  21806. while (sk) {
  21807. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  21808. if (!cur) {
  21809. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  21810. goto error;
  21811. }
  21812. if (!ret) {
  21813. /* Set first node */
  21814. ret = cur;
  21815. }
  21816. if (last) {
  21817. last->next = cur;
  21818. }
  21819. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  21820. /* We will allocate new memory for this */
  21821. XMEMSET(&cur->data, 0, sizeof(cur->data));
  21822. cur->next = NULL;
  21823. switch (sk->type) {
  21824. case STACK_TYPE_X509:
  21825. if (!sk->data.x509)
  21826. break;
  21827. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  21828. if (!cur->data.x509) {
  21829. WOLFSSL_MSG("wolfSSL_X509_dup error");
  21830. goto error;
  21831. }
  21832. break;
  21833. case STACK_TYPE_CIPHER:
  21834. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  21835. break;
  21836. case STACK_TYPE_GEN_NAME:
  21837. if (!sk->data.gn)
  21838. break;
  21839. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  21840. if (!cur->data.gn) {
  21841. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  21842. goto error;
  21843. }
  21844. break;
  21845. case STACK_TYPE_OBJ:
  21846. if (!sk->data.obj)
  21847. break;
  21848. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  21849. if (!cur->data.obj) {
  21850. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  21851. goto error;
  21852. }
  21853. break;
  21854. case STACK_TYPE_BIO:
  21855. case STACK_TYPE_STRING:
  21856. case STACK_TYPE_ACCESS_DESCRIPTION:
  21857. case STACK_TYPE_X509_EXT:
  21858. case STACK_TYPE_X509_REQ_ATTR:
  21859. case STACK_TYPE_NULL:
  21860. case STACK_TYPE_X509_NAME:
  21861. case STACK_TYPE_X509_NAME_ENTRY:
  21862. case STACK_TYPE_CONF_VALUE:
  21863. case STACK_TYPE_X509_INFO:
  21864. case STACK_TYPE_BY_DIR_entry:
  21865. case STACK_TYPE_BY_DIR_hash:
  21866. case STACK_TYPE_X509_OBJ:
  21867. case STACK_TYPE_DIST_POINT:
  21868. case STACK_TYPE_X509_CRL:
  21869. default:
  21870. WOLFSSL_MSG("Unsupported stack type");
  21871. goto error;
  21872. }
  21873. sk = sk->next;
  21874. last = cur;
  21875. }
  21876. return ret;
  21877. error:
  21878. if (ret) {
  21879. wolfSSL_sk_GENERAL_NAME_free(ret);
  21880. }
  21881. return NULL;
  21882. }
  21883. /* Free the just the stack structure */
  21884. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  21885. {
  21886. WOLFSSL_ENTER("wolfSSL_sk_free");
  21887. while (sk != NULL) {
  21888. WOLFSSL_STACK* next = sk->next;
  21889. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  21890. sk = next;
  21891. }
  21892. }
  21893. /* Frees each node in the stack and frees the stack.
  21894. */
  21895. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  21896. void (*f) (void*))
  21897. {
  21898. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  21899. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  21900. }
  21901. /* return 1 on success 0 on fail */
  21902. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  21903. {
  21904. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  21905. return wolfSSL_sk_push(sk, generic);
  21906. }
  21907. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  21908. {
  21909. wolfSSL_sk_free(sk);
  21910. }
  21911. /* Free all nodes in a stack including the pushed objects */
  21912. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  21913. wolfSSL_sk_freefunc func)
  21914. {
  21915. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  21916. if (sk == NULL) {
  21917. /* pop_free can be called with NULL, do not print bad argument */
  21918. return;
  21919. }
  21920. #if defined(WOLFSSL_QT)
  21921. /* In Qt v15.5, it calls OPENSSL_sk_free(xxx, OPENSSL_sk_free).
  21922. * By using OPENSSL_sk_free for free causes access violation.
  21923. * Therefore, switching free func to wolfSSL_ACCESS_DESCRIPTION_free
  21924. * is needed even the func isn't NULL.
  21925. */
  21926. if (sk->type == STACK_TYPE_ACCESS_DESCRIPTION) {
  21927. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  21928. }
  21929. #endif
  21930. if (func == NULL) {
  21931. switch(sk->type) {
  21932. case STACK_TYPE_ACCESS_DESCRIPTION:
  21933. #if defined(OPENSSL_ALL)
  21934. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  21935. #endif
  21936. break;
  21937. case STACK_TYPE_X509:
  21938. func = (wolfSSL_sk_freefunc)wolfSSL_X509_free;
  21939. break;
  21940. case STACK_TYPE_X509_OBJ:
  21941. #ifdef OPENSSL_ALL
  21942. func = (wolfSSL_sk_freefunc)wolfSSL_X509_OBJECT_free;
  21943. #endif
  21944. break;
  21945. case STACK_TYPE_OBJ:
  21946. func = (wolfSSL_sk_freefunc)wolfSSL_ASN1_OBJECT_free;
  21947. break;
  21948. case STACK_TYPE_DIST_POINT:
  21949. #ifdef OPENSSL_EXTRA
  21950. func = (wolfSSL_sk_freefunc)wolfSSL_DIST_POINT_free;
  21951. #endif
  21952. break;
  21953. case STACK_TYPE_GEN_NAME:
  21954. func = (wolfSSL_sk_freefunc)wolfSSL_GENERAL_NAME_free;
  21955. break;
  21956. case STACK_TYPE_STRING:
  21957. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  21958. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21959. func = (wolfSSL_sk_freefunc)wolfSSL_WOLFSSL_STRING_free;
  21960. #endif
  21961. break;
  21962. case STACK_TYPE_X509_NAME:
  21963. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  21964. && !defined(WOLFCRYPT_ONLY)
  21965. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_free;
  21966. #endif
  21967. break;
  21968. case STACK_TYPE_X509_NAME_ENTRY:
  21969. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  21970. && !defined(WOLFCRYPT_ONLY)
  21971. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_ENTRY_free;
  21972. #endif
  21973. break;
  21974. case STACK_TYPE_X509_EXT:
  21975. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  21976. func = (wolfSSL_sk_freefunc)wolfSSL_X509_EXTENSION_free;
  21977. #endif
  21978. break;
  21979. case STACK_TYPE_X509_REQ_ATTR:
  21980. #if defined(OPENSSL_ALL) && \
  21981. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  21982. func = (wolfSSL_sk_freefunc)wolfSSL_X509_ATTRIBUTE_free;
  21983. #endif
  21984. break;
  21985. case STACK_TYPE_CONF_VALUE:
  21986. #if defined(OPENSSL_ALL)
  21987. func = (wolfSSL_sk_freefunc)wolfSSL_X509V3_conf_free;
  21988. #endif
  21989. break;
  21990. case STACK_TYPE_X509_INFO:
  21991. #if defined(OPENSSL_ALL)
  21992. func = (wolfSSL_sk_freefunc)wolfSSL_X509_INFO_free;
  21993. #endif
  21994. break;
  21995. case STACK_TYPE_BIO:
  21996. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  21997. func = (wolfSSL_sk_freefunc)wolfSSL_BIO_vfree;
  21998. #endif
  21999. break;
  22000. case STACK_TYPE_BY_DIR_entry:
  22001. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  22002. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_entry_free;
  22003. #endif
  22004. break;
  22005. case STACK_TYPE_BY_DIR_hash:
  22006. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  22007. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_HASH_free;
  22008. #endif
  22009. break;
  22010. case STACK_TYPE_X509_CRL:
  22011. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  22012. func = (wolfSSL_sk_freefunc)wolfSSL_X509_CRL_free;
  22013. #endif
  22014. break;
  22015. case STACK_TYPE_CIPHER:
  22016. case STACK_TYPE_NULL:
  22017. default:
  22018. break;
  22019. }
  22020. }
  22021. while (sk != NULL) {
  22022. WOLFSSL_STACK* next = sk->next;
  22023. if (func != NULL) {
  22024. if (sk->type != STACK_TYPE_CIPHER)
  22025. func(sk->data.generic);
  22026. }
  22027. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  22028. sk = next;
  22029. }
  22030. }
  22031. /* Creates and returns a new null stack. */
  22032. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  22033. {
  22034. WOLFSSL_STACK* sk;
  22035. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  22036. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  22037. DYNAMIC_TYPE_OPENSSL);
  22038. if (sk == NULL) {
  22039. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  22040. return NULL;
  22041. }
  22042. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  22043. sk->type = STACK_TYPE_NULL;
  22044. return sk;
  22045. }
  22046. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  22047. {
  22048. if (sk == NULL)
  22049. return 0;
  22050. return (int)sk->num;
  22051. }
  22052. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22053. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  22054. defined(HAVE_EXT_CACHE))
  22055. /* stunnel 4.28 needs
  22056. *
  22057. * Callback that is called if a session tries to resume but could not find
  22058. * the session to resume it.
  22059. */
  22060. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  22061. WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*))
  22062. {
  22063. if (ctx == NULL)
  22064. return;
  22065. #ifdef HAVE_EXT_CACHE
  22066. ctx->get_sess_cb = f;
  22067. #else
  22068. (void)f;
  22069. #endif
  22070. }
  22071. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  22072. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  22073. {
  22074. if (ctx == NULL)
  22075. return;
  22076. #ifdef HAVE_EXT_CACHE
  22077. ctx->new_sess_cb = f;
  22078. #else
  22079. (void)f;
  22080. #endif
  22081. }
  22082. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  22083. WOLFSSL_SESSION*))
  22084. {
  22085. if (ctx == NULL)
  22086. return;
  22087. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  22088. ctx->rem_sess_cb = f;
  22089. #else
  22090. (void)f;
  22091. #endif
  22092. }
  22093. /*
  22094. *
  22095. * Note: It is expected that the importing and exporting function have been
  22096. * built with the same settings. For example if session tickets was
  22097. * enabled with the wolfSSL library exporting a session then it is
  22098. * expected to be turned on with the wolfSSL library importing the session.
  22099. */
  22100. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  22101. {
  22102. int size = 0;
  22103. #ifdef HAVE_EXT_CACHE
  22104. int idx = 0;
  22105. #ifdef SESSION_CERTS
  22106. int i;
  22107. #endif
  22108. unsigned char *data;
  22109. WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION");
  22110. sess = ClientSessionToSession(sess);
  22111. if (sess == NULL) {
  22112. return BAD_FUNC_ARG;
  22113. }
  22114. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  22115. * haveEMS */
  22116. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  22117. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  22118. /* altSessionID */
  22119. size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0);
  22120. #ifdef SESSION_CERTS
  22121. /* Peer chain */
  22122. size += OPAQUE8_LEN;
  22123. for (i = 0; i < sess->chain.count; i++)
  22124. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  22125. #endif
  22126. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22127. defined(HAVE_SESSION_TICKET))
  22128. /* Protocol version */
  22129. size += OPAQUE16_LEN;
  22130. #endif
  22131. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22132. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22133. /* cipher suite */
  22134. size += OPAQUE16_LEN;
  22135. #endif
  22136. #ifndef NO_CLIENT_CACHE
  22137. /* ServerID len | ServerID */
  22138. size += OPAQUE16_LEN + sess->idLen;
  22139. #endif
  22140. #ifdef OPENSSL_EXTRA
  22141. /* session context ID len | session context ID */
  22142. size += OPAQUE8_LEN + sess->sessionCtxSz;
  22143. #endif
  22144. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22145. /* peerVerifyRet */
  22146. size += OPAQUE8_LEN;
  22147. #endif
  22148. #ifdef WOLFSSL_TLS13
  22149. /* namedGroup */
  22150. size += OPAQUE16_LEN;
  22151. #endif
  22152. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22153. #ifdef WOLFSSL_TLS13
  22154. #ifdef WOLFSSL_32BIT_MILLI_TIME
  22155. /* ticketSeen | ticketAdd */
  22156. size += OPAQUE32_LEN + OPAQUE32_LEN;
  22157. #else
  22158. /* ticketSeen Hi 32 bits | ticketSeen Lo 32 bits | ticketAdd */
  22159. size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE32_LEN;
  22160. #endif
  22161. /* ticketNonce */
  22162. size += OPAQUE8_LEN + sess->ticketNonce.len;
  22163. #endif
  22164. #ifdef WOLFSSL_EARLY_DATA
  22165. size += OPAQUE32_LEN;
  22166. #endif
  22167. #endif
  22168. #ifdef HAVE_SESSION_TICKET
  22169. /* ticket len | ticket */
  22170. size += OPAQUE16_LEN + sess->ticketLen;
  22171. #endif
  22172. if (p != NULL) {
  22173. if (*p == NULL)
  22174. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  22175. if (*p == NULL)
  22176. return 0;
  22177. data = *p;
  22178. data[idx++] = sess->side;
  22179. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  22180. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  22181. data[idx++] = sess->sessionIDSz;
  22182. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  22183. idx += sess->sessionIDSz;
  22184. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  22185. data[idx++] = (byte)sess->haveEMS;
  22186. data[idx++] = sess->haveAltSessionID ? ID_LEN : 0;
  22187. if (sess->haveAltSessionID) {
  22188. XMEMCPY(data + idx, sess->altSessionID, ID_LEN);
  22189. idx += ID_LEN;
  22190. }
  22191. #ifdef SESSION_CERTS
  22192. data[idx++] = (byte)sess->chain.count;
  22193. for (i = 0; i < sess->chain.count; i++) {
  22194. c16toa((word16)sess->chain.certs[i].length, data + idx);
  22195. idx += OPAQUE16_LEN;
  22196. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  22197. sess->chain.certs[i].length);
  22198. idx += sess->chain.certs[i].length;
  22199. }
  22200. #endif
  22201. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22202. defined(HAVE_SESSION_TICKET))
  22203. data[idx++] = sess->version.major;
  22204. data[idx++] = sess->version.minor;
  22205. #endif
  22206. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22207. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22208. data[idx++] = sess->cipherSuite0;
  22209. data[idx++] = sess->cipherSuite;
  22210. #endif
  22211. #ifndef NO_CLIENT_CACHE
  22212. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  22213. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  22214. idx += sess->idLen;
  22215. #endif
  22216. #ifdef OPENSSL_EXTRA
  22217. data[idx++] = sess->sessionCtxSz;
  22218. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  22219. idx += sess->sessionCtxSz;
  22220. #endif
  22221. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22222. data[idx++] = sess->peerVerifyRet;
  22223. #endif
  22224. #ifdef WOLFSSL_TLS13
  22225. c16toa(sess->namedGroup, data + idx);
  22226. idx += OPAQUE16_LEN;
  22227. #endif
  22228. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22229. #ifdef WOLFSSL_TLS13
  22230. #ifdef WOLFSSL_32BIT_MILLI_TIME
  22231. c32toa(sess->ticketSeen, data + idx);
  22232. idx += OPAQUE32_LEN;
  22233. #else
  22234. c32toa((word32)(sess->ticketSeen >> 32), data + idx);
  22235. idx += OPAQUE32_LEN;
  22236. c32toa((word32)sess->ticketSeen, data + idx);
  22237. idx += OPAQUE32_LEN;
  22238. #endif
  22239. c32toa(sess->ticketAdd, data + idx);
  22240. idx += OPAQUE32_LEN;
  22241. data[idx++] = sess->ticketNonce.len;
  22242. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  22243. idx += sess->ticketNonce.len;
  22244. #endif
  22245. #ifdef WOLFSSL_EARLY_DATA
  22246. c32toa(sess->maxEarlyDataSz, data + idx);
  22247. idx += OPAQUE32_LEN;
  22248. #endif
  22249. #endif
  22250. #ifdef HAVE_SESSION_TICKET
  22251. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  22252. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  22253. idx += sess->ticketLen;
  22254. #endif
  22255. }
  22256. #endif
  22257. (void)sess;
  22258. (void)p;
  22259. #ifdef HAVE_EXT_CACHE
  22260. (void)idx;
  22261. #endif
  22262. return size;
  22263. }
  22264. /* TODO: no function to free new session.
  22265. *
  22266. * Note: It is expected that the importing and exporting function have been
  22267. * built with the same settings. For example if session tickets was
  22268. * enabled with the wolfSSL library exporting a session then it is
  22269. * expected to be turned on with the wolfSSL library importing the session.
  22270. */
  22271. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  22272. const unsigned char** p, long i)
  22273. {
  22274. WOLFSSL_SESSION* s = NULL;
  22275. int ret = 0;
  22276. #if defined(HAVE_EXT_CACHE)
  22277. int idx;
  22278. byte* data;
  22279. #ifdef SESSION_CERTS
  22280. int j;
  22281. word16 length;
  22282. #endif
  22283. #endif /* HAVE_EXT_CACHE */
  22284. (void)p;
  22285. (void)i;
  22286. (void)ret;
  22287. (void)sess;
  22288. #ifdef HAVE_EXT_CACHE
  22289. if (p == NULL || *p == NULL)
  22290. return NULL;
  22291. s = wolfSSL_SESSION_new();
  22292. if (s == NULL)
  22293. return NULL;
  22294. idx = 0;
  22295. data = (byte*)*p;
  22296. /* side | bornOn | timeout | sessionID len */
  22297. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  22298. ret = BUFFER_ERROR;
  22299. goto end;
  22300. }
  22301. s->side = data[idx++];
  22302. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  22303. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  22304. s->sessionIDSz = data[idx++];
  22305. /* sessionID | secret | haveEMS | haveAltSessionID */
  22306. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) {
  22307. ret = BUFFER_ERROR;
  22308. goto end;
  22309. }
  22310. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  22311. idx += s->sessionIDSz;
  22312. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  22313. s->haveEMS = data[idx++];
  22314. if (data[idx] != ID_LEN && data[idx] != 0) {
  22315. ret = BUFFER_ERROR;
  22316. goto end;
  22317. }
  22318. s->haveAltSessionID = data[idx++] == ID_LEN;
  22319. /* altSessionID */
  22320. if (s->haveAltSessionID) {
  22321. if (i - idx < ID_LEN) {
  22322. ret = BUFFER_ERROR;
  22323. goto end;
  22324. }
  22325. XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN;
  22326. }
  22327. #ifdef SESSION_CERTS
  22328. /* Certificate chain */
  22329. if (i - idx == 0) {
  22330. ret = BUFFER_ERROR;
  22331. goto end;
  22332. }
  22333. s->chain.count = data[idx++];
  22334. for (j = 0; j < s->chain.count; j++) {
  22335. if (i - idx < OPAQUE16_LEN) {
  22336. ret = BUFFER_ERROR;
  22337. goto end;
  22338. }
  22339. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  22340. s->chain.certs[j].length = length;
  22341. if (i - idx < length) {
  22342. ret = BUFFER_ERROR;
  22343. goto end;
  22344. }
  22345. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  22346. idx += length;
  22347. }
  22348. #endif
  22349. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22350. defined(HAVE_SESSION_TICKET))
  22351. /* Protocol Version */
  22352. if (i - idx < OPAQUE16_LEN) {
  22353. ret = BUFFER_ERROR;
  22354. goto end;
  22355. }
  22356. s->version.major = data[idx++];
  22357. s->version.minor = data[idx++];
  22358. #endif
  22359. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22360. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22361. /* Cipher suite */
  22362. if (i - idx < OPAQUE16_LEN) {
  22363. ret = BUFFER_ERROR;
  22364. goto end;
  22365. }
  22366. s->cipherSuite0 = data[idx++];
  22367. s->cipherSuite = data[idx++];
  22368. #endif
  22369. #ifndef NO_CLIENT_CACHE
  22370. /* ServerID len */
  22371. if (i - idx < OPAQUE16_LEN) {
  22372. ret = BUFFER_ERROR;
  22373. goto end;
  22374. }
  22375. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  22376. /* ServerID */
  22377. if (i - idx < s->idLen) {
  22378. ret = BUFFER_ERROR;
  22379. goto end;
  22380. }
  22381. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  22382. #endif
  22383. #ifdef OPENSSL_EXTRA
  22384. /* byte for length of session context ID */
  22385. if (i - idx < OPAQUE8_LEN) {
  22386. ret = BUFFER_ERROR;
  22387. goto end;
  22388. }
  22389. s->sessionCtxSz = data[idx++];
  22390. /* app session context ID */
  22391. if (i - idx < s->sessionCtxSz) {
  22392. ret = BUFFER_ERROR;
  22393. goto end;
  22394. }
  22395. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  22396. #endif
  22397. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22398. /* byte for peerVerifyRet */
  22399. if (i - idx < OPAQUE8_LEN) {
  22400. ret = BUFFER_ERROR;
  22401. goto end;
  22402. }
  22403. s->peerVerifyRet = data[idx++];
  22404. #endif
  22405. #ifdef WOLFSSL_TLS13
  22406. if (i - idx < OPAQUE16_LEN) {
  22407. ret = BUFFER_ERROR;
  22408. goto end;
  22409. }
  22410. ato16(data + idx, &s->namedGroup);
  22411. idx += OPAQUE16_LEN;
  22412. #endif
  22413. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22414. #ifdef WOLFSSL_TLS13
  22415. if (i - idx < (OPAQUE32_LEN * 2)) {
  22416. ret = BUFFER_ERROR;
  22417. goto end;
  22418. }
  22419. #ifdef WOLFSSL_32BIT_MILLI_TIME
  22420. ato32(data + idx, &s->ticketSeen);
  22421. idx += OPAQUE32_LEN;
  22422. #else
  22423. {
  22424. word32 seenHi, seenLo;
  22425. ato32(data + idx, &seenHi);
  22426. idx += OPAQUE32_LEN;
  22427. ato32(data + idx, &seenLo);
  22428. idx += OPAQUE32_LEN;
  22429. s->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  22430. }
  22431. #endif
  22432. ato32(data + idx, &s->ticketAdd);
  22433. idx += OPAQUE32_LEN;
  22434. if (i - idx < OPAQUE8_LEN) {
  22435. ret = BUFFER_ERROR;
  22436. goto end;
  22437. }
  22438. s->ticketNonce.len = data[idx++];
  22439. if (i - idx < s->ticketNonce.len) {
  22440. ret = BUFFER_ERROR;
  22441. goto end;
  22442. }
  22443. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  22444. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  22445. ret = SessionTicketNoncePopulate(s, data + idx, s->ticketNonce.len);
  22446. if (ret != 0)
  22447. goto end;
  22448. #else
  22449. if (s->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  22450. ret = BUFFER_ERROR;
  22451. goto end;
  22452. }
  22453. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  22454. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  22455. idx += s->ticketNonce.len;
  22456. #endif
  22457. #ifdef WOLFSSL_EARLY_DATA
  22458. if (i - idx < OPAQUE32_LEN) {
  22459. ret = BUFFER_ERROR;
  22460. goto end;
  22461. }
  22462. ato32(data + idx, &s->maxEarlyDataSz);
  22463. idx += OPAQUE32_LEN;
  22464. #endif
  22465. #endif
  22466. #ifdef HAVE_SESSION_TICKET
  22467. /* ticket len */
  22468. if (i - idx < OPAQUE16_LEN) {
  22469. ret = BUFFER_ERROR;
  22470. goto end;
  22471. }
  22472. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  22473. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  22474. if (s->ticketLenAlloc > 0) {
  22475. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  22476. }
  22477. if (s->ticketLen <= SESSION_TICKET_LEN)
  22478. s->ticket = s->staticTicket;
  22479. else {
  22480. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  22481. DYNAMIC_TYPE_SESSION_TICK);
  22482. if (s->ticket == NULL) {
  22483. ret = MEMORY_ERROR;
  22484. goto end;
  22485. }
  22486. s->ticketLenAlloc = (word16)s->ticketLen;
  22487. }
  22488. /* ticket */
  22489. if (i - idx < s->ticketLen) {
  22490. ret = BUFFER_ERROR;
  22491. goto end;
  22492. }
  22493. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  22494. #endif
  22495. (void)idx;
  22496. if (sess != NULL) {
  22497. *sess = s;
  22498. }
  22499. *p += idx;
  22500. end:
  22501. if (ret != 0 && (sess == NULL || *sess != s)) {
  22502. wolfSSL_SESSION_free(s);
  22503. s = NULL;
  22504. }
  22505. #endif /* HAVE_EXT_CACHE */
  22506. return s;
  22507. }
  22508. /* Check if there is a session ticket associated with this WOLFSSL_SESSION.
  22509. *
  22510. * sess - pointer to WOLFSSL_SESSION struct
  22511. *
  22512. * Returns 1 if has session ticket, otherwise 0 */
  22513. int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess)
  22514. {
  22515. WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket");
  22516. #ifdef HAVE_SESSION_TICKET
  22517. sess = ClientSessionToSession(sess);
  22518. if (sess) {
  22519. if ((sess->ticketLen > 0) && (sess->ticket != NULL)) {
  22520. return WOLFSSL_SUCCESS;
  22521. }
  22522. }
  22523. #else
  22524. (void)sess;
  22525. #endif
  22526. return WOLFSSL_FAILURE;
  22527. }
  22528. unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint(
  22529. const WOLFSSL_SESSION* sess)
  22530. {
  22531. WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint");
  22532. sess = ClientSessionToSession(sess);
  22533. if (sess) {
  22534. return sess->timeout;
  22535. }
  22536. return 0;
  22537. }
  22538. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  22539. {
  22540. long timeout = 0;
  22541. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  22542. sess = ClientSessionToSession(sess);
  22543. if (sess)
  22544. timeout = sess->timeout;
  22545. return timeout;
  22546. }
  22547. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  22548. {
  22549. long bornOn = 0;
  22550. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  22551. sess = ClientSessionToSession(sess);
  22552. if (sess)
  22553. bornOn = sess->bornOn;
  22554. return bornOn;
  22555. }
  22556. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  22557. {
  22558. word32 tmptime;
  22559. ses = ClientSessionToSession(ses);
  22560. if (ses == NULL || t < 0) {
  22561. return BAD_FUNC_ARG;
  22562. }
  22563. tmptime = t & 0xFFFFFFFF;
  22564. ses->timeout = tmptime;
  22565. return WOLFSSL_SUCCESS;
  22566. }
  22567. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  22568. #ifdef OPENSSL_EXTRA
  22569. #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
  22570. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  22571. {
  22572. int ret = WOLFSSL_FATAL_ERROR;
  22573. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  22574. if (ssl != NULL && fname != NULL)
  22575. {
  22576. #ifdef WOLFSSL_SMALL_STACK
  22577. byte staticBuffer[1]; /* force heap usage */
  22578. #else
  22579. byte staticBuffer[FILE_BUFFER_SIZE];
  22580. #endif
  22581. byte* myBuffer = staticBuffer;
  22582. int dynamic = 0;
  22583. XFILE file;
  22584. long sz = 0;
  22585. WOLFSSL_CTX* ctx = ssl->ctx;
  22586. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  22587. DerBuffer* fileDer = NULL;
  22588. file = XFOPEN(fname, "rb");
  22589. if (file == XBADFILE)
  22590. return WOLFSSL_BAD_FILE;
  22591. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  22592. XFCLOSE(file);
  22593. return WOLFSSL_BAD_FILE;
  22594. }
  22595. sz = XFTELL(file);
  22596. XREWIND(file);
  22597. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  22598. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  22599. XFCLOSE(file);
  22600. return WOLFSSL_BAD_FILE;
  22601. }
  22602. if (sz > (long)sizeof(staticBuffer)) {
  22603. WOLFSSL_MSG("Getting dynamic buffer");
  22604. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  22605. dynamic = 1;
  22606. }
  22607. if ((myBuffer != NULL) &&
  22608. (sz > 0) &&
  22609. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  22610. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  22611. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  22612. (fileDer->length != 0) &&
  22613. (fileDer->length == peer_cert->derCert->length) &&
  22614. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  22615. fileDer->length) == 0))
  22616. {
  22617. ret = 0;
  22618. }
  22619. FreeDer(&fileDer);
  22620. if (dynamic)
  22621. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  22622. XFCLOSE(file);
  22623. }
  22624. return ret;
  22625. }
  22626. #endif
  22627. #endif /* OPENSSL_EXTRA */
  22628. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22629. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  22630. #ifndef NO_CERTS
  22631. /* oidCertExtType */
  22632. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  22633. "X509v3 Basic Constraints"},
  22634. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  22635. "X509v3 Subject Alternative Name"},
  22636. { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  22637. "X509v3 CRL Distribution Points"},
  22638. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  22639. "Authority Information Access"},
  22640. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  22641. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  22642. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  22643. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  22644. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  22645. "X509v3 Key Usage"},
  22646. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  22647. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  22648. { NID_ext_key_usage, EXT_KEY_USAGE_OID, oidCertExtType,
  22649. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  22650. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  22651. "nameConstraints", "X509v3 Name Constraints"},
  22652. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  22653. "certificatePolicies", "X509v3 Certificate Policies"},
  22654. /* oidCertAuthInfoType */
  22655. { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP",
  22656. "OCSP"},
  22657. { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  22658. "caIssuers", "CA Issuers"},
  22659. /* oidCertPolicyType */
  22660. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  22661. "X509v3 Any Policy"},
  22662. /* oidCertAltNameType */
  22663. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  22664. /* oidCertKeyUseType */
  22665. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  22666. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  22667. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  22668. "serverAuth", "TLS Web Server Authentication"},
  22669. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  22670. "clientAuth", "TLS Web Client Authentication"},
  22671. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  22672. "OCSPSigning", "OCSP Signing"},
  22673. /* oidCertNameType */
  22674. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  22675. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  22676. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  22677. "serialNumber"},
  22678. { NID_userId, NID_userId, oidCertNameType, "UID", "userid"},
  22679. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  22680. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  22681. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  22682. "stateOrProvinceName"},
  22683. { NID_streetAddress, NID_streetAddress, oidCertNameType, "street",
  22684. "streetAddress"},
  22685. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  22686. "organizationName"},
  22687. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  22688. "OU", "organizationalUnitName"},
  22689. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  22690. "emailAddress"},
  22691. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  22692. "domainComponent"},
  22693. { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink",
  22694. "favouriteDrink"},
  22695. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  22696. "businessCategory"},
  22697. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  22698. "jurisdictionCountryName"},
  22699. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  22700. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  22701. { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"},
  22702. { NID_userId, NID_userId, oidCertNameType, "UID", "userId"},
  22703. #ifdef WOLFSSL_CERT_REQ
  22704. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  22705. oidCsrAttrType, "challengePassword", "challengePassword"},
  22706. { NID_pkcs9_contentType, PKCS9_CONTENT_TYPE_OID,
  22707. oidCsrAttrType, "contentType", "contentType" },
  22708. { NID_pkcs9_unstructuredName, UNSTRUCTURED_NAME_OID,
  22709. oidCsrAttrType, "unstructuredName", "unstructuredName" },
  22710. { NID_name, NAME_OID, oidCsrAttrType, "name", "name" },
  22711. { NID_surname, SURNAME_OID,
  22712. oidCsrAttrType, "surname", "surname" },
  22713. { NID_givenName, GIVEN_NAME_OID,
  22714. oidCsrAttrType, "givenName", "givenName" },
  22715. { NID_initials, INITIALS_OID,
  22716. oidCsrAttrType, "initials", "initials" },
  22717. { NID_dnQualifier, DNQUALIFIER_OID,
  22718. oidCsrAttrType, "dnQualifer", "dnQualifier" },
  22719. #endif
  22720. #endif
  22721. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  22722. /* oidHashType */
  22723. #ifdef WOLFSSL_MD2
  22724. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  22725. #endif
  22726. #ifdef WOLFSSL_MD5
  22727. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  22728. #endif
  22729. #ifndef NO_SHA
  22730. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  22731. #endif
  22732. #ifdef WOLFSSL_SHA224
  22733. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  22734. #endif
  22735. #ifndef NO_SHA256
  22736. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  22737. #endif
  22738. #ifdef WOLFSSL_SHA384
  22739. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  22740. #endif
  22741. #ifdef WOLFSSL_SHA512
  22742. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  22743. #endif
  22744. #ifdef WOLFSSL_SHA3
  22745. #ifndef WOLFSSL_NOSHA3_224
  22746. { NID_sha3_224, SHA3_224h, oidHashType, "SHA3-224", "sha3-224"},
  22747. #endif
  22748. #ifndef WOLFSSL_NOSHA3_256
  22749. { NID_sha3_256, SHA3_256h, oidHashType, "SHA3-256", "sha3-256"},
  22750. #endif
  22751. #ifndef WOLFSSL_NOSHA3_384
  22752. { NID_sha3_384, SHA3_384h, oidHashType, "SHA3-384", "sha3-384"},
  22753. #endif
  22754. #ifndef WOLFSSL_NOSHA3_512
  22755. { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"},
  22756. #endif
  22757. #endif /* WOLFSSL_SHA3 */
  22758. /* oidSigType */
  22759. #ifndef NO_DSA
  22760. #ifndef NO_SHA
  22761. { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  22762. { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  22763. "dsa_with_SHA256"},
  22764. #endif
  22765. #endif /* NO_DSA */
  22766. #ifndef NO_RSA
  22767. #ifdef WOLFSSL_MD2
  22768. { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  22769. "md2WithRSAEncryption"},
  22770. #endif
  22771. #ifndef NO_MD5
  22772. { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  22773. "md5WithRSAEncryption"},
  22774. #endif
  22775. #ifndef NO_SHA
  22776. { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  22777. "sha1WithRSAEncryption"},
  22778. #endif
  22779. #ifdef WOLFSSL_SHA224
  22780. { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  22781. "sha224WithRSAEncryption"},
  22782. #endif
  22783. #ifndef NO_SHA256
  22784. { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  22785. "sha256WithRSAEncryption"},
  22786. #endif
  22787. #ifdef WOLFSSL_SHA384
  22788. { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  22789. "sha384WithRSAEncryption"},
  22790. #endif
  22791. #ifdef WOLFSSL_SHA512
  22792. { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  22793. "sha512WithRSAEncryption"},
  22794. #endif
  22795. #ifdef WOLFSSL_SHA3
  22796. #ifndef WOLFSSL_NOSHA3_224
  22797. { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224",
  22798. "sha3-224WithRSAEncryption"},
  22799. #endif
  22800. #ifndef WOLFSSL_NOSHA3_256
  22801. { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256",
  22802. "sha3-256WithRSAEncryption"},
  22803. #endif
  22804. #ifndef WOLFSSL_NOSHA3_384
  22805. { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384",
  22806. "sha3-384WithRSAEncryption"},
  22807. #endif
  22808. #ifndef WOLFSSL_NOSHA3_512
  22809. { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512",
  22810. "sha3-512WithRSAEncryption"},
  22811. #endif
  22812. #endif
  22813. #endif /* NO_RSA */
  22814. #ifdef HAVE_ECC
  22815. #ifndef NO_SHA
  22816. { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  22817. #endif
  22818. #ifdef WOLFSSL_SHA224
  22819. { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  22820. #endif
  22821. #ifndef NO_SHA256
  22822. { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  22823. #endif
  22824. #ifdef WOLFSSL_SHA384
  22825. { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  22826. #endif
  22827. #ifdef WOLFSSL_SHA512
  22828. { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  22829. #endif
  22830. #ifdef WOLFSSL_SHA3
  22831. #ifndef WOLFSSL_NOSHA3_224
  22832. { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224",
  22833. "ecdsa_with_SHA3-224"},
  22834. #endif
  22835. #ifndef WOLFSSL_NOSHA3_256
  22836. { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256",
  22837. "ecdsa_with_SHA3-256"},
  22838. #endif
  22839. #ifndef WOLFSSL_NOSHA3_384
  22840. { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384",
  22841. "ecdsa_with_SHA3-384"},
  22842. #endif
  22843. #ifndef WOLFSSL_NOSHA3_512
  22844. { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512",
  22845. "ecdsa_with_SHA3-512"},
  22846. #endif
  22847. #endif
  22848. #endif /* HAVE_ECC */
  22849. /* oidKeyType */
  22850. #ifndef NO_DSA
  22851. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  22852. #endif /* NO_DSA */
  22853. #ifndef NO_RSA
  22854. { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"},
  22855. #endif /* NO_RSA */
  22856. #ifdef HAVE_ECC
  22857. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  22858. "id-ecPublicKey"},
  22859. #endif /* HAVE_ECC */
  22860. #ifndef NO_DH
  22861. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  22862. #endif
  22863. #ifdef HAVE_ED448
  22864. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  22865. #endif
  22866. #ifdef HAVE_ED25519
  22867. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  22868. #endif
  22869. #ifdef HAVE_PQC
  22870. #ifdef HAVE_FALCON
  22871. { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1",
  22872. "Falcon Level 1"},
  22873. { CTC_FALCON_LEVEL5, FALCON_LEVEL5k, oidKeyType, "Falcon Level 5",
  22874. "Falcon Level 5"},
  22875. #endif /* HAVE_FALCON */
  22876. #ifdef HAVE_DILITHIUM
  22877. { CTC_DILITHIUM_LEVEL2, DILITHIUM_LEVEL2k, oidKeyType,
  22878. "Dilithium Level 2", "Dilithium Level 2"},
  22879. { CTC_DILITHIUM_LEVEL3, DILITHIUM_LEVEL3k, oidKeyType,
  22880. "Dilithium Level 3", "Dilithium Level 3"},
  22881. { CTC_DILITHIUM_LEVEL5, DILITHIUM_LEVEL5k, oidKeyType,
  22882. "Dilithium Level 5", "Dilithium Level 5"},
  22883. { CTC_DILITHIUM_AES_LEVEL2, DILITHIUM_AES_LEVEL2k, oidKeyType,
  22884. "Dilithium AES Level 2", "Dilithium AES Level 2"},
  22885. { CTC_DILITHIUM_AES_LEVEL3, DILITHIUM_AES_LEVEL3k, oidKeyType,
  22886. "Dilithium AES Level 3", "Dilithium AES Level 3"},
  22887. { CTC_DILITHIUM_AES_LEVEL5, DILITHIUM_AES_LEVEL5k, oidKeyType,
  22888. "Dilithium AES Level 5", "Dilithium AES Level 5"},
  22889. #endif /* HAVE_DILITHIUM */
  22890. #endif /* HAVE_PQC */
  22891. /* oidCurveType */
  22892. #ifdef HAVE_ECC
  22893. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  22894. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  22895. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  22896. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  22897. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  22898. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  22899. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  22900. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  22901. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  22902. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  22903. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  22904. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  22905. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  22906. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  22907. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  22908. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  22909. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  22910. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  22911. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  22912. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  22913. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  22914. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  22915. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  22916. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  22917. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  22918. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  22919. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  22920. #endif /* HAVE_ECC */
  22921. /* oidBlkType */
  22922. #ifdef WOLFSSL_AES_128
  22923. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  22924. #endif
  22925. #ifdef WOLFSSL_AES_192
  22926. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  22927. #endif
  22928. #ifdef WOLFSSL_AES_256
  22929. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  22930. #endif
  22931. #ifndef NO_DES3
  22932. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  22933. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  22934. #endif /* !NO_DES3 */
  22935. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  22936. { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, "ChaCha20-Poly1305", "chacha20-poly1305"},
  22937. #endif
  22938. /* oidOcspType */
  22939. #ifdef HAVE_OCSP
  22940. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  22941. "Basic OCSP Response"},
  22942. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  22943. "OCSP Nonce"},
  22944. #endif /* HAVE_OCSP */
  22945. #ifndef NO_PWDBASED
  22946. /* oidKdfType */
  22947. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  22948. /* oidPBEType */
  22949. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  22950. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  22951. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  22952. "pbeWithSHA1AndDES-CBC"},
  22953. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  22954. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  22955. #endif
  22956. /* oidKeyWrapType */
  22957. #ifdef WOLFSSL_AES_128
  22958. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  22959. #endif
  22960. #ifdef WOLFSSL_AES_192
  22961. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  22962. #endif
  22963. #ifdef WOLFSSL_AES_256
  22964. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  22965. #endif
  22966. #ifndef NO_PKCS7
  22967. #ifndef NO_DH
  22968. /* oidCmsKeyAgreeType */
  22969. #ifndef NO_SHA
  22970. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  22971. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  22972. #endif
  22973. #ifdef WOLFSSL_SHA224
  22974. { dhSinglePass_stdDH_sha224kdf_scheme,
  22975. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  22976. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  22977. #endif
  22978. #ifndef NO_SHA256
  22979. { dhSinglePass_stdDH_sha256kdf_scheme,
  22980. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  22981. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  22982. #endif
  22983. #ifdef WOLFSSL_SHA384
  22984. { dhSinglePass_stdDH_sha384kdf_scheme,
  22985. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  22986. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  22987. #endif
  22988. #ifdef WOLFSSL_SHA512
  22989. { dhSinglePass_stdDH_sha512kdf_scheme,
  22990. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  22991. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  22992. #endif
  22993. #endif
  22994. #endif
  22995. #if defined(WOLFSSL_APACHE_HTTPD)
  22996. /* "1.3.6.1.5.5.7.8.7" */
  22997. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  22998. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  22999. /* "1.3.6.1.4.1.311.20.2.3" */
  23000. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  23001. WOLFSSL_LN_MS_UPN },
  23002. /* "1.3.6.1.5.5.7.1.24" */
  23003. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  23004. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  23005. #endif
  23006. #endif /* OPENSSL_EXTRA */
  23007. };
  23008. #define WOLFSSL_OBJECT_INFO_SZ \
  23009. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  23010. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  23011. #endif
  23012. #ifdef OPENSSL_EXTRA
  23013. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  23014. {
  23015. WOLFSSL_ASN1_INTEGER* a;
  23016. int len;
  23017. const int extraTagSz = MAX_LENGTH_SZ + 1;
  23018. byte intTag[MAX_LENGTH_SZ + 1];
  23019. int idx = 0;
  23020. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  23021. if (ai == NULL) {
  23022. a = wolfSSL_ASN1_INTEGER_new();
  23023. if (a == NULL)
  23024. return NULL;
  23025. a->type = V_ASN1_INTEGER;
  23026. }
  23027. else {
  23028. a = ai;
  23029. }
  23030. if (a) {
  23031. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  23032. a->type |= V_ASN1_NEG_INTEGER;
  23033. a->negative = 1;
  23034. }
  23035. len = wolfSSL_BN_num_bytes(bn);
  23036. if (len == 0)
  23037. len = 1;
  23038. /* allocate buffer */
  23039. if (len + extraTagSz > (int)sizeof(a->intData)) {
  23040. /* create new data buffer and copy over */
  23041. a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  23042. DYNAMIC_TYPE_OPENSSL);
  23043. if (a->data == NULL) {
  23044. if (a != ai)
  23045. wolfSSL_ASN1_INTEGER_free(a);
  23046. return NULL;
  23047. }
  23048. a->isDynamic = 1;
  23049. }
  23050. else {
  23051. XMEMSET(a->intData, 0, sizeof(a->intData));
  23052. a->data = a->intData;
  23053. a->isDynamic = 0;
  23054. }
  23055. /* populate data */
  23056. if (wolfSSL_BN_is_zero(bn)) {
  23057. a->data[0] = 0;
  23058. }
  23059. else {
  23060. len = wolfSSL_BN_bn2bin(bn, a->data);
  23061. if (len < 0) {
  23062. wolfSSL_ASN1_INTEGER_free(a);
  23063. return NULL;
  23064. }
  23065. }
  23066. a->length = len;
  23067. /* Write ASN tag */
  23068. idx = SetASNInt(a->length, a->data[0], intTag);
  23069. XMEMMOVE(a->data + idx, a->data, a->length);
  23070. XMEMCPY(a->data, intTag, idx);
  23071. a->dataMax = a->length += idx;
  23072. }
  23073. return a;
  23074. }
  23075. #ifdef OPENSSL_ALL
  23076. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  23077. {
  23078. void *ret = NULL;
  23079. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23080. size_t i;
  23081. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  23082. if (!tpl) {
  23083. return NULL;
  23084. }
  23085. if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  23086. return NULL;
  23087. }
  23088. XMEMSET(ret, 0, tpl->size);
  23089. for (member = tpl->members, i = 0; i < tpl->mcount;
  23090. member++, i++) {
  23091. switch (member->type) {
  23092. case WOLFSSL_X509_ALGOR_ASN1:
  23093. {
  23094. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  23095. if (!algor) {
  23096. goto error;
  23097. }
  23098. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  23099. break;
  23100. }
  23101. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23102. {
  23103. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  23104. if (!bit_str) {
  23105. goto error;
  23106. }
  23107. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  23108. break;
  23109. }
  23110. default:
  23111. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  23112. goto error;
  23113. }
  23114. }
  23115. return ret;
  23116. error:
  23117. wolfSSL_ASN1_item_free(ret, tpl);
  23118. return NULL;
  23119. }
  23120. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  23121. {
  23122. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23123. size_t i;
  23124. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  23125. if (val) {
  23126. for (member = tpl->members, i = 0; i < tpl->mcount;
  23127. member++, i++) {
  23128. switch (member->type) {
  23129. case WOLFSSL_X509_ALGOR_ASN1:
  23130. {
  23131. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  23132. (((byte*)val) + member->offset);
  23133. if (algor) {
  23134. wolfSSL_X509_ALGOR_free(algor);
  23135. }
  23136. break;
  23137. }
  23138. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23139. {
  23140. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  23141. (((byte*)val) + member->offset);
  23142. if (bit_str) {
  23143. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  23144. }
  23145. break;
  23146. }
  23147. default:
  23148. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  23149. }
  23150. }
  23151. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  23152. }
  23153. }
  23154. #define bufLenOrNull(buf, len) ((buf) ? (buf) + (len) : NULL)
  23155. static int i2dProcessMembers(const void *src, byte *buf,
  23156. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  23157. {
  23158. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23159. int len = 0, ret;
  23160. size_t i;
  23161. WOLFSSL_ENTER("processMembers");
  23162. for (member = members, i = 0; i < mcount; member++, i++) {
  23163. switch (member->type) {
  23164. case WOLFSSL_X509_ALGOR_ASN1:
  23165. {
  23166. word32 oid = 0;
  23167. word32 idx = 0;
  23168. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  23169. (((byte*)src) + member->offset);
  23170. if (!algor->algorithm) {
  23171. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  23172. return WOLFSSL_FAILURE;
  23173. }
  23174. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  23175. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  23176. WOLFSSL_MSG("Issue getting OID of object");
  23177. return -1;
  23178. }
  23179. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  23180. algor->algorithm->grp, 0);
  23181. if (!ret) {
  23182. return WOLFSSL_FAILURE;
  23183. }
  23184. len += ret;
  23185. break;
  23186. }
  23187. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23188. {
  23189. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  23190. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  23191. (((byte*)src) + member->offset);
  23192. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  23193. if (buf && bit_str->data) {
  23194. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  23195. }
  23196. len += bit_str->length;
  23197. break;
  23198. }
  23199. default:
  23200. WOLFSSL_MSG("Type not support in processMembers");
  23201. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  23202. return WOLFSSL_FAILURE;
  23203. }
  23204. }
  23205. WOLFSSL_LEAVE("processMembers", len);
  23206. return len;
  23207. }
  23208. static int wolfSSL_ASN1_item_i2d_1(const void *src, byte *buf,
  23209. const WOLFSSL_ASN1_ITEM *tpl, int *len)
  23210. {
  23211. *len = 0;
  23212. switch (tpl->type) {
  23213. case ASN_SEQUENCE:
  23214. {
  23215. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  23216. tpl->mcount);
  23217. if (seq_len == WOLFSSL_FAILURE)
  23218. return WOLFSSL_FAILURE;
  23219. *len += SetSequence(seq_len, bufLenOrNull(buf, *len));
  23220. if (buf) {
  23221. if (i2dProcessMembers(src, bufLenOrNull(buf, *len), tpl->members,
  23222. tpl->mcount) != seq_len) {
  23223. WOLFSSL_MSG("Inconsistent sequence length");
  23224. return WOLFSSL_FAILURE;
  23225. }
  23226. }
  23227. *len += seq_len;
  23228. break;
  23229. }
  23230. default:
  23231. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  23232. return WOLFSSL_FAILURE;
  23233. }
  23234. return WOLFSSL_SUCCESS;
  23235. }
  23236. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  23237. const WOLFSSL_ASN1_ITEM *tpl)
  23238. {
  23239. int len;
  23240. byte *buf = NULL;
  23241. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  23242. if ((src == NULL) || (tpl == NULL))
  23243. goto error;
  23244. if (wolfSSL_ASN1_item_i2d_1(src, NULL, tpl, &len) != WOLFSSL_SUCCESS)
  23245. goto error;
  23246. if (dest == NULL) {
  23247. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_SUCCESS);
  23248. return len;
  23249. }
  23250. if (*dest == NULL) {
  23251. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  23252. if (buf == NULL)
  23253. goto error;
  23254. } else
  23255. buf = *dest;
  23256. if (wolfSSL_ASN1_item_i2d_1(src, buf, tpl, &len) != WOLFSSL_SUCCESS)
  23257. goto error;
  23258. if (*dest == NULL)
  23259. *dest = buf;
  23260. else {
  23261. /* XXX *dest length is not checked because the user is responsible
  23262. * for providing a long enough buffer
  23263. */
  23264. XMEMCPY(*dest, buf, len);
  23265. }
  23266. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  23267. return len;
  23268. error:
  23269. if (buf) {
  23270. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  23271. }
  23272. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  23273. return WOLFSSL_FAILURE;
  23274. }
  23275. #endif /* OPENSSL_ALL */
  23276. #endif /* OPENSSL_EXTRA */
  23277. #ifdef OPENSSL_EXTRA
  23278. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  23279. {
  23280. WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
  23281. sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
  23282. if (hmac_ctx != NULL) {
  23283. XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  23284. }
  23285. return hmac_ctx;
  23286. }
  23287. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  23288. {
  23289. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  23290. if (ctx != NULL) {
  23291. /* wc_HmacSetKey sets up ctx->hmac */
  23292. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  23293. }
  23294. return WOLFSSL_SUCCESS;
  23295. }
  23296. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  23297. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  23298. {
  23299. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  23300. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  23301. (void)e;
  23302. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  23303. }
  23304. /* helper function for Deep copy of internal wolfSSL hmac structure
  23305. * returns WOLFSSL_SUCCESS on success */
  23306. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  23307. {
  23308. void* heap;
  23309. int ret;
  23310. #ifndef HAVE_FIPS
  23311. heap = src->heap;
  23312. #else
  23313. heap = NULL;
  23314. #endif
  23315. if (wc_HmacInit(des, heap, 0) != 0) {
  23316. return WOLFSSL_FAILURE;
  23317. }
  23318. /* requires that hash structures have no dynamic parts to them */
  23319. switch (src->macType) {
  23320. #ifndef NO_MD5
  23321. case WC_MD5:
  23322. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  23323. break;
  23324. #endif /* !NO_MD5 */
  23325. #ifndef NO_SHA
  23326. case WC_SHA:
  23327. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  23328. break;
  23329. #endif /* !NO_SHA */
  23330. #ifdef WOLFSSL_SHA224
  23331. case WC_SHA224:
  23332. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  23333. break;
  23334. #endif /* WOLFSSL_SHA224 */
  23335. #ifndef NO_SHA256
  23336. case WC_SHA256:
  23337. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  23338. break;
  23339. #endif /* !NO_SHA256 */
  23340. #ifdef WOLFSSL_SHA384
  23341. case WC_SHA384:
  23342. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  23343. break;
  23344. #endif /* WOLFSSL_SHA384 */
  23345. #ifdef WOLFSSL_SHA512
  23346. case WC_SHA512:
  23347. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  23348. break;
  23349. #endif /* WOLFSSL_SHA512 */
  23350. #ifdef WOLFSSL_SHA3
  23351. #ifndef WOLFSSL_NOSHA3_224
  23352. case WC_SHA3_224:
  23353. ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
  23354. break;
  23355. #endif /* WOLFSSL_NO_SHA3_224 */
  23356. #ifndef WOLFSSL_NOSHA3_256
  23357. case WC_SHA3_256:
  23358. ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
  23359. break;
  23360. #endif /* WOLFSSL_NO_SHA3_256 */
  23361. #ifndef WOLFSSL_NOSHA3_384
  23362. case WC_SHA3_384:
  23363. ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
  23364. break;
  23365. #endif /* WOLFSSL_NO_SHA3_384 */
  23366. #ifndef WOLFSSL_NOSHA3_512
  23367. case WC_SHA3_512:
  23368. ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
  23369. break;
  23370. #endif /* WOLFSSL_NO_SHA3_512 */
  23371. #endif /* WOLFSSL_SHA3 */
  23372. default:
  23373. return WOLFSSL_FAILURE;
  23374. }
  23375. if (ret != 0)
  23376. return WOLFSSL_FAILURE;
  23377. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  23378. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  23379. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  23380. #ifndef HAVE_FIPS
  23381. des->heap = heap;
  23382. #endif
  23383. des->macType = src->macType;
  23384. des->innerHashKeyed = src->innerHashKeyed;
  23385. #ifdef WOLFSSL_ASYNC_CRYPT
  23386. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  23387. des->keyLen = src->keyLen;
  23388. #ifdef HAVE_CAVIUM
  23389. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  23390. DYNAMIC_TYPE_HMAC);
  23391. if (des->data == NULL) {
  23392. return BUFFER_E;
  23393. }
  23394. XMEMCPY(des->data, src->data, src->dataLen);
  23395. des->dataLen = src->dataLen;
  23396. #endif /* HAVE_CAVIUM */
  23397. #endif /* WOLFSSL_ASYNC_CRYPT */
  23398. return WOLFSSL_SUCCESS;
  23399. }
  23400. /* Deep copy of information from src to des structure
  23401. *
  23402. * des destination to copy information to
  23403. * src structure to get information from
  23404. *
  23405. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  23406. */
  23407. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  23408. {
  23409. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  23410. if (des == NULL || src == NULL) {
  23411. return WOLFSSL_FAILURE;
  23412. }
  23413. des->type = src->type;
  23414. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  23415. WC_HMAC_BLOCK_SIZE);
  23416. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  23417. WC_HMAC_BLOCK_SIZE);
  23418. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  23419. }
  23420. #if defined(HAVE_FIPS) && \
  23421. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  23422. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  23423. {
  23424. int ret = 0;
  23425. switch (type) {
  23426. #ifndef NO_MD5
  23427. case WC_MD5:
  23428. ret = wc_InitMd5(&hmac->hash.md5);
  23429. break;
  23430. #endif /* !NO_MD5 */
  23431. #ifndef NO_SHA
  23432. case WC_SHA:
  23433. ret = wc_InitSha(&hmac->hash.sha);
  23434. break;
  23435. #endif /* !NO_SHA */
  23436. #ifdef WOLFSSL_SHA224
  23437. case WC_SHA224:
  23438. ret = wc_InitSha224(&hmac->hash.sha224);
  23439. break;
  23440. #endif /* WOLFSSL_SHA224 */
  23441. #ifndef NO_SHA256
  23442. case WC_SHA256:
  23443. ret = wc_InitSha256(&hmac->hash.sha256);
  23444. break;
  23445. #endif /* !NO_SHA256 */
  23446. #ifdef WOLFSSL_SHA384
  23447. case WC_SHA384:
  23448. ret = wc_InitSha384(&hmac->hash.sha384);
  23449. break;
  23450. #endif /* WOLFSSL_SHA384 */
  23451. #ifdef WOLFSSL_SHA512
  23452. case WC_SHA512:
  23453. ret = wc_InitSha512(&hmac->hash.sha512);
  23454. break;
  23455. #endif /* WOLFSSL_SHA512 */
  23456. #ifdef WOLFSSL_SHA3
  23457. case WC_SHA3_224:
  23458. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  23459. break;
  23460. case WC_SHA3_256:
  23461. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  23462. break;
  23463. case WC_SHA3_384:
  23464. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  23465. break;
  23466. case WC_SHA3_512:
  23467. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  23468. break;
  23469. #endif
  23470. default:
  23471. ret = BAD_FUNC_ARG;
  23472. break;
  23473. }
  23474. (void)heap;
  23475. return ret;
  23476. }
  23477. #else
  23478. #define _HMAC_Init _InitHmac
  23479. #endif
  23480. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  23481. const EVP_MD* type)
  23482. {
  23483. int hmac_error = 0;
  23484. void* heap = NULL;
  23485. int inited;
  23486. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  23487. if (ctx == NULL) {
  23488. WOLFSSL_MSG("no ctx on init");
  23489. return WOLFSSL_FAILURE;
  23490. }
  23491. #ifndef HAVE_FIPS
  23492. heap = ctx->hmac.heap;
  23493. #endif
  23494. if (type) {
  23495. WOLFSSL_MSG("init has type");
  23496. #ifndef NO_MD5
  23497. if (XSTRNCMP(type, "MD5", 3) == 0) {
  23498. WOLFSSL_MSG("md5 hmac");
  23499. ctx->type = WC_MD5;
  23500. }
  23501. else
  23502. #endif
  23503. #ifdef WOLFSSL_SHA224
  23504. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  23505. WOLFSSL_MSG("sha224 hmac");
  23506. ctx->type = WC_SHA224;
  23507. }
  23508. else
  23509. #endif
  23510. #ifndef NO_SHA256
  23511. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  23512. WOLFSSL_MSG("sha256 hmac");
  23513. ctx->type = WC_SHA256;
  23514. }
  23515. else
  23516. #endif
  23517. #ifdef WOLFSSL_SHA384
  23518. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  23519. WOLFSSL_MSG("sha384 hmac");
  23520. ctx->type = WC_SHA384;
  23521. }
  23522. else
  23523. #endif
  23524. #ifdef WOLFSSL_SHA512
  23525. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  23526. WOLFSSL_MSG("sha512 hmac");
  23527. ctx->type = WC_SHA512;
  23528. }
  23529. else
  23530. #endif
  23531. #ifdef WOLFSSL_SHA3
  23532. #ifndef WOLFSSL_NOSHA3_224
  23533. if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
  23534. WOLFSSL_MSG("sha3_224 hmac");
  23535. ctx->type = WC_SHA3_224;
  23536. }
  23537. else
  23538. #endif
  23539. #ifndef WOLFSSL_NOSHA3_256
  23540. if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
  23541. WOLFSSL_MSG("sha3_256 hmac");
  23542. ctx->type = WC_SHA3_256;
  23543. }
  23544. else
  23545. #endif
  23546. if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
  23547. WOLFSSL_MSG("sha3_384 hmac");
  23548. ctx->type = WC_SHA3_384;
  23549. }
  23550. else
  23551. #ifndef WOLFSSL_NOSHA3_512
  23552. if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
  23553. WOLFSSL_MSG("sha3_512 hmac");
  23554. ctx->type = WC_SHA3_512;
  23555. }
  23556. else
  23557. #endif
  23558. #endif
  23559. #ifndef NO_SHA
  23560. /* has to be last since would pick or 256, 384, or 512 too */
  23561. if (XSTRNCMP(type, "SHA", 3) == 0) {
  23562. WOLFSSL_MSG("sha hmac");
  23563. ctx->type = WC_SHA;
  23564. }
  23565. else
  23566. #endif
  23567. {
  23568. WOLFSSL_MSG("bad init type");
  23569. return WOLFSSL_FAILURE;
  23570. }
  23571. }
  23572. /* Check if init has been called before */
  23573. inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
  23574. /* Free if needed */
  23575. if (inited) {
  23576. wc_HmacFree(&ctx->hmac);
  23577. }
  23578. if (key != NULL) {
  23579. WOLFSSL_MSG("keying hmac");
  23580. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  23581. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  23582. (word32)keylen);
  23583. if (hmac_error < 0){
  23584. /* in FIPS mode a key < 14 characters will fail here */
  23585. WOLFSSL_MSG("hmac set key error");
  23586. WOLFSSL_ERROR(hmac_error);
  23587. wc_HmacFree(&ctx->hmac);
  23588. return WOLFSSL_FAILURE;
  23589. }
  23590. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  23591. WC_HMAC_BLOCK_SIZE);
  23592. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  23593. WC_HMAC_BLOCK_SIZE);
  23594. }
  23595. /* OpenSSL compat, no error */
  23596. }
  23597. else if (!inited) {
  23598. return WOLFSSL_FAILURE;
  23599. }
  23600. else if (ctx->type >= 0) { /* MD5 == 0 */
  23601. WOLFSSL_MSG("recover hmac");
  23602. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  23603. ctx->hmac.macType = (byte)ctx->type;
  23604. ctx->hmac.innerHashKeyed = 0;
  23605. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  23606. WC_HMAC_BLOCK_SIZE);
  23607. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  23608. WC_HMAC_BLOCK_SIZE);
  23609. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  23610. !=0) {
  23611. WOLFSSL_MSG("hmac init error");
  23612. WOLFSSL_ERROR(hmac_error);
  23613. return WOLFSSL_FAILURE;
  23614. }
  23615. }
  23616. }
  23617. (void)hmac_error;
  23618. return WOLFSSL_SUCCESS;
  23619. }
  23620. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  23621. int len)
  23622. {
  23623. int hmac_error = 0;
  23624. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  23625. if (ctx == NULL) {
  23626. WOLFSSL_MSG("no ctx");
  23627. return WOLFSSL_FAILURE;
  23628. }
  23629. if (data) {
  23630. WOLFSSL_MSG("updating hmac");
  23631. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  23632. if (hmac_error < 0){
  23633. WOLFSSL_MSG("hmac update error");
  23634. return WOLFSSL_FAILURE;
  23635. }
  23636. }
  23637. return WOLFSSL_SUCCESS;
  23638. }
  23639. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  23640. unsigned int* len)
  23641. {
  23642. int hmac_error;
  23643. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  23644. /* "len" parameter is optional. */
  23645. if (ctx == NULL || hash == NULL) {
  23646. WOLFSSL_MSG("invalid parameter");
  23647. return WOLFSSL_FAILURE;
  23648. }
  23649. WOLFSSL_MSG("final hmac");
  23650. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  23651. if (hmac_error < 0){
  23652. WOLFSSL_MSG("final hmac error");
  23653. return WOLFSSL_FAILURE;
  23654. }
  23655. if (len) {
  23656. WOLFSSL_MSG("setting output len");
  23657. switch (ctx->type) {
  23658. #ifndef NO_MD5
  23659. case WC_MD5:
  23660. *len = WC_MD5_DIGEST_SIZE;
  23661. break;
  23662. #endif
  23663. #ifndef NO_SHA
  23664. case WC_SHA:
  23665. *len = WC_SHA_DIGEST_SIZE;
  23666. break;
  23667. #endif
  23668. #ifdef WOLFSSL_SHA224
  23669. case WC_SHA224:
  23670. *len = WC_SHA224_DIGEST_SIZE;
  23671. break;
  23672. #endif
  23673. #ifndef NO_SHA256
  23674. case WC_SHA256:
  23675. *len = WC_SHA256_DIGEST_SIZE;
  23676. break;
  23677. #endif
  23678. #ifdef WOLFSSL_SHA384
  23679. case WC_SHA384:
  23680. *len = WC_SHA384_DIGEST_SIZE;
  23681. break;
  23682. #endif
  23683. #ifdef WOLFSSL_SHA512
  23684. case WC_SHA512:
  23685. *len = WC_SHA512_DIGEST_SIZE;
  23686. break;
  23687. #endif
  23688. #ifdef WOLFSSL_SHA3
  23689. #ifndef WOLFSSL_NOSHA3_224
  23690. case WC_SHA3_224:
  23691. *len = WC_SHA3_224_DIGEST_SIZE;
  23692. break;
  23693. #endif
  23694. #ifndef WOLFSSL_NOSHA3_256
  23695. case WC_SHA3_256:
  23696. *len = WC_SHA3_256_DIGEST_SIZE;
  23697. break;
  23698. #endif
  23699. #ifndef WOLFSSL_NOSHA3_384
  23700. case WC_SHA3_384:
  23701. *len = WC_SHA3_384_DIGEST_SIZE;
  23702. break;
  23703. #endif
  23704. #ifndef WOLFSSL_NOSHA3_512
  23705. case WC_SHA3_512:
  23706. *len = WC_SHA3_512_DIGEST_SIZE;
  23707. break;
  23708. #endif
  23709. #endif
  23710. default:
  23711. WOLFSSL_MSG("bad hmac type");
  23712. return WOLFSSL_FAILURE;
  23713. }
  23714. }
  23715. return WOLFSSL_SUCCESS;
  23716. }
  23717. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  23718. {
  23719. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  23720. if (ctx) {
  23721. wc_HmacFree(&ctx->hmac);
  23722. }
  23723. return WOLFSSL_SUCCESS;
  23724. }
  23725. void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
  23726. {
  23727. if (ctx) {
  23728. wolfSSL_HMAC_cleanup(ctx);
  23729. }
  23730. }
  23731. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  23732. {
  23733. if (ctx) {
  23734. wolfSSL_HMAC_CTX_cleanup(ctx);
  23735. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23736. }
  23737. }
  23738. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  23739. {
  23740. if (!ctx) {
  23741. return 0;
  23742. }
  23743. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  23744. }
  23745. const WOLFSSL_EVP_MD *wolfSSL_HMAC_CTX_get_md(const WOLFSSL_HMAC_CTX *ctx)
  23746. {
  23747. if (!ctx) {
  23748. return NULL;
  23749. }
  23750. return wolfSSL_macType2EVP_md((enum wc_HashType)ctx->type);
  23751. }
  23752. #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
  23753. defined(WOLFSSL_AES_DIRECT)
  23754. WOLFSSL_CMAC_CTX* wolfSSL_CMAC_CTX_new(void)
  23755. {
  23756. WOLFSSL_CMAC_CTX* ctx = NULL;
  23757. ctx = (WOLFSSL_CMAC_CTX*)XMALLOC(sizeof(WOLFSSL_CMAC_CTX), NULL,
  23758. DYNAMIC_TYPE_OPENSSL);
  23759. if (ctx != NULL) {
  23760. ctx->internal = (Cmac*)XMALLOC(sizeof(Cmac), NULL, DYNAMIC_TYPE_CMAC);
  23761. if (ctx->internal == NULL) {
  23762. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23763. ctx = NULL;
  23764. }
  23765. }
  23766. if (ctx != NULL) {
  23767. ctx->cctx = wolfSSL_EVP_CIPHER_CTX_new();
  23768. if (ctx->cctx == NULL) {
  23769. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  23770. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23771. ctx = NULL;
  23772. }
  23773. }
  23774. return ctx;
  23775. }
  23776. void wolfSSL_CMAC_CTX_free(WOLFSSL_CMAC_CTX *ctx)
  23777. {
  23778. if (ctx != NULL) {
  23779. if (ctx->internal != NULL) {
  23780. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  23781. }
  23782. if (ctx->cctx != NULL) {
  23783. wolfSSL_EVP_CIPHER_CTX_free(ctx->cctx);
  23784. }
  23785. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23786. }
  23787. }
  23788. WOLFSSL_EVP_CIPHER_CTX* wolfSSL_CMAC_CTX_get0_cipher_ctx(WOLFSSL_CMAC_CTX* ctx)
  23789. {
  23790. WOLFSSL_EVP_CIPHER_CTX* cctx = NULL;
  23791. if (ctx != NULL) {
  23792. cctx = ctx->cctx;
  23793. }
  23794. return cctx;
  23795. }
  23796. int wolfSSL_CMAC_Init(WOLFSSL_CMAC_CTX* ctx, const void *key, size_t keyLen,
  23797. const WOLFSSL_EVP_CIPHER* cipher, WOLFSSL_ENGINE* engine)
  23798. {
  23799. int ret = WOLFSSL_SUCCESS;
  23800. (void)engine;
  23801. WOLFSSL_ENTER("wolfSSL_CMAC_Init");
  23802. if (ctx == NULL || cipher == NULL || (
  23803. cipher != EVP_AES_128_CBC &&
  23804. cipher != EVP_AES_192_CBC &&
  23805. cipher != EVP_AES_256_CBC)) {
  23806. ret = WOLFSSL_FAILURE;
  23807. }
  23808. if (ret == WOLFSSL_SUCCESS) {
  23809. ret = wc_InitCmac((Cmac*)ctx->internal, (const byte*)key,
  23810. (word32)keyLen, WC_CMAC_AES, NULL);
  23811. if (ret != 0) {
  23812. ret = WOLFSSL_FAILURE;
  23813. }
  23814. else {
  23815. ret = WOLFSSL_SUCCESS;
  23816. }
  23817. }
  23818. if (ret == WOLFSSL_SUCCESS) {
  23819. ret = wolfSSL_EVP_CipherInit(ctx->cctx, cipher, (const byte*)key, NULL,
  23820. 1);
  23821. }
  23822. WOLFSSL_LEAVE("wolfSSL_CMAC_Init", ret);
  23823. return ret;
  23824. }
  23825. int wolfSSL_CMAC_Update(WOLFSSL_CMAC_CTX* ctx, const void* data, size_t len)
  23826. {
  23827. int ret = WOLFSSL_SUCCESS;
  23828. WOLFSSL_ENTER("wolfSSL_CMAC_Update");
  23829. if (ctx == NULL || ctx->internal == NULL) {
  23830. ret = WOLFSSL_FAILURE;
  23831. }
  23832. if (ret == WOLFSSL_SUCCESS) {
  23833. if (data) {
  23834. ret = wc_CmacUpdate((Cmac*)ctx->internal, (const byte*)data,
  23835. (word32)len);
  23836. if (ret != 0){
  23837. ret = WOLFSSL_FAILURE;
  23838. }
  23839. else {
  23840. ret = WOLFSSL_SUCCESS;
  23841. }
  23842. }
  23843. }
  23844. WOLFSSL_LEAVE("wolfSSL_CMAC_Update", ret);
  23845. return ret;
  23846. }
  23847. int wolfSSL_CMAC_Final(WOLFSSL_CMAC_CTX* ctx, unsigned char* out,
  23848. size_t* len)
  23849. {
  23850. int ret = WOLFSSL_SUCCESS;
  23851. int blockSize;
  23852. WOLFSSL_ENTER("wolfSSL_CMAC_Final");
  23853. if (ctx == NULL || ctx->cctx == NULL || ctx->internal == NULL ||
  23854. len == NULL) {
  23855. ret = WOLFSSL_FAILURE;
  23856. }
  23857. if (ret == WOLFSSL_SUCCESS) {
  23858. blockSize = EVP_CIPHER_CTX_block_size(ctx->cctx);
  23859. if (blockSize <= 0) {
  23860. ret = WOLFSSL_FAILURE;
  23861. }
  23862. else {
  23863. *len = blockSize;
  23864. }
  23865. }
  23866. if (ret == WOLFSSL_SUCCESS) {
  23867. word32 len32 = (word32)*len;
  23868. ret = wc_CmacFinal((Cmac*)ctx->internal, out, &len32);
  23869. *len = (size_t)len32;
  23870. if (ret != 0) {
  23871. ret = WOLFSSL_FAILURE;
  23872. }
  23873. else {
  23874. ret = WOLFSSL_SUCCESS;
  23875. }
  23876. }
  23877. WOLFSSL_LEAVE("wolfSSL_CMAC_Final", ret);
  23878. return ret;
  23879. }
  23880. #endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */
  23881. #endif /* OPENSSL_EXTRA */
  23882. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23883. /* Free the dynamically allocated data.
  23884. *
  23885. * p Pointer to dynamically allocated memory.
  23886. */
  23887. void wolfSSL_OPENSSL_free(void* p)
  23888. {
  23889. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  23890. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  23891. }
  23892. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  23893. #ifdef OPENSSL_EXTRA
  23894. void *wolfSSL_OPENSSL_malloc(size_t a)
  23895. {
  23896. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  23897. }
  23898. int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
  23899. {
  23900. /* 'char' is unsigned on some platforms. */
  23901. return (int)(signed char)HexCharToByte((char)c);
  23902. }
  23903. unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
  23904. {
  23905. unsigned char* targetBuf;
  23906. int srcDigitHigh = 0;
  23907. int srcDigitLow = 0;
  23908. size_t srcLen;
  23909. size_t srcIdx = 0;
  23910. long targetIdx = 0;
  23911. srcLen = XSTRLEN(str);
  23912. targetBuf = (unsigned char*)XMALLOC(srcLen / 2, NULL, DYNAMIC_TYPE_OPENSSL);
  23913. if (targetBuf == NULL) {
  23914. return NULL;
  23915. }
  23916. while (srcIdx < srcLen) {
  23917. if (str[srcIdx] == ':') {
  23918. srcIdx++;
  23919. continue;
  23920. }
  23921. srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  23922. srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  23923. if (srcDigitHigh < 0 || srcDigitLow < 0) {
  23924. WOLFSSL_MSG("Invalid hex character.");
  23925. XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  23926. return NULL;
  23927. }
  23928. targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow);
  23929. }
  23930. if (len != NULL)
  23931. *len = targetIdx;
  23932. return targetBuf;
  23933. }
  23934. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  23935. {
  23936. (void)opts;
  23937. (void)settings;
  23938. return wolfSSL_library_init();
  23939. }
  23940. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  23941. {
  23942. (void)opts;
  23943. (void)settings;
  23944. return wolfSSL_library_init();
  23945. }
  23946. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  23947. int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  23948. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  23949. int maxDerSz)
  23950. {
  23951. int ret, paddingSz;
  23952. word32 idx, cipherInfoSz;
  23953. #ifdef WOLFSSL_SMALL_STACK
  23954. EncryptedInfo* info = NULL;
  23955. #else
  23956. EncryptedInfo info[1];
  23957. #endif
  23958. WOLFSSL_ENTER("EncryptDerKey");
  23959. if (der == NULL || derSz == NULL || cipher == NULL ||
  23960. passwd == NULL || cipherInfo == NULL)
  23961. return BAD_FUNC_ARG;
  23962. #ifdef WOLFSSL_SMALL_STACK
  23963. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  23964. DYNAMIC_TYPE_ENCRYPTEDINFO);
  23965. if (info == NULL) {
  23966. WOLFSSL_MSG("malloc failed");
  23967. return WOLFSSL_FAILURE;
  23968. }
  23969. #endif
  23970. XMEMSET(info, 0, sizeof(EncryptedInfo));
  23971. /* set the cipher name on info */
  23972. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  23973. info->name[NAME_SZ-1] = '\0'; /* null term */
  23974. ret = wc_EncryptedInfoGet(info, info->name);
  23975. if (ret != 0) {
  23976. WOLFSSL_MSG("unsupported cipher");
  23977. #ifdef WOLFSSL_SMALL_STACK
  23978. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23979. #endif
  23980. return WOLFSSL_FAILURE;
  23981. }
  23982. /* Generate a random salt */
  23983. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  23984. WOLFSSL_MSG("generate iv failed");
  23985. #ifdef WOLFSSL_SMALL_STACK
  23986. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23987. #endif
  23988. return WOLFSSL_FAILURE;
  23989. }
  23990. /* add the padding before encryption */
  23991. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  23992. if (paddingSz == 0)
  23993. paddingSz = info->ivSz;
  23994. if (maxDerSz < *derSz + paddingSz) {
  23995. WOLFSSL_MSG("not enough DER buffer allocated");
  23996. #ifdef WOLFSSL_SMALL_STACK
  23997. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23998. #endif
  23999. return WOLFSSL_FAILURE;
  24000. }
  24001. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  24002. (*derSz) += paddingSz;
  24003. /* encrypt buffer */
  24004. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  24005. WOLFSSL_MSG("encrypt key failed");
  24006. #ifdef WOLFSSL_SMALL_STACK
  24007. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  24008. #endif
  24009. return WOLFSSL_FAILURE;
  24010. }
  24011. /* create cipher info : 'cipher_name,Salt(hex)' */
  24012. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  24013. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  24014. DYNAMIC_TYPE_STRING);
  24015. if (*cipherInfo == NULL) {
  24016. WOLFSSL_MSG("malloc failed");
  24017. #ifdef WOLFSSL_SMALL_STACK
  24018. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  24019. #endif
  24020. return WOLFSSL_FAILURE;
  24021. }
  24022. XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  24023. XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz);
  24024. idx = (word32)XSTRLEN((char*)*cipherInfo);
  24025. cipherInfoSz -= idx;
  24026. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  24027. #ifdef WOLFSSL_SMALL_STACK
  24028. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  24029. #endif
  24030. if (ret != 0) {
  24031. WOLFSSL_MSG("Base16_Encode failed");
  24032. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  24033. return WOLFSSL_FAILURE;
  24034. }
  24035. return WOLFSSL_SUCCESS;
  24036. }
  24037. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  24038. #if !defined(NO_BIO)
  24039. static int pem_write_pubkey(WOLFSSL_EVP_PKEY* key, void* heap, byte** derBuf,
  24040. int* derSz)
  24041. {
  24042. byte* buf = NULL;
  24043. int sz = 0;
  24044. (void)heap;
  24045. if (key == NULL) {
  24046. WOLFSSL_MSG("Bad parameters");
  24047. return WOLFSSL_FAILURE;
  24048. }
  24049. switch (key->type) {
  24050. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  24051. case EVP_PKEY_RSA:
  24052. if ((sz = wolfSSL_RSA_To_Der(key->rsa, &buf, 1, heap))
  24053. < 0) {
  24054. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  24055. break;
  24056. }
  24057. break;
  24058. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  24059. #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  24060. defined(WOLFSSL_CERT_GEN))
  24061. case EVP_PKEY_DSA:
  24062. if (key->dsa == NULL) {
  24063. WOLFSSL_MSG("key->dsa is null");
  24064. break;
  24065. }
  24066. sz = MAX_DSA_PUBKEY_SZ;
  24067. buf = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  24068. if (buf == NULL) {
  24069. WOLFSSL_MSG("malloc failed");
  24070. break;
  24071. }
  24072. /* Key to DER */
  24073. sz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, buf, sz);
  24074. if (sz < 0) {
  24075. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  24076. break;
  24077. }
  24078. break;
  24079. #endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */
  24080. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  24081. case EVP_PKEY_EC:
  24082. {
  24083. if (key->ecc == NULL) {
  24084. WOLFSSL_MSG("key->ecc is null");
  24085. break;
  24086. }
  24087. sz = wc_EccPublicKeyDerSize((ecc_key*)key->ecc->internal, 1);
  24088. if (sz <= 0) {
  24089. WOLFSSL_MSG("wc_EccPublicKeyDerSize failed");
  24090. break;
  24091. }
  24092. buf = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  24093. if (buf == NULL) {
  24094. WOLFSSL_MSG("malloc failed");
  24095. break;
  24096. }
  24097. sz = wc_EccPublicKeyToDer((ecc_key*)key->ecc->internal, buf, sz, 1);
  24098. if (sz < 0) {
  24099. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  24100. break;
  24101. }
  24102. break;
  24103. }
  24104. #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
  24105. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  24106. case EVP_PKEY_DH:
  24107. WOLFSSL_MSG("Writing DH PUBKEY not supported!");
  24108. break;
  24109. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  24110. default:
  24111. WOLFSSL_MSG("Unknown Key type!");
  24112. break;
  24113. }
  24114. if (buf == NULL || sz <= 0) {
  24115. if (buf != NULL)
  24116. XFREE(buf, heap, DYNAMIC_TYPE_DER);
  24117. return WOLFSSL_FAILURE;
  24118. }
  24119. *derBuf = buf;
  24120. *derSz = sz;
  24121. return WOLFSSL_SUCCESS;
  24122. }
  24123. #endif
  24124. #ifndef NO_BIO
  24125. static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  24126. {
  24127. int ret;
  24128. int derSz = 0;
  24129. byte* derBuf = NULL;
  24130. ret = pem_write_pubkey(key, bio->heap, &derBuf, &derSz);
  24131. if (ret == WOLFSSL_SUCCESS) {
  24132. ret = der_write_to_bio_as_pem(derBuf, derSz, bio, PUBLICKEY_TYPE);
  24133. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  24134. }
  24135. return ret;
  24136. }
  24137. /* Takes a public key and writes it out to a WOLFSSL_BIO
  24138. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  24139. */
  24140. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  24141. {
  24142. int ret;
  24143. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  24144. if ((bio == NULL) || (key == NULL)) {
  24145. ret = WOLFSSL_FAILURE;
  24146. }
  24147. else {
  24148. ret = pem_write_bio_pubkey(bio, key);
  24149. }
  24150. return ret;
  24151. }
  24152. /* Takes a private key and writes it out to a WOLFSSL_BIO
  24153. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  24154. */
  24155. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  24156. const WOLFSSL_EVP_CIPHER* cipher,
  24157. unsigned char* passwd, int len,
  24158. wc_pem_password_cb* cb, void* arg)
  24159. {
  24160. byte* keyDer;
  24161. int type;
  24162. (void)cipher;
  24163. (void)passwd;
  24164. (void)len;
  24165. (void)cb;
  24166. (void)arg;
  24167. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  24168. if (bio == NULL || key == NULL) {
  24169. WOLFSSL_MSG("Bad Function Arguments");
  24170. return WOLFSSL_FAILURE;
  24171. }
  24172. keyDer = (byte*)key->pkey.ptr;
  24173. switch (key->type) {
  24174. #ifndef NO_RSA
  24175. case EVP_PKEY_RSA:
  24176. type = PRIVATEKEY_TYPE;
  24177. break;
  24178. #endif
  24179. #ifndef NO_DSA
  24180. case EVP_PKEY_DSA:
  24181. type = DSA_PRIVATEKEY_TYPE;
  24182. break;
  24183. #endif
  24184. #ifdef HAVE_ECC
  24185. case EVP_PKEY_EC:
  24186. type = ECC_PRIVATEKEY_TYPE;
  24187. break;
  24188. #endif
  24189. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  24190. case EVP_PKEY_DH:
  24191. type = DH_PRIVATEKEY_TYPE;
  24192. break;
  24193. #endif
  24194. default:
  24195. WOLFSSL_MSG("Unknown Key type!");
  24196. type = PRIVATEKEY_TYPE;
  24197. }
  24198. return der_write_to_bio_as_pem(keyDer, key->pkey_sz, bio, type);
  24199. }
  24200. #endif /* !NO_BIO */
  24201. /* Colon separated list of <public key>+<digest> algorithms.
  24202. * Replaces list in context.
  24203. */
  24204. int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list)
  24205. {
  24206. WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list");
  24207. if (ctx == NULL || list == NULL) {
  24208. WOLFSSL_MSG("Bad function arguments");
  24209. return WOLFSSL_FAILURE;
  24210. }
  24211. /* alloc/init on demand only */
  24212. if (ctx->suites == NULL) {
  24213. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  24214. DYNAMIC_TYPE_SUITES);
  24215. if (ctx->suites == NULL) {
  24216. WOLFSSL_MSG("Memory alloc for Suites failed");
  24217. return WOLFSSL_FAILURE;
  24218. }
  24219. XMEMSET(ctx->suites, 0, sizeof(Suites));
  24220. }
  24221. return SetSuitesHashSigAlgo(ctx->suites, list);
  24222. }
  24223. /* Colon separated list of <public key>+<digest> algorithms.
  24224. * Replaces list in SSL.
  24225. */
  24226. int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list)
  24227. {
  24228. WOLFSSL_MSG("wolfSSL_set1_sigalg_list");
  24229. if (ssl == NULL) {
  24230. WOLFSSL_MSG("Bad function arguments");
  24231. return WOLFSSL_FAILURE;
  24232. }
  24233. #ifdef SINGLE_THREADED
  24234. if (ssl->ctx->suites == ssl->suites) {
  24235. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  24236. DYNAMIC_TYPE_SUITES);
  24237. if (ssl->suites == NULL) {
  24238. WOLFSSL_MSG("Suites Memory error");
  24239. return MEMORY_E;
  24240. }
  24241. *ssl->suites = *ssl->ctx->suites;
  24242. ssl->options.ownSuites = 1;
  24243. }
  24244. #endif
  24245. if (ssl == NULL || list == NULL) {
  24246. WOLFSSL_MSG("Bad function arguments");
  24247. return WOLFSSL_FAILURE;
  24248. }
  24249. return SetSuitesHashSigAlgo(ssl->suites, list);
  24250. }
  24251. struct WOLFSSL_HashSigInfo {
  24252. int hashAlgo;
  24253. int sigAlgo;
  24254. int nid;
  24255. } wolfssl_hash_sig_info[] =
  24256. {
  24257. #ifndef NO_RSA
  24258. #ifndef NO_SHA256
  24259. { sha256_mac, rsa_sa_algo, CTC_SHA256wRSA },
  24260. #endif
  24261. #ifdef WOLFSSL_SHA384
  24262. { sha384_mac, rsa_sa_algo, CTC_SHA384wRSA },
  24263. #endif
  24264. #ifdef WOLFSSL_SHA512
  24265. { sha512_mac, rsa_sa_algo, CTC_SHA512wRSA },
  24266. #endif
  24267. #ifdef WOLFSSL_SHA224
  24268. { sha224_mac, rsa_sa_algo, CTC_SHA224wRSA },
  24269. #endif
  24270. #ifndef NO_SHA
  24271. { sha_mac, rsa_sa_algo, CTC_SHAwRSA },
  24272. #endif
  24273. #ifdef WC_RSA_PSS
  24274. #ifndef NO_SHA256
  24275. { sha256_mac, rsa_pss_sa_algo, CTC_SHA256wRSA },
  24276. #endif
  24277. #ifdef WOLFSSL_SHA384
  24278. { sha384_mac, rsa_pss_sa_algo, CTC_SHA384wRSA },
  24279. #endif
  24280. #ifdef WOLFSSL_SHA512
  24281. { sha512_mac, rsa_pss_sa_algo, CTC_SHA512wRSA },
  24282. #endif
  24283. #ifdef WOLFSSL_SHA224
  24284. { sha224_mac, rsa_pss_sa_algo, CTC_SHA224wRSA },
  24285. #endif
  24286. #endif
  24287. #endif
  24288. #ifdef HAVE_ECC
  24289. #ifndef NO_SHA256
  24290. { sha256_mac, ecc_dsa_sa_algo, CTC_SHA256wECDSA },
  24291. #endif
  24292. #ifdef WOLFSSL_SHA384
  24293. { sha384_mac, ecc_dsa_sa_algo, CTC_SHA384wECDSA },
  24294. #endif
  24295. #ifdef WOLFSSL_SHA512
  24296. { sha512_mac, ecc_dsa_sa_algo, CTC_SHA512wECDSA },
  24297. #endif
  24298. #ifdef WOLFSSL_SHA224
  24299. { sha224_mac, ecc_dsa_sa_algo, CTC_SHA224wECDSA },
  24300. #endif
  24301. #ifndef NO_SHA
  24302. { sha_mac, ecc_dsa_sa_algo, CTC_SHAwECDSA },
  24303. #endif
  24304. #endif
  24305. #ifdef HAVE_ED25519
  24306. { no_mac, ed25519_sa_algo, CTC_ED25519 },
  24307. #endif
  24308. #ifdef HAVE_ED448
  24309. { no_mac, ed448_sa_algo, CTC_ED448 },
  24310. #endif
  24311. #ifdef HAVE_PQC
  24312. #ifdef HAVE_FALCON
  24313. { no_mac, falcon_level1_sa_algo, CTC_FALCON_LEVEL1 },
  24314. { no_mac, falcon_level5_sa_algo, CTC_FALCON_LEVEL5 },
  24315. #endif /* HAVE_FALCON */
  24316. #ifdef HAVE_DILITHIUM
  24317. { no_mac, dilithium_level2_sa_algo, CTC_DILITHIUM_LEVEL2 },
  24318. { no_mac, dilithium_level3_sa_algo, CTC_DILITHIUM_LEVEL3 },
  24319. { no_mac, dilithium_level5_sa_algo, CTC_DILITHIUM_LEVEL5 },
  24320. { no_mac, dilithium_aes_level2_sa_algo, CTC_DILITHIUM_AES_LEVEL2 },
  24321. { no_mac, dilithium_aes_level3_sa_algo, CTC_DILITHIUM_AES_LEVEL3 },
  24322. { no_mac, dilithium_aes_level5_sa_algo, CTC_DILITHIUM_AES_LEVEL5 },
  24323. #endif /* HAVE_DILITHIUM */
  24324. #endif /* HAVE_PQC */
  24325. #ifndef NO_DSA
  24326. #ifndef NO_SHA
  24327. { sha_mac, dsa_sa_algo, CTC_SHAwDSA },
  24328. #endif
  24329. #endif
  24330. };
  24331. #define WOLFSSL_HASH_SIG_INFO_SZ \
  24332. (int)(sizeof(wolfssl_hash_sig_info)/sizeof(*wolfssl_hash_sig_info))
  24333. int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid)
  24334. {
  24335. int i;
  24336. int ret = WOLFSSL_FAILURE;
  24337. WOLFSSL_MSG("wolfSSL_get_signature_nid");
  24338. if (ssl == NULL) {
  24339. WOLFSSL_MSG("Bad function arguments");
  24340. return WOLFSSL_FAILURE;
  24341. }
  24342. for (i = 0; i < WOLFSSL_HASH_SIG_INFO_SZ; i++) {
  24343. if (ssl->suites->hashAlgo == wolfssl_hash_sig_info[i].hashAlgo &&
  24344. ssl->suites->sigAlgo == wolfssl_hash_sig_info[i].sigAlgo) {
  24345. *nid = wolfssl_hash_sig_info[i].nid;
  24346. ret = WOLFSSL_SUCCESS;
  24347. break;
  24348. }
  24349. }
  24350. return ret;
  24351. }
  24352. #ifdef HAVE_ECC
  24353. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  24354. static int populate_groups(int* groups, int max_count, char *list)
  24355. {
  24356. char *end;
  24357. int len;
  24358. int count = 0;
  24359. const WOLF_EC_NIST_NAME* nist_name;
  24360. if (!groups || !list) {
  24361. return -1;
  24362. }
  24363. for (end = list; ; list = ++end) {
  24364. if (count > max_count) {
  24365. WOLFSSL_MSG("Too many curves in list");
  24366. return -1;
  24367. }
  24368. while (*end != ':' && *end != '\0') end++;
  24369. len = (int)(end - list); /* end points to char after end
  24370. * of curve name so no need for -1 */
  24371. if ((len < kNistCurves_MIN_NAME_LEN) ||
  24372. (len > kNistCurves_MAX_NAME_LEN)) {
  24373. WOLFSSL_MSG("Unrecognized curve name in list");
  24374. return -1;
  24375. }
  24376. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  24377. if (len == nist_name->name_len &&
  24378. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  24379. break;
  24380. }
  24381. }
  24382. if (!nist_name->name) {
  24383. WOLFSSL_MSG("Unrecognized curve name in list");
  24384. return -1;
  24385. }
  24386. groups[count++] = nist_name->nid;
  24387. if (*end == '\0') break;
  24388. }
  24389. return count;
  24390. }
  24391. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  24392. {
  24393. int groups[WOLFSSL_MAX_GROUP_COUNT];
  24394. int count;
  24395. if (!ctx || !list) {
  24396. return WOLFSSL_FAILURE;
  24397. }
  24398. if ((count = populate_groups(groups,
  24399. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  24400. return WOLFSSL_FAILURE;
  24401. }
  24402. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  24403. }
  24404. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  24405. {
  24406. int groups[WOLFSSL_MAX_GROUP_COUNT];
  24407. int count;
  24408. if (!ssl || !list) {
  24409. return WOLFSSL_FAILURE;
  24410. }
  24411. if ((count = populate_groups(groups,
  24412. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  24413. return WOLFSSL_FAILURE;
  24414. }
  24415. return wolfSSL_set1_groups(ssl, groups, count);
  24416. }
  24417. #endif /* WOLFSSL_TLS13 */
  24418. #endif /* HAVE_ECC */
  24419. #ifndef NO_BIO
  24420. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  24421. WOLFSSL_EVP_PKEY** key,
  24422. wc_pem_password_cb* cb,
  24423. void* pass)
  24424. {
  24425. WOLFSSL_EVP_PKEY* pkey = NULL;
  24426. DerBuffer* der = NULL;
  24427. int keyFormat = 0;
  24428. int type = -1;
  24429. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  24430. if (bio == NULL)
  24431. return pkey;
  24432. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat, &der)
  24433. >= 0) {
  24434. const unsigned char* ptr = der->buffer;
  24435. if (keyFormat) {
  24436. /* keyFormat is Key_Sum enum */
  24437. if (keyFormat == RSAk)
  24438. type = EVP_PKEY_RSA;
  24439. else if (keyFormat == ECDSAk)
  24440. type = EVP_PKEY_EC;
  24441. else if (keyFormat == DSAk)
  24442. type = EVP_PKEY_DSA;
  24443. else if (keyFormat == DHk)
  24444. type = EVP_PKEY_DH;
  24445. }
  24446. else {
  24447. /* Default to RSA if format is not set */
  24448. type = EVP_PKEY_RSA;
  24449. }
  24450. /* handle case where reuse is attempted */
  24451. if (key != NULL && *key != NULL)
  24452. pkey = *key;
  24453. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  24454. if (pkey == NULL) {
  24455. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  24456. }
  24457. }
  24458. FreeDer(&der);
  24459. if (key != NULL && pkey != NULL)
  24460. *key = pkey;
  24461. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  24462. return pkey;
  24463. }
  24464. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  24465. WOLFSSL_EVP_PKEY **key,
  24466. wc_pem_password_cb *cb,
  24467. void *pass)
  24468. {
  24469. WOLFSSL_EVP_PKEY* pkey = NULL;
  24470. DerBuffer* der = NULL;
  24471. int keyFormat = 0;
  24472. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  24473. if (bio == NULL)
  24474. return pkey;
  24475. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  24476. >= 0) {
  24477. const unsigned char* ptr = der->buffer;
  24478. /* handle case where reuse is attempted */
  24479. if (key != NULL && *key != NULL)
  24480. pkey = *key;
  24481. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  24482. if (pkey == NULL) {
  24483. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  24484. }
  24485. }
  24486. FreeDer(&der);
  24487. if (key != NULL && pkey != NULL)
  24488. *key = pkey;
  24489. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  24490. return pkey;
  24491. }
  24492. #endif /* !NO_BIO */
  24493. #if !defined(NO_FILESYSTEM)
  24494. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **key,
  24495. wc_pem_password_cb *cb, void *pass)
  24496. {
  24497. WOLFSSL_EVP_PKEY* pkey = NULL;
  24498. DerBuffer* der = NULL;
  24499. int keyFormat = 0;
  24500. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  24501. if (pem_read_file_key(fp, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der)
  24502. >= 0) {
  24503. const unsigned char* ptr = der->buffer;
  24504. /* handle case where reuse is attempted */
  24505. if (key != NULL && *key != NULL)
  24506. pkey = *key;
  24507. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  24508. if (pkey == NULL) {
  24509. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  24510. }
  24511. }
  24512. FreeDer(&der);
  24513. if (key != NULL && pkey != NULL)
  24514. *key = pkey;
  24515. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  24516. return pkey;
  24517. }
  24518. #endif /* NO_FILESYSTEM */
  24519. #endif /* OPENSSL_EXTRA */
  24520. #ifdef WOLFSSL_ALT_CERT_CHAINS
  24521. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  24522. {
  24523. int isUsing = 0;
  24524. if (ssl)
  24525. isUsing = ssl->options.usingAltCertChain;
  24526. return isUsing;
  24527. }
  24528. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  24529. #ifdef SESSION_CERTS
  24530. #ifdef WOLFSSL_ALT_CERT_CHAINS
  24531. /* Get peer's alternate certificate chain */
  24532. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  24533. {
  24534. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  24535. if (ssl)
  24536. return &ssl->session->altChain;
  24537. return 0;
  24538. }
  24539. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  24540. /* Get peer's certificate chain */
  24541. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  24542. {
  24543. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  24544. if (ssl)
  24545. return &ssl->session->chain;
  24546. return 0;
  24547. }
  24548. /* Get peer's certificate chain total count */
  24549. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  24550. {
  24551. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  24552. if (chain)
  24553. return chain->count;
  24554. return 0;
  24555. }
  24556. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  24557. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  24558. {
  24559. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  24560. if (chain)
  24561. return chain->certs[idx].length;
  24562. return 0;
  24563. }
  24564. /* Get peer's ASN.1 DER certificate at index (idx) */
  24565. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  24566. {
  24567. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  24568. if (chain)
  24569. return chain->certs[idx].buffer;
  24570. return 0;
  24571. }
  24572. /* Get peer's wolfSSL X509 certificate at index (idx) */
  24573. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  24574. {
  24575. int ret;
  24576. WOLFSSL_X509* x509 = NULL;
  24577. #ifdef WOLFSSL_SMALL_STACK
  24578. DecodedCert* cert = NULL;
  24579. #else
  24580. DecodedCert cert[1];
  24581. #endif
  24582. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  24583. if (chain != NULL) {
  24584. #ifdef WOLFSSL_SMALL_STACK
  24585. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  24586. DYNAMIC_TYPE_DCERT);
  24587. if (cert != NULL)
  24588. #endif
  24589. {
  24590. InitDecodedCert(cert, chain->certs[idx].buffer,
  24591. chain->certs[idx].length, NULL);
  24592. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  24593. WOLFSSL_MSG("Failed to parse cert");
  24594. }
  24595. else {
  24596. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  24597. DYNAMIC_TYPE_X509);
  24598. if (x509 == NULL) {
  24599. WOLFSSL_MSG("Failed alloc X509");
  24600. }
  24601. else {
  24602. InitX509(x509, 1, NULL);
  24603. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  24604. WOLFSSL_MSG("Failed to copy decoded");
  24605. wolfSSL_X509_free(x509);
  24606. x509 = NULL;
  24607. }
  24608. }
  24609. }
  24610. FreeDecodedCert(cert);
  24611. #ifdef WOLFSSL_SMALL_STACK
  24612. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  24613. #endif
  24614. }
  24615. }
  24616. (void)ret;
  24617. return x509;
  24618. }
  24619. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  24620. enough else return error (-1). If buffer is NULL only calculate
  24621. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  24622. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  24623. unsigned char* buf, int inLen, int* outLen)
  24624. {
  24625. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  24626. const char* header = NULL;
  24627. const char* footer = NULL;
  24628. int headerLen;
  24629. int footerLen;
  24630. int i;
  24631. int err;
  24632. word32 szNeeded = 0;
  24633. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  24634. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  24635. return BAD_FUNC_ARG;
  24636. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  24637. if (err != 0)
  24638. return err;
  24639. headerLen = (int)XSTRLEN(header);
  24640. footerLen = (int)XSTRLEN(footer);
  24641. /* Null output buffer return size needed in outLen */
  24642. if(!buf) {
  24643. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  24644. NULL, &szNeeded) != LENGTH_ONLY_E)
  24645. return WOLFSSL_FAILURE;
  24646. *outLen = szNeeded + headerLen + footerLen;
  24647. return LENGTH_ONLY_E;
  24648. }
  24649. /* don't even try if inLen too short */
  24650. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  24651. return BAD_FUNC_ARG;
  24652. /* header */
  24653. if (XMEMCPY(buf, header, headerLen) == NULL)
  24654. return WOLFSSL_FATAL_ERROR;
  24655. i = headerLen;
  24656. /* body */
  24657. *outLen = inLen; /* input to Base64_Encode */
  24658. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  24659. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  24660. return err;
  24661. i += *outLen;
  24662. /* footer */
  24663. if ( (i + footerLen) > inLen)
  24664. return BAD_FUNC_ARG;
  24665. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  24666. return WOLFSSL_FATAL_ERROR;
  24667. *outLen += headerLen + footerLen;
  24668. return WOLFSSL_SUCCESS;
  24669. #else
  24670. (void)chain;
  24671. (void)idx;
  24672. (void)buf;
  24673. (void)inLen;
  24674. (void)outLen;
  24675. return WOLFSSL_FAILURE;
  24676. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  24677. }
  24678. /* get session ID */
  24679. WOLFSSL_ABI
  24680. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  24681. {
  24682. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  24683. session = ClientSessionToSession(session);
  24684. if (session)
  24685. return session->sessionID;
  24686. return NULL;
  24687. }
  24688. #endif /* SESSION_CERTS */
  24689. #ifdef HAVE_FUZZER
  24690. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  24691. {
  24692. if (ssl) {
  24693. ssl->fuzzerCb = cbf;
  24694. ssl->fuzzerCtx = fCtx;
  24695. }
  24696. }
  24697. #endif
  24698. #ifndef NO_CERTS
  24699. #ifdef HAVE_PK_CALLBACKS
  24700. #ifdef HAVE_ECC
  24701. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  24702. {
  24703. if (ctx)
  24704. ctx->EccKeyGenCb = cb;
  24705. }
  24706. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  24707. {
  24708. if (ssl)
  24709. ssl->EccKeyGenCtx = ctx;
  24710. }
  24711. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  24712. {
  24713. if (ssl)
  24714. return ssl->EccKeyGenCtx;
  24715. return NULL;
  24716. }
  24717. void wolfSSL_CTX_SetEccSignCtx(WOLFSSL_CTX* ctx, void *userCtx)
  24718. {
  24719. if (ctx)
  24720. ctx->EccSignCtx = userCtx;
  24721. }
  24722. void* wolfSSL_CTX_GetEccSignCtx(WOLFSSL_CTX* ctx)
  24723. {
  24724. if (ctx)
  24725. return ctx->EccSignCtx;
  24726. return NULL;
  24727. }
  24728. WOLFSSL_ABI
  24729. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  24730. {
  24731. if (ctx)
  24732. ctx->EccSignCb = cb;
  24733. }
  24734. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  24735. {
  24736. if (ssl)
  24737. ssl->EccSignCtx = ctx;
  24738. }
  24739. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  24740. {
  24741. if (ssl)
  24742. return ssl->EccSignCtx;
  24743. return NULL;
  24744. }
  24745. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  24746. {
  24747. if (ctx)
  24748. ctx->EccVerifyCb = cb;
  24749. }
  24750. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  24751. {
  24752. if (ssl)
  24753. ssl->EccVerifyCtx = ctx;
  24754. }
  24755. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  24756. {
  24757. if (ssl)
  24758. return ssl->EccVerifyCtx;
  24759. return NULL;
  24760. }
  24761. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  24762. {
  24763. if (ctx)
  24764. ctx->EccSharedSecretCb = cb;
  24765. }
  24766. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24767. {
  24768. if (ssl)
  24769. ssl->EccSharedSecretCtx = ctx;
  24770. }
  24771. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  24772. {
  24773. if (ssl)
  24774. return ssl->EccSharedSecretCtx;
  24775. return NULL;
  24776. }
  24777. #endif /* HAVE_ECC */
  24778. #ifdef HAVE_ED25519
  24779. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  24780. {
  24781. if (ctx)
  24782. ctx->Ed25519SignCb = cb;
  24783. }
  24784. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  24785. {
  24786. if (ssl)
  24787. ssl->Ed25519SignCtx = ctx;
  24788. }
  24789. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  24790. {
  24791. if (ssl)
  24792. return ssl->Ed25519SignCtx;
  24793. return NULL;
  24794. }
  24795. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  24796. {
  24797. if (ctx)
  24798. ctx->Ed25519VerifyCb = cb;
  24799. }
  24800. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  24801. {
  24802. if (ssl)
  24803. ssl->Ed25519VerifyCtx = ctx;
  24804. }
  24805. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  24806. {
  24807. if (ssl)
  24808. return ssl->Ed25519VerifyCtx;
  24809. return NULL;
  24810. }
  24811. #endif /* HAVE_ED25519 */
  24812. #ifdef HAVE_CURVE25519
  24813. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  24814. CallbackX25519KeyGen cb)
  24815. {
  24816. if (ctx)
  24817. ctx->X25519KeyGenCb = cb;
  24818. }
  24819. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  24820. {
  24821. if (ssl)
  24822. ssl->X25519KeyGenCtx = ctx;
  24823. }
  24824. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  24825. {
  24826. if (ssl)
  24827. return ssl->X25519KeyGenCtx;
  24828. return NULL;
  24829. }
  24830. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  24831. CallbackX25519SharedSecret cb)
  24832. {
  24833. if (ctx)
  24834. ctx->X25519SharedSecretCb = cb;
  24835. }
  24836. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24837. {
  24838. if (ssl)
  24839. ssl->X25519SharedSecretCtx = ctx;
  24840. }
  24841. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  24842. {
  24843. if (ssl)
  24844. return ssl->X25519SharedSecretCtx;
  24845. return NULL;
  24846. }
  24847. #endif /* HAVE_CURVE25519 */
  24848. #ifdef HAVE_ED448
  24849. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  24850. {
  24851. if (ctx)
  24852. ctx->Ed448SignCb = cb;
  24853. }
  24854. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  24855. {
  24856. if (ssl)
  24857. ssl->Ed448SignCtx = ctx;
  24858. }
  24859. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  24860. {
  24861. if (ssl)
  24862. return ssl->Ed448SignCtx;
  24863. return NULL;
  24864. }
  24865. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  24866. {
  24867. if (ctx)
  24868. ctx->Ed448VerifyCb = cb;
  24869. }
  24870. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  24871. {
  24872. if (ssl)
  24873. ssl->Ed448VerifyCtx = ctx;
  24874. }
  24875. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  24876. {
  24877. if (ssl)
  24878. return ssl->Ed448VerifyCtx;
  24879. return NULL;
  24880. }
  24881. #endif /* HAVE_ED448 */
  24882. #ifdef HAVE_CURVE448
  24883. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  24884. CallbackX448KeyGen cb)
  24885. {
  24886. if (ctx)
  24887. ctx->X448KeyGenCb = cb;
  24888. }
  24889. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  24890. {
  24891. if (ssl)
  24892. ssl->X448KeyGenCtx = ctx;
  24893. }
  24894. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  24895. {
  24896. if (ssl)
  24897. return ssl->X448KeyGenCtx;
  24898. return NULL;
  24899. }
  24900. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  24901. CallbackX448SharedSecret cb)
  24902. {
  24903. if (ctx)
  24904. ctx->X448SharedSecretCb = cb;
  24905. }
  24906. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24907. {
  24908. if (ssl)
  24909. ssl->X448SharedSecretCtx = ctx;
  24910. }
  24911. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  24912. {
  24913. if (ssl)
  24914. return ssl->X448SharedSecretCtx;
  24915. return NULL;
  24916. }
  24917. #endif /* HAVE_CURVE448 */
  24918. #ifndef NO_RSA
  24919. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  24920. {
  24921. if (ctx)
  24922. ctx->RsaSignCb = cb;
  24923. }
  24924. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  24925. {
  24926. if (ctx)
  24927. ctx->RsaSignCheckCb = cb;
  24928. }
  24929. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  24930. {
  24931. if (ssl)
  24932. ssl->RsaSignCtx = ctx;
  24933. }
  24934. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  24935. {
  24936. if (ssl)
  24937. return ssl->RsaSignCtx;
  24938. return NULL;
  24939. }
  24940. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  24941. {
  24942. if (ctx)
  24943. ctx->RsaVerifyCb = cb;
  24944. }
  24945. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  24946. {
  24947. if (ssl)
  24948. ssl->RsaVerifyCtx = ctx;
  24949. }
  24950. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  24951. {
  24952. if (ssl)
  24953. return ssl->RsaVerifyCtx;
  24954. return NULL;
  24955. }
  24956. #ifdef WC_RSA_PSS
  24957. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  24958. {
  24959. if (ctx)
  24960. ctx->RsaPssSignCb = cb;
  24961. }
  24962. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  24963. {
  24964. if (ctx)
  24965. ctx->RsaPssSignCheckCb = cb;
  24966. }
  24967. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  24968. {
  24969. if (ssl)
  24970. ssl->RsaPssSignCtx = ctx;
  24971. }
  24972. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  24973. {
  24974. if (ssl)
  24975. return ssl->RsaPssSignCtx;
  24976. return NULL;
  24977. }
  24978. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  24979. {
  24980. if (ctx)
  24981. ctx->RsaPssVerifyCb = cb;
  24982. }
  24983. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  24984. {
  24985. if (ssl)
  24986. ssl->RsaPssVerifyCtx = ctx;
  24987. }
  24988. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  24989. {
  24990. if (ssl)
  24991. return ssl->RsaPssVerifyCtx;
  24992. return NULL;
  24993. }
  24994. #endif /* WC_RSA_PSS */
  24995. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  24996. {
  24997. if (ctx)
  24998. ctx->RsaEncCb = cb;
  24999. }
  25000. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  25001. {
  25002. if (ssl)
  25003. ssl->RsaEncCtx = ctx;
  25004. }
  25005. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  25006. {
  25007. if (ssl)
  25008. return ssl->RsaEncCtx;
  25009. return NULL;
  25010. }
  25011. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  25012. {
  25013. if (ctx)
  25014. ctx->RsaDecCb = cb;
  25015. }
  25016. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  25017. {
  25018. if (ssl)
  25019. ssl->RsaDecCtx = ctx;
  25020. }
  25021. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  25022. {
  25023. if (ssl)
  25024. return ssl->RsaDecCtx;
  25025. return NULL;
  25026. }
  25027. #endif /* NO_RSA */
  25028. /* callback for premaster secret generation */
  25029. void wolfSSL_CTX_SetGenPreMasterCb(WOLFSSL_CTX* ctx, CallbackGenPreMaster cb)
  25030. {
  25031. if (ctx)
  25032. ctx->GenPreMasterCb = cb;
  25033. }
  25034. /* Set premaster secret generation callback context */
  25035. void wolfSSL_SetGenPreMasterCtx(WOLFSSL* ssl, void *ctx)
  25036. {
  25037. if (ssl)
  25038. ssl->GenPreMasterCtx = ctx;
  25039. }
  25040. /* Get premaster secret generation callback context */
  25041. void* wolfSSL_GetGenPreMasterCtx(WOLFSSL* ssl)
  25042. {
  25043. if (ssl)
  25044. return ssl->GenPreMasterCtx;
  25045. return NULL;
  25046. }
  25047. /* callback for master secret generation */
  25048. void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb)
  25049. {
  25050. if (ctx)
  25051. ctx->GenMasterCb = cb;
  25052. }
  25053. /* Set master secret generation callback context */
  25054. void wolfSSL_SetGenMasterSecretCtx(WOLFSSL* ssl, void *ctx)
  25055. {
  25056. if (ssl)
  25057. ssl->GenMasterCtx = ctx;
  25058. }
  25059. /* Get master secret generation callback context */
  25060. void* wolfSSL_GetGenMasterSecretCtx(WOLFSSL* ssl)
  25061. {
  25062. if (ssl)
  25063. return ssl->GenMasterCtx;
  25064. return NULL;
  25065. }
  25066. /* callback for session key generation */
  25067. void wolfSSL_CTX_SetGenSessionKeyCb(WOLFSSL_CTX* ctx, CallbackGenSessionKey cb)
  25068. {
  25069. if (ctx)
  25070. ctx->GenSessionKeyCb = cb;
  25071. }
  25072. /* Set session key generation callback context */
  25073. void wolfSSL_SetGenSessionKeyCtx(WOLFSSL* ssl, void *ctx)
  25074. {
  25075. if (ssl)
  25076. ssl->GenSessionKeyCtx = ctx;
  25077. }
  25078. /* Get session key generation callback context */
  25079. void* wolfSSL_GetGenSessionKeyCtx(WOLFSSL* ssl)
  25080. {
  25081. if (ssl)
  25082. return ssl->GenSessionKeyCtx;
  25083. return NULL;
  25084. }
  25085. /* callback for setting encryption keys */
  25086. void wolfSSL_CTX_SetEncryptKeysCb(WOLFSSL_CTX* ctx, CallbackEncryptKeys cb)
  25087. {
  25088. if (ctx)
  25089. ctx->EncryptKeysCb = cb;
  25090. }
  25091. /* Set encryption keys callback context */
  25092. void wolfSSL_SetEncryptKeysCtx(WOLFSSL* ssl, void *ctx)
  25093. {
  25094. if (ssl)
  25095. ssl->EncryptKeysCtx = ctx;
  25096. }
  25097. /* Get encryption keys callback context */
  25098. void* wolfSSL_GetEncryptKeysCtx(WOLFSSL* ssl)
  25099. {
  25100. if (ssl)
  25101. return ssl->EncryptKeysCtx;
  25102. return NULL;
  25103. }
  25104. /* callback for Tls finished */
  25105. /* the callback can be used to build TLS Finished message if enabled */
  25106. void wolfSSL_CTX_SetTlsFinishedCb(WOLFSSL_CTX* ctx, CallbackTlsFinished cb)
  25107. {
  25108. if (ctx)
  25109. ctx->TlsFinishedCb = cb;
  25110. }
  25111. /* Set Tls finished callback context */
  25112. void wolfSSL_SetTlsFinishedCtx(WOLFSSL* ssl, void *ctx)
  25113. {
  25114. if (ssl)
  25115. ssl->TlsFinishedCtx = ctx;
  25116. }
  25117. /* Get Tls finished callback context */
  25118. void* wolfSSL_GetTlsFinishedCtx(WOLFSSL* ssl)
  25119. {
  25120. if (ssl)
  25121. return ssl->TlsFinishedCtx;
  25122. return NULL;
  25123. }
  25124. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  25125. /* callback for verify data */
  25126. void wolfSSL_CTX_SetVerifyMacCb(WOLFSSL_CTX* ctx, CallbackVerifyMac cb)
  25127. {
  25128. if (ctx)
  25129. ctx->VerifyMacCb = cb;
  25130. }
  25131. /* Set set keys callback context */
  25132. void wolfSSL_SetVerifyMacCtx(WOLFSSL* ssl, void *ctx)
  25133. {
  25134. if (ssl)
  25135. ssl->VerifyMacCtx = ctx;
  25136. }
  25137. /* Get set keys callback context */
  25138. void* wolfSSL_GetVerifyMacCtx(WOLFSSL* ssl)
  25139. {
  25140. if (ssl)
  25141. return ssl->VerifyMacCtx;
  25142. return NULL;
  25143. }
  25144. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  25145. #endif /* HAVE_PK_CALLBACKS */
  25146. #endif /* NO_CERTS */
  25147. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  25148. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  25149. {
  25150. if (ctx)
  25151. ctx->DhAgreeCb = cb;
  25152. }
  25153. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  25154. {
  25155. if (ssl)
  25156. ssl->DhAgreeCtx = ctx;
  25157. }
  25158. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  25159. {
  25160. if (ssl)
  25161. return ssl->DhAgreeCtx;
  25162. return NULL;
  25163. }
  25164. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  25165. #if defined(HAVE_PK_CALLBACKS) && defined(HAVE_HKDF)
  25166. void wolfSSL_CTX_SetHKDFExtractCb(WOLFSSL_CTX* ctx, CallbackHKDFExtract cb)
  25167. {
  25168. if (ctx)
  25169. ctx->HkdfExtractCb = cb;
  25170. }
  25171. void wolfSSL_SetHKDFExtractCtx(WOLFSSL* ssl, void *ctx)
  25172. {
  25173. if (ssl)
  25174. ssl->HkdfExtractCtx = ctx;
  25175. }
  25176. void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
  25177. {
  25178. if (ssl)
  25179. return ssl->HkdfExtractCtx;
  25180. return NULL;
  25181. }
  25182. #endif /* HAVE_PK_CALLBACKS && HAVE_HKDF */
  25183. #ifdef WOLFSSL_HAVE_WOLFSCEP
  25184. /* Used by autoconf to see if wolfSCEP is available */
  25185. void wolfSSL_wolfSCEP(void) {}
  25186. #endif
  25187. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  25188. /* Used by autoconf to see if cert service is available */
  25189. void wolfSSL_cert_service(void) {}
  25190. #endif
  25191. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  25192. !defined(WOLFCRYPT_ONLY)
  25193. #ifndef NO_CERTS
  25194. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  25195. /* Convert ASN1 input string into canonical ASN1 string */
  25196. /* , which has the following rules: */
  25197. /* convert to UTF8 */
  25198. /* convert to lower case */
  25199. /* multi-spaces collapsed */
  25200. /* @param asn_out a pointer to ASN1_STRING to be converted */
  25201. /* @param asn_in a pointer to input ASN1_STRING */
  25202. /* @return WOLFSSL_SUCCESS on successful converted, otherwise <=0 error code*/
  25203. int wolfSSL_ASN1_STRING_canon(WOLFSSL_ASN1_STRING* asn_out,
  25204. const WOLFSSL_ASN1_STRING* asn_in)
  25205. {
  25206. char* dst;
  25207. char* src;
  25208. int i, len;
  25209. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_canon");
  25210. /* sanity check */
  25211. if (asn_out == NULL || asn_in == NULL) {
  25212. WOLFSSL_MSG("invalid function arguments");
  25213. return BAD_FUNC_ARG;
  25214. }
  25215. switch (asn_in->type) {
  25216. case MBSTRING_UTF8:
  25217. case V_ASN1_PRINTABLESTRING:
  25218. break;
  25219. default:
  25220. WOLFSSL_MSG("just copy string");
  25221. return wolfSSL_ASN1_STRING_copy(asn_out, asn_in);
  25222. }
  25223. /* type is set as UTF8 */
  25224. asn_out->type = MBSTRING_UTF8;
  25225. asn_out->length = wolfSSL_ASN1_STRING_to_UTF8(
  25226. (unsigned char**)&asn_out->data, (WOLFSSL_ASN1_STRING*)asn_in);
  25227. if (asn_out->length < 0) {
  25228. return WOLFSSL_FAILURE;
  25229. }
  25230. /* point to the last */
  25231. dst = asn_out->data + asn_out->length;
  25232. /* point to the start */
  25233. src = asn_out->data;
  25234. len = asn_out->length;
  25235. /* trimming spaces at the head and tail */
  25236. dst--;
  25237. for (; (len > 0 && XISSPACE(*dst)); len--) {
  25238. dst--;
  25239. }
  25240. for (; (len > 0 && XISSPACE(*src)); len--) {
  25241. src++;
  25242. }
  25243. /* point to the start */
  25244. dst = asn_out->data;
  25245. for (i = 0; i < len; dst++, i++) {
  25246. if (!XISASCII(*src)) {
  25247. /* keep non-ascii code */
  25248. *dst = *src++;
  25249. } else if (XISSPACE(*src)) {
  25250. *dst = 0x20; /* space */
  25251. /* remove the rest of spaces */
  25252. while (XISSPACE(*++src) && i++ < len);
  25253. } else {
  25254. *dst = (char)XTOLOWER((unsigned char)*src++);
  25255. }
  25256. }
  25257. /* put actual length */
  25258. asn_out->length = (int)(dst - asn_out->data);
  25259. return WOLFSSL_SUCCESS;
  25260. }
  25261. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  25262. #if !defined(NO_FILESYSTEM)
  25263. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp,
  25264. WOLFSSL_EVP_PKEY **key, wc_pem_password_cb *cb, void *pass)
  25265. {
  25266. WOLFSSL_EVP_PKEY* pkey = NULL;
  25267. DerBuffer* der = NULL;
  25268. int keyFormat = 0;
  25269. int type = -1;
  25270. WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey");
  25271. if (pem_read_file_key(fp, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  25272. &der) >= 0) {
  25273. const unsigned char* ptr = der->buffer;
  25274. if (keyFormat) {
  25275. /* keyFormat is Key_Sum enum */
  25276. if (keyFormat == RSAk)
  25277. type = EVP_PKEY_RSA;
  25278. else if (keyFormat == ECDSAk)
  25279. type = EVP_PKEY_EC;
  25280. else if (keyFormat == DSAk)
  25281. type = EVP_PKEY_DSA;
  25282. else if (keyFormat == DHk)
  25283. type = EVP_PKEY_DH;
  25284. }
  25285. else {
  25286. /* Default to RSA if format is not set */
  25287. type = EVP_PKEY_RSA;
  25288. }
  25289. /* handle case where reuse is attempted */
  25290. if (key != NULL && *key != NULL)
  25291. pkey = *key;
  25292. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  25293. if (pkey == NULL) {
  25294. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  25295. }
  25296. }
  25297. FreeDer(&der);
  25298. if (key != NULL && pkey != NULL)
  25299. *key = pkey;
  25300. WOLFSSL_LEAVE("wolfSSL_PEM_read_PrivateKey", 0);
  25301. return pkey;
  25302. }
  25303. #endif
  25304. #endif
  25305. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/
  25306. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  25307. #define PEM_BEGIN "-----BEGIN "
  25308. #define PEM_BEGIN_SZ 11
  25309. #define PEM_END "-----END "
  25310. #define PEM_END_SZ 9
  25311. #define PEM_HDR_FIN "-----"
  25312. #define PEM_HDR_FIN_SZ 5
  25313. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  25314. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  25315. #define PEM_HDR_FIN_EOL_SZ 6
  25316. #ifndef NO_BIO
  25317. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  25318. unsigned char **data, long *len)
  25319. {
  25320. int ret = WOLFSSL_SUCCESS;
  25321. char pem[256];
  25322. int pemLen;
  25323. char* p;
  25324. char* nameStr = NULL;
  25325. int nameLen = 0;
  25326. char* headerStr = NULL;
  25327. int headerLen;
  25328. int headerFound = 0;
  25329. unsigned char* der = NULL;
  25330. word32 derLen = 0;
  25331. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  25332. len == NULL) {
  25333. return WOLFSSL_FAILURE;
  25334. }
  25335. /* Find header line. */
  25336. pem[sizeof(pem) - 1] = '\0';
  25337. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  25338. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  25339. break;
  25340. }
  25341. if (pemLen <= 0)
  25342. ret = WOLFSSL_FAILURE;
  25343. /* Have a header line. */
  25344. if (ret == WOLFSSL_SUCCESS) {
  25345. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  25346. pemLen--;
  25347. pem[pemLen] = '\0';
  25348. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  25349. PEM_HDR_FIN_SZ) != 0) {
  25350. ret = WOLFSSL_FAILURE;
  25351. }
  25352. }
  25353. /* Get out name. */
  25354. if (ret == WOLFSSL_SUCCESS) {
  25355. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  25356. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  25357. DYNAMIC_TYPE_TMP_BUFFER);
  25358. if (nameStr == NULL)
  25359. ret = WOLFSSL_FAILURE;
  25360. }
  25361. if (ret == WOLFSSL_SUCCESS) {
  25362. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  25363. nameStr[nameLen] = '\0';
  25364. /* Get header of PEM - encryption header. */
  25365. headerLen = 0;
  25366. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  25367. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  25368. pem[pemLen - 1] == '\n')) {
  25369. pemLen--;
  25370. }
  25371. pem[pemLen++] = '\n';
  25372. pem[pemLen] = '\0';
  25373. /* Header separator is a blank line. */
  25374. if (pem[0] == '\n') {
  25375. headerFound = 1;
  25376. break;
  25377. }
  25378. /* Didn't find a blank line - no header. */
  25379. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  25380. der = (unsigned char*)headerStr;
  25381. derLen = headerLen;
  25382. /* Empty header - empty string. */
  25383. headerStr = (char*)XMALLOC(1, NULL,
  25384. DYNAMIC_TYPE_TMP_BUFFER);
  25385. if (headerStr == NULL)
  25386. ret = WOLFSSL_FAILURE;
  25387. else
  25388. headerStr[0] = '\0';
  25389. break;
  25390. }
  25391. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  25392. DYNAMIC_TYPE_TMP_BUFFER);
  25393. if (p == NULL) {
  25394. ret = WOLFSSL_FAILURE;
  25395. break;
  25396. }
  25397. headerStr = p;
  25398. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  25399. headerLen += pemLen;
  25400. }
  25401. if (pemLen <= 0)
  25402. ret = WOLFSSL_FAILURE;
  25403. }
  25404. /* Get body of PEM - if there was a header */
  25405. if (ret == WOLFSSL_SUCCESS && headerFound) {
  25406. derLen = 0;
  25407. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  25408. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  25409. pem[pemLen - 1] == '\n')) {
  25410. pemLen--;
  25411. }
  25412. pem[pemLen++] = '\n';
  25413. pem[pemLen] = '\0';
  25414. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  25415. break;
  25416. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  25417. DYNAMIC_TYPE_TMP_BUFFER);
  25418. if (p == NULL) {
  25419. ret = WOLFSSL_FAILURE;
  25420. break;
  25421. }
  25422. der = (unsigned char*)p;
  25423. XMEMCPY(der + derLen, pem, pemLen + 1);
  25424. derLen += pemLen;
  25425. }
  25426. if (pemLen <= 0)
  25427. ret = WOLFSSL_FAILURE;
  25428. }
  25429. /* Check trailer. */
  25430. if (ret == WOLFSSL_SUCCESS) {
  25431. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  25432. ret = WOLFSSL_FAILURE;
  25433. }
  25434. if (ret == WOLFSSL_SUCCESS) {
  25435. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  25436. PEM_HDR_FIN_EOL_NEWLINE,
  25437. PEM_HDR_FIN_EOL_SZ) != 0 &&
  25438. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  25439. PEM_HDR_FIN_EOL_NULL_TERM,
  25440. PEM_HDR_FIN_EOL_SZ) != 0) {
  25441. ret = WOLFSSL_FAILURE;
  25442. }
  25443. }
  25444. /* Base64 decode body. */
  25445. if (ret == WOLFSSL_SUCCESS) {
  25446. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  25447. ret = WOLFSSL_FAILURE;
  25448. }
  25449. if (ret == WOLFSSL_SUCCESS) {
  25450. *name = nameStr;
  25451. *header = headerStr;
  25452. *data = der;
  25453. *len = derLen;
  25454. nameStr = NULL;
  25455. headerStr = NULL;
  25456. der = NULL;
  25457. }
  25458. if (nameStr != NULL)
  25459. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25460. if (headerStr != NULL)
  25461. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25462. if (der != NULL)
  25463. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25464. return ret;
  25465. }
  25466. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  25467. const char *header, const unsigned char *data,
  25468. long len)
  25469. {
  25470. int err = 0;
  25471. int outSz = 0;
  25472. int nameLen;
  25473. int headerLen;
  25474. byte* pem = NULL;
  25475. word32 pemLen;
  25476. word32 derLen = (word32)len;
  25477. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  25478. return 0;
  25479. nameLen = (int)XSTRLEN(name);
  25480. headerLen = (int)XSTRLEN(header);
  25481. pemLen = (derLen + 2) / 3 * 4;
  25482. pemLen += (pemLen + 63) / 64;
  25483. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25484. err = pem == NULL;
  25485. if (!err)
  25486. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  25487. if (!err) {
  25488. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  25489. (int)PEM_BEGIN_SZ;
  25490. }
  25491. if (!err)
  25492. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  25493. if (!err) {
  25494. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  25495. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  25496. }
  25497. if (!err && headerLen > 0) {
  25498. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  25499. /* Blank line after a header and before body. */
  25500. if (!err)
  25501. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  25502. headerLen++;
  25503. }
  25504. if (!err)
  25505. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  25506. if (!err)
  25507. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  25508. (int)PEM_END_SZ;
  25509. if (!err)
  25510. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  25511. if (!err) {
  25512. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  25513. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  25514. }
  25515. if (!err) {
  25516. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  25517. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  25518. }
  25519. if (pem != NULL)
  25520. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25521. return outSz;
  25522. }
  25523. #if !defined(NO_FILESYSTEM)
  25524. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  25525. unsigned char **data, long *len)
  25526. {
  25527. int ret;
  25528. WOLFSSL_BIO* bio;
  25529. if (name == NULL || header == NULL || data == NULL || len == NULL)
  25530. return WOLFSSL_FAILURE;
  25531. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  25532. if (bio == NULL)
  25533. return 0;
  25534. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  25535. if (bio != NULL)
  25536. wolfSSL_BIO_free(bio);
  25537. return ret;
  25538. }
  25539. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  25540. const unsigned char *data, long len)
  25541. {
  25542. int ret;
  25543. WOLFSSL_BIO* bio;
  25544. if (name == NULL || header == NULL || data == NULL)
  25545. return 0;
  25546. bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  25547. if (bio == NULL)
  25548. return 0;
  25549. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  25550. if (bio != NULL)
  25551. wolfSSL_BIO_free(bio);
  25552. return ret;
  25553. }
  25554. #endif
  25555. #endif /* !NO_BIO */
  25556. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  25557. EncryptedInfo* cipher)
  25558. {
  25559. if (header == NULL || cipher == NULL)
  25560. return WOLFSSL_FAILURE;
  25561. XMEMSET(cipher, 0, sizeof(*cipher));
  25562. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  25563. return WOLFSSL_FAILURE;
  25564. return WOLFSSL_SUCCESS;
  25565. }
  25566. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  25567. long* len, wc_pem_password_cb* callback,
  25568. void* ctx)
  25569. {
  25570. int ret = WOLFSSL_SUCCESS;
  25571. char password[NAME_SZ];
  25572. int passwordSz;
  25573. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  25574. return WOLFSSL_FAILURE;
  25575. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  25576. if (passwordSz < 0)
  25577. ret = WOLFSSL_FAILURE;
  25578. if (ret == WOLFSSL_SUCCESS) {
  25579. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  25580. passwordSz, WC_MD5) != 0) {
  25581. ret = WOLFSSL_FAILURE;
  25582. }
  25583. }
  25584. if (passwordSz > 0)
  25585. XMEMSET(password, 0, passwordSz);
  25586. return ret;
  25587. }
  25588. #ifndef NO_BIO
  25589. /*
  25590. * bp : bio to read X509 from
  25591. * x : x509 to write to
  25592. * cb : password call back for reading PEM
  25593. * u : password
  25594. * _AUX is for working with a trusted X509 certificate
  25595. */
  25596. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  25597. WOLFSSL_X509 **x, wc_pem_password_cb *cb,
  25598. void *u)
  25599. {
  25600. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  25601. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  25602. * and potentially a stack of "other" info. wolfSSL does not store
  25603. * friendly name or private key id yet in WOLFSSL_X509 for human
  25604. * readability and does not support extra trusted/rejected uses for
  25605. * root CA. */
  25606. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  25607. }
  25608. #endif /* !NO_BIO */
  25609. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  25610. #endif /* !NO_CERTS */
  25611. /* NID variables are dependent on compatibility header files currently
  25612. *
  25613. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  25614. * on fail
  25615. */
  25616. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  25617. {
  25618. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  25619. }
  25620. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  25621. WOLFSSL_ASN1_OBJECT* arg_obj)
  25622. {
  25623. word32 oidSz = 0;
  25624. int nid = 0;
  25625. const byte* oid;
  25626. word32 type = 0;
  25627. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  25628. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  25629. word32 objSz = 0;
  25630. const char* sName = NULL;
  25631. int i;
  25632. #ifdef WOLFSSL_DEBUG_OPENSSL
  25633. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  25634. #endif
  25635. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  25636. if (wolfssl_object_info[i].nid == id) {
  25637. nid = id;
  25638. id = wolfssl_object_info[i].id;
  25639. sName = wolfssl_object_info[i].sName;
  25640. type = wolfssl_object_info[i].type;
  25641. break;
  25642. }
  25643. }
  25644. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  25645. WOLFSSL_MSG("NID not in table");
  25646. #ifdef WOLFSSL_QT
  25647. sName = NULL;
  25648. type = id;
  25649. #else
  25650. return NULL;
  25651. #endif
  25652. }
  25653. #ifdef HAVE_ECC
  25654. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  25655. type = oidCurveType;
  25656. }
  25657. #endif /* HAVE_ECC */
  25658. if (sName != NULL) {
  25659. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  25660. WOLFSSL_MSG("Attempted short name is too large");
  25661. return NULL;
  25662. }
  25663. }
  25664. oid = OidFromId(id, type, &oidSz);
  25665. /* set object ID to buffer */
  25666. if (obj == NULL){
  25667. obj = wolfSSL_ASN1_OBJECT_new();
  25668. if (obj == NULL) {
  25669. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  25670. return NULL;
  25671. }
  25672. }
  25673. obj->nid = nid;
  25674. obj->type = id;
  25675. obj->grp = type;
  25676. obj->sName[0] = '\0';
  25677. if (sName != NULL) {
  25678. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  25679. }
  25680. objBuf[0] = ASN_OBJECT_ID; objSz++;
  25681. objSz += SetLength(oidSz, objBuf + 1);
  25682. if (oidSz) {
  25683. XMEMCPY(objBuf + objSz, oid, oidSz);
  25684. objSz += oidSz;
  25685. }
  25686. if (obj->objSz == 0 || objSz != obj->objSz) {
  25687. obj->objSz = objSz;
  25688. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  25689. (obj->obj == NULL)) {
  25690. if (obj->obj != NULL)
  25691. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  25692. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  25693. if (obj->obj == NULL) {
  25694. wolfSSL_ASN1_OBJECT_free(obj);
  25695. return NULL;
  25696. }
  25697. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  25698. }
  25699. else {
  25700. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  25701. }
  25702. }
  25703. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  25704. (void)type;
  25705. return obj;
  25706. }
  25707. static const char* oid_translate_num_to_str(const char* oid)
  25708. {
  25709. const struct oid_dict {
  25710. const char* num;
  25711. const char* desc;
  25712. } oid_dict[] = {
  25713. { "2.5.29.37.0", "Any Extended Key Usage" },
  25714. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  25715. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  25716. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  25717. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  25718. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  25719. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  25720. { NULL, NULL }
  25721. };
  25722. const struct oid_dict* idx;
  25723. for (idx = oid_dict; idx->num != NULL; idx++) {
  25724. if (!XSTRCMP(oid, idx->num)) {
  25725. return idx->desc;
  25726. }
  25727. }
  25728. return NULL;
  25729. }
  25730. static int wolfssl_obj2txt_numeric(char *buf, int bufLen,
  25731. const WOLFSSL_ASN1_OBJECT *a)
  25732. {
  25733. int bufSz;
  25734. int length;
  25735. word32 idx = 0;
  25736. byte tag;
  25737. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  25738. return WOLFSSL_FAILURE;
  25739. }
  25740. if (tag != ASN_OBJECT_ID) {
  25741. WOLFSSL_MSG("Bad ASN1 Object");
  25742. return WOLFSSL_FAILURE;
  25743. }
  25744. if (GetLength((const byte*)a->obj, &idx, &length,
  25745. a->objSz) < 0 || length < 0) {
  25746. return ASN_PARSE_E;
  25747. }
  25748. if (bufLen < MAX_OID_STRING_SZ) {
  25749. bufSz = bufLen - 1;
  25750. }
  25751. else {
  25752. bufSz = MAX_OID_STRING_SZ;
  25753. }
  25754. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  25755. (word32)length)) <= 0) {
  25756. WOLFSSL_MSG("Error decoding OID");
  25757. return WOLFSSL_FAILURE;
  25758. }
  25759. buf[bufSz] = '\0';
  25760. return bufSz;
  25761. }
  25762. /* If no_name is one then use numerical form, otherwise short name.
  25763. *
  25764. * Returns the buffer size on success, WOLFSSL_FAILURE on error
  25765. */
  25766. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, const WOLFSSL_ASN1_OBJECT *a,
  25767. int no_name)
  25768. {
  25769. int bufSz;
  25770. const char* desc;
  25771. const char* name;
  25772. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  25773. if (buf == NULL || bufLen <= 1 || a == NULL) {
  25774. WOLFSSL_MSG("Bad input argument");
  25775. return WOLFSSL_FAILURE;
  25776. }
  25777. if (no_name == 1) {
  25778. return wolfssl_obj2txt_numeric(buf, bufLen, a);
  25779. }
  25780. /* return long name unless using x509small, then return short name */
  25781. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  25782. name = a->sName;
  25783. #else
  25784. name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  25785. #endif
  25786. if (name == NULL) {
  25787. WOLFSSL_MSG("Name not found");
  25788. bufSz = 0;
  25789. }
  25790. else if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  25791. bufSz = (int)XSTRLEN(name);
  25792. }
  25793. else {
  25794. bufSz = bufLen - 1;
  25795. }
  25796. if (bufSz) {
  25797. XMEMCPY(buf, name, bufSz);
  25798. }
  25799. else if (a->type == GEN_DNS || a->type == GEN_EMAIL ||
  25800. a->type == GEN_URI) {
  25801. bufSz = (int)XSTRLEN((const char*)a->obj);
  25802. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  25803. }
  25804. else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) {
  25805. if ((desc = oid_translate_num_to_str(buf))) {
  25806. bufSz = (int)XSTRLEN(desc);
  25807. bufSz = min(bufSz, bufLen - 1);
  25808. XMEMCPY(buf, desc, bufSz);
  25809. }
  25810. }
  25811. buf[bufSz] = '\0';
  25812. return bufSz;
  25813. }
  25814. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  25815. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  25816. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  25817. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  25818. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS_SMALL)
  25819. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  25820. * n : NID value of ASN1_OBJECT to search */
  25821. const char* wolfSSL_OBJ_nid2ln(int n)
  25822. {
  25823. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  25824. size_t i;
  25825. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  25826. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  25827. if (obj_info->nid == n) {
  25828. return obj_info->lName;
  25829. }
  25830. }
  25831. WOLFSSL_MSG("NID not found in table");
  25832. return NULL;
  25833. }
  25834. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  25835. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY, WOLFSSL_WPAS_SMALL */
  25836. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  25837. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  25838. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  25839. defined(WOLFSSL_HAPROXY)
  25840. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  25841. {
  25842. int ret;
  25843. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  25844. if (!ctx || !x || !x->derCert) {
  25845. WOLFSSL_MSG("Bad parameter");
  25846. return WOLFSSL_FAILURE;
  25847. }
  25848. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  25849. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  25850. ctx->heap);
  25851. if (ret != 0)
  25852. return WOLFSSL_FAILURE;
  25853. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  25854. x->derCert->length);
  25855. #ifdef KEEP_OUR_CERT
  25856. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  25857. wolfSSL_X509_free(ctx->ourCert);
  25858. }
  25859. #ifndef WOLFSSL_X509_STORE_CERTS
  25860. ctx->ourCert = x;
  25861. if (wolfSSL_X509_up_ref(x) != 1) {
  25862. return WOLFSSL_FAILURE;
  25863. }
  25864. #else
  25865. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  25866. if(ctx->ourCert == NULL){
  25867. return WOLFSSL_FAILURE;
  25868. }
  25869. #endif
  25870. /* We own the cert because either we up its reference counter
  25871. * or we create our own copy of the cert object. */
  25872. ctx->ownOurCert = 1;
  25873. #endif
  25874. /* Update the available options with public keys. */
  25875. switch (x->pubKeyOID) {
  25876. #ifndef NO_RSA
  25877. #ifdef WC_RSA_PSS
  25878. case RSAPSSk:
  25879. #endif
  25880. case RSAk:
  25881. ctx->haveRSA = 1;
  25882. break;
  25883. #endif
  25884. #ifdef HAVE_ED25519
  25885. case ED25519k:
  25886. #endif
  25887. #ifdef HAVE_ED448
  25888. case ED448k:
  25889. #endif
  25890. case ECDSAk:
  25891. ctx->haveECC = 1;
  25892. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  25893. ctx->pkCurveOID = x->pkCurveOID;
  25894. #endif
  25895. break;
  25896. }
  25897. return WOLFSSL_SUCCESS;
  25898. }
  25899. static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn,
  25900. byte* cert, word32 certSz, void* heap)
  25901. {
  25902. int ret;
  25903. DerBuffer* inChain = NULL;
  25904. DerBuffer* der = NULL;
  25905. word32 len = 0;
  25906. if (inOutDer == NULL)
  25907. return BAD_FUNC_ARG;
  25908. inChain = *inOutDer;
  25909. if (inChain != NULL)
  25910. len = inChain->length;
  25911. ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE,
  25912. heap);
  25913. if (ret != 0) {
  25914. WOLFSSL_MSG("AllocDer error");
  25915. return ret;
  25916. }
  25917. if (inChain != NULL)
  25918. XMEMCPY(der->buffer, inChain->buffer, len);
  25919. c32to24(certSz, der->buffer + len);
  25920. XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz);
  25921. if (weOwn)
  25922. FreeDer(inOutDer);
  25923. *inOutDer = der;
  25924. return WOLFSSL_SUCCESS;
  25925. }
  25926. /**
  25927. * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it
  25928. * on success
  25929. */
  25930. int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  25931. {
  25932. WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert");
  25933. if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) {
  25934. return WOLFSSL_FAILURE;
  25935. }
  25936. wolfSSL_X509_free(x509);
  25937. return WOLFSSL_SUCCESS;
  25938. }
  25939. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  25940. {
  25941. int ret;
  25942. WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert");
  25943. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  25944. return WOLFSSL_FAILURE;
  25945. }
  25946. if (ctx->certificate == NULL)
  25947. ret = (int)wolfSSL_CTX_use_certificate(ctx, x509);
  25948. else {
  25949. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  25950. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  25951. return WOLFSSL_FAILURE;
  25952. }
  25953. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  25954. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  25955. if (ret == WOLFSSL_SUCCESS) {
  25956. /* push to ctx->certChain */
  25957. ret = PushCertToDerBuffer(&ctx->certChain, 1,
  25958. x509->derCert->buffer, x509->derCert->length, ctx->heap);
  25959. }
  25960. /* Store cert to free it later */
  25961. if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) {
  25962. ctx->x509Chain = wolfSSL_sk_X509_new_null();
  25963. if (ctx->x509Chain == NULL) {
  25964. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  25965. ret = WOLFSSL_FAILURE;
  25966. }
  25967. }
  25968. if (ret == WOLFSSL_SUCCESS &&
  25969. wolfSSL_sk_X509_push(ctx->x509Chain, x509)
  25970. != WOLFSSL_SUCCESS) {
  25971. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  25972. ret = WOLFSSL_FAILURE;
  25973. }
  25974. if (ret != WOLFSSL_SUCCESS)
  25975. wolfSSL_X509_free(x509); /* Decrease ref counter */
  25976. }
  25977. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  25978. }
  25979. #ifdef KEEP_OUR_CERT
  25980. int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  25981. {
  25982. int ret;
  25983. WOLFSSL_ENTER("wolfSSL_add0_chain_cert");
  25984. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  25985. x509->derCert == NULL)
  25986. return WOLFSSL_FAILURE;
  25987. if (ssl->buffers.certificate == NULL) {
  25988. ret = wolfSSL_use_certificate(ssl, x509);
  25989. /* Store cert to free it later */
  25990. if (ret == WOLFSSL_SUCCESS) {
  25991. if (ssl->buffers.weOwnCert)
  25992. wolfSSL_X509_free(ssl->ourCert);
  25993. ssl->ourCert = x509;
  25994. ssl->buffers.weOwnCert = 1;
  25995. }
  25996. }
  25997. else {
  25998. ret = PushCertToDerBuffer(&ssl->buffers.certChain,
  25999. ssl->buffers.weOwnCertChain, x509->derCert->buffer,
  26000. x509->derCert->length, ssl->heap);
  26001. if (ret == WOLFSSL_SUCCESS) {
  26002. ssl->buffers.weOwnCertChain = 1;
  26003. /* Store cert to free it later */
  26004. if (ssl->ourCertChain == NULL) {
  26005. ssl->ourCertChain = wolfSSL_sk_X509_new_null();
  26006. if (ssl->ourCertChain == NULL) {
  26007. WOLFSSL_MSG("wolfSSL_sk_X509_new_null error");
  26008. return WOLFSSL_FAILURE;
  26009. }
  26010. }
  26011. if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509)
  26012. != WOLFSSL_SUCCESS) {
  26013. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  26014. return WOLFSSL_FAILURE;
  26015. }
  26016. }
  26017. }
  26018. return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  26019. }
  26020. int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  26021. {
  26022. int ret;
  26023. WOLFSSL_ENTER("wolfSSL_add1_chain_cert");
  26024. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  26025. x509->derCert == NULL)
  26026. return WOLFSSL_FAILURE;
  26027. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  26028. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  26029. return WOLFSSL_FAILURE;
  26030. }
  26031. ret = wolfSSL_add0_chain_cert(ssl, x509);
  26032. /* Decrease ref counter on error */
  26033. if (ret != WOLFSSL_SUCCESS)
  26034. wolfSSL_X509_free(x509);
  26035. return ret;
  26036. }
  26037. #endif
  26038. /* Return the corresponding short name for the nid <n>.
  26039. * or NULL if short name can't be found.
  26040. */
  26041. const char * wolfSSL_OBJ_nid2sn(int n) {
  26042. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  26043. size_t i;
  26044. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  26045. if (n == NID_md5) {
  26046. /* NID_surname == NID_md5 and NID_surname comes before NID_md5 in
  26047. * wolfssl_object_info. As a result, the loop below will incorrectly
  26048. * return "SN" instead of "MD5." NID_surname isn't the true OpenSSL
  26049. * NID, but other functions rely on this table and modifying it to
  26050. * conform with OpenSSL's NIDs isn't trivial. */
  26051. return "MD5";
  26052. }
  26053. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  26054. if (obj_info->nid == n) {
  26055. return obj_info->sName;
  26056. }
  26057. }
  26058. WOLFSSL_MSG("SN not found");
  26059. return NULL;
  26060. }
  26061. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  26062. int wolfSSL_OBJ_sn2nid(const char *sn) {
  26063. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  26064. if (sn == NULL)
  26065. return NID_undef;
  26066. return wc_OBJ_sn2nid(sn);
  26067. }
  26068. #endif
  26069. size_t wolfSSL_OBJ_length(const WOLFSSL_ASN1_OBJECT* o)
  26070. {
  26071. size_t ret = 0;
  26072. int err = 0;
  26073. word32 idx = 0;
  26074. int len = 0;
  26075. WOLFSSL_ENTER("wolfSSL_OBJ_length");
  26076. if (o == NULL || o->obj == NULL) {
  26077. WOLFSSL_MSG("Bad argument.");
  26078. err = 1;
  26079. }
  26080. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  26081. WOLFSSL_MSG("Error parsing ASN.1 header.");
  26082. err = 1;
  26083. }
  26084. if (err == 0) {
  26085. ret = len;
  26086. }
  26087. WOLFSSL_LEAVE("wolfSSL_OBJ_length", (int)ret);
  26088. return ret;
  26089. }
  26090. const unsigned char* wolfSSL_OBJ_get0_data(const WOLFSSL_ASN1_OBJECT* o)
  26091. {
  26092. const unsigned char* ret = NULL;
  26093. int err = 0;
  26094. word32 idx = 0;
  26095. int len = 0;
  26096. WOLFSSL_ENTER("wolfSSL_OBJ_get0_data");
  26097. if (o == NULL || o->obj == NULL) {
  26098. WOLFSSL_MSG("Bad argument.");
  26099. err = 1;
  26100. }
  26101. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  26102. WOLFSSL_MSG("Error parsing ASN.1 header.");
  26103. err = 1;
  26104. }
  26105. if (err == 0) {
  26106. ret = o->obj + idx;
  26107. }
  26108. return ret;
  26109. }
  26110. /* Gets the NID value that corresponds with the ASN1 object.
  26111. *
  26112. * o ASN1 object to get NID of
  26113. *
  26114. * Return NID on success and a negative value on failure
  26115. */
  26116. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  26117. {
  26118. word32 oid = 0;
  26119. word32 idx = 0;
  26120. int ret;
  26121. #ifdef WOLFSSL_DEBUG_OPENSSL
  26122. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  26123. #endif
  26124. if (o == NULL) {
  26125. return -1;
  26126. }
  26127. #ifdef WOLFSSL_QT
  26128. if (o->grp == oidCertExtType) {
  26129. /* If nid is an unknown extension, return NID_undef */
  26130. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  26131. return NID_undef;
  26132. }
  26133. #endif
  26134. if (o->nid > 0)
  26135. return o->nid;
  26136. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  26137. if (ret == ASN_OBJECT_ID_E) {
  26138. /* Put ASN object tag in front and try again */
  26139. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  26140. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26141. if (!buf) {
  26142. WOLFSSL_MSG("malloc error");
  26143. return -1;
  26144. }
  26145. idx = SetObjectId(o->objSz, buf);
  26146. XMEMCPY(buf + idx, o->obj, o->objSz);
  26147. idx = 0;
  26148. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  26149. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26150. if (ret < 0) {
  26151. WOLFSSL_MSG("Issue getting OID of object");
  26152. return -1;
  26153. }
  26154. }
  26155. else {
  26156. WOLFSSL_MSG("Issue getting OID of object");
  26157. return -1;
  26158. }
  26159. }
  26160. return oid2nid(oid, o->grp);
  26161. }
  26162. /* Return the corresponding NID for the long name <ln>
  26163. * or NID_undef if NID can't be found.
  26164. */
  26165. int wolfSSL_OBJ_ln2nid(const char *ln)
  26166. {
  26167. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  26168. size_t i, lnlen;
  26169. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  26170. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  26171. /* Accept input like "/commonName=" */
  26172. if (ln[0] == '/') {
  26173. ln++;
  26174. lnlen--;
  26175. }
  26176. if (lnlen) {
  26177. if (ln[lnlen-1] == '=') {
  26178. lnlen--;
  26179. }
  26180. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  26181. if (lnlen == XSTRLEN(obj_info->lName) &&
  26182. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  26183. return obj_info->nid;
  26184. }
  26185. }
  26186. }
  26187. }
  26188. return NID_undef;
  26189. }
  26190. /* compares two objects, return 0 if equal */
  26191. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  26192. const WOLFSSL_ASN1_OBJECT* b)
  26193. {
  26194. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  26195. if (a && b && a->obj && b->obj) {
  26196. if (a->objSz == b->objSz) {
  26197. return XMEMCMP(a->obj, b->obj, a->objSz);
  26198. }
  26199. else if (a->type == EXT_KEY_USAGE_OID ||
  26200. b->type == EXT_KEY_USAGE_OID) {
  26201. /* Special case for EXT_KEY_USAGE_OID so that
  26202. * cmp will be treated as a substring search */
  26203. /* Used in libest to check for id-kp-cmcRA in
  26204. * EXT_KEY_USAGE extension */
  26205. unsigned int idx;
  26206. const byte* s; /* shorter */
  26207. unsigned int sLen;
  26208. const byte* l; /* longer */
  26209. unsigned int lLen;
  26210. if (a->objSz > b->objSz) {
  26211. s = b->obj; sLen = b->objSz;
  26212. l = a->obj; lLen = a->objSz;
  26213. }
  26214. else {
  26215. s = a->obj; sLen = a->objSz;
  26216. l = b->obj; lLen = b->objSz;
  26217. }
  26218. for (idx = 0; idx <= lLen - sLen; idx++) {
  26219. if (XMEMCMP(l + idx, s, sLen) == 0) {
  26220. /* Found substring */
  26221. return 0;
  26222. }
  26223. }
  26224. }
  26225. }
  26226. return WOLFSSL_FATAL_ERROR;
  26227. }
  26228. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  26229. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  26230. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  26231. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  26232. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  26233. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  26234. /* Gets the NID value that is related to the OID string passed in. Example
  26235. * string would be "2.5.29.14" for subject key ID.
  26236. *
  26237. * returns NID value on success and NID_undef on error
  26238. */
  26239. int wolfSSL_OBJ_txt2nid(const char* s)
  26240. {
  26241. unsigned int i;
  26242. #ifdef WOLFSSL_CERT_EXT
  26243. int ret;
  26244. unsigned int sum = 0;
  26245. unsigned int outSz = MAX_OID_SZ;
  26246. unsigned char out[MAX_OID_SZ];
  26247. #endif
  26248. WOLFSSL_ENTER("OBJ_txt2nid");
  26249. if (s == NULL) {
  26250. return NID_undef;
  26251. }
  26252. #ifdef WOLFSSL_CERT_EXT
  26253. ret = EncodePolicyOID(out, &outSz, s, NULL);
  26254. if (ret == 0) {
  26255. /* sum OID */
  26256. for (i = 0; i < outSz; i++) {
  26257. sum += out[i];
  26258. }
  26259. }
  26260. #endif /* WOLFSSL_CERT_EXT */
  26261. /* get the group that the OID's sum is in
  26262. * @TODO possible conflict with multiples */
  26263. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  26264. int len;
  26265. #ifdef WOLFSSL_CERT_EXT
  26266. if (ret == 0) {
  26267. if (wolfssl_object_info[i].id == (int)sum) {
  26268. return wolfssl_object_info[i].nid;
  26269. }
  26270. }
  26271. #endif
  26272. /* try as a short name */
  26273. len = (int)XSTRLEN(s);
  26274. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  26275. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  26276. return wolfssl_object_info[i].nid;
  26277. }
  26278. /* try as a long name */
  26279. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  26280. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  26281. return wolfssl_object_info[i].nid;
  26282. }
  26283. }
  26284. return NID_undef;
  26285. }
  26286. #endif
  26287. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  26288. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  26289. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  26290. defined(WOLFSSL_HAPROXY)
  26291. /* Creates new ASN1_OBJECT from short name, long name, or text
  26292. * representation of oid. If no_name is 0, then short name, long name, and
  26293. * numerical value of oid are interpreted. If no_name is 1, then only the
  26294. * numerical value of the oid is interpreted.
  26295. *
  26296. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  26297. */
  26298. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  26299. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  26300. {
  26301. int i, ret;
  26302. int nid = NID_undef;
  26303. unsigned int outSz = MAX_OID_SZ;
  26304. unsigned char out[MAX_OID_SZ];
  26305. WOLFSSL_ASN1_OBJECT* obj;
  26306. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  26307. if (s == NULL)
  26308. return NULL;
  26309. /* If s is numerical value, try to sum oid */
  26310. ret = EncodePolicyOID(out, &outSz, s, NULL);
  26311. if (ret == 0 && outSz > 0) {
  26312. /* If numerical encode succeeded then just
  26313. * create object from that because sums are
  26314. * not unique and can cause confusion. */
  26315. obj = wolfSSL_ASN1_OBJECT_new();
  26316. if (obj == NULL) {
  26317. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  26318. return NULL;
  26319. }
  26320. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  26321. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  26322. DYNAMIC_TYPE_ASN1);
  26323. if (obj->obj == NULL) {
  26324. wolfSSL_ASN1_OBJECT_free(obj);
  26325. return NULL;
  26326. }
  26327. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  26328. i = SetObjectId(outSz, (byte*)obj->obj);
  26329. XMEMCPY((byte*)obj->obj + i, out, outSz);
  26330. obj->objSz = i + outSz;
  26331. return obj;
  26332. }
  26333. /* TODO: update short names in wolfssl_object_info and check OID sums
  26334. are correct */
  26335. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  26336. /* Short name, long name, and numerical value are interpreted */
  26337. if (no_name == 0 &&
  26338. ((XSTRCMP(s, wolfssl_object_info[i].sName) == 0) ||
  26339. (XSTRCMP(s, wolfssl_object_info[i].lName) == 0)))
  26340. {
  26341. nid = wolfssl_object_info[i].nid;
  26342. }
  26343. }
  26344. if (nid != NID_undef)
  26345. return wolfSSL_OBJ_nid2obj(nid);
  26346. return NULL;
  26347. }
  26348. #endif
  26349. /* compatibility function. Its intended use is to remove OID's from an
  26350. * internal table that have been added with OBJ_create. wolfSSL manages its
  26351. * own internal OID values and does not currently support OBJ_create. */
  26352. void wolfSSL_OBJ_cleanup(void)
  26353. {
  26354. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  26355. }
  26356. #ifndef NO_WOLFSSL_STUB
  26357. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  26358. {
  26359. (void)oid;
  26360. (void)sn;
  26361. (void)ln;
  26362. WOLFSSL_STUB("wolfSSL_OBJ_create");
  26363. return WOLFSSL_FAILURE;
  26364. }
  26365. #endif
  26366. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  26367. {
  26368. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  26369. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  26370. ssl->options.verifyDepth = (byte)depth;
  26371. #endif
  26372. }
  26373. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  26374. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  26375. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  26376. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  26377. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  26378. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  26379. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
  26380. {
  26381. WOLFSSL_ASN1_OBJECT* obj = NULL;
  26382. #ifdef WOLFSSL_DEBUG_OPENSSL
  26383. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  26384. #endif
  26385. if (ne == NULL) return NULL;
  26386. obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
  26387. if (obj != NULL) {
  26388. obj->nid = ne->nid;
  26389. return obj;
  26390. }
  26391. return NULL;
  26392. }
  26393. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  26394. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  26395. #ifdef OPENSSL_EXTRA
  26396. /* wolfSSL uses negative values for error states. This function returns an
  26397. * unsigned type so the value returned is the absolute value of the error.
  26398. */
  26399. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  26400. {
  26401. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  26402. (void)line;
  26403. (void)file;
  26404. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  26405. {
  26406. int ret;
  26407. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  26408. WOLFSSL_MSG("Issue peeking at error node in queue");
  26409. return 0;
  26410. }
  26411. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  26412. if (ret == -ASN_NO_PEM_HEADER)
  26413. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  26414. #endif
  26415. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  26416. if (ret == ASN1_R_HEADER_TOO_LONG) {
  26417. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  26418. }
  26419. #endif
  26420. return (unsigned long)ret;
  26421. }
  26422. #else
  26423. return (unsigned long)(0 - NOT_COMPILED_IN);
  26424. #endif
  26425. }
  26426. #ifndef NO_CERTS
  26427. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  26428. {
  26429. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  26430. if (ctx == NULL || pkey == NULL) {
  26431. return WOLFSSL_FAILURE;
  26432. }
  26433. switch (pkey->type) {
  26434. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && !defined(NO_RSA)
  26435. case EVP_PKEY_RSA:
  26436. WOLFSSL_MSG("populating RSA key");
  26437. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS)
  26438. return WOLFSSL_FAILURE;
  26439. break;
  26440. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  26441. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  26442. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  26443. case EVP_PKEY_DSA:
  26444. break;
  26445. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  26446. #ifdef HAVE_ECC
  26447. case EVP_PKEY_EC:
  26448. WOLFSSL_MSG("populating ECC key");
  26449. if (ECC_populate_EVP_PKEY(pkey, pkey->ecc)
  26450. != WOLFSSL_SUCCESS)
  26451. return WOLFSSL_FAILURE;
  26452. break;
  26453. #endif
  26454. default:
  26455. return WOLFSSL_FAILURE;
  26456. }
  26457. if (pkey->pkey.ptr != NULL) {
  26458. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  26459. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  26460. (const unsigned char*)pkey->pkey.ptr,
  26461. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  26462. }
  26463. WOLFSSL_MSG("wolfSSL private key not set");
  26464. return BAD_FUNC_ARG;
  26465. }
  26466. #endif /* !NO_CERTS */
  26467. #endif /* OPENSSL_EXTRA */
  26468. #if defined(HAVE_EX_DATA) && \
  26469. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  26470. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  26471. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  26472. defined(WOLFSSL_WPAS_SMALL)
  26473. /**
  26474. * get_ex_new_index is a helper function for the following
  26475. * xx_get_ex_new_index functions:
  26476. * - wolfSSL_CRYPTO_get_ex_new_index
  26477. * - wolfSSL_CTX_get_ex_new_index
  26478. * - wolfSSL_get_ex_new_index
  26479. * Issues a unique index number for the specified class-index.
  26480. * Returns an index number greater or equal to zero on success,
  26481. * -1 on failure.
  26482. */
  26483. int wolfssl_get_ex_new_index(int class_index)
  26484. {
  26485. /* index counter for each class index*/
  26486. static int ctx_idx = 0;
  26487. static int ssl_idx = 0;
  26488. static int ssl_session_idx = 0;
  26489. static int x509_idx = 0;
  26490. int idx = -1;
  26491. switch(class_index) {
  26492. case WOLF_CRYPTO_EX_INDEX_SSL:
  26493. idx = ssl_idx++;
  26494. break;
  26495. case WOLF_CRYPTO_EX_INDEX_SSL_CTX:
  26496. idx = ctx_idx++;
  26497. break;
  26498. case WOLF_CRYPTO_EX_INDEX_X509:
  26499. idx = x509_idx++;
  26500. break;
  26501. case WOLF_CRYPTO_EX_INDEX_SSL_SESSION:
  26502. idx = ssl_session_idx++;
  26503. break;
  26504. /* following class indexes are not supoprted */
  26505. case WOLF_CRYPTO_EX_INDEX_X509_STORE:
  26506. case WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX:
  26507. case WOLF_CRYPTO_EX_INDEX_DH:
  26508. case WOLF_CRYPTO_EX_INDEX_DSA:
  26509. case WOLF_CRYPTO_EX_INDEX_EC_KEY:
  26510. case WOLF_CRYPTO_EX_INDEX_RSA:
  26511. case WOLF_CRYPTO_EX_INDEX_ENGINE:
  26512. case WOLF_CRYPTO_EX_INDEX_UI:
  26513. case WOLF_CRYPTO_EX_INDEX_BIO:
  26514. case WOLF_CRYPTO_EX_INDEX_APP:
  26515. case WOLF_CRYPTO_EX_INDEX_UI_METHOD:
  26516. case WOLF_CRYPTO_EX_INDEX_DRBG:
  26517. default:
  26518. break;
  26519. }
  26520. return idx;
  26521. }
  26522. #endif /* HAVE_EX_DATA || WOLFSSL_WPAS_SMALL */
  26523. #if defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL)
  26524. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  26525. {
  26526. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  26527. #ifdef HAVE_EX_DATA
  26528. if(ctx != NULL) {
  26529. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  26530. }
  26531. #else
  26532. (void)ctx;
  26533. (void)idx;
  26534. #endif
  26535. return NULL;
  26536. }
  26537. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  26538. void* c)
  26539. {
  26540. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  26541. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(idx, arg, a, b, c);
  26542. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX);
  26543. }
  26544. /* Return the index that can be used for the WOLFSSL structure to store
  26545. * application data.
  26546. *
  26547. */
  26548. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  26549. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  26550. WOLFSSL_CRYPTO_EX_free* cb3)
  26551. {
  26552. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  26553. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(argValue, arg, cb1, cb2, cb3);
  26554. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL);
  26555. }
  26556. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  26557. {
  26558. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  26559. #ifdef HAVE_EX_DATA
  26560. if (ctx != NULL)
  26561. {
  26562. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  26563. }
  26564. #else
  26565. (void)ctx;
  26566. (void)idx;
  26567. (void)data;
  26568. #endif
  26569. return WOLFSSL_FAILURE;
  26570. }
  26571. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  26572. int wolfSSL_CTX_set_ex_data_with_cleanup(
  26573. WOLFSSL_CTX* ctx,
  26574. int idx,
  26575. void* data,
  26576. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  26577. {
  26578. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data_with_cleanup");
  26579. if (ctx != NULL)
  26580. {
  26581. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  26582. cleanup_routine);
  26583. }
  26584. return WOLFSSL_FAILURE;
  26585. }
  26586. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  26587. #endif /* defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL) */
  26588. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  26589. /* Returns char* to app data stored in ex[0].
  26590. *
  26591. * ssl WOLFSSL structure to get app data from
  26592. */
  26593. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  26594. {
  26595. /* checkout exdata stuff... */
  26596. WOLFSSL_ENTER("wolfSSL_get_app_data");
  26597. return wolfSSL_get_ex_data(ssl, 0);
  26598. }
  26599. /* Set ex array 0 to have app data
  26600. *
  26601. * ssl WOLFSSL struct to set app data in
  26602. * arg data to be stored
  26603. *
  26604. * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
  26605. */
  26606. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  26607. WOLFSSL_ENTER("wolfSSL_set_app_data");
  26608. return wolfSSL_set_ex_data(ssl, 0, arg);
  26609. }
  26610. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  26611. #if defined(HAVE_EX_DATA) || defined(OPENSSL_EXTRA) || \
  26612. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  26613. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  26614. {
  26615. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  26616. #ifdef HAVE_EX_DATA
  26617. if (ssl != NULL)
  26618. {
  26619. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  26620. }
  26621. #else
  26622. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  26623. (void)ssl;
  26624. (void)idx;
  26625. (void)data;
  26626. #endif
  26627. return WOLFSSL_FAILURE;
  26628. }
  26629. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  26630. int wolfSSL_set_ex_data_with_cleanup(
  26631. WOLFSSL* ssl,
  26632. int idx,
  26633. void* data,
  26634. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  26635. {
  26636. WOLFSSL_ENTER("wolfSSL_set_ex_data_with_cleanup");
  26637. if (ssl != NULL)
  26638. {
  26639. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ssl->ex_data, idx, data,
  26640. cleanup_routine);
  26641. }
  26642. return WOLFSSL_FAILURE;
  26643. }
  26644. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  26645. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  26646. {
  26647. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  26648. #ifdef HAVE_EX_DATA
  26649. if (ssl != NULL) {
  26650. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  26651. }
  26652. #else
  26653. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  26654. (void)ssl;
  26655. (void)idx;
  26656. #endif
  26657. return 0;
  26658. }
  26659. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  26660. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  26661. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  26662. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  26663. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  26664. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  26665. {
  26666. int pSz, gSz;
  26667. byte *p, *g;
  26668. int ret=0;
  26669. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  26670. if(!ctx || !dh)
  26671. return BAD_FUNC_ARG;
  26672. /* Get needed size for p and g */
  26673. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  26674. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  26675. if(pSz <= 0 || gSz <= 0)
  26676. return WOLFSSL_FATAL_ERROR;
  26677. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26678. if(!p)
  26679. return MEMORY_E;
  26680. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26681. if(!g) {
  26682. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26683. return MEMORY_E;
  26684. }
  26685. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  26686. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  26687. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  26688. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  26689. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26690. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26691. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  26692. }
  26693. #endif /* OPENSSL_EXTRA && !NO_DH */
  26694. /* returns the enum value associated with handshake state
  26695. *
  26696. * ssl the WOLFSSL structure to get state of
  26697. */
  26698. int wolfSSL_get_state(const WOLFSSL* ssl)
  26699. {
  26700. WOLFSSL_ENTER("wolfSSL_get_state");
  26701. if (ssl == NULL) {
  26702. WOLFSSL_MSG("Null argument passed in");
  26703. return SSL_FAILURE;
  26704. }
  26705. return ssl->options.handShakeState;
  26706. }
  26707. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  26708. #ifdef OPENSSL_EXTRA
  26709. void wolfSSL_certs_clear(WOLFSSL* ssl)
  26710. {
  26711. WOLFSSL_ENTER("wolfSSL_certs_clear()");
  26712. if (ssl == NULL)
  26713. return;
  26714. /* ctx still owns certificate, certChain, key, dh, and cm */
  26715. if (ssl->buffers.weOwnCert)
  26716. FreeDer(&ssl->buffers.certificate);
  26717. ssl->buffers.certificate = NULL;
  26718. if (ssl->buffers.weOwnCertChain)
  26719. FreeDer(&ssl->buffers.certChain);
  26720. ssl->buffers.certChain = NULL;
  26721. #ifdef WOLFSSL_TLS13
  26722. ssl->buffers.certChainCnt = 0;
  26723. #endif
  26724. if (ssl->buffers.weOwnKey)
  26725. FreeDer(&ssl->buffers.key);
  26726. ssl->buffers.key = NULL;
  26727. ssl->buffers.keyType = 0;
  26728. ssl->buffers.keyId = 0;
  26729. ssl->buffers.keyLabel = 0;
  26730. ssl->buffers.keySz = 0;
  26731. ssl->buffers.keyDevId = 0;
  26732. }
  26733. #endif
  26734. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  26735. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  26736. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  26737. {
  26738. WOLFSSL_ENTER("wolfSSL_ctrl");
  26739. if (ssl == NULL)
  26740. return BAD_FUNC_ARG;
  26741. switch (cmd) {
  26742. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  26743. #ifdef HAVE_SNI
  26744. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  26745. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  26746. if (pt == NULL) {
  26747. WOLFSSL_MSG("Passed in NULL Host Name.");
  26748. break;
  26749. }
  26750. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  26751. #endif /* HAVE_SNI */
  26752. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  26753. default:
  26754. WOLFSSL_MSG("Case not implemented.");
  26755. }
  26756. (void)opt;
  26757. (void)pt;
  26758. return WOLFSSL_FAILURE;
  26759. }
  26760. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  26761. {
  26762. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  26763. long ctrl_opt;
  26764. #endif
  26765. long ret = WOLFSSL_SUCCESS;
  26766. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  26767. if (ctx == NULL)
  26768. return WOLFSSL_FAILURE;
  26769. switch (cmd) {
  26770. case SSL_CTRL_CHAIN:
  26771. #ifdef SESSION_CERTS
  26772. {
  26773. /*
  26774. * We don't care about opt here because a copy of the certificate is
  26775. * stored anyway so increasing the reference counter is not necessary.
  26776. * Just check to make sure that it is set to one of the correct values.
  26777. */
  26778. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  26779. WOLFSSL_X509* x509;
  26780. int i;
  26781. if (opt != 0 && opt != 1) {
  26782. ret = WOLFSSL_FAILURE;
  26783. break;
  26784. }
  26785. /* Clear certificate chain */
  26786. FreeDer(&ctx->certChain);
  26787. if (sk) {
  26788. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  26789. x509 = wolfSSL_sk_X509_value(sk, i);
  26790. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  26791. if (wolfSSL_X509_up_ref(x509) != 1) {
  26792. WOLFSSL_MSG("Error increasing reference count");
  26793. continue;
  26794. }
  26795. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  26796. WOLFSSL_SUCCESS) {
  26797. WOLFSSL_MSG("Error adding certificate to context");
  26798. /* Decrease reference count on failure */
  26799. wolfSSL_X509_free(x509);
  26800. }
  26801. }
  26802. }
  26803. /* Free previous chain */
  26804. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  26805. ctx->x509Chain = sk;
  26806. if (sk && opt == 1) {
  26807. /* up all refs when opt == 1 */
  26808. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  26809. x509 = wolfSSL_sk_X509_value(sk, i);
  26810. if (wolfSSL_X509_up_ref(x509) != 1) {
  26811. WOLFSSL_MSG("Error increasing reference count");
  26812. continue;
  26813. }
  26814. }
  26815. }
  26816. }
  26817. #else
  26818. WOLFSSL_MSG("Session certificates not compiled in");
  26819. ret = WOLFSSL_FAILURE;
  26820. #endif
  26821. break;
  26822. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  26823. case SSL_CTRL_OPTIONS:
  26824. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  26825. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  26826. #ifdef WOLFSSL_QT
  26827. /* Set whether to use client or server cipher preference */
  26828. if ((ctrl_opt & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE)
  26829. == WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  26830. WOLFSSL_MSG("Using Server's Cipher Preference.");
  26831. ctx->useClientOrder = FALSE;
  26832. } else {
  26833. WOLFSSL_MSG("Using Client's Cipher Preference.");
  26834. ctx->useClientOrder = TRUE;
  26835. }
  26836. #endif /* WOLFSSL_QT */
  26837. return ctrl_opt;
  26838. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  26839. case SSL_CTRL_EXTRA_CHAIN_CERT:
  26840. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  26841. if (pt == NULL) {
  26842. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  26843. ret = WOLFSSL_FAILURE;
  26844. break;
  26845. }
  26846. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  26847. #ifndef NO_DH
  26848. case SSL_CTRL_SET_TMP_DH:
  26849. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  26850. if (pt == NULL) {
  26851. WOLFSSL_MSG("Passed in DH pointer NULL.");
  26852. ret = WOLFSSL_FAILURE;
  26853. break;
  26854. }
  26855. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  26856. #endif
  26857. #ifdef HAVE_ECC
  26858. case SSL_CTRL_SET_TMP_ECDH:
  26859. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  26860. if (pt == NULL) {
  26861. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  26862. ret = WOLFSSL_FAILURE;
  26863. break;
  26864. }
  26865. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  26866. #endif
  26867. case SSL_CTRL_MODE:
  26868. wolfSSL_CTX_set_mode(ctx,opt);
  26869. break;
  26870. case SSL_CTRL_SET_MIN_PROTO_VERSION:
  26871. WOLFSSL_MSG("set min proto version");
  26872. return wolfSSL_CTX_set_min_proto_version(ctx, (int)opt);
  26873. case SSL_CTRL_SET_MAX_PROTO_VERSION:
  26874. WOLFSSL_MSG("set max proto version");
  26875. return wolfSSL_CTX_set_max_proto_version(ctx, (int)opt);
  26876. case SSL_CTRL_GET_MIN_PROTO_VERSION:
  26877. WOLFSSL_MSG("get min proto version");
  26878. return wolfSSL_CTX_get_min_proto_version(ctx);
  26879. case SSL_CTRL_GET_MAX_PROTO_VERSION:
  26880. WOLFSSL_MSG("get max proto version");
  26881. return wolfSSL_CTX_get_max_proto_version(ctx);
  26882. default:
  26883. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  26884. ret = WOLFSSL_FAILURE;
  26885. break;
  26886. }
  26887. (void)ctx;
  26888. (void)cmd;
  26889. (void)opt;
  26890. (void)pt;
  26891. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  26892. return ret;
  26893. }
  26894. #ifndef WOLFSSL_NO_STUB
  26895. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  26896. {
  26897. (void) ctx;
  26898. (void) cmd;
  26899. (void) fp;
  26900. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  26901. return WOLFSSL_FAILURE;
  26902. }
  26903. #endif /* WOLFSSL_NO_STUB */
  26904. #ifndef NO_WOLFSSL_STUB
  26905. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  26906. {
  26907. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0L, NULL);
  26908. }
  26909. #endif
  26910. /* Returns the verifyCallback from the ssl structure if successful.
  26911. Returns NULL otherwise. */
  26912. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  26913. {
  26914. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  26915. if (ssl) {
  26916. return ssl->verifyCallback;
  26917. }
  26918. return NULL;
  26919. }
  26920. /* Adds the ASN1 certificate to the user ctx.
  26921. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  26922. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  26923. const unsigned char *der)
  26924. {
  26925. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  26926. if (der != NULL && ctx != NULL) {
  26927. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  26928. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  26929. return WOLFSSL_SUCCESS;
  26930. }
  26931. }
  26932. return WOLFSSL_FAILURE;
  26933. }
  26934. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  26935. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26936. /* Adds the rsa private key to the user ctx.
  26937. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  26938. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  26939. {
  26940. int ret;
  26941. int derSize;
  26942. unsigned char *maxDerBuf;
  26943. unsigned char* key = NULL;
  26944. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  26945. if (ctx == NULL || rsa == NULL) {
  26946. WOLFSSL_MSG("one or more inputs were NULL");
  26947. return BAD_FUNC_ARG;
  26948. }
  26949. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26950. if (maxDerBuf == NULL) {
  26951. WOLFSSL_MSG("Malloc failure");
  26952. return MEMORY_E;
  26953. }
  26954. key = maxDerBuf;
  26955. /* convert RSA struct to der encoded buffer and get the size */
  26956. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  26957. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  26958. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26959. return WOLFSSL_FAILURE;
  26960. }
  26961. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  26962. derSize, SSL_FILETYPE_ASN1);
  26963. if (ret != WOLFSSL_SUCCESS) {
  26964. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  26965. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26966. return WOLFSSL_FAILURE;
  26967. }
  26968. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26969. return ret;
  26970. }
  26971. #endif /* NO_RSA && !HAVE_FAST_RSA */
  26972. #ifndef NO_BIO
  26973. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  26974. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  26975. is a failure.*/
  26976. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  26977. WOLFSSL_EVP_PKEY** out)
  26978. {
  26979. unsigned char* mem = NULL;
  26980. int memSz = 0;
  26981. WOLFSSL_EVP_PKEY* key = NULL;
  26982. int i = 0, j = 0;
  26983. unsigned char* extraBioMem = NULL;
  26984. int extraBioMemSz = 0;
  26985. int derLength = 0;
  26986. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  26987. if (bio == NULL) {
  26988. return NULL;
  26989. }
  26990. (void)out;
  26991. memSz = wolfSSL_BIO_get_len(bio);
  26992. if (memSz <= 0) {
  26993. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  26994. return NULL;
  26995. }
  26996. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26997. if (mem == NULL) {
  26998. WOLFSSL_MSG("Malloc failure");
  26999. return NULL;
  27000. }
  27001. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  27002. /* Determines key type and returns the new private EVP_PKEY object */
  27003. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  27004. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  27005. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  27006. return NULL;
  27007. }
  27008. /* Write extra data back into bio object if necessary. */
  27009. derLength = key->pkey_sz;
  27010. extraBioMemSz = (memSz - derLength);
  27011. if (extraBioMemSz > 0) {
  27012. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  27013. DYNAMIC_TYPE_TMP_BUFFER);
  27014. if (extraBioMem == NULL) {
  27015. WOLFSSL_MSG("Malloc failure");
  27016. XFREE((unsigned char*)extraBioMem, bio->heap,
  27017. DYNAMIC_TYPE_TMP_BUFFER);
  27018. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  27019. return NULL;
  27020. }
  27021. for (i = derLength; i < memSz; i++) {
  27022. *(extraBioMem + j) = *(mem + i);
  27023. j++;
  27024. }
  27025. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  27026. if (wolfSSL_BIO_get_len(bio) <= 0) {
  27027. WOLFSSL_MSG("Failed to write memory to bio");
  27028. XFREE((unsigned char*)extraBioMem, bio->heap,
  27029. DYNAMIC_TYPE_TMP_BUFFER);
  27030. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  27031. return NULL;
  27032. }
  27033. XFREE((unsigned char*)extraBioMem, bio->heap,
  27034. DYNAMIC_TYPE_TMP_BUFFER);
  27035. }
  27036. if (out != NULL) {
  27037. *out = key;
  27038. }
  27039. }
  27040. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  27041. return key;
  27042. }
  27043. #endif /* !NO_BIO */
  27044. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  27045. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \
  27046. defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL)
  27047. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  27048. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  27049. * on fail */
  27050. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  27051. unsigned char** in, long inSz)
  27052. {
  27053. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP");
  27054. return d2iGenericKey(out, (const unsigned char**)in, inSz, 1);
  27055. }
  27056. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/
  27057. /* stunnel compatibility functions*/
  27058. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  27059. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  27060. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  27061. void wolfSSL_ERR_remove_thread_state(void* pid)
  27062. {
  27063. (void) pid;
  27064. return;
  27065. }
  27066. #ifndef NO_FILESYSTEM
  27067. /***TBD ***/
  27068. void wolfSSL_print_all_errors_fp(XFILE fp)
  27069. {
  27070. (void)fp;
  27071. }
  27072. #endif /* !NO_FILESYSTEM */
  27073. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  27074. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  27075. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  27076. defined(HAVE_EX_DATA)
  27077. #if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
  27078. static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx,
  27079. void* data, byte get, void** getRet, int* setRet)
  27080. {
  27081. int row;
  27082. int i;
  27083. int error = 0;
  27084. SessionRow* sessRow = NULL;
  27085. const byte* id;
  27086. byte foundCache = 0;
  27087. if (getRet != NULL)
  27088. *getRet = NULL;
  27089. if (setRet != NULL)
  27090. *setRet = WOLFSSL_FAILURE;
  27091. id = session->sessionID;
  27092. if (session->haveAltSessionID)
  27093. id = session->altSessionID;
  27094. row = (int)(HashObject(id, ID_LEN, &error) % SESSION_ROWS);
  27095. if (error != 0) {
  27096. WOLFSSL_MSG("Hash session failed");
  27097. return;
  27098. }
  27099. sessRow = &SessionCache[row];
  27100. if (SESSION_ROW_LOCK(sessRow) != 0) {
  27101. WOLFSSL_MSG("Session row lock failed");
  27102. return;
  27103. }
  27104. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  27105. if (XMEMCMP(id, sessRow->Sessions[i].sessionID, ID_LEN) == 0
  27106. && session->side == sessRow->Sessions[i].side
  27107. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  27108. && (IsAtLeastTLSv1_3(session->version) ==
  27109. IsAtLeastTLSv1_3(sessRow->Sessions[i].version))
  27110. #endif
  27111. ) {
  27112. if (get) {
  27113. *getRet = wolfSSL_CRYPTO_get_ex_data(
  27114. &sessRow->Sessions[i].ex_data, idx);
  27115. }
  27116. else {
  27117. *setRet = wolfSSL_CRYPTO_set_ex_data(
  27118. &sessRow->Sessions[i].ex_data, idx, data);
  27119. }
  27120. foundCache = 1;
  27121. break;
  27122. }
  27123. }
  27124. SESSION_ROW_UNLOCK(sessRow);
  27125. /* If we don't have a session in cache then clear the ex_data and
  27126. * own it */
  27127. if (!foundCache) {
  27128. XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA));
  27129. session->ownExData = 1;
  27130. if (!get) {
  27131. *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx,
  27132. data);
  27133. }
  27134. }
  27135. }
  27136. #endif
  27137. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  27138. {
  27139. int ret = WOLFSSL_FAILURE;
  27140. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  27141. #ifdef HAVE_EX_DATA
  27142. session = ClientSessionToSession(session);
  27143. if (session != NULL) {
  27144. #ifndef NO_SESSION_CACHE
  27145. if (!session->ownExData) {
  27146. /* Need to update in cache */
  27147. SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret);
  27148. }
  27149. else
  27150. #endif
  27151. {
  27152. ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  27153. }
  27154. }
  27155. #else
  27156. (void)session;
  27157. (void)idx;
  27158. (void)data;
  27159. #endif
  27160. return ret;
  27161. }
  27162. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  27163. int wolfSSL_SESSION_set_ex_data_with_cleanup(
  27164. WOLFSSL_SESSION* session,
  27165. int idx,
  27166. void* data,
  27167. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  27168. {
  27169. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup");
  27170. session = ClientSessionToSession(session);
  27171. if(session != NULL) {
  27172. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx,
  27173. data, cleanup_routine);
  27174. }
  27175. return WOLFSSL_FAILURE;
  27176. }
  27177. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  27178. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  27179. {
  27180. void* ret = NULL;
  27181. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  27182. #ifdef HAVE_EX_DATA
  27183. session = ClientSessionToSession(session);
  27184. if (session != NULL) {
  27185. #ifndef NO_SESSION_CACHE
  27186. if (!session->ownExData) {
  27187. /* Need to retrieve the data from the session cache */
  27188. SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL,
  27189. 1, &ret, NULL);
  27190. }
  27191. else
  27192. #endif
  27193. {
  27194. ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  27195. }
  27196. }
  27197. #else
  27198. (void)session;
  27199. (void)idx;
  27200. #endif
  27201. return ret;
  27202. }
  27203. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */
  27204. /* Note: This is a huge section of API's - through
  27205. * wolfSSL_X509_OBJECT_get0_X509_CRL */
  27206. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \
  27207. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  27208. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  27209. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))
  27210. #ifdef HAVE_EX_DATA
  27211. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  27212. void* cb2, CRYPTO_free_func* cb3)
  27213. {
  27214. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  27215. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(idx, data, cb1, cb2, cb3);
  27216. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION);
  27217. }
  27218. #endif
  27219. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY)
  27220. static wolfSSL_OSSL_Malloc_cb ossl_malloc = NULL;
  27221. static wolfSSL_OSSL_Free_cb ossl_free = NULL;
  27222. static wolfSSL_OSSL_Realloc_cb ossl_realloc = NULL;
  27223. static void* OSSL_Malloc(size_t size)
  27224. {
  27225. if (ossl_malloc != NULL)
  27226. return ossl_malloc(size, NULL, 0);
  27227. else
  27228. return NULL;
  27229. }
  27230. static void OSSL_Free(void *ptr)
  27231. {
  27232. if (ossl_free != NULL)
  27233. ossl_free(ptr, NULL, 0);
  27234. }
  27235. static void* OSSL_Realloc(void *ptr, size_t size)
  27236. {
  27237. if (ossl_realloc != NULL)
  27238. return ossl_realloc(ptr, size, NULL, 0);
  27239. else
  27240. return NULL;
  27241. }
  27242. #endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY */
  27243. int wolfSSL_CRYPTO_set_mem_functions(
  27244. wolfSSL_OSSL_Malloc_cb m,
  27245. wolfSSL_OSSL_Realloc_cb r,
  27246. wolfSSL_OSSL_Free_cb f)
  27247. {
  27248. #ifdef USE_WOLFSSL_MEMORY
  27249. #ifdef WOLFSSL_DEBUG_MEMORY
  27250. WOLFSSL_MSG("mem functions will receive function name instead of "
  27251. "file name");
  27252. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)m, (wolfSSL_Free_cb)f,
  27253. (wolfSSL_Realloc_cb)r) == 0)
  27254. return WOLFSSL_SUCCESS;
  27255. #else
  27256. WOLFSSL_MSG("wolfSSL was compiled without WOLFSSL_DEBUG_MEMORY. mem "
  27257. "functions will receive a NULL file name and 0 for the "
  27258. "line number.");
  27259. if (wolfSSL_SetAllocators(OSSL_Malloc, OSSL_Free, OSSL_Realloc) == 0) {
  27260. ossl_malloc = m;
  27261. ossl_free = f;
  27262. ossl_realloc = r;
  27263. return WOLFSSL_SUCCESS;
  27264. }
  27265. #endif
  27266. else
  27267. return WOLFSSL_FAILURE;
  27268. #else
  27269. (void)m;
  27270. (void)r;
  27271. (void)f;
  27272. WOLFSSL_MSG("wolfSSL allocator callback functions not compiled in");
  27273. return WOLFSSL_FAILURE;
  27274. #endif
  27275. }
  27276. int wolfSSL_ERR_load_ERR_strings(void)
  27277. {
  27278. return WOLFSSL_SUCCESS;
  27279. }
  27280. void wolfSSL_ERR_load_crypto_strings(void)
  27281. {
  27282. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  27283. /* Do nothing */
  27284. return;
  27285. }
  27286. int wolfSSL_FIPS_mode(void)
  27287. {
  27288. #ifdef HAVE_FIPS
  27289. return 1;
  27290. #else
  27291. return 0;
  27292. #endif
  27293. }
  27294. int wolfSSL_FIPS_mode_set(int r)
  27295. {
  27296. #ifdef HAVE_FIPS
  27297. if (r == 0) {
  27298. WOLFSSL_MSG("Cannot disable FIPS at runtime.");
  27299. return WOLFSSL_FAILURE;
  27300. }
  27301. return WOLFSSL_SUCCESS;
  27302. #else
  27303. if (r == 0) {
  27304. return WOLFSSL_SUCCESS;
  27305. }
  27306. WOLFSSL_MSG("Cannot enable FIPS. This isn't the wolfSSL FIPS code.");
  27307. return WOLFSSL_FAILURE;
  27308. #endif
  27309. }
  27310. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  27311. {
  27312. int ret = WOLFSSL_FAILURE;
  27313. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  27314. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  27315. (void)alg_bits;
  27316. if (c!= NULL)
  27317. ret = c->bits;
  27318. #else
  27319. if (c != NULL && c->ssl != NULL) {
  27320. ret = 8 * c->ssl->specs.key_size;
  27321. if (alg_bits != NULL) {
  27322. *alg_bits = ret;
  27323. }
  27324. }
  27325. #endif
  27326. return ret;
  27327. }
  27328. /* returns value less than 0 on fail to match
  27329. * On a successful match the priority level found is returned
  27330. */
  27331. int wolfSSL_sk_SSL_CIPHER_find(
  27332. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  27333. {
  27334. WOLFSSL_STACK* next;
  27335. int i, sz;
  27336. if (sk == NULL || toFind == NULL) {
  27337. return WOLFSSL_FATAL_ERROR;
  27338. }
  27339. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  27340. next = sk;
  27341. for (i = 0; i < sz && next != NULL; i++) {
  27342. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  27343. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  27344. return sz - i; /* reverse because stack pushed highest on first */
  27345. }
  27346. next = next->next;
  27347. }
  27348. return WOLFSSL_FATAL_ERROR;
  27349. }
  27350. /* free's all nodes in the stack and there data */
  27351. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  27352. {
  27353. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_free");
  27354. wolfSSL_sk_free(sk);
  27355. }
  27356. #ifdef HAVE_SNI
  27357. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  27358. {
  27359. int ret;
  27360. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  27361. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  27362. host_name, (word16)XSTRLEN(host_name));
  27363. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  27364. return ret;
  27365. }
  27366. #ifndef NO_WOLFSSL_SERVER
  27367. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  27368. {
  27369. void * serverName = NULL;
  27370. if (ssl == NULL)
  27371. return NULL;
  27372. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  27373. return (const char *)serverName;
  27374. }
  27375. #endif /* NO_WOLFSSL_SERVER */
  27376. #endif /* HAVE_SNI */
  27377. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  27378. {
  27379. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  27380. return ssl->ctx;
  27381. return NULL;
  27382. }
  27383. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  27384. {
  27385. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  27386. if(ctx)
  27387. return ctx->verifyCallback;
  27388. return NULL;
  27389. }
  27390. #ifdef HAVE_SNI
  27391. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  27392. {
  27393. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  27394. if (ctx)
  27395. ctx->sniRecvCb = cb;
  27396. }
  27397. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  27398. CallbackSniRecv cb)
  27399. {
  27400. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  27401. if (ctx) {
  27402. ctx->sniRecvCb = cb;
  27403. return WOLFSSL_SUCCESS;
  27404. }
  27405. return WOLFSSL_FAILURE;
  27406. }
  27407. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  27408. {
  27409. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  27410. if (ctx) {
  27411. ctx->sniRecvCbArg = arg;
  27412. return WOLFSSL_SUCCESS;
  27413. }
  27414. return WOLFSSL_FAILURE;
  27415. }
  27416. #endif /* HAVE_SNI */
  27417. #ifndef NO_BIO
  27418. void wolfSSL_ERR_load_BIO_strings(void) {
  27419. WOLFSSL_ENTER("ERR_load_BIO_strings");
  27420. /* do nothing */
  27421. }
  27422. #endif
  27423. #ifndef NO_WOLFSSL_STUB
  27424. /* Set THREADID callback, return 1 on success, 0 on error */
  27425. int wolfSSL_THREADID_set_callback(
  27426. void(*threadid_func)(WOLFSSL_CRYPTO_THREADID*))
  27427. {
  27428. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  27429. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  27430. (void)threadid_func;
  27431. return 1;
  27432. }
  27433. #endif
  27434. #ifndef NO_WOLFSSL_STUB
  27435. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  27436. {
  27437. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  27438. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  27439. (void)id;
  27440. (void)val;
  27441. return;
  27442. }
  27443. #endif
  27444. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  27445. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  27446. * HAVE_SBLIM_SFCB)) */
  27447. #if defined(OPENSSL_EXTRA)
  27448. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  27449. {
  27450. if (!a || !b)
  27451. return 0;
  27452. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  27453. }
  27454. unsigned long wolfSSL_ERR_peek_last_error(void)
  27455. {
  27456. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  27457. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  27458. {
  27459. int ret;
  27460. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  27461. WOLFSSL_MSG("Issue peeking at error node in queue");
  27462. return 0;
  27463. }
  27464. if (ret == -ASN_NO_PEM_HEADER)
  27465. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  27466. #if defined(WOLFSSL_PYTHON)
  27467. if (ret == ASN1_R_HEADER_TOO_LONG)
  27468. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  27469. #endif
  27470. return (unsigned long)ret;
  27471. }
  27472. #else
  27473. return (unsigned long)(0 - NOT_COMPILED_IN);
  27474. #endif
  27475. }
  27476. #endif /* OPENSSL_EXTRA */
  27477. int wolfSSL_version(WOLFSSL* ssl)
  27478. {
  27479. WOLFSSL_ENTER("wolfSSL_version");
  27480. if (ssl->version.major == SSLv3_MAJOR) {
  27481. switch (ssl->version.minor) {
  27482. case SSLv3_MINOR :
  27483. return SSL3_VERSION;
  27484. case TLSv1_MINOR :
  27485. return TLS1_VERSION;
  27486. case TLSv1_1_MINOR :
  27487. return TLS1_1_VERSION;
  27488. case TLSv1_2_MINOR :
  27489. return TLS1_2_VERSION;
  27490. case TLSv1_3_MINOR :
  27491. return TLS1_3_VERSION;
  27492. default:
  27493. return WOLFSSL_FAILURE;
  27494. }
  27495. }
  27496. else if (ssl->version.major == DTLS_MAJOR) {
  27497. switch (ssl->version.minor) {
  27498. case DTLS_MINOR :
  27499. return DTLS1_VERSION;
  27500. case DTLSv1_2_MINOR :
  27501. return DTLS1_2_VERSION;
  27502. default:
  27503. return WOLFSSL_FAILURE;
  27504. }
  27505. }
  27506. return WOLFSSL_FAILURE;
  27507. }
  27508. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  27509. {
  27510. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  27511. return ssl->ctx;
  27512. }
  27513. #if defined(OPENSSL_ALL) || \
  27514. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  27515. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  27516. const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess,
  27517. unsigned int* idLen)
  27518. {
  27519. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  27520. sess = ClientSessionToSession(sess);
  27521. if (sess == NULL || idLen == NULL) {
  27522. WOLFSSL_MSG("Bad func args. Please provide idLen");
  27523. return NULL;
  27524. }
  27525. *idLen = sess->sessionIDSz;
  27526. return sess->sessionID;
  27527. }
  27528. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  27529. !defined(NO_FILESYSTEM)
  27530. #ifndef NO_BIO
  27531. #if defined(SESSION_CERTS) || \
  27532. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  27533. /* returns a pointer to the protocol used by the session */
  27534. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  27535. {
  27536. in = ClientSessionToSession(in);
  27537. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  27538. }
  27539. #endif
  27540. /* returns true (non 0) if the session has EMS (extended master secret) */
  27541. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  27542. {
  27543. in = ClientSessionToSession(in);
  27544. if (in == NULL)
  27545. return 0;
  27546. return in->haveEMS;
  27547. }
  27548. #if defined(HAVE_SESSION_TICKET)
  27549. /* prints out the ticket to bio passed in
  27550. * return WOLFSSL_SUCCESS on success
  27551. */
  27552. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  27553. const WOLFSSL_SESSION* in, const char* tab)
  27554. {
  27555. unsigned short i, j, z, sz;
  27556. short tag = 0;
  27557. byte* pt;
  27558. in = ClientSessionToSession(in);
  27559. if (in == NULL || bio == NULL) {
  27560. return BAD_FUNC_ARG;
  27561. }
  27562. sz = in->ticketLen;
  27563. pt = in->ticket;
  27564. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  27565. return WOLFSSL_FAILURE;
  27566. for (i = 0; i < sz;) {
  27567. char asc[16];
  27568. if (sz - i < 16) {
  27569. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  27570. return WOLFSSL_FAILURE;
  27571. }
  27572. else {
  27573. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  27574. return WOLFSSL_FAILURE;
  27575. }
  27576. for (j = 0; i < sz && j < 8; j++,i++) {
  27577. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27578. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  27579. return WOLFSSL_FAILURE;
  27580. }
  27581. if (i < sz) {
  27582. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27583. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  27584. return WOLFSSL_FAILURE;
  27585. j++;
  27586. i++;
  27587. }
  27588. for (; i < sz && j < 16; j++,i++) {
  27589. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27590. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  27591. return WOLFSSL_FAILURE;
  27592. }
  27593. /* pad out spacing */
  27594. for (z = j; z < 17; z++) {
  27595. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  27596. return WOLFSSL_FAILURE;
  27597. }
  27598. for (z = 0; z < j; z++) {
  27599. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  27600. return WOLFSSL_FAILURE;
  27601. }
  27602. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  27603. return WOLFSSL_FAILURE;
  27604. tag += 16;
  27605. }
  27606. return WOLFSSL_SUCCESS;
  27607. }
  27608. #endif /* HAVE_SESSION_TICKET */
  27609. /* prints out the session information in human readable form
  27610. * return WOLFSSL_SUCCESS on success
  27611. */
  27612. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session)
  27613. {
  27614. const unsigned char* pt;
  27615. unsigned char buf[SECRET_LEN];
  27616. unsigned int sz = 0, i;
  27617. int ret;
  27618. session = ClientSessionToSession(session);
  27619. if (session == NULL) {
  27620. return WOLFSSL_FAILURE;
  27621. }
  27622. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  27623. return WOLFSSL_FAILURE;
  27624. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  27625. defined(HAVE_SESSION_TICKET))
  27626. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  27627. wolfSSL_SESSION_get_protocol(session)) <= 0)
  27628. return WOLFSSL_FAILURE;
  27629. #endif
  27630. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  27631. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  27632. return WOLFSSL_FAILURE;
  27633. pt = wolfSSL_SESSION_get_id(session, &sz);
  27634. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  27635. return WOLFSSL_FAILURE;
  27636. for (i = 0; i < sz; i++) {
  27637. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  27638. return WOLFSSL_FAILURE;
  27639. }
  27640. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  27641. return WOLFSSL_FAILURE;
  27642. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  27643. return WOLFSSL_FAILURE;
  27644. ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf));
  27645. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  27646. return WOLFSSL_FAILURE;
  27647. if (ret > 0) {
  27648. sz = (unsigned int)ret;
  27649. for (i = 0; i < sz; i++) {
  27650. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  27651. return WOLFSSL_FAILURE;
  27652. }
  27653. }
  27654. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  27655. return WOLFSSL_FAILURE;
  27656. /* @TODO PSK identity hint and SRP */
  27657. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  27658. return WOLFSSL_FAILURE;
  27659. #ifdef HAVE_SESSION_TICKET
  27660. if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS)
  27661. return WOLFSSL_FAILURE;
  27662. #endif
  27663. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  27664. defined(HAVE_EXT_CACHE))
  27665. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  27666. wolfSSL_SESSION_get_time(session)) <= 0)
  27667. return WOLFSSL_FAILURE;
  27668. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  27669. wolfSSL_SESSION_get_timeout(session)) <= 0)
  27670. return WOLFSSL_FAILURE;
  27671. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  27672. /* @TODO verify return code print */
  27673. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  27674. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  27675. return WOLFSSL_FAILURE;
  27676. return WOLFSSL_SUCCESS;
  27677. }
  27678. #endif /* !NO_BIO */
  27679. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  27680. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  27681. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  27682. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  27683. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  27684. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  27685. int mode = 0;
  27686. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  27687. if (!ssl) {
  27688. return WOLFSSL_FAILURE;
  27689. }
  27690. if (ssl->options.verifyNone) {
  27691. mode = WOLFSSL_VERIFY_NONE;
  27692. }
  27693. else {
  27694. if (ssl->options.verifyPeer) {
  27695. mode |= WOLFSSL_VERIFY_PEER;
  27696. }
  27697. if (ssl->options.failNoCert) {
  27698. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  27699. }
  27700. if (ssl->options.failNoCertxPSK) {
  27701. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  27702. }
  27703. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  27704. if (ssl->options.verifyPostHandshake) {
  27705. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  27706. }
  27707. #endif
  27708. }
  27709. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  27710. return mode;
  27711. }
  27712. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  27713. {
  27714. int mode = 0;
  27715. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  27716. if (!ctx) {
  27717. return WOLFSSL_FAILURE;
  27718. }
  27719. if (ctx->verifyNone) {
  27720. mode = WOLFSSL_VERIFY_NONE;
  27721. }
  27722. else {
  27723. if (ctx->verifyPeer) {
  27724. mode |= WOLFSSL_VERIFY_PEER;
  27725. }
  27726. if (ctx->failNoCert) {
  27727. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  27728. }
  27729. if (ctx->failNoCertxPSK) {
  27730. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  27731. }
  27732. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  27733. if (ctx->verifyPostHandshake) {
  27734. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  27735. }
  27736. #endif
  27737. }
  27738. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  27739. return mode;
  27740. }
  27741. #endif
  27742. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  27743. /* return 1 if success, 0 if error
  27744. * output keys are little endian format
  27745. */
  27746. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  27747. unsigned char *pub, unsigned int *pubSz)
  27748. {
  27749. #ifndef WOLFSSL_KEY_GEN
  27750. WOLFSSL_MSG("No Key Gen built in");
  27751. (void) priv;
  27752. (void) privSz;
  27753. (void) pub;
  27754. (void) pubSz;
  27755. return WOLFSSL_FAILURE;
  27756. #else /* WOLFSSL_KEY_GEN */
  27757. int ret = WOLFSSL_FAILURE;
  27758. int initTmpRng = 0;
  27759. WC_RNG *rng = NULL;
  27760. #ifdef WOLFSSL_SMALL_STACK
  27761. WC_RNG *tmpRNG = NULL;
  27762. #else
  27763. WC_RNG tmpRNG[1];
  27764. #endif
  27765. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  27766. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  27767. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  27768. WOLFSSL_MSG("Bad arguments");
  27769. return WOLFSSL_FAILURE;
  27770. }
  27771. #ifdef WOLFSSL_SMALL_STACK
  27772. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27773. if (tmpRNG == NULL)
  27774. return WOLFSSL_FAILURE;
  27775. #endif
  27776. if (wc_InitRng(tmpRNG) == 0) {
  27777. rng = tmpRNG;
  27778. initTmpRng = 1;
  27779. }
  27780. else {
  27781. WOLFSSL_MSG("Bad RNG Init, trying global");
  27782. if (initGlobalRNG == 0)
  27783. WOLFSSL_MSG("Global RNG no Init");
  27784. else
  27785. rng = &globalRNG;
  27786. }
  27787. if (rng) {
  27788. curve25519_key key;
  27789. if (wc_curve25519_init(&key) != MP_OKAY)
  27790. WOLFSSL_MSG("wc_curve25519_init failed");
  27791. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  27792. WOLFSSL_MSG("wc_curve25519_make_key failed");
  27793. /* export key pair */
  27794. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  27795. pubSz, EC25519_LITTLE_ENDIAN)
  27796. != MP_OKAY)
  27797. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  27798. else
  27799. ret = WOLFSSL_SUCCESS;
  27800. wc_curve25519_free(&key);
  27801. }
  27802. if (initTmpRng)
  27803. wc_FreeRng(tmpRNG);
  27804. #ifdef WOLFSSL_SMALL_STACK
  27805. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27806. #endif
  27807. return ret;
  27808. #endif /* WOLFSSL_KEY_GEN */
  27809. }
  27810. /* return 1 if success, 0 if error
  27811. * input and output keys are little endian format
  27812. */
  27813. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  27814. const unsigned char *priv, unsigned int privSz,
  27815. const unsigned char *pub, unsigned int pubSz)
  27816. {
  27817. #ifndef WOLFSSL_KEY_GEN
  27818. WOLFSSL_MSG("No Key Gen built in");
  27819. (void) shared;
  27820. (void) sharedSz;
  27821. (void) priv;
  27822. (void) privSz;
  27823. (void) pub;
  27824. (void) pubSz;
  27825. return WOLFSSL_FAILURE;
  27826. #else /* WOLFSSL_KEY_GEN */
  27827. int ret = WOLFSSL_FAILURE;
  27828. curve25519_key privkey, pubkey;
  27829. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  27830. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  27831. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  27832. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  27833. WOLFSSL_MSG("Bad arguments");
  27834. return WOLFSSL_FAILURE;
  27835. }
  27836. /* import private key */
  27837. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  27838. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  27839. return ret;
  27840. }
  27841. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  27842. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  27843. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  27844. wc_curve25519_free(&privkey);
  27845. return ret;
  27846. }
  27847. /* import public key */
  27848. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  27849. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  27850. wc_curve25519_free(&privkey);
  27851. return ret;
  27852. }
  27853. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  27854. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  27855. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  27856. wc_curve25519_free(&privkey);
  27857. wc_curve25519_free(&pubkey);
  27858. return ret;
  27859. }
  27860. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  27861. shared, sharedSz,
  27862. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  27863. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  27864. else
  27865. ret = WOLFSSL_SUCCESS;
  27866. wc_curve25519_free(&privkey);
  27867. wc_curve25519_free(&pubkey);
  27868. return ret;
  27869. #endif /* WOLFSSL_KEY_GEN */
  27870. }
  27871. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  27872. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  27873. /* return 1 if success, 0 if error
  27874. * output keys are little endian format
  27875. */
  27876. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  27877. unsigned char *pub, unsigned int *pubSz)
  27878. {
  27879. #ifndef WOLFSSL_KEY_GEN
  27880. WOLFSSL_MSG("No Key Gen built in");
  27881. (void) priv;
  27882. (void) privSz;
  27883. (void) pub;
  27884. (void) pubSz;
  27885. return WOLFSSL_FAILURE;
  27886. #elif !defined(HAVE_ED25519_KEY_EXPORT)
  27887. WOLFSSL_MSG("No ED25519 key export built in");
  27888. (void) priv;
  27889. (void) privSz;
  27890. (void) pub;
  27891. (void) pubSz;
  27892. return WOLFSSL_FAILURE;
  27893. #else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  27894. int ret = WOLFSSL_FAILURE;
  27895. int initTmpRng = 0;
  27896. WC_RNG *rng = NULL;
  27897. #ifdef WOLFSSL_SMALL_STACK
  27898. WC_RNG *tmpRNG = NULL;
  27899. #else
  27900. WC_RNG tmpRNG[1];
  27901. #endif
  27902. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  27903. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  27904. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  27905. WOLFSSL_MSG("Bad arguments");
  27906. return WOLFSSL_FAILURE;
  27907. }
  27908. #ifdef WOLFSSL_SMALL_STACK
  27909. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27910. if (tmpRNG == NULL)
  27911. return WOLFSSL_FATAL_ERROR;
  27912. #endif
  27913. if (wc_InitRng(tmpRNG) == 0) {
  27914. rng = tmpRNG;
  27915. initTmpRng = 1;
  27916. }
  27917. else {
  27918. WOLFSSL_MSG("Bad RNG Init, trying global");
  27919. if (initGlobalRNG == 0)
  27920. WOLFSSL_MSG("Global RNG no Init");
  27921. else
  27922. rng = &globalRNG;
  27923. }
  27924. if (rng) {
  27925. ed25519_key key;
  27926. if (wc_ed25519_init(&key) != MP_OKAY)
  27927. WOLFSSL_MSG("wc_ed25519_init failed");
  27928. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  27929. WOLFSSL_MSG("wc_ed25519_make_key failed");
  27930. /* export private key */
  27931. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  27932. WOLFSSL_MSG("wc_ed25519_export_key failed");
  27933. else
  27934. ret = WOLFSSL_SUCCESS;
  27935. wc_ed25519_free(&key);
  27936. }
  27937. if (initTmpRng)
  27938. wc_FreeRng(tmpRNG);
  27939. #ifdef WOLFSSL_SMALL_STACK
  27940. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27941. #endif
  27942. return ret;
  27943. #endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  27944. }
  27945. /* return 1 if success, 0 if error
  27946. * input and output keys are little endian format
  27947. * priv is a buffer containing private and public part of key
  27948. */
  27949. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  27950. const unsigned char *priv, unsigned int privSz,
  27951. unsigned char *sig, unsigned int *sigSz)
  27952. {
  27953. #if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  27954. #if !defined(HAVE_ED25519_SIGN)
  27955. WOLFSSL_MSG("No ED25519 sign built in");
  27956. #elif !defined(WOLFSSL_KEY_GEN)
  27957. WOLFSSL_MSG("No Key Gen built in");
  27958. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  27959. WOLFSSL_MSG("No ED25519 Key import built in");
  27960. #endif
  27961. (void) msg;
  27962. (void) msgSz;
  27963. (void) priv;
  27964. (void) privSz;
  27965. (void) sig;
  27966. (void) sigSz;
  27967. return WOLFSSL_FAILURE;
  27968. #else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27969. ed25519_key key;
  27970. int ret = WOLFSSL_FAILURE;
  27971. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  27972. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  27973. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  27974. WOLFSSL_MSG("Bad arguments");
  27975. return WOLFSSL_FAILURE;
  27976. }
  27977. /* import key */
  27978. if (wc_ed25519_init(&key) != MP_OKAY) {
  27979. WOLFSSL_MSG("wc_curve25519_init failed");
  27980. return ret;
  27981. }
  27982. if (wc_ed25519_import_private_key(priv, privSz/2,
  27983. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  27984. &key) != MP_OKAY){
  27985. WOLFSSL_MSG("wc_ed25519_import_private failed");
  27986. wc_ed25519_free(&key);
  27987. return ret;
  27988. }
  27989. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  27990. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  27991. else
  27992. ret = WOLFSSL_SUCCESS;
  27993. wc_ed25519_free(&key);
  27994. return ret;
  27995. #endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27996. }
  27997. /* return 1 if success, 0 if error
  27998. * input and output keys are little endian format
  27999. * pub is a buffer containing public part of key
  28000. */
  28001. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  28002. const unsigned char *pub, unsigned int pubSz,
  28003. const unsigned char *sig, unsigned int sigSz)
  28004. {
  28005. #if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  28006. #if !defined(HAVE_ED25519_VERIFY)
  28007. WOLFSSL_MSG("No ED25519 verify built in");
  28008. #elif !defined(WOLFSSL_KEY_GEN)
  28009. WOLFSSL_MSG("No Key Gen built in");
  28010. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  28011. WOLFSSL_MSG("No ED25519 Key import built in");
  28012. #endif
  28013. (void) msg;
  28014. (void) msgSz;
  28015. (void) pub;
  28016. (void) pubSz;
  28017. (void) sig;
  28018. (void) sigSz;
  28019. return WOLFSSL_FAILURE;
  28020. #else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  28021. ed25519_key key;
  28022. int ret = WOLFSSL_FAILURE, check = 0;
  28023. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  28024. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  28025. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  28026. WOLFSSL_MSG("Bad arguments");
  28027. return WOLFSSL_FAILURE;
  28028. }
  28029. /* import key */
  28030. if (wc_ed25519_init(&key) != MP_OKAY) {
  28031. WOLFSSL_MSG("wc_curve25519_init failed");
  28032. return ret;
  28033. }
  28034. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  28035. WOLFSSL_MSG("wc_ed25519_import_public failed");
  28036. wc_ed25519_free(&key);
  28037. return ret;
  28038. }
  28039. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  28040. &check, &key)) != MP_OKAY) {
  28041. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  28042. }
  28043. else if (!check)
  28044. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  28045. else
  28046. ret = WOLFSSL_SUCCESS;
  28047. wc_ed25519_free(&key);
  28048. return ret;
  28049. #endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  28050. }
  28051. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  28052. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  28053. /* return 1 if success, 0 if error
  28054. * output keys are little endian format
  28055. */
  28056. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  28057. unsigned char *pub, unsigned int *pubSz)
  28058. {
  28059. #ifndef WOLFSSL_KEY_GEN
  28060. WOLFSSL_MSG("No Key Gen built in");
  28061. (void) priv;
  28062. (void) privSz;
  28063. (void) pub;
  28064. (void) pubSz;
  28065. return WOLFSSL_FAILURE;
  28066. #else /* WOLFSSL_KEY_GEN */
  28067. int ret = WOLFSSL_FAILURE;
  28068. int initTmpRng = 0;
  28069. WC_RNG *rng = NULL;
  28070. #ifdef WOLFSSL_SMALL_STACK
  28071. WC_RNG *tmpRNG = NULL;
  28072. #else
  28073. WC_RNG tmpRNG[1];
  28074. #endif
  28075. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  28076. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  28077. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  28078. WOLFSSL_MSG("Bad arguments");
  28079. return WOLFSSL_FAILURE;
  28080. }
  28081. #ifdef WOLFSSL_SMALL_STACK
  28082. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28083. if (tmpRNG == NULL)
  28084. return WOLFSSL_FAILURE;
  28085. #endif
  28086. if (wc_InitRng(tmpRNG) == 0) {
  28087. rng = tmpRNG;
  28088. initTmpRng = 1;
  28089. }
  28090. else {
  28091. WOLFSSL_MSG("Bad RNG Init, trying global");
  28092. if (initGlobalRNG == 0)
  28093. WOLFSSL_MSG("Global RNG no Init");
  28094. else
  28095. rng = &globalRNG;
  28096. }
  28097. if (rng) {
  28098. curve448_key key;
  28099. if (wc_curve448_init(&key) != MP_OKAY)
  28100. WOLFSSL_MSG("wc_curve448_init failed");
  28101. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  28102. WOLFSSL_MSG("wc_curve448_make_key failed");
  28103. /* export key pair */
  28104. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  28105. EC448_LITTLE_ENDIAN)
  28106. != MP_OKAY)
  28107. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  28108. else
  28109. ret = WOLFSSL_SUCCESS;
  28110. wc_curve448_free(&key);
  28111. }
  28112. if (initTmpRng)
  28113. wc_FreeRng(tmpRNG);
  28114. #ifdef WOLFSSL_SMALL_STACK
  28115. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28116. #endif
  28117. return ret;
  28118. #endif /* WOLFSSL_KEY_GEN */
  28119. }
  28120. /* return 1 if success, 0 if error
  28121. * input and output keys are little endian format
  28122. */
  28123. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  28124. const unsigned char *priv, unsigned int privSz,
  28125. const unsigned char *pub, unsigned int pubSz)
  28126. {
  28127. #ifndef WOLFSSL_KEY_GEN
  28128. WOLFSSL_MSG("No Key Gen built in");
  28129. (void) shared;
  28130. (void) sharedSz;
  28131. (void) priv;
  28132. (void) privSz;
  28133. (void) pub;
  28134. (void) pubSz;
  28135. return WOLFSSL_FAILURE;
  28136. #else /* WOLFSSL_KEY_GEN */
  28137. int ret = WOLFSSL_FAILURE;
  28138. curve448_key privkey, pubkey;
  28139. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  28140. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  28141. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  28142. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  28143. WOLFSSL_MSG("Bad arguments");
  28144. return WOLFSSL_FAILURE;
  28145. }
  28146. /* import private key */
  28147. if (wc_curve448_init(&privkey) != MP_OKAY) {
  28148. WOLFSSL_MSG("wc_curve448_init privkey failed");
  28149. return ret;
  28150. }
  28151. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  28152. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  28153. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  28154. wc_curve448_free(&privkey);
  28155. return ret;
  28156. }
  28157. /* import public key */
  28158. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  28159. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  28160. wc_curve448_free(&privkey);
  28161. return ret;
  28162. }
  28163. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  28164. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  28165. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  28166. wc_curve448_free(&privkey);
  28167. wc_curve448_free(&pubkey);
  28168. return ret;
  28169. }
  28170. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  28171. EC448_LITTLE_ENDIAN) != MP_OKAY)
  28172. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  28173. else
  28174. ret = WOLFSSL_SUCCESS;
  28175. wc_curve448_free(&privkey);
  28176. wc_curve448_free(&pubkey);
  28177. return ret;
  28178. #endif /* WOLFSSL_KEY_GEN */
  28179. }
  28180. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  28181. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  28182. /* return 1 if success, 0 if error
  28183. * output keys are little endian format
  28184. */
  28185. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  28186. unsigned char *pub, unsigned int *pubSz)
  28187. {
  28188. #ifndef WOLFSSL_KEY_GEN
  28189. WOLFSSL_MSG("No Key Gen built in");
  28190. (void) priv;
  28191. (void) privSz;
  28192. (void) pub;
  28193. (void) pubSz;
  28194. return WOLFSSL_FAILURE;
  28195. #elif !defined(HAVE_ED448_KEY_EXPORT)
  28196. WOLFSSL_MSG("No ED448 key export built in");
  28197. (void) priv;
  28198. (void) privSz;
  28199. (void) pub;
  28200. (void) pubSz;
  28201. return WOLFSSL_FAILURE;
  28202. #else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  28203. int ret = WOLFSSL_FAILURE;
  28204. int initTmpRng = 0;
  28205. WC_RNG *rng = NULL;
  28206. #ifdef WOLFSSL_SMALL_STACK
  28207. WC_RNG *tmpRNG = NULL;
  28208. #else
  28209. WC_RNG tmpRNG[1];
  28210. #endif
  28211. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  28212. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  28213. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  28214. WOLFSSL_MSG("Bad arguments");
  28215. return WOLFSSL_FAILURE;
  28216. }
  28217. #ifdef WOLFSSL_SMALL_STACK
  28218. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28219. if (tmpRNG == NULL)
  28220. return WOLFSSL_FATAL_ERROR;
  28221. #endif
  28222. if (wc_InitRng(tmpRNG) == 0) {
  28223. rng = tmpRNG;
  28224. initTmpRng = 1;
  28225. }
  28226. else {
  28227. WOLFSSL_MSG("Bad RNG Init, trying global");
  28228. if (initGlobalRNG == 0)
  28229. WOLFSSL_MSG("Global RNG no Init");
  28230. else
  28231. rng = &globalRNG;
  28232. }
  28233. if (rng) {
  28234. ed448_key key;
  28235. if (wc_ed448_init(&key) != MP_OKAY)
  28236. WOLFSSL_MSG("wc_ed448_init failed");
  28237. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  28238. WOLFSSL_MSG("wc_ed448_make_key failed");
  28239. /* export private key */
  28240. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  28241. WOLFSSL_MSG("wc_ed448_export_key failed");
  28242. else
  28243. ret = WOLFSSL_SUCCESS;
  28244. wc_ed448_free(&key);
  28245. }
  28246. if (initTmpRng)
  28247. wc_FreeRng(tmpRNG);
  28248. #ifdef WOLFSSL_SMALL_STACK
  28249. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28250. #endif
  28251. return ret;
  28252. #endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  28253. }
  28254. /* return 1 if success, 0 if error
  28255. * input and output keys are little endian format
  28256. * priv is a buffer containing private and public part of key
  28257. */
  28258. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  28259. const unsigned char *priv, unsigned int privSz,
  28260. unsigned char *sig, unsigned int *sigSz)
  28261. {
  28262. #if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  28263. #if !defined(HAVE_ED448_SIGN)
  28264. WOLFSSL_MSG("No ED448 sign built in");
  28265. #elif !defined(WOLFSSL_KEY_GEN)
  28266. WOLFSSL_MSG("No Key Gen built in");
  28267. #elif !defined(HAVE_ED448_KEY_IMPORT)
  28268. WOLFSSL_MSG("No ED448 Key import built in");
  28269. #endif
  28270. (void) msg;
  28271. (void) msgSz;
  28272. (void) priv;
  28273. (void) privSz;
  28274. (void) sig;
  28275. (void) sigSz;
  28276. return WOLFSSL_FAILURE;
  28277. #else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  28278. ed448_key key;
  28279. int ret = WOLFSSL_FAILURE;
  28280. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  28281. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  28282. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  28283. WOLFSSL_MSG("Bad arguments");
  28284. return WOLFSSL_FAILURE;
  28285. }
  28286. /* import key */
  28287. if (wc_ed448_init(&key) != MP_OKAY) {
  28288. WOLFSSL_MSG("wc_curve448_init failed");
  28289. return ret;
  28290. }
  28291. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  28292. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  28293. WOLFSSL_MSG("wc_ed448_import_private failed");
  28294. wc_ed448_free(&key);
  28295. return ret;
  28296. }
  28297. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  28298. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  28299. else
  28300. ret = WOLFSSL_SUCCESS;
  28301. wc_ed448_free(&key);
  28302. return ret;
  28303. #endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  28304. }
  28305. /* return 1 if success, 0 if error
  28306. * input and output keys are little endian format
  28307. * pub is a buffer containing public part of key
  28308. */
  28309. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  28310. const unsigned char *pub, unsigned int pubSz,
  28311. const unsigned char *sig, unsigned int sigSz)
  28312. {
  28313. #if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  28314. #if !defined(HAVE_ED448_VERIFY)
  28315. WOLFSSL_MSG("No ED448 verify built in");
  28316. #elif !defined(WOLFSSL_KEY_GEN)
  28317. WOLFSSL_MSG("No Key Gen built in");
  28318. #elif !defined(HAVE_ED448_KEY_IMPORT)
  28319. WOLFSSL_MSG("No ED448 Key import built in");
  28320. #endif
  28321. (void) msg;
  28322. (void) msgSz;
  28323. (void) pub;
  28324. (void) pubSz;
  28325. (void) sig;
  28326. (void) sigSz;
  28327. return WOLFSSL_FAILURE;
  28328. #else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  28329. ed448_key key;
  28330. int ret = WOLFSSL_FAILURE, check = 0;
  28331. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  28332. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  28333. sig == NULL || sigSz != ED448_SIG_SIZE) {
  28334. WOLFSSL_MSG("Bad arguments");
  28335. return WOLFSSL_FAILURE;
  28336. }
  28337. /* import key */
  28338. if (wc_ed448_init(&key) != MP_OKAY) {
  28339. WOLFSSL_MSG("wc_curve448_init failed");
  28340. return ret;
  28341. }
  28342. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  28343. WOLFSSL_MSG("wc_ed448_import_public failed");
  28344. wc_ed448_free(&key);
  28345. return ret;
  28346. }
  28347. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  28348. &key, NULL, 0)) != MP_OKAY) {
  28349. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  28350. }
  28351. else if (!check)
  28352. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  28353. else
  28354. ret = WOLFSSL_SUCCESS;
  28355. wc_ed448_free(&key);
  28356. return ret;
  28357. #endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */
  28358. }
  28359. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  28360. #ifdef WOLFSSL_JNI
  28361. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  28362. {
  28363. WOLFSSL_ENTER("wolfSSL_set_jobject");
  28364. if (ssl != NULL)
  28365. {
  28366. ssl->jObjectRef = objPtr;
  28367. return WOLFSSL_SUCCESS;
  28368. }
  28369. return WOLFSSL_FAILURE;
  28370. }
  28371. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  28372. {
  28373. WOLFSSL_ENTER("wolfSSL_get_jobject");
  28374. if (ssl != NULL)
  28375. return ssl->jObjectRef;
  28376. return NULL;
  28377. }
  28378. #endif /* WOLFSSL_JNI */
  28379. #ifdef WOLFSSL_ASYNC_CRYPT
  28380. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  28381. WOLF_EVENT_FLAG flags, int* eventCount)
  28382. {
  28383. if (ctx == NULL) {
  28384. return BAD_FUNC_ARG;
  28385. }
  28386. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  28387. events, maxEvents, flags, eventCount);
  28388. }
  28389. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  28390. {
  28391. int ret, eventCount = 0;
  28392. WOLF_EVENT* events[1];
  28393. if (ssl == NULL) {
  28394. return BAD_FUNC_ARG;
  28395. }
  28396. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  28397. events, sizeof(events)/sizeof(events[0]), flags, &eventCount);
  28398. if (ret == 0) {
  28399. ret = eventCount;
  28400. }
  28401. return ret;
  28402. }
  28403. #endif /* WOLFSSL_ASYNC_CRYPT */
  28404. #ifdef OPENSSL_EXTRA
  28405. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  28406. const char **data, int *flags)
  28407. {
  28408. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  28409. (void)line;
  28410. (void)file;
  28411. /* No data or flags stored - error display only in Nginx. */
  28412. if (data != NULL) {
  28413. *data = "";
  28414. }
  28415. if (flags != NULL) {
  28416. *flags = 0;
  28417. }
  28418. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  28419. {
  28420. int ret = 0;
  28421. while (1) {
  28422. ret = wc_PeekErrorNode(0, file, NULL, line);
  28423. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  28424. WOLFSSL_MSG("Issue peeking at error node in queue");
  28425. return 0;
  28426. }
  28427. /* OpenSSL uses positive error codes */
  28428. if (ret < 0) {
  28429. ret = -ret;
  28430. }
  28431. if (ret == -ASN_NO_PEM_HEADER)
  28432. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  28433. #ifdef OPENSSL_ALL
  28434. /* PARSE_ERROR is returned if an HTTP request is detected. */
  28435. if (ret == -SSL_R_HTTP_REQUEST)
  28436. return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST;
  28437. #endif
  28438. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  28439. if (ret == ASN1_R_HEADER_TOO_LONG) {
  28440. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  28441. }
  28442. #endif
  28443. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  28444. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  28445. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  28446. break;
  28447. wc_RemoveErrorNode(0);
  28448. }
  28449. return (unsigned long)ret;
  28450. }
  28451. #else
  28452. return (unsigned long)(0 - NOT_COMPILED_IN);
  28453. #endif
  28454. }
  28455. #endif
  28456. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  28457. #if !defined(WOLFSSL_USER_IO)
  28458. /* converts an IPv6 or IPv4 address into an octet string for use with rfc3280
  28459. * example input would be "127.0.0.1" and the returned value would be 7F000001
  28460. */
  28461. WOLFSSL_ASN1_STRING* wolfSSL_a2i_IPADDRESS(const char* ipa)
  28462. {
  28463. int ipaSz = WOLFSSL_IP4_ADDR_LEN;
  28464. char buf[WOLFSSL_IP6_ADDR_LEN + 1]; /* plus 1 for terminator */
  28465. int af = WOLFSSL_IP4;
  28466. WOLFSSL_ASN1_STRING *ret = NULL;
  28467. if (ipa == NULL)
  28468. return NULL;
  28469. if (XSTRSTR(ipa, ":") != NULL) {
  28470. af = WOLFSSL_IP6;
  28471. ipaSz = WOLFSSL_IP6_ADDR_LEN;
  28472. }
  28473. buf[WOLFSSL_IP6_ADDR_LEN] = '\0';
  28474. if (XINET_PTON(af, ipa, (void*)buf) != 1) {
  28475. WOLFSSL_MSG("Error parsing IP address");
  28476. return NULL;
  28477. }
  28478. ret = wolfSSL_ASN1_STRING_new();
  28479. if (ret != NULL) {
  28480. if (wolfSSL_ASN1_STRING_set(ret, buf, ipaSz) != WOLFSSL_SUCCESS) {
  28481. WOLFSSL_MSG("Error setting the string");
  28482. wolfSSL_ASN1_STRING_free(ret);
  28483. ret = NULL;
  28484. }
  28485. }
  28486. return ret;
  28487. }
  28488. #endif /* !WOLFSSL_USER_IO */
  28489. /* Is the specified cipher suite a fake one used an an extension proxy? */
  28490. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  28491. {
  28492. (void)suite0;
  28493. (void)suite;
  28494. #ifdef HAVE_RENEGOTIATION_INDICATION
  28495. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  28496. return 1;
  28497. #endif
  28498. return 0;
  28499. }
  28500. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  28501. byte suite)
  28502. {
  28503. const CipherSuiteInfo* cipher_names = GetCipherNames();
  28504. int cipherSz = GetCipherNamesSize();
  28505. int i;
  28506. for (i = 0; i < cipherSz; i++)
  28507. if (cipher_names[i].cipherSuite0 == suite0 &&
  28508. cipher_names[i].cipherSuite == suite)
  28509. break;
  28510. if (i == cipherSz)
  28511. return 1;
  28512. /* Check min version */
  28513. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  28514. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  28515. cipher_names[i].minor >= TLSv1_MINOR)
  28516. /* 1.0 ciphersuites are in general available in 1.1 and
  28517. * 1.1 ciphersuites are in general available in 1.2 */
  28518. return 0;
  28519. return 1;
  28520. }
  28521. /* Check max version */
  28522. switch (cipher_names[i].minor) {
  28523. case SSLv3_MINOR :
  28524. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  28525. case TLSv1_MINOR :
  28526. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  28527. case TLSv1_1_MINOR :
  28528. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  28529. case TLSv1_2_MINOR :
  28530. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  28531. case TLSv1_3_MINOR :
  28532. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  28533. default:
  28534. WOLFSSL_MSG("Unrecognized minor version");
  28535. return 1;
  28536. }
  28537. }
  28538. /* returns a pointer to internal cipher suite list. Should not be free'd by
  28539. * caller.
  28540. */
  28541. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  28542. {
  28543. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  28544. Suites* suites;
  28545. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28546. const CipherSuiteInfo* cipher_names = GetCipherNames();
  28547. int cipherSz = GetCipherNamesSize();
  28548. #endif
  28549. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  28550. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  28551. return NULL;
  28552. }
  28553. if (ssl->suites != NULL) {
  28554. if (ssl->suites->suiteSz == 0 &&
  28555. InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
  28556. WOLFSSL_MSG("Suite initialization failure");
  28557. return NULL;
  28558. }
  28559. suites = ssl->suites;
  28560. }
  28561. else {
  28562. suites = ssl->ctx->suites;
  28563. }
  28564. /* check if stack needs populated */
  28565. if (suites->stack == NULL) {
  28566. int i;
  28567. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28568. int j;
  28569. /* higher priority of cipher suite will be on top of stack */
  28570. for (i = suites->suiteSz - 2; i >=0; i-=2) {
  28571. #else
  28572. for (i = 0; i < suites->suiteSz; i+=2) {
  28573. #endif
  28574. WOLFSSL_STACK* add;
  28575. /* A couple of suites are placeholders for special options,
  28576. * skip those. */
  28577. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  28578. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  28579. suites->suites[i+1])) {
  28580. continue;
  28581. }
  28582. add = wolfSSL_sk_new_node(ssl->heap);
  28583. if (add != NULL) {
  28584. add->type = STACK_TYPE_CIPHER;
  28585. add->data.cipher.cipherSuite0 = suites->suites[i];
  28586. add->data.cipher.cipherSuite = suites->suites[i+1];
  28587. add->data.cipher.ssl = ssl;
  28588. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28589. for (j = 0; j < cipherSz; j++) {
  28590. if (cipher_names[j].cipherSuite0 ==
  28591. add->data.cipher.cipherSuite0 &&
  28592. cipher_names[j].cipherSuite ==
  28593. add->data.cipher.cipherSuite) {
  28594. add->data.cipher.offset = j;
  28595. break;
  28596. }
  28597. }
  28598. #endif
  28599. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  28600. /* in_stack is checked in wolfSSL_CIPHER_description */
  28601. add->data.cipher.in_stack = 1;
  28602. #endif
  28603. add->next = ret;
  28604. if (ret != NULL) {
  28605. add->num = ret->num + 1;
  28606. }
  28607. else {
  28608. add->num = 1;
  28609. }
  28610. ret = add;
  28611. }
  28612. }
  28613. suites->stack = ret;
  28614. }
  28615. return suites->stack;
  28616. }
  28617. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  28618. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  28619. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK)
  28620. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  28621. {
  28622. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  28623. if (ctx == NULL)
  28624. return 0;
  28625. return ctx->timeout;
  28626. }
  28627. /* returns the time in seconds of the current timeout */
  28628. long wolfSSL_get_timeout(WOLFSSL* ssl)
  28629. {
  28630. WOLFSSL_ENTER("wolfSSL_get_timeout");
  28631. if (ssl == NULL)
  28632. return 0;
  28633. return ssl->timeout;
  28634. }
  28635. #endif
  28636. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  28637. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  28638. #ifdef HAVE_ECC
  28639. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  28640. {
  28641. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  28642. if (ctx == NULL || ecdh == NULL)
  28643. return BAD_FUNC_ARG;
  28644. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  28645. return WOLFSSL_SUCCESS;
  28646. }
  28647. #endif
  28648. /* Assumes that the session passed in is from the cache. */
  28649. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  28650. {
  28651. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  28652. s = ClientSessionToSession(s);
  28653. if (ctx == NULL || s == NULL)
  28654. return BAD_FUNC_ARG;
  28655. #ifdef HAVE_EXT_CACHE
  28656. if (!ctx->internalCacheOff)
  28657. #endif
  28658. {
  28659. /* Don't remove session just timeout session. */
  28660. s->timeout = 0;
  28661. #ifndef NO_SESSION_CACHE
  28662. /* Clear the timeout in the cache */
  28663. {
  28664. int row;
  28665. int i;
  28666. SessionRow* sessRow = NULL;
  28667. WOLFSSL_SESSION *cacheSession;
  28668. const byte* id;
  28669. int ret = 0;
  28670. id = s->sessionID;
  28671. if (s->haveAltSessionID)
  28672. id = s->altSessionID;
  28673. row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS);
  28674. if (ret != 0) {
  28675. WOLFSSL_MSG("Hash session failed");
  28676. return ret;
  28677. }
  28678. sessRow = &SessionCache[row];
  28679. if (SESSION_ROW_LOCK(sessRow) != 0) {
  28680. WOLFSSL_MSG("Session row lock failed");
  28681. return BAD_MUTEX_E;
  28682. }
  28683. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  28684. cacheSession = &sessRow->Sessions[i];
  28685. if (XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0) {
  28686. if (ctx->method->side != cacheSession->side)
  28687. continue;
  28688. cacheSession->timeout = 0;
  28689. #ifdef HAVE_EX_DATA
  28690. if (cacheSession->ownExData) {
  28691. /* Most recent version of ex data is in cache. Copy it
  28692. * over so the user can free it. */
  28693. XMEMCPY(&s->ex_data, &cacheSession->ex_data,
  28694. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  28695. }
  28696. cacheSession->ownExData = 0; /* We clear below */
  28697. s->ownExData = 1;
  28698. #endif
  28699. break;
  28700. }
  28701. }
  28702. SESSION_ROW_UNLOCK(sessRow);
  28703. }
  28704. #endif
  28705. }
  28706. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  28707. if (ctx->rem_sess_cb != NULL) {
  28708. ctx->rem_sess_cb(ctx, s);
  28709. }
  28710. #endif
  28711. return 0;
  28712. }
  28713. #ifndef NO_BIO
  28714. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  28715. {
  28716. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  28717. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  28718. * The setting buffer size doesn't do anything so return NULL for both.
  28719. */
  28720. if (s == NULL)
  28721. return NULL;
  28722. return s->biord;
  28723. }
  28724. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  28725. {
  28726. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  28727. (void)s;
  28728. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  28729. * The setting buffer size doesn't do anything so return NULL for both.
  28730. */
  28731. if (s == NULL)
  28732. return NULL;
  28733. return s->biowr;
  28734. }
  28735. #endif /* !NO_BIO */
  28736. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  28737. {
  28738. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  28739. if (s == NULL)
  28740. return WOLFSSL_FAILURE;
  28741. if (s->options.side == WOLFSSL_CLIENT_END) {
  28742. #ifndef NO_WOLFSSL_CLIENT
  28743. return wolfSSL_connect(s);
  28744. #else
  28745. WOLFSSL_MSG("Client not compiled in");
  28746. return WOLFSSL_FAILURE;
  28747. #endif
  28748. }
  28749. #ifndef NO_WOLFSSL_SERVER
  28750. return wolfSSL_accept(s);
  28751. #else
  28752. WOLFSSL_MSG("Server not compiled in");
  28753. return WOLFSSL_FAILURE;
  28754. #endif
  28755. }
  28756. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  28757. int wolfSSL_SSL_in_init(const WOLFSSL *ssl)
  28758. #else
  28759. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  28760. #endif
  28761. {
  28762. WOLFSSL_ENTER("SSL_in_init");
  28763. if (ssl == NULL)
  28764. return WOLFSSL_FAILURE;
  28765. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  28766. return ssl->options.connectState < SECOND_REPLY_DONE;
  28767. }
  28768. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  28769. }
  28770. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  28771. {
  28772. WOLFSSL_ENTER("SSL_connect_init");
  28773. if (ssl == NULL)
  28774. return WOLFSSL_FAILURE;
  28775. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  28776. return ssl->options.connectState > CONNECT_BEGIN &&
  28777. ssl->options.connectState < SECOND_REPLY_DONE;
  28778. }
  28779. return ssl->options.acceptState > ACCEPT_BEGIN &&
  28780. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  28781. }
  28782. #ifndef NO_SESSION_CACHE
  28783. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  28784. {
  28785. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  28786. return ssl->session;
  28787. }
  28788. #endif /* NO_SESSION_CACHE */
  28789. #ifndef NO_BIO
  28790. int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
  28791. char *buf, int size)
  28792. {
  28793. int readNextLine;
  28794. int lineLen;
  28795. int len;
  28796. byte isNumCheck;
  28797. word32 outLen;
  28798. const int extraTagSz = MAX_LENGTH_SZ + 1;
  28799. byte intTag[MAX_LENGTH_SZ + 1];
  28800. int idx = 0;
  28801. WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
  28802. if (!bio || !asn1 || !buf || size <= 0) {
  28803. WOLFSSL_MSG("Bad parameter");
  28804. return WOLFSSL_FAILURE;
  28805. }
  28806. /* Reset asn1 */
  28807. if (asn1->isDynamic && asn1->data) {
  28808. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  28809. }
  28810. XMEMSET(asn1->intData, 0, WOLFSSL_ASN1_INTEGER_MAX);
  28811. asn1->data = asn1->intData;
  28812. asn1->isDynamic = 0;
  28813. asn1->length = 0;
  28814. asn1->negative = 0;
  28815. asn1->type = V_ASN1_INTEGER;
  28816. lineLen = wolfSSL_BIO_gets(bio, buf, size);
  28817. do {
  28818. readNextLine = 0;
  28819. if (lineLen <= 0) {
  28820. WOLFSSL_MSG("wolfSSL_BIO_gets error");
  28821. return WOLFSSL_FAILURE;
  28822. }
  28823. while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
  28824. lineLen--;
  28825. if (buf[lineLen-1] == '\\')
  28826. readNextLine = 1;
  28827. /* Ignore none-hex chars at the end of the line */
  28828. outLen = 1;
  28829. while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
  28830. &isNumCheck, &outLen) == ASN_INPUT_E)
  28831. lineLen--;
  28832. if (!lineLen || lineLen % 2) {
  28833. WOLFSSL_MSG("Invalid line length");
  28834. return WOLFSSL_FAILURE;
  28835. }
  28836. len = asn1->length + (lineLen/2);
  28837. /* Check if it will fit in static memory and
  28838. * save space for the ASN tag in front */
  28839. if (len > (int)(WOLFSSL_ASN1_INTEGER_MAX - extraTagSz)) {
  28840. /* Allocate mem for data */
  28841. if (asn1->isDynamic) {
  28842. byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
  28843. DYNAMIC_TYPE_OPENSSL);
  28844. if (!tmp) {
  28845. WOLFSSL_MSG("realloc error");
  28846. return WOLFSSL_FAILURE;
  28847. }
  28848. asn1->data = tmp;
  28849. }
  28850. else {
  28851. /* Up to this point asn1->data pointed to asn1->intData.
  28852. * Now that the size has grown larger than intData can handle
  28853. * the asn1 structure moves to a dynamic type with isDynamic
  28854. * flag being set and asn1->data being malloc'd. */
  28855. asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  28856. DYNAMIC_TYPE_OPENSSL);
  28857. if (!asn1->data) {
  28858. WOLFSSL_MSG("malloc error");
  28859. return WOLFSSL_FAILURE;
  28860. }
  28861. asn1->isDynamic = 1;
  28862. XMEMCPY(asn1->data, asn1->intData, asn1->length);
  28863. }
  28864. }
  28865. len = lineLen/2;
  28866. if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
  28867. (word32*)&len) != 0) {
  28868. WOLFSSL_MSG("Base16_Decode error");
  28869. return WOLFSSL_FAILURE;
  28870. }
  28871. asn1->length += len;
  28872. } while (readNextLine);
  28873. /* Write ASN tag */
  28874. idx = SetASNInt(asn1->length, asn1->data[0], intTag);
  28875. XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
  28876. XMEMCPY(asn1->data, intTag, idx);
  28877. asn1->dataMax = asn1->length += idx;
  28878. return WOLFSSL_SUCCESS;
  28879. }
  28880. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  28881. {
  28882. word32 idx = 1;
  28883. int len = 0;
  28884. byte buf[512];
  28885. word32 bufLen = 512;
  28886. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  28887. if (bp == NULL || a == NULL)
  28888. return WOLFSSL_FAILURE;
  28889. /* Skip ASN.1 INTEGER (type) byte. */
  28890. if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
  28891. GetLength(a->data, &idx, &len, a->length) < 0) {
  28892. return 0;
  28893. }
  28894. /* Zero length integer is the value zero. */
  28895. if (len == 0) {
  28896. return wolfSSL_BIO_write(bp, "00", 2);
  28897. }
  28898. if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
  28899. bufLen == 0) {
  28900. return 0;
  28901. }
  28902. return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
  28903. }
  28904. #endif /* !NO_BIO */
  28905. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  28906. /* Expected return values from implementations of OpenSSL ticket key callback.
  28907. */
  28908. #define TICKET_KEY_CB_RET_FAILURE (-1)
  28909. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  28910. #define TICKET_KEY_CB_RET_OK 1
  28911. #define TICKET_KEY_CB_RET_RENEW 2
  28912. /* Implementation of session ticket encryption/decryption using OpenSSL
  28913. * callback to initialize the cipher and HMAC.
  28914. *
  28915. * ssl The SSL/TLS object.
  28916. * keyName The key name - used to identify the key to be used.
  28917. * iv The IV to use.
  28918. * mac The MAC of the encrypted data.
  28919. * enc Encrypt ticket.
  28920. * encTicket The ticket data.
  28921. * encTicketLen The length of the ticket data.
  28922. * encLen The encrypted/decrypted ticket length - output length.
  28923. * ctx Ignored. Application specific data.
  28924. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  28925. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  28926. * WOLFSSL_TICKET_RET_FATAL on error.
  28927. */
  28928. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  28929. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  28930. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  28931. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  28932. int enc, unsigned char* encTicket,
  28933. int encTicketLen, int* encLen, void* ctx)
  28934. {
  28935. byte digest[WC_MAX_DIGEST_SIZE];
  28936. #ifdef WOLFSSL_SMALL_STACK
  28937. WOLFSSL_EVP_CIPHER_CTX *evpCtx;
  28938. #else
  28939. WOLFSSL_EVP_CIPHER_CTX evpCtx[1];
  28940. #endif
  28941. WOLFSSL_HMAC_CTX hmacCtx;
  28942. unsigned int mdSz = 0;
  28943. int len = 0;
  28944. int ret = WOLFSSL_TICKET_RET_FATAL;
  28945. int res;
  28946. int totalSz = 0;
  28947. (void)ctx;
  28948. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  28949. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncWrapCb == NULL) {
  28950. WOLFSSL_MSG("Bad parameter");
  28951. return WOLFSSL_TICKET_RET_FATAL;
  28952. }
  28953. #ifdef WOLFSSL_SMALL_STACK
  28954. evpCtx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(sizeof(*evpCtx), ssl->heap,
  28955. DYNAMIC_TYPE_TMP_BUFFER);
  28956. if (evpCtx == NULL) {
  28957. WOLFSSL_MSG("out of memory");
  28958. return WOLFSSL_TICKET_RET_FATAL;
  28959. }
  28960. #endif
  28961. /* Initialize the cipher and HMAC. */
  28962. wolfSSL_EVP_CIPHER_CTX_init(evpCtx);
  28963. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  28964. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  28965. #ifdef WOLFSSL_SMALL_STACK
  28966. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28967. #endif
  28968. return WOLFSSL_TICKET_RET_FATAL;
  28969. }
  28970. res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
  28971. iv, evpCtx, &hmacCtx, enc);
  28972. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  28973. WOLFSSL_MSG("Ticket callback error");
  28974. ret = WOLFSSL_TICKET_RET_FATAL;
  28975. goto end;
  28976. }
  28977. if (wolfSSL_HMAC_size(&hmacCtx) > WOLFSSL_TICKET_MAC_SZ) {
  28978. WOLFSSL_MSG("Ticket cipher MAC size error");
  28979. goto end;
  28980. }
  28981. if (enc)
  28982. {
  28983. /* Encrypt in place. */
  28984. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  28985. encTicket, encTicketLen))
  28986. goto end;
  28987. totalSz = len;
  28988. if (totalSz > *encLen)
  28989. goto end;
  28990. if (!wolfSSL_EVP_EncryptFinal(evpCtx, &encTicket[len], &len))
  28991. goto end;
  28992. /* Total length of encrypted data. */
  28993. totalSz += len;
  28994. if (totalSz > *encLen)
  28995. goto end;
  28996. /* HMAC the encrypted data into the parameter 'mac'. */
  28997. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, totalSz))
  28998. goto end;
  28999. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  29000. goto end;
  29001. }
  29002. else
  29003. {
  29004. /* HMAC the encrypted data and compare it to the passed in data. */
  29005. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  29006. goto end;
  29007. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  29008. goto end;
  29009. if (XMEMCMP(mac, digest, mdSz) != 0)
  29010. goto end;
  29011. /* Decrypt the ticket data in place. */
  29012. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  29013. encTicket, encTicketLen))
  29014. goto end;
  29015. totalSz = len;
  29016. if (totalSz > encTicketLen)
  29017. goto end;
  29018. if (!wolfSSL_EVP_DecryptFinal(evpCtx, &encTicket[len], &len))
  29019. goto end;
  29020. /* Total length of decrypted data. */
  29021. totalSz += len;
  29022. if (totalSz > encTicketLen)
  29023. goto end;
  29024. }
  29025. *encLen = totalSz;
  29026. if (res == TICKET_KEY_CB_RET_RENEW && !IsAtLeastTLSv1_3(ssl->version)
  29027. && !enc)
  29028. ret = WOLFSSL_TICKET_RET_CREATE;
  29029. else
  29030. ret = WOLFSSL_TICKET_RET_OK;
  29031. end:
  29032. (void)wc_HmacFree(&hmacCtx.hmac);
  29033. #ifdef WOLFSSL_SMALL_STACK
  29034. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29035. #endif
  29036. return ret;
  29037. }
  29038. /* Set the callback to use when encrypting/decrypting tickets.
  29039. *
  29040. * ctx The SSL/TLS context object.
  29041. * cb The OpenSSL session ticket callback.
  29042. * returns WOLFSSL_SUCCESS to indicate success.
  29043. */
  29044. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  29045. {
  29046. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  29047. * callback.
  29048. */
  29049. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  29050. ctx->ticketEncWrapCb = cb;
  29051. return WOLFSSL_SUCCESS;
  29052. }
  29053. #endif /* HAVE_SESSION_TICKET */
  29054. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  29055. OPENSSL_EXTRA || HAVE_LIGHTY */
  29056. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  29057. !defined(NO_WOLFSSL_SERVER)
  29058. /* Serialize the session ticket encryption keys.
  29059. *
  29060. * @param [in] ctx SSL/TLS context object.
  29061. * @param [in] keys Buffer to hold session ticket keys.
  29062. * @param [in] keylen Length of buffer.
  29063. * @return WOLFSSL_SUCCESS on success.
  29064. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  29065. * correct length.
  29066. */
  29067. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  29068. unsigned char *keys, int keylen)
  29069. {
  29070. if (ctx == NULL || keys == NULL) {
  29071. return WOLFSSL_FAILURE;
  29072. }
  29073. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  29074. return WOLFSSL_FAILURE;
  29075. }
  29076. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  29077. keys += WOLFSSL_TICKET_NAME_SZ;
  29078. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  29079. keys += WOLFSSL_TICKET_KEY_SZ;
  29080. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  29081. keys += WOLFSSL_TICKET_KEY_SZ;
  29082. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  29083. keys += OPAQUE32_LEN;
  29084. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  29085. return WOLFSSL_SUCCESS;
  29086. }
  29087. /* Deserialize the session ticket encryption keys.
  29088. *
  29089. * @param [in] ctx SSL/TLS context object.
  29090. * @param [in] keys Session ticket keys.
  29091. * @param [in] keylen Length of data.
  29092. * @return WOLFSSL_SUCCESS on success.
  29093. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  29094. * correct length.
  29095. */
  29096. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  29097. unsigned char *keys, int keylen)
  29098. {
  29099. if (ctx == NULL || keys == NULL) {
  29100. return WOLFSSL_FAILURE;
  29101. }
  29102. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  29103. return WOLFSSL_FAILURE;
  29104. }
  29105. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  29106. keys += WOLFSSL_TICKET_NAME_SZ;
  29107. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  29108. keys += WOLFSSL_TICKET_KEY_SZ;
  29109. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  29110. keys += WOLFSSL_TICKET_KEY_SZ;
  29111. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  29112. keys += OPAQUE32_LEN;
  29113. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  29114. return WOLFSSL_SUCCESS;
  29115. }
  29116. #endif
  29117. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  29118. #ifdef HAVE_OCSP
  29119. /* Not an OpenSSL API. */
  29120. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  29121. {
  29122. *response = ssl->ocspResp;
  29123. return ssl->ocspRespSz;
  29124. }
  29125. /* Not an OpenSSL API. */
  29126. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  29127. {
  29128. return ssl->url;
  29129. }
  29130. /* Not an OpenSSL API. */
  29131. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  29132. {
  29133. if (ssl == NULL)
  29134. return WOLFSSL_FAILURE;
  29135. ssl->url = url;
  29136. return WOLFSSL_SUCCESS;
  29137. }
  29138. #endif /* OCSP */
  29139. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  29140. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  29141. int wolfSSL_get_ocsp_producedDate(
  29142. WOLFSSL *ssl,
  29143. byte *producedDate,
  29144. size_t producedDate_space,
  29145. int *producedDateFormat)
  29146. {
  29147. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  29148. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  29149. return BAD_FUNC_ARG;
  29150. if ((producedDate == NULL) || (producedDateFormat == NULL))
  29151. return BAD_FUNC_ARG;
  29152. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  29153. return BUFFER_E;
  29154. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  29155. *producedDateFormat = ssl->ocspProducedDateFormat;
  29156. return 0;
  29157. }
  29158. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  29159. int idx = 0;
  29160. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  29161. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  29162. return BAD_FUNC_ARG;
  29163. if (produced_tm == NULL)
  29164. return BAD_FUNC_ARG;
  29165. if (ExtractDate(ssl->ocspProducedDate,
  29166. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  29167. return 0;
  29168. else
  29169. return ASN_PARSE_E;
  29170. }
  29171. #endif
  29172. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  29173. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  29174. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  29175. {
  29176. word32 idx;
  29177. word32 length;
  29178. WOLFSSL_STACK* node;
  29179. WOLFSSL_STACK* last = NULL;
  29180. if (ctx == NULL || chain == NULL) {
  29181. chain = NULL;
  29182. return WOLFSSL_FAILURE;
  29183. }
  29184. if (ctx->x509Chain != NULL) {
  29185. *chain = ctx->x509Chain;
  29186. return WOLFSSL_SUCCESS;
  29187. }
  29188. /* If there are no chains then success! */
  29189. *chain = NULL;
  29190. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  29191. return WOLFSSL_SUCCESS;
  29192. }
  29193. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  29194. for (idx = 0; idx < ctx->certChain->length; ) {
  29195. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  29196. DYNAMIC_TYPE_OPENSSL);
  29197. if (node == NULL)
  29198. return WOLFSSL_FAILURE;
  29199. node->next = NULL;
  29200. /* 3 byte length | X509 DER data */
  29201. ato24(ctx->certChain->buffer + idx, &length);
  29202. idx += 3;
  29203. /* Create a new X509 from DER encoded data. */
  29204. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  29205. length);
  29206. if (node->data.x509 == NULL) {
  29207. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  29208. /* Return as much of the chain as we created. */
  29209. ctx->x509Chain = *chain;
  29210. return WOLFSSL_FAILURE;
  29211. }
  29212. idx += length;
  29213. /* Add object to the end of the stack. */
  29214. if (last == NULL) {
  29215. node->num = 1;
  29216. *chain = node;
  29217. }
  29218. else {
  29219. (*chain)->num++;
  29220. last->next = node;
  29221. }
  29222. last = node;
  29223. }
  29224. ctx->x509Chain = *chain;
  29225. return WOLFSSL_SUCCESS;
  29226. }
  29227. int wolfSSL_CTX_get_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb* cb)
  29228. {
  29229. if (ctx == NULL || ctx->cm == NULL || cb == NULL)
  29230. return WOLFSSL_FAILURE;
  29231. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  29232. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  29233. if (ctx->cm->ocsp_stapling == NULL)
  29234. return WOLFSSL_FAILURE;
  29235. *cb = ctx->cm->ocsp_stapling->statusCb;
  29236. #else
  29237. (void)cb;
  29238. *cb = NULL;
  29239. #endif
  29240. return WOLFSSL_SUCCESS;
  29241. }
  29242. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb cb)
  29243. {
  29244. if (ctx == NULL || ctx->cm == NULL)
  29245. return WOLFSSL_FAILURE;
  29246. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  29247. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  29248. /* Ensure stapling is on for callback to be used. */
  29249. wolfSSL_CTX_EnableOCSPStapling(ctx);
  29250. if (ctx->cm->ocsp_stapling == NULL)
  29251. return WOLFSSL_FAILURE;
  29252. ctx->cm->ocsp_stapling->statusCb = cb;
  29253. #else
  29254. (void)cb;
  29255. #endif
  29256. return WOLFSSL_SUCCESS;
  29257. }
  29258. int wolfSSL_CTX_get0_chain_certs(WOLFSSL_CTX *ctx,
  29259. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  29260. {
  29261. WOLFSSL_ENTER("wolfSSL_CTX_get0_chain_certs");
  29262. if (ctx == NULL || sk == NULL) {
  29263. WOLFSSL_MSG("Bad parameter");
  29264. return WOLFSSL_FAILURE;
  29265. }
  29266. *sk = ctx->x509Chain;
  29267. return WOLFSSL_SUCCESS;
  29268. }
  29269. #ifdef KEEP_OUR_CERT
  29270. int wolfSSL_get0_chain_certs(WOLFSSL *ssl,
  29271. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  29272. {
  29273. WOLFSSL_ENTER("wolfSSL_get0_chain_certs");
  29274. if (ssl == NULL || sk == NULL) {
  29275. WOLFSSL_MSG("Bad parameter");
  29276. return WOLFSSL_FAILURE;
  29277. }
  29278. *sk = ssl->ourCertChain;
  29279. return WOLFSSL_SUCCESS;
  29280. }
  29281. #endif
  29282. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  29283. {
  29284. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  29285. if (ret) {
  29286. ret->type = STACK_TYPE_STRING;
  29287. }
  29288. return ret;
  29289. }
  29290. void wolfSSL_WOLFSSL_STRING_free(WOLFSSL_STRING s)
  29291. {
  29292. WOLFSSL_ENTER("wolfSSL_WOLFSSL_STRING_free");
  29293. if (s != NULL)
  29294. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  29295. }
  29296. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  29297. {
  29298. WOLFSSL_STACK* tmp;
  29299. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  29300. if (sk == NULL)
  29301. return;
  29302. /* parse through stack freeing each node */
  29303. while (sk) {
  29304. tmp = sk->next;
  29305. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  29306. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  29307. sk = tmp;
  29308. }
  29309. }
  29310. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  29311. int idx)
  29312. {
  29313. for (; idx > 0 && strings != NULL; idx--)
  29314. strings = strings->next;
  29315. if (strings == NULL)
  29316. return NULL;
  29317. return strings->data.string;
  29318. }
  29319. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  29320. {
  29321. if (strings)
  29322. return (int)strings->num;
  29323. return 0;
  29324. }
  29325. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  29326. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  29327. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) || \
  29328. defined(WOLFSSL_QUIC)
  29329. #ifdef HAVE_ALPN
  29330. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  29331. unsigned int *len)
  29332. {
  29333. word16 nameLen;
  29334. if (ssl != NULL && data != NULL && len != NULL) {
  29335. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  29336. *len = nameLen;
  29337. }
  29338. }
  29339. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  29340. const unsigned char *in, unsigned int inLen,
  29341. const unsigned char *clientNames,
  29342. unsigned int clientLen)
  29343. {
  29344. unsigned int i, j;
  29345. byte lenIn, lenClient;
  29346. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  29347. return OPENSSL_NPN_UNSUPPORTED;
  29348. for (i = 0; i < inLen; i += lenIn) {
  29349. lenIn = in[i++];
  29350. for (j = 0; j < clientLen; j += lenClient) {
  29351. lenClient = clientNames[j++];
  29352. if (lenIn != lenClient)
  29353. continue;
  29354. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  29355. *out = (unsigned char *)(in + i);
  29356. *outLen = lenIn;
  29357. return OPENSSL_NPN_NEGOTIATED;
  29358. }
  29359. }
  29360. }
  29361. *out = (unsigned char *)clientNames + 1;
  29362. *outLen = clientNames[0];
  29363. return OPENSSL_NPN_NO_OVERLAP;
  29364. }
  29365. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  29366. int (*cb) (WOLFSSL *ssl,
  29367. const unsigned char **out,
  29368. unsigned char *outlen,
  29369. const unsigned char *in,
  29370. unsigned int inlen,
  29371. void *arg), void *arg)
  29372. {
  29373. if (ctx != NULL) {
  29374. ctx->alpnSelect = cb;
  29375. ctx->alpnSelectArg = arg;
  29376. }
  29377. }
  29378. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  29379. int (*cb) (WOLFSSL *ssl,
  29380. const unsigned char
  29381. **out,
  29382. unsigned int *outlen,
  29383. void *arg), void *arg)
  29384. {
  29385. (void)s;
  29386. (void)cb;
  29387. (void)arg;
  29388. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  29389. }
  29390. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  29391. int (*cb) (WOLFSSL *ssl,
  29392. unsigned char **out,
  29393. unsigned char *outlen,
  29394. const unsigned char *in,
  29395. unsigned int inlen,
  29396. void *arg), void *arg)
  29397. {
  29398. (void)s;
  29399. (void)cb;
  29400. (void)arg;
  29401. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  29402. }
  29403. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  29404. unsigned *len)
  29405. {
  29406. (void)s;
  29407. (void)data;
  29408. (void)len;
  29409. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  29410. }
  29411. #endif /* HAVE_ALPN */
  29412. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  29413. #ifdef OPENSSL_EXTRA
  29414. int wolfSSL_curve_is_disabled(WOLFSSL* ssl, word16 curve_id)
  29415. {
  29416. return (curve_id <= WOLFSSL_ECC_MAX &&
  29417. ssl->disabledCurves &&
  29418. ssl->disabledCurves & (1 << curve_id));
  29419. }
  29420. #endif
  29421. #if defined(OPENSSL_EXTRA) && (defined(HAVE_ECC) || \
  29422. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  29423. static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
  29424. {
  29425. int idx, start = 0, len, i, ret = WOLFSSL_FAILURE;
  29426. word16 curve;
  29427. word32 disabled;
  29428. char name[MAX_CURVE_NAME_SZ];
  29429. byte groups_len = 0;
  29430. #ifdef WOLFSSL_SMALL_STACK
  29431. void *heap = ssl? ssl->heap : ctx->heap;
  29432. int *groups;
  29433. #else
  29434. int groups[WOLFSSL_MAX_GROUP_COUNT];
  29435. #endif
  29436. #ifdef WOLFSSL_SMALL_STACK
  29437. groups = (int*)XMALLOC(sizeof(int)*WOLFSSL_MAX_GROUP_COUNT,
  29438. heap, DYNAMIC_TYPE_TMP_BUFFER);
  29439. if (groups == NULL) {
  29440. ret = MEMORY_E;
  29441. goto leave;
  29442. }
  29443. #endif
  29444. for (idx = 1; names[idx-1] != '\0'; idx++) {
  29445. if (names[idx] != ':' && names[idx] != '\0')
  29446. continue;
  29447. len = idx - start;
  29448. if (len > MAX_CURVE_NAME_SZ - 1)
  29449. goto leave;
  29450. XMEMCPY(name, names + start, len);
  29451. name[len++] = 0;
  29452. /* Use XSTRNCMP to avoid valgrind error. */
  29453. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  29454. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  29455. (XSTRNCMP(name, "P-256", len) == 0))
  29456. {
  29457. curve = WOLFSSL_ECC_SECP256R1;
  29458. }
  29459. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  29460. (XSTRNCMP(name, "P-384", len) == 0))
  29461. {
  29462. curve = WOLFSSL_ECC_SECP384R1;
  29463. }
  29464. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  29465. (XSTRNCMP(name, "P-521", len) == 0))
  29466. {
  29467. curve = WOLFSSL_ECC_SECP521R1;
  29468. }
  29469. #ifdef HAVE_CURVE25519
  29470. else if (XSTRNCMP(name, "X25519", len) == 0)
  29471. {
  29472. curve = WOLFSSL_ECC_X25519;
  29473. }
  29474. #endif
  29475. #ifdef HAVE_CURVE448
  29476. else if (XSTRNCMP(name, "X448", len) == 0)
  29477. {
  29478. curve = WOLFSSL_ECC_X448;
  29479. }
  29480. #endif
  29481. else {
  29482. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  29483. int nret;
  29484. const ecc_set_type *eccSet;
  29485. nret = wc_ecc_get_curve_idx_from_name(name);
  29486. if (nret < 0) {
  29487. WOLFSSL_MSG("Could not find name in set");
  29488. goto leave;
  29489. }
  29490. eccSet = wc_ecc_get_curve_params(ret);
  29491. if (eccSet == NULL) {
  29492. WOLFSSL_MSG("NULL set returned");
  29493. goto leave;
  29494. }
  29495. curve = GetCurveByOID(eccSet->oidSum);
  29496. #else
  29497. WOLFSSL_MSG("API not present to search farther using name");
  29498. goto leave;
  29499. #endif
  29500. }
  29501. if (curve >= (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  29502. /* shift left more than size of ctx->disabledCurves causes static
  29503. * analysis report */
  29504. WOLFSSL_MSG("curve value is too large for upcoming shift");
  29505. goto leave;
  29506. }
  29507. for (i = 0; i < groups_len; ++i) {
  29508. if (groups[i] == curve) {
  29509. /* silently drop duplicates */
  29510. break;
  29511. }
  29512. }
  29513. if (i >= groups_len) {
  29514. if (groups_len >= WOLFSSL_MAX_GROUP_COUNT) {
  29515. WOLFSSL_MSG_EX("setting %d or more supported "
  29516. "curves is not permitted", groups_len);
  29517. goto leave;
  29518. }
  29519. groups[groups_len++] = (int)curve;
  29520. }
  29521. start = idx + 1;
  29522. }
  29523. /* Disable all curves so that only the ones the user wants are enabled. */
  29524. disabled = 0xFFFFFFFFUL;
  29525. for (i = 0; i < groups_len; ++i) {
  29526. /* Switch the bit to off and therefore is enabled. */
  29527. curve = (word16)groups[i];
  29528. disabled &= ~(1U << curve);
  29529. #ifdef HAVE_SUPPORTED_CURVES
  29530. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_OLD_SET_CURVES_LIST)
  29531. /* using the wolfSSL API to set the groups, this will populate
  29532. * (ssl|ctx)->groups and reset any TLSX_SUPPORTED_GROUPS.
  29533. * The order in (ssl|ctx)->groups will then be respected
  29534. * when TLSX_KEY_SHARE needs to be established */
  29535. if ((ssl && wolfSSL_set_groups(ssl, groups, groups_len)
  29536. != WOLFSSL_SUCCESS)
  29537. || (ctx && wolfSSL_CTX_set_groups(ctx, groups, groups_len)
  29538. != WOLFSSL_SUCCESS)) {
  29539. WOLFSSL_MSG("Unable to set supported curve");
  29540. goto leave;
  29541. }
  29542. #elif !defined(NO_WOLFSSL_CLIENT)
  29543. /* set the supported curve so client TLS extension contains only the
  29544. * desired curves */
  29545. if ((ssl && wolfSSL_UseSupportedCurve(ssl, curve) != WOLFSSL_SUCCESS)
  29546. || (ctx && wolfSSL_CTX_UseSupportedCurve(ctx, curve)
  29547. != WOLFSSL_SUCCESS)) {
  29548. WOLFSSL_MSG("Unable to set supported curve");
  29549. goto leave;
  29550. }
  29551. #endif
  29552. #endif /* HAVE_SUPPORTED_CURVES */
  29553. }
  29554. if (ssl)
  29555. ssl->disabledCurves = disabled;
  29556. else
  29557. ctx->disabledCurves = disabled;
  29558. ret = WOLFSSL_SUCCESS;
  29559. leave:
  29560. #ifdef WOLFSSL_SMALL_STACK
  29561. if (groups)
  29562. XFREE((void*)groups, heap, DYNAMIC_TYPE_TMP_BUFFER);
  29563. #endif
  29564. return ret;
  29565. }
  29566. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  29567. {
  29568. if (ctx == NULL || names == NULL) {
  29569. WOLFSSL_MSG("ctx or names was NULL");
  29570. return WOLFSSL_FAILURE;
  29571. }
  29572. return set_curves_list(NULL, ctx, names);
  29573. }
  29574. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  29575. {
  29576. if (ssl == NULL || names == NULL) {
  29577. WOLFSSL_MSG("ssl or names was NULL");
  29578. return WOLFSSL_FAILURE;
  29579. }
  29580. return set_curves_list(ssl, NULL, names);
  29581. }
  29582. #endif /* OPENSSL_EXTRA && (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) */
  29583. #ifdef OPENSSL_EXTRA
  29584. /* Sets a callback for when sending and receiving protocol messages.
  29585. * This callback is copied to all WOLFSSL objects created from the ctx.
  29586. *
  29587. * ctx WOLFSSL_CTX structure to set callback in
  29588. * cb callback to use
  29589. *
  29590. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  29591. */
  29592. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  29593. {
  29594. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback");
  29595. if (ctx == NULL) {
  29596. WOLFSSL_MSG("Null ctx passed in");
  29597. return WOLFSSL_FAILURE;
  29598. }
  29599. ctx->protoMsgCb = cb;
  29600. return WOLFSSL_SUCCESS;
  29601. }
  29602. /* Sets a callback for when sending and receiving protocol messages.
  29603. *
  29604. * ssl WOLFSSL structure to set callback in
  29605. * cb callback to use
  29606. *
  29607. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  29608. */
  29609. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  29610. {
  29611. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  29612. if (ssl == NULL) {
  29613. return SSL_FAILURE;
  29614. }
  29615. if (cb != NULL) {
  29616. ssl->toInfoOn = 1;
  29617. }
  29618. ssl->protoMsgCb = cb;
  29619. return WOLFSSL_SUCCESS;
  29620. }
  29621. /* set the user argument to pass to the msg callback when called
  29622. * return WOLFSSL_SUCCESS on success */
  29623. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  29624. {
  29625. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback_arg");
  29626. if (ctx == NULL) {
  29627. WOLFSSL_MSG("Null WOLFSSL_CTX passed in");
  29628. return WOLFSSL_FAILURE;
  29629. }
  29630. ctx->protoMsgCtx = arg;
  29631. return WOLFSSL_SUCCESS;
  29632. }
  29633. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  29634. {
  29635. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  29636. if (ssl == NULL)
  29637. return WOLFSSL_FAILURE;
  29638. ssl->protoMsgCtx = arg;
  29639. return WOLFSSL_SUCCESS;
  29640. }
  29641. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  29642. {
  29643. void *ret;
  29644. (void)file;
  29645. (void)line;
  29646. if (data == NULL || siz >= INT_MAX)
  29647. return NULL;
  29648. ret = OPENSSL_malloc(siz);
  29649. if (ret == NULL) {
  29650. return NULL;
  29651. }
  29652. return XMEMCPY(ret, data, siz);
  29653. }
  29654. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  29655. {
  29656. if (ptr)
  29657. ForceZero(ptr, (word32)len);
  29658. }
  29659. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  29660. unsigned int p_len)
  29661. {
  29662. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  29663. if (ctx == NULL)
  29664. return BAD_FUNC_ARG;
  29665. if (ctx->alpn_cli_protos != NULL) {
  29666. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  29667. }
  29668. ctx->alpn_cli_protos = (const unsigned char*)XMALLOC(p_len,
  29669. ctx->heap, DYNAMIC_TYPE_OPENSSL);
  29670. if (ctx->alpn_cli_protos == NULL) {
  29671. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29672. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29673. * the function reverses the return value convention.
  29674. */
  29675. return 1;
  29676. #else
  29677. return WOLFSSL_FAILURE;
  29678. #endif
  29679. }
  29680. XMEMCPY((void*)ctx->alpn_cli_protos, p, p_len);
  29681. ctx->alpn_cli_protos_len = p_len;
  29682. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29683. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29684. * the function reverses the return value convention.
  29685. */
  29686. return 0;
  29687. #else
  29688. return WOLFSSL_SUCCESS;
  29689. #endif
  29690. }
  29691. #ifdef HAVE_ALPN
  29692. #ifndef NO_BIO
  29693. /* Sets the ALPN extension protos
  29694. *
  29695. * example format is
  29696. * unsigned char p[] = {
  29697. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  29698. * };
  29699. *
  29700. * returns WOLFSSL_SUCCESS on success */
  29701. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  29702. const unsigned char* p, unsigned int p_len)
  29703. {
  29704. WOLFSSL_BIO* bio;
  29705. char* pt;
  29706. unsigned int sz;
  29707. unsigned int idx = 0;
  29708. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  29709. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  29710. if (ssl == NULL || p_len <= 1) {
  29711. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29712. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29713. * the function reverses the return value convention.
  29714. */
  29715. return 1;
  29716. #else
  29717. return WOLFSSL_FAILURE;
  29718. #endif
  29719. }
  29720. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  29721. if (bio == NULL) {
  29722. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29723. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29724. * the function reverses the return value convention.
  29725. */
  29726. return 1;
  29727. #else
  29728. return WOLFSSL_FAILURE;
  29729. #endif
  29730. }
  29731. /* convert into comma separated list */
  29732. while (idx < p_len - 1) {
  29733. unsigned int i;
  29734. sz = p[idx++];
  29735. if (idx + sz > p_len) {
  29736. WOLFSSL_MSG("Bad list format");
  29737. wolfSSL_BIO_free(bio);
  29738. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29739. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29740. * the function reverses the return value convention.
  29741. */
  29742. return 1;
  29743. #else
  29744. return WOLFSSL_FAILURE;
  29745. #endif
  29746. }
  29747. if (sz > 0) {
  29748. for (i = 0; i < sz; i++) {
  29749. wolfSSL_BIO_write(bio, &p[idx++], 1);
  29750. }
  29751. if (idx < p_len - 1)
  29752. wolfSSL_BIO_write(bio, ",", 1);
  29753. }
  29754. }
  29755. wolfSSL_BIO_write(bio, "\0", 1);
  29756. /* clears out all current ALPN extensions set */
  29757. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  29758. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  29759. wolfSSL_UseALPN(ssl, pt, sz, (byte) alpn_opt);
  29760. }
  29761. wolfSSL_BIO_free(bio);
  29762. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29763. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29764. * the function reverses the return value convention.
  29765. */
  29766. return 0;
  29767. #else
  29768. return WOLFSSL_SUCCESS;
  29769. #endif
  29770. }
  29771. #endif /* !NO_BIO */
  29772. #endif /* HAVE_ALPN */
  29773. #endif /* OPENSSL_EXTRA */
  29774. #if defined(OPENSSL_EXTRA)
  29775. #ifndef NO_BIO
  29776. #define WOLFSSL_BIO_INCLUDED
  29777. #include "src/bio.c"
  29778. #endif
  29779. word32 nid2oid(int nid, int grp)
  29780. {
  29781. /* get OID type */
  29782. switch (grp) {
  29783. /* oidHashType */
  29784. case oidHashType:
  29785. switch (nid) {
  29786. #ifdef WOLFSSL_MD2
  29787. case NID_md2:
  29788. return MD2h;
  29789. #endif
  29790. #ifndef NO_MD5
  29791. case NID_md5:
  29792. return MD5h;
  29793. #endif
  29794. #ifndef NO_SHA
  29795. case NID_sha1:
  29796. return SHAh;
  29797. #endif
  29798. case NID_sha224:
  29799. return SHA224h;
  29800. #ifndef NO_SHA256
  29801. case NID_sha256:
  29802. return SHA256h;
  29803. #endif
  29804. #ifdef WOLFSSL_SHA384
  29805. case NID_sha384:
  29806. return SHA384h;
  29807. #endif
  29808. #ifdef WOLFSSL_SHA512
  29809. case NID_sha512:
  29810. return SHA512h;
  29811. #endif
  29812. #ifndef WOLFSSL_NOSHA3_224
  29813. case NID_sha3_224:
  29814. return SHA3_224h;
  29815. #endif
  29816. #ifndef WOLFSSL_NOSHA3_256
  29817. case NID_sha3_256:
  29818. return SHA3_256h;
  29819. #endif
  29820. #ifndef WOLFSSL_NOSHA3_384
  29821. case NID_sha3_384:
  29822. return SHA3_384h;
  29823. #endif
  29824. #ifndef WOLFSSL_NOSHA3_512
  29825. case NID_sha3_512:
  29826. return SHA3_512h;
  29827. #endif
  29828. }
  29829. break;
  29830. /* oidSigType */
  29831. case oidSigType:
  29832. switch (nid) {
  29833. #ifndef NO_DSA
  29834. case NID_dsaWithSHA1:
  29835. return CTC_SHAwDSA;
  29836. case NID_dsa_with_SHA256:
  29837. return CTC_SHA256wDSA;
  29838. #endif /* NO_DSA */
  29839. #ifndef NO_RSA
  29840. case NID_md2WithRSAEncryption:
  29841. return CTC_MD2wRSA;
  29842. case NID_md5WithRSAEncryption:
  29843. return CTC_MD5wRSA;
  29844. case NID_sha1WithRSAEncryption:
  29845. return CTC_SHAwRSA;
  29846. case NID_sha224WithRSAEncryption:
  29847. return CTC_SHA224wRSA;
  29848. case NID_sha256WithRSAEncryption:
  29849. return CTC_SHA256wRSA;
  29850. case NID_sha384WithRSAEncryption:
  29851. return CTC_SHA384wRSA;
  29852. case NID_sha512WithRSAEncryption:
  29853. return CTC_SHA512wRSA;
  29854. #ifdef WOLFSSL_SHA3
  29855. case NID_RSA_SHA3_224:
  29856. return CTC_SHA3_224wRSA;
  29857. case NID_RSA_SHA3_256:
  29858. return CTC_SHA3_256wRSA;
  29859. case NID_RSA_SHA3_384:
  29860. return CTC_SHA3_384wRSA;
  29861. case NID_RSA_SHA3_512:
  29862. return CTC_SHA3_512wRSA;
  29863. #endif
  29864. #endif /* NO_RSA */
  29865. #ifdef HAVE_ECC
  29866. case NID_ecdsa_with_SHA1:
  29867. return CTC_SHAwECDSA;
  29868. case NID_ecdsa_with_SHA224:
  29869. return CTC_SHA224wECDSA;
  29870. case NID_ecdsa_with_SHA256:
  29871. return CTC_SHA256wECDSA;
  29872. case NID_ecdsa_with_SHA384:
  29873. return CTC_SHA384wECDSA;
  29874. case NID_ecdsa_with_SHA512:
  29875. return CTC_SHA512wECDSA;
  29876. #ifdef WOLFSSL_SHA3
  29877. case NID_ecdsa_with_SHA3_224:
  29878. return CTC_SHA3_224wECDSA;
  29879. case NID_ecdsa_with_SHA3_256:
  29880. return CTC_SHA3_256wECDSA;
  29881. case NID_ecdsa_with_SHA3_384:
  29882. return CTC_SHA3_384wECDSA;
  29883. case NID_ecdsa_with_SHA3_512:
  29884. return CTC_SHA3_512wECDSA;
  29885. #endif
  29886. #endif /* HAVE_ECC */
  29887. }
  29888. break;
  29889. /* oidKeyType */
  29890. case oidKeyType:
  29891. switch (nid) {
  29892. #ifndef NO_DSA
  29893. case NID_dsa:
  29894. return DSAk;
  29895. #endif /* NO_DSA */
  29896. #ifndef NO_RSA
  29897. case NID_rsaEncryption:
  29898. return RSAk;
  29899. #endif /* NO_RSA */
  29900. #ifdef HAVE_ECC
  29901. case NID_X9_62_id_ecPublicKey:
  29902. return ECDSAk;
  29903. #endif /* HAVE_ECC */
  29904. }
  29905. break;
  29906. #ifdef HAVE_ECC
  29907. case oidCurveType:
  29908. switch (nid) {
  29909. case NID_X9_62_prime192v1:
  29910. return ECC_SECP192R1_OID;
  29911. case NID_X9_62_prime192v2:
  29912. return ECC_PRIME192V2_OID;
  29913. case NID_X9_62_prime192v3:
  29914. return ECC_PRIME192V3_OID;
  29915. case NID_X9_62_prime239v1:
  29916. return ECC_PRIME239V1_OID;
  29917. case NID_X9_62_prime239v2:
  29918. return ECC_PRIME239V2_OID;
  29919. case NID_X9_62_prime239v3:
  29920. return ECC_PRIME239V3_OID;
  29921. case NID_X9_62_prime256v1:
  29922. return ECC_SECP256R1_OID;
  29923. case NID_secp112r1:
  29924. return ECC_SECP112R1_OID;
  29925. case NID_secp112r2:
  29926. return ECC_SECP112R2_OID;
  29927. case NID_secp128r1:
  29928. return ECC_SECP128R1_OID;
  29929. case NID_secp128r2:
  29930. return ECC_SECP128R2_OID;
  29931. case NID_secp160r1:
  29932. return ECC_SECP160R1_OID;
  29933. case NID_secp160r2:
  29934. return ECC_SECP160R2_OID;
  29935. case NID_secp224r1:
  29936. return ECC_SECP224R1_OID;
  29937. case NID_secp384r1:
  29938. return ECC_SECP384R1_OID;
  29939. case NID_secp521r1:
  29940. return ECC_SECP521R1_OID;
  29941. case NID_secp160k1:
  29942. return ECC_SECP160K1_OID;
  29943. case NID_secp192k1:
  29944. return ECC_SECP192K1_OID;
  29945. case NID_secp224k1:
  29946. return ECC_SECP224K1_OID;
  29947. case NID_secp256k1:
  29948. return ECC_SECP256K1_OID;
  29949. case NID_brainpoolP160r1:
  29950. return ECC_BRAINPOOLP160R1_OID;
  29951. case NID_brainpoolP192r1:
  29952. return ECC_BRAINPOOLP192R1_OID;
  29953. case NID_brainpoolP224r1:
  29954. return ECC_BRAINPOOLP224R1_OID;
  29955. case NID_brainpoolP256r1:
  29956. return ECC_BRAINPOOLP256R1_OID;
  29957. case NID_brainpoolP320r1:
  29958. return ECC_BRAINPOOLP320R1_OID;
  29959. case NID_brainpoolP384r1:
  29960. return ECC_BRAINPOOLP384R1_OID;
  29961. case NID_brainpoolP512r1:
  29962. return ECC_BRAINPOOLP512R1_OID;
  29963. }
  29964. break;
  29965. #endif /* HAVE_ECC */
  29966. /* oidBlkType */
  29967. case oidBlkType:
  29968. switch (nid) {
  29969. #ifdef WOLFSSL_AES_128
  29970. case AES128CBCb:
  29971. return AES128CBCb;
  29972. #endif
  29973. #ifdef WOLFSSL_AES_192
  29974. case AES192CBCb:
  29975. return AES192CBCb;
  29976. #endif
  29977. #ifdef WOLFSSL_AES_256
  29978. case AES256CBCb:
  29979. return AES256CBCb;
  29980. #endif
  29981. #ifndef NO_DES3
  29982. case NID_des:
  29983. return DESb;
  29984. case NID_des3:
  29985. return DES3b;
  29986. #endif
  29987. }
  29988. break;
  29989. #ifdef HAVE_OCSP
  29990. case oidOcspType:
  29991. switch (nid) {
  29992. case NID_id_pkix_OCSP_basic:
  29993. return OCSP_BASIC_OID;
  29994. case OCSP_NONCE_OID:
  29995. return OCSP_NONCE_OID;
  29996. }
  29997. break;
  29998. #endif /* HAVE_OCSP */
  29999. /* oidCertExtType */
  30000. case oidCertExtType:
  30001. switch (nid) {
  30002. case NID_basic_constraints:
  30003. return BASIC_CA_OID;
  30004. case NID_subject_alt_name:
  30005. return ALT_NAMES_OID;
  30006. case NID_crl_distribution_points:
  30007. return CRL_DIST_OID;
  30008. case NID_info_access:
  30009. return AUTH_INFO_OID;
  30010. case NID_authority_key_identifier:
  30011. return AUTH_KEY_OID;
  30012. case NID_subject_key_identifier:
  30013. return SUBJ_KEY_OID;
  30014. case NID_inhibit_any_policy:
  30015. return INHIBIT_ANY_OID;
  30016. case NID_key_usage:
  30017. return KEY_USAGE_OID;
  30018. case NID_name_constraints:
  30019. return NAME_CONS_OID;
  30020. case NID_certificate_policies:
  30021. return CERT_POLICY_OID;
  30022. case NID_ext_key_usage:
  30023. return EXT_KEY_USAGE_OID;
  30024. }
  30025. break;
  30026. /* oidCertAuthInfoType */
  30027. case oidCertAuthInfoType:
  30028. switch (nid) {
  30029. case NID_ad_OCSP:
  30030. return AIA_OCSP_OID;
  30031. case NID_ad_ca_issuers:
  30032. return AIA_CA_ISSUER_OID;
  30033. }
  30034. break;
  30035. /* oidCertPolicyType */
  30036. case oidCertPolicyType:
  30037. switch (nid) {
  30038. case NID_any_policy:
  30039. return CP_ANY_OID;
  30040. }
  30041. break;
  30042. /* oidCertAltNameType */
  30043. case oidCertAltNameType:
  30044. switch (nid) {
  30045. case NID_hw_name_oid:
  30046. return HW_NAME_OID;
  30047. }
  30048. break;
  30049. /* oidCertKeyUseType */
  30050. case oidCertKeyUseType:
  30051. switch (nid) {
  30052. case NID_anyExtendedKeyUsage:
  30053. return EKU_ANY_OID;
  30054. case EKU_SERVER_AUTH_OID:
  30055. return EKU_SERVER_AUTH_OID;
  30056. case EKU_CLIENT_AUTH_OID:
  30057. return EKU_CLIENT_AUTH_OID;
  30058. case EKU_OCSP_SIGN_OID:
  30059. return EKU_OCSP_SIGN_OID;
  30060. }
  30061. break;
  30062. /* oidKdfType */
  30063. case oidKdfType:
  30064. switch (nid) {
  30065. case PBKDF2_OID:
  30066. return PBKDF2_OID;
  30067. }
  30068. break;
  30069. /* oidPBEType */
  30070. case oidPBEType:
  30071. switch (nid) {
  30072. case PBE_SHA1_RC4_128:
  30073. return PBE_SHA1_RC4_128;
  30074. case PBE_SHA1_DES:
  30075. return PBE_SHA1_DES;
  30076. case PBE_SHA1_DES3:
  30077. return PBE_SHA1_DES3;
  30078. }
  30079. break;
  30080. /* oidKeyWrapType */
  30081. case oidKeyWrapType:
  30082. switch (nid) {
  30083. #ifdef WOLFSSL_AES_128
  30084. case AES128_WRAP:
  30085. return AES128_WRAP;
  30086. #endif
  30087. #ifdef WOLFSSL_AES_192
  30088. case AES192_WRAP:
  30089. return AES192_WRAP;
  30090. #endif
  30091. #ifdef WOLFSSL_AES_256
  30092. case AES256_WRAP:
  30093. return AES256_WRAP;
  30094. #endif
  30095. }
  30096. break;
  30097. /* oidCmsKeyAgreeType */
  30098. case oidCmsKeyAgreeType:
  30099. switch (nid) {
  30100. #ifndef NO_SHA
  30101. case dhSinglePass_stdDH_sha1kdf_scheme:
  30102. return dhSinglePass_stdDH_sha1kdf_scheme;
  30103. #endif
  30104. #ifdef WOLFSSL_SHA224
  30105. case dhSinglePass_stdDH_sha224kdf_scheme:
  30106. return dhSinglePass_stdDH_sha224kdf_scheme;
  30107. #endif
  30108. #ifndef NO_SHA256
  30109. case dhSinglePass_stdDH_sha256kdf_scheme:
  30110. return dhSinglePass_stdDH_sha256kdf_scheme;
  30111. #endif
  30112. #ifdef WOLFSSL_SHA384
  30113. case dhSinglePass_stdDH_sha384kdf_scheme:
  30114. return dhSinglePass_stdDH_sha384kdf_scheme;
  30115. #endif
  30116. #ifdef WOLFSSL_SHA512
  30117. case dhSinglePass_stdDH_sha512kdf_scheme:
  30118. return dhSinglePass_stdDH_sha512kdf_scheme;
  30119. #endif
  30120. }
  30121. break;
  30122. default:
  30123. WOLFSSL_MSG("NID not in table");
  30124. /* MSVC warns without the cast */
  30125. return (word32)-1;
  30126. }
  30127. /* MSVC warns without the cast */
  30128. return (word32)-1;
  30129. }
  30130. int oid2nid(word32 oid, int grp)
  30131. {
  30132. size_t i;
  30133. /* get OID type */
  30134. switch (grp) {
  30135. /* oidHashType */
  30136. case oidHashType:
  30137. switch (oid) {
  30138. #ifdef WOLFSSL_MD2
  30139. case MD2h:
  30140. return NID_md2;
  30141. #endif
  30142. #ifndef NO_MD5
  30143. case MD5h:
  30144. return NID_md5;
  30145. #endif
  30146. #ifndef NO_SHA
  30147. case SHAh:
  30148. return NID_sha1;
  30149. #endif
  30150. case SHA224h:
  30151. return NID_sha224;
  30152. #ifndef NO_SHA256
  30153. case SHA256h:
  30154. return NID_sha256;
  30155. #endif
  30156. #ifdef WOLFSSL_SHA384
  30157. case SHA384h:
  30158. return NID_sha384;
  30159. #endif
  30160. #ifdef WOLFSSL_SHA512
  30161. case SHA512h:
  30162. return NID_sha512;
  30163. #endif
  30164. }
  30165. break;
  30166. /* oidSigType */
  30167. case oidSigType:
  30168. switch (oid) {
  30169. #ifndef NO_DSA
  30170. case CTC_SHAwDSA:
  30171. return NID_dsaWithSHA1;
  30172. case CTC_SHA256wDSA:
  30173. return NID_dsa_with_SHA256;
  30174. #endif /* NO_DSA */
  30175. #ifndef NO_RSA
  30176. case CTC_MD2wRSA:
  30177. return NID_md2WithRSAEncryption;
  30178. case CTC_MD5wRSA:
  30179. return NID_md5WithRSAEncryption;
  30180. case CTC_SHAwRSA:
  30181. return NID_sha1WithRSAEncryption;
  30182. case CTC_SHA224wRSA:
  30183. return NID_sha224WithRSAEncryption;
  30184. case CTC_SHA256wRSA:
  30185. return NID_sha256WithRSAEncryption;
  30186. case CTC_SHA384wRSA:
  30187. return NID_sha384WithRSAEncryption;
  30188. case CTC_SHA512wRSA:
  30189. return NID_sha512WithRSAEncryption;
  30190. #ifdef WOLFSSL_SHA3
  30191. case CTC_SHA3_224wRSA:
  30192. return NID_RSA_SHA3_224;
  30193. case CTC_SHA3_256wRSA:
  30194. return NID_RSA_SHA3_256;
  30195. case CTC_SHA3_384wRSA:
  30196. return NID_RSA_SHA3_384;
  30197. case CTC_SHA3_512wRSA:
  30198. return NID_RSA_SHA3_512;
  30199. #endif
  30200. #endif /* NO_RSA */
  30201. #ifdef HAVE_ECC
  30202. case CTC_SHAwECDSA:
  30203. return NID_ecdsa_with_SHA1;
  30204. case CTC_SHA224wECDSA:
  30205. return NID_ecdsa_with_SHA224;
  30206. case CTC_SHA256wECDSA:
  30207. return NID_ecdsa_with_SHA256;
  30208. case CTC_SHA384wECDSA:
  30209. return NID_ecdsa_with_SHA384;
  30210. case CTC_SHA512wECDSA:
  30211. return NID_ecdsa_with_SHA512;
  30212. #ifdef WOLFSSL_SHA3
  30213. case CTC_SHA3_224wECDSA:
  30214. return NID_ecdsa_with_SHA3_224;
  30215. case CTC_SHA3_256wECDSA:
  30216. return NID_ecdsa_with_SHA3_256;
  30217. case CTC_SHA3_384wECDSA:
  30218. return NID_ecdsa_with_SHA3_384;
  30219. case CTC_SHA3_512wECDSA:
  30220. return NID_ecdsa_with_SHA3_512;
  30221. #endif
  30222. #endif /* HAVE_ECC */
  30223. }
  30224. break;
  30225. /* oidKeyType */
  30226. case oidKeyType:
  30227. switch (oid) {
  30228. #ifndef NO_DSA
  30229. case DSAk:
  30230. return NID_dsa;
  30231. #endif /* NO_DSA */
  30232. #ifndef NO_RSA
  30233. case RSAk:
  30234. return NID_rsaEncryption;
  30235. #endif /* NO_RSA */
  30236. #ifdef HAVE_ECC
  30237. case ECDSAk:
  30238. return NID_X9_62_id_ecPublicKey;
  30239. #endif /* HAVE_ECC */
  30240. }
  30241. break;
  30242. #ifdef HAVE_ECC
  30243. case oidCurveType:
  30244. switch (oid) {
  30245. case ECC_SECP192R1_OID:
  30246. return NID_X9_62_prime192v1;
  30247. case ECC_PRIME192V2_OID:
  30248. return NID_X9_62_prime192v2;
  30249. case ECC_PRIME192V3_OID:
  30250. return NID_X9_62_prime192v3;
  30251. case ECC_PRIME239V1_OID:
  30252. return NID_X9_62_prime239v1;
  30253. case ECC_PRIME239V2_OID:
  30254. return NID_X9_62_prime239v2;
  30255. case ECC_PRIME239V3_OID:
  30256. return NID_X9_62_prime239v3;
  30257. case ECC_SECP256R1_OID:
  30258. return NID_X9_62_prime256v1;
  30259. case ECC_SECP112R1_OID:
  30260. return NID_secp112r1;
  30261. case ECC_SECP112R2_OID:
  30262. return NID_secp112r2;
  30263. case ECC_SECP128R1_OID:
  30264. return NID_secp128r1;
  30265. case ECC_SECP128R2_OID:
  30266. return NID_secp128r2;
  30267. case ECC_SECP160R1_OID:
  30268. return NID_secp160r1;
  30269. case ECC_SECP160R2_OID:
  30270. return NID_secp160r2;
  30271. case ECC_SECP224R1_OID:
  30272. return NID_secp224r1;
  30273. case ECC_SECP384R1_OID:
  30274. return NID_secp384r1;
  30275. case ECC_SECP521R1_OID:
  30276. return NID_secp521r1;
  30277. case ECC_SECP160K1_OID:
  30278. return NID_secp160k1;
  30279. case ECC_SECP192K1_OID:
  30280. return NID_secp192k1;
  30281. case ECC_SECP224K1_OID:
  30282. return NID_secp224k1;
  30283. case ECC_SECP256K1_OID:
  30284. return NID_secp256k1;
  30285. case ECC_BRAINPOOLP160R1_OID:
  30286. return NID_brainpoolP160r1;
  30287. case ECC_BRAINPOOLP192R1_OID:
  30288. return NID_brainpoolP192r1;
  30289. case ECC_BRAINPOOLP224R1_OID:
  30290. return NID_brainpoolP224r1;
  30291. case ECC_BRAINPOOLP256R1_OID:
  30292. return NID_brainpoolP256r1;
  30293. case ECC_BRAINPOOLP320R1_OID:
  30294. return NID_brainpoolP320r1;
  30295. case ECC_BRAINPOOLP384R1_OID:
  30296. return NID_brainpoolP384r1;
  30297. case ECC_BRAINPOOLP512R1_OID:
  30298. return NID_brainpoolP512r1;
  30299. }
  30300. break;
  30301. #endif /* HAVE_ECC */
  30302. /* oidBlkType */
  30303. case oidBlkType:
  30304. switch (oid) {
  30305. #ifdef WOLFSSL_AES_128
  30306. case AES128CBCb:
  30307. return AES128CBCb;
  30308. #endif
  30309. #ifdef WOLFSSL_AES_192
  30310. case AES192CBCb:
  30311. return AES192CBCb;
  30312. #endif
  30313. #ifdef WOLFSSL_AES_256
  30314. case AES256CBCb:
  30315. return AES256CBCb;
  30316. #endif
  30317. #ifndef NO_DES3
  30318. case DESb:
  30319. return NID_des;
  30320. case DES3b:
  30321. return NID_des3;
  30322. #endif
  30323. }
  30324. break;
  30325. #ifdef HAVE_OCSP
  30326. case oidOcspType:
  30327. switch (oid) {
  30328. case OCSP_BASIC_OID:
  30329. return NID_id_pkix_OCSP_basic;
  30330. case OCSP_NONCE_OID:
  30331. return OCSP_NONCE_OID;
  30332. }
  30333. break;
  30334. #endif /* HAVE_OCSP */
  30335. /* oidCertExtType */
  30336. case oidCertExtType:
  30337. switch (oid) {
  30338. case BASIC_CA_OID:
  30339. return NID_basic_constraints;
  30340. case ALT_NAMES_OID:
  30341. return NID_subject_alt_name;
  30342. case CRL_DIST_OID:
  30343. return NID_crl_distribution_points;
  30344. case AUTH_INFO_OID:
  30345. return NID_info_access;
  30346. case AUTH_KEY_OID:
  30347. return NID_authority_key_identifier;
  30348. case SUBJ_KEY_OID:
  30349. return NID_subject_key_identifier;
  30350. case INHIBIT_ANY_OID:
  30351. return NID_inhibit_any_policy;
  30352. case KEY_USAGE_OID:
  30353. return NID_key_usage;
  30354. case NAME_CONS_OID:
  30355. return NID_name_constraints;
  30356. case CERT_POLICY_OID:
  30357. return NID_certificate_policies;
  30358. case EXT_KEY_USAGE_OID:
  30359. return NID_ext_key_usage;
  30360. }
  30361. break;
  30362. /* oidCertAuthInfoType */
  30363. case oidCertAuthInfoType:
  30364. switch (oid) {
  30365. case AIA_OCSP_OID:
  30366. return NID_ad_OCSP;
  30367. case AIA_CA_ISSUER_OID:
  30368. return NID_ad_ca_issuers;
  30369. }
  30370. break;
  30371. /* oidCertPolicyType */
  30372. case oidCertPolicyType:
  30373. switch (oid) {
  30374. case CP_ANY_OID:
  30375. return NID_any_policy;
  30376. }
  30377. break;
  30378. /* oidCertAltNameType */
  30379. case oidCertAltNameType:
  30380. switch (oid) {
  30381. case HW_NAME_OID:
  30382. return NID_hw_name_oid;
  30383. }
  30384. break;
  30385. /* oidCertKeyUseType */
  30386. case oidCertKeyUseType:
  30387. switch (oid) {
  30388. case EKU_ANY_OID:
  30389. return NID_anyExtendedKeyUsage;
  30390. case EKU_SERVER_AUTH_OID:
  30391. return EKU_SERVER_AUTH_OID;
  30392. case EKU_CLIENT_AUTH_OID:
  30393. return EKU_CLIENT_AUTH_OID;
  30394. case EKU_OCSP_SIGN_OID:
  30395. return EKU_OCSP_SIGN_OID;
  30396. }
  30397. break;
  30398. /* oidKdfType */
  30399. case oidKdfType:
  30400. switch (oid) {
  30401. case PBKDF2_OID:
  30402. return PBKDF2_OID;
  30403. }
  30404. break;
  30405. /* oidPBEType */
  30406. case oidPBEType:
  30407. switch (oid) {
  30408. case PBE_SHA1_RC4_128:
  30409. return PBE_SHA1_RC4_128;
  30410. case PBE_SHA1_DES:
  30411. return PBE_SHA1_DES;
  30412. case PBE_SHA1_DES3:
  30413. return PBE_SHA1_DES3;
  30414. }
  30415. break;
  30416. /* oidKeyWrapType */
  30417. case oidKeyWrapType:
  30418. switch (oid) {
  30419. #ifdef WOLFSSL_AES_128
  30420. case AES128_WRAP:
  30421. return AES128_WRAP;
  30422. #endif
  30423. #ifdef WOLFSSL_AES_192
  30424. case AES192_WRAP:
  30425. return AES192_WRAP;
  30426. #endif
  30427. #ifdef WOLFSSL_AES_256
  30428. case AES256_WRAP:
  30429. return AES256_WRAP;
  30430. #endif
  30431. }
  30432. break;
  30433. /* oidCmsKeyAgreeType */
  30434. case oidCmsKeyAgreeType:
  30435. switch (oid) {
  30436. #ifndef NO_SHA
  30437. case dhSinglePass_stdDH_sha1kdf_scheme:
  30438. return dhSinglePass_stdDH_sha1kdf_scheme;
  30439. #endif
  30440. #ifdef WOLFSSL_SHA224
  30441. case dhSinglePass_stdDH_sha224kdf_scheme:
  30442. return dhSinglePass_stdDH_sha224kdf_scheme;
  30443. #endif
  30444. #ifndef NO_SHA256
  30445. case dhSinglePass_stdDH_sha256kdf_scheme:
  30446. return dhSinglePass_stdDH_sha256kdf_scheme;
  30447. #endif
  30448. #ifdef WOLFSSL_SHA384
  30449. case dhSinglePass_stdDH_sha384kdf_scheme:
  30450. return dhSinglePass_stdDH_sha384kdf_scheme;
  30451. #endif
  30452. #ifdef WOLFSSL_SHA512
  30453. case dhSinglePass_stdDH_sha512kdf_scheme:
  30454. return dhSinglePass_stdDH_sha512kdf_scheme;
  30455. #endif
  30456. }
  30457. break;
  30458. #ifdef WOLFSSL_CERT_REQ
  30459. case oidCsrAttrType:
  30460. switch (oid) {
  30461. case PKCS9_CONTENT_TYPE_OID:
  30462. return NID_pkcs9_contentType;
  30463. case CHALLENGE_PASSWORD_OID:
  30464. return NID_pkcs9_challengePassword;
  30465. case SERIAL_NUMBER_OID:
  30466. return NID_serialNumber;
  30467. case USER_ID_OID:
  30468. return NID_userId;
  30469. }
  30470. break;
  30471. #endif
  30472. default:
  30473. WOLFSSL_MSG("NID not in table");
  30474. }
  30475. /* If not found in above switch then try the table */
  30476. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  30477. if (wolfssl_object_info[i].id == (int)oid) {
  30478. return wolfssl_object_info[i].nid;
  30479. }
  30480. }
  30481. return -1;
  30482. }
  30483. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  30484. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  30485. * disabled since a copy of mpi is made by this function and placed into bn.
  30486. */
  30487. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  30488. {
  30489. WOLFSSL_MSG("Entering SetIndividualInternal");
  30490. if (bn == NULL || bn->internal == NULL) {
  30491. WOLFSSL_MSG("bn NULL error");
  30492. return WOLFSSL_FATAL_ERROR;
  30493. }
  30494. if (mpi == NULL) {
  30495. WOLFSSL_MSG("mpi NULL error");
  30496. return WOLFSSL_FATAL_ERROR;
  30497. }
  30498. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  30499. WOLFSSL_MSG("mp_copy error");
  30500. return WOLFSSL_FATAL_ERROR;
  30501. }
  30502. return WOLFSSL_SUCCESS;
  30503. }
  30504. #ifndef NO_ASN
  30505. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  30506. WOLFSSL_BIGNUM *bn)
  30507. {
  30508. #ifdef WOLFSSL_SMALL_STACK
  30509. mp_int* mpi = NULL;
  30510. #else
  30511. mp_int mpi[1];
  30512. #endif
  30513. word32 idx = 0;
  30514. int ret;
  30515. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  30516. if (ai == NULL) {
  30517. return NULL;
  30518. }
  30519. #ifdef WOLFSSL_SMALL_STACK
  30520. mpi = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  30521. if (mpi == NULL) {
  30522. return NULL;
  30523. }
  30524. #endif
  30525. ret = GetInt(mpi, ai->data, &idx, ai->dataMax);
  30526. if (ret != 0) {
  30527. #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY)
  30528. ret = mp_init(mpi); /* must init mpi */
  30529. if (ret != MP_OKAY) {
  30530. #ifdef WOLFSSL_SMALL_STACK
  30531. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30532. #endif
  30533. return NULL;
  30534. }
  30535. /* Serial number in QT starts at index 0 of data */
  30536. if (mp_read_unsigned_bin(mpi, (byte*)ai->data, ai->length) != 0) {
  30537. mp_clear(mpi);
  30538. #ifdef WOLFSSL_SMALL_STACK
  30539. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30540. #endif
  30541. return NULL;
  30542. }
  30543. #else
  30544. /* expecting ASN1 format for INTEGER */
  30545. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  30546. #ifdef WOLFSSL_SMALL_STACK
  30547. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30548. #endif
  30549. return NULL;
  30550. #endif
  30551. }
  30552. /* mp_clear needs called because mpi is copied and causes memory leak with
  30553. * --disable-fastmath */
  30554. ret = SetIndividualExternal(&bn, mpi);
  30555. mp_clear(mpi);
  30556. #ifdef WOLFSSL_SMALL_STACK
  30557. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30558. #endif
  30559. if (ret != WOLFSSL_SUCCESS) {
  30560. return NULL;
  30561. }
  30562. return bn;
  30563. }
  30564. #endif /* !NO_ASN */
  30565. /* frees all nodes in the current threads error queue
  30566. *
  30567. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  30568. * current threads queue will be free'd.
  30569. */
  30570. void wolfSSL_ERR_remove_state(unsigned long id)
  30571. {
  30572. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  30573. (void)id;
  30574. if (wc_ERR_remove_state() != 0) {
  30575. WOLFSSL_MSG("Error with removing the state");
  30576. }
  30577. }
  30578. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  30579. {
  30580. static int ctx; /* wolfcrypt doesn't now need ctx */
  30581. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  30582. return (WOLFSSL_BN_CTX*)&ctx;
  30583. }
  30584. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  30585. {
  30586. (void)ctx;
  30587. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  30588. }
  30589. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  30590. {
  30591. (void)ctx;
  30592. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  30593. /* do free since static ctx that does nothing */
  30594. }
  30595. /* WOLFSSL_SUCCESS on ok */
  30596. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  30597. const WOLFSSL_BIGNUM* b)
  30598. {
  30599. WOLFSSL_MSG("wolfSSL_BN_sub");
  30600. if (r == NULL || a == NULL || b == NULL)
  30601. return 0;
  30602. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  30603. (mp_int*)r->internal) == MP_OKAY)
  30604. return WOLFSSL_SUCCESS;
  30605. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  30606. return 0;
  30607. }
  30608. WOLFSSL_API int wolfSSL_BN_mul(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b,
  30609. WOLFSSL_BN_CTX *ctx)
  30610. {
  30611. int ret = WOLFSSL_SUCCESS;
  30612. (void)ctx;
  30613. WOLFSSL_ENTER("wolfSSL_BN_mul");
  30614. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  30615. a->internal == NULL || b->internal == NULL) {
  30616. ret = WOLFSSL_FAILURE;
  30617. }
  30618. if (ret == WOLFSSL_SUCCESS) {
  30619. ret = mp_mul((mp_int*)a->internal, (mp_int*)b->internal,
  30620. (mp_int*)r->internal);
  30621. if (ret == MP_OKAY) {
  30622. ret = WOLFSSL_SUCCESS;
  30623. }
  30624. else {
  30625. ret = WOLFSSL_FAILURE;
  30626. }
  30627. }
  30628. WOLFSSL_LEAVE("wolfSSL_BN_mul", ret);
  30629. return ret;
  30630. }
  30631. #ifndef WOLFSSL_SP_MATH
  30632. int wolfSSL_BN_div(WOLFSSL_BIGNUM* dv, WOLFSSL_BIGNUM* rem,
  30633. const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* d,
  30634. WOLFSSL_BN_CTX* ctx)
  30635. {
  30636. int ret = WOLFSSL_SUCCESS;
  30637. (void)ctx;
  30638. WOLFSSL_ENTER("wolfSSL_BN_div");
  30639. if (dv == NULL || rem == NULL || a == NULL || d == NULL ||
  30640. dv->internal == NULL || rem->internal == NULL || a->internal == NULL ||
  30641. d->internal == NULL) {
  30642. ret = WOLFSSL_FAILURE;
  30643. }
  30644. if (ret == WOLFSSL_SUCCESS) {
  30645. ret = mp_div((mp_int*)a->internal, (mp_int*)d->internal,
  30646. (mp_int*)dv->internal, (mp_int*)rem->internal);
  30647. if (ret == MP_OKAY) {
  30648. ret = WOLFSSL_SUCCESS;
  30649. }
  30650. else {
  30651. ret = WOLFSSL_FAILURE;
  30652. }
  30653. }
  30654. WOLFSSL_LEAVE("wolfSSL_BN_div", ret);
  30655. return ret;
  30656. }
  30657. #endif
  30658. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Needed to get mp_gcd. */
  30659. int wolfSSL_BN_gcd(WOLFSSL_BIGNUM* r, WOLFSSL_BIGNUM* a, WOLFSSL_BIGNUM* b,
  30660. WOLFSSL_BN_CTX* ctx)
  30661. {
  30662. int ret = WOLFSSL_SUCCESS;
  30663. (void)ctx;
  30664. WOLFSSL_ENTER("wolfSSL_BN_gcd");
  30665. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  30666. a->internal == NULL || b->internal == NULL) {
  30667. ret = WOLFSSL_FAILURE;
  30668. }
  30669. if (ret == WOLFSSL_SUCCESS) {
  30670. ret = mp_gcd((mp_int*)a->internal, (mp_int*)b->internal,
  30671. (mp_int*)r->internal);
  30672. if (ret == MP_OKAY) {
  30673. ret = WOLFSSL_SUCCESS;
  30674. }
  30675. else {
  30676. ret = WOLFSSL_FAILURE;
  30677. }
  30678. }
  30679. WOLFSSL_LEAVE("wolfSSL_BN_gcd", ret);
  30680. return ret;
  30681. }
  30682. #endif /* !NO_RSA && WOLFSSL_KEY_GEN */
  30683. /* WOLFSSL_SUCCESS on ok */
  30684. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  30685. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  30686. {
  30687. (void)c;
  30688. WOLFSSL_MSG("wolfSSL_BN_mod");
  30689. if (r == NULL || a == NULL || b == NULL)
  30690. return 0;
  30691. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  30692. (mp_int*)r->internal) == MP_OKAY)
  30693. return WOLFSSL_SUCCESS;
  30694. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  30695. return 0;
  30696. }
  30697. /* r = (a^p) % m */
  30698. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  30699. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  30700. {
  30701. int ret;
  30702. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  30703. (void) ctx;
  30704. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  30705. WOLFSSL_MSG("Bad Argument");
  30706. return WOLFSSL_FAILURE;
  30707. }
  30708. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  30709. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  30710. return WOLFSSL_SUCCESS;
  30711. }
  30712. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  30713. (void)ret;
  30714. return WOLFSSL_FAILURE;
  30715. }
  30716. /* r = (a * p) % m */
  30717. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  30718. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  30719. {
  30720. int ret;
  30721. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  30722. (void) ctx;
  30723. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  30724. WOLFSSL_MSG("Bad Argument");
  30725. return SSL_FAILURE;
  30726. }
  30727. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  30728. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  30729. return WOLFSSL_SUCCESS;
  30730. }
  30731. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  30732. (void)ret;
  30733. return SSL_FAILURE;
  30734. }
  30735. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  30736. {
  30737. WOLFSSL_MSG("wolfSSL_BN_value_one");
  30738. if (bn_one == NULL) {
  30739. bn_one = wolfSSL_BN_new();
  30740. if (bn_one) {
  30741. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  30742. /* handle error by freeing BN and returning NULL */
  30743. wolfSSL_BN_free(bn_one);
  30744. bn_one = NULL;
  30745. }
  30746. }
  30747. }
  30748. return bn_one;
  30749. }
  30750. /* return compliant with OpenSSL
  30751. * size of BIGNUM in bytes, 0 if error */
  30752. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  30753. {
  30754. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  30755. if (bn == NULL || bn->internal == NULL)
  30756. return WOLFSSL_FAILURE;
  30757. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30758. }
  30759. /* return compliant with OpenSSL
  30760. * size of BIGNUM in bits, 0 if error */
  30761. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  30762. {
  30763. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  30764. if (bn == NULL || bn->internal == NULL)
  30765. return WOLFSSL_FAILURE;
  30766. return mp_count_bits((mp_int*)bn->internal);
  30767. }
  30768. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  30769. {
  30770. if (bn == NULL)
  30771. return WOLFSSL_FAILURE;
  30772. return mp_isneg((mp_int*)bn->internal);
  30773. }
  30774. WOLFSSL_API void wolfSSL_BN_zero(WOLFSSL_BIGNUM* bn)
  30775. {
  30776. if (bn == NULL || bn->internal == NULL) {
  30777. return;
  30778. }
  30779. mp_zero((mp_int*)bn->internal);
  30780. }
  30781. WOLFSSL_API int wolfSSL_BN_one(WOLFSSL_BIGNUM* bn)
  30782. {
  30783. int ret = WOLFSSL_SUCCESS;
  30784. if (bn == NULL || bn->internal == NULL) {
  30785. return WOLFSSL_FAILURE;
  30786. }
  30787. if (ret == WOLFSSL_SUCCESS) {
  30788. ret = wolfSSL_BN_set_word(bn, 1);
  30789. }
  30790. return ret;
  30791. }
  30792. /* return compliant with OpenSSL
  30793. * 1 if BIGNUM is zero, 0 else */
  30794. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  30795. {
  30796. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  30797. if (bn == NULL || bn->internal == NULL)
  30798. return WOLFSSL_FAILURE;
  30799. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  30800. return WOLFSSL_SUCCESS;
  30801. return WOLFSSL_FAILURE;
  30802. }
  30803. /* return compliant with OpenSSL
  30804. * 1 if BIGNUM is one, 0 else */
  30805. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  30806. {
  30807. WOLFSSL_MSG("wolfSSL_BN_is_one");
  30808. if (bn == NULL || bn->internal == NULL)
  30809. return WOLFSSL_FAILURE;
  30810. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  30811. return WOLFSSL_SUCCESS;
  30812. return WOLFSSL_FAILURE;
  30813. }
  30814. /* return compliant with OpenSSL
  30815. * 1 if BIGNUM is odd, 0 else */
  30816. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  30817. {
  30818. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  30819. if (bn == NULL || bn->internal == NULL)
  30820. return WOLFSSL_FAILURE;
  30821. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  30822. return WOLFSSL_SUCCESS;
  30823. return WOLFSSL_FAILURE;
  30824. }
  30825. /* return compliant with OpenSSL
  30826. * 1 if BIGNUM is word, 0 else */
  30827. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  30828. {
  30829. WOLFSSL_MSG("wolfSSL_BN_is_word");
  30830. if (bn == NULL || bn->internal == NULL) {
  30831. WOLFSSL_MSG("bn NULL error");
  30832. return WOLFSSL_FAILURE;
  30833. }
  30834. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  30835. if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
  30836. return WOLFSSL_SUCCESS;
  30837. }
  30838. } else {
  30839. int ret;
  30840. mp_int w_mp;
  30841. if (mp_init(&w_mp) != MP_OKAY)
  30842. return WOLFSSL_FAILURE;
  30843. if (mp_set_int(&w_mp, w) != MP_OKAY)
  30844. return WOLFSSL_FAILURE;
  30845. ret = mp_cmp((mp_int *)bn->internal, &w_mp);
  30846. mp_free(&w_mp);
  30847. if (ret == MP_EQ)
  30848. return WOLFSSL_SUCCESS;
  30849. }
  30850. return WOLFSSL_FAILURE;
  30851. }
  30852. /* return compliant with OpenSSL
  30853. * -1 if a < b, 0 if a == b and 1 if a > b
  30854. */
  30855. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  30856. {
  30857. int ret;
  30858. WOLFSSL_MSG("wolfSSL_BN_cmp");
  30859. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  30860. return WOLFSSL_FATAL_ERROR;
  30861. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  30862. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  30863. }
  30864. /* return compliant with OpenSSL
  30865. * length of BIGNUM in bytes, -1 if error */
  30866. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  30867. {
  30868. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  30869. if (bn == NULL || bn->internal == NULL) {
  30870. WOLFSSL_MSG("NULL bn error");
  30871. return WOLFSSL_FATAL_ERROR;
  30872. }
  30873. if (r == NULL)
  30874. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30875. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  30876. WOLFSSL_MSG("mp_to_unsigned_bin error");
  30877. return WOLFSSL_FATAL_ERROR;
  30878. }
  30879. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30880. }
  30881. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  30882. WOLFSSL_BIGNUM* ret)
  30883. {
  30884. int weOwn = 0;
  30885. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  30886. /* if ret is null create a BN */
  30887. if (ret == NULL) {
  30888. ret = wolfSSL_BN_new();
  30889. weOwn = 1;
  30890. if (ret == NULL)
  30891. return NULL;
  30892. }
  30893. /* check ret and ret->internal then read in value */
  30894. if (ret && ret->internal) {
  30895. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  30896. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  30897. if (weOwn)
  30898. wolfSSL_BN_free(ret);
  30899. return NULL;
  30900. }
  30901. } else {
  30902. /* This may be overly defensive */
  30903. if (weOwn)
  30904. wolfSSL_BN_free(ret);
  30905. return NULL;
  30906. }
  30907. return ret;
  30908. }
  30909. /* return compliant with OpenSSL
  30910. * 1 if success, 0 if error */
  30911. #ifndef NO_WOLFSSL_STUB
  30912. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  30913. {
  30914. (void)bn;
  30915. (void)n;
  30916. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  30917. WOLFSSL_STUB("BN_mask_bits");
  30918. return SSL_FAILURE;
  30919. }
  30920. #endif
  30921. /* WOLFSSL_SUCCESS on ok */
  30922. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  30923. {
  30924. int ret = WOLFSSL_SUCCESS;
  30925. int len = (bits + 7) / 8;
  30926. WC_RNG* rng = &globalRNG;
  30927. byte* buff = NULL;
  30928. WOLFSSL_ENTER("wolfSSL_BN_rand");
  30929. if ((bn == NULL || bn->internal == NULL) || bits < 0 ||
  30930. (bits == 0 && (bottom != 0 || top != -1)) || (bits == 1 && top > 0)) {
  30931. WOLFSSL_MSG("Bad argument");
  30932. ret = WOLFSSL_FAILURE;
  30933. }
  30934. if (ret == WOLFSSL_SUCCESS) {
  30935. if (len == 0) {
  30936. mp_zero((mp_int*)bn->internal);
  30937. }
  30938. else {
  30939. buff = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30940. if (buff == NULL) {
  30941. WOLFSSL_MSG("Failed to allocate buffer.");
  30942. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30943. ret = WOLFSSL_FAILURE;
  30944. }
  30945. if (ret == WOLFSSL_SUCCESS && initGlobalRNG == 0 &&
  30946. wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  30947. WOLFSSL_MSG("Failed to use global RNG.");
  30948. ret = WOLFSSL_FAILURE;
  30949. }
  30950. if (ret == WOLFSSL_SUCCESS &&
  30951. wc_RNG_GenerateBlock(rng, buff, len) != 0) {
  30952. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  30953. ret = WOLFSSL_FAILURE;
  30954. }
  30955. if (ret == WOLFSSL_SUCCESS &&
  30956. mp_read_unsigned_bin((mp_int*)bn->internal,buff,len)
  30957. != MP_OKAY) {
  30958. WOLFSSL_MSG("mp_read_unsigned_bin failed");
  30959. ret = WOLFSSL_FAILURE;
  30960. }
  30961. if (ret == WOLFSSL_SUCCESS) {
  30962. /* Truncate to requested bit length. */
  30963. mp_rshb((mp_int*)bn->internal, 8 - (bits % 8));
  30964. if (top == 0) {
  30965. if (mp_set_bit((mp_int*)bn->internal, bits - 1)
  30966. != MP_OKAY) {
  30967. WOLFSSL_MSG("Failed to set top bit");
  30968. ret = WOLFSSL_FAILURE;
  30969. }
  30970. }
  30971. else if (top > 0) {
  30972. if (mp_set_bit((mp_int*)bn->internal, bits - 1)
  30973. != MP_OKAY ||
  30974. mp_set_bit((mp_int*)bn->internal, bits - 2)
  30975. != MP_OKAY) {
  30976. WOLFSSL_MSG("Failed to set top 2 bits");
  30977. ret = WOLFSSL_FAILURE;
  30978. }
  30979. }
  30980. }
  30981. if (ret == WOLFSSL_SUCCESS && bottom &&
  30982. mp_set_bit((mp_int*)bn->internal, 0) != MP_OKAY) {
  30983. WOLFSSL_MSG("Failed to set 0th bit");
  30984. ret = WOLFSSL_FAILURE;
  30985. }
  30986. if (buff != NULL) {
  30987. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30988. }
  30989. }
  30990. }
  30991. WOLFSSL_LEAVE("wolfSSL_BN_rand", ret);
  30992. return ret;
  30993. }
  30994. /**
  30995. * N = length of range input var
  30996. * Generate N-bit length numbers until generated number is less than range
  30997. * @param r Output number
  30998. * @param range The upper limit of generated output
  30999. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  31000. */
  31001. int wolfSSL_BN_rand_range(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *range)
  31002. {
  31003. int n;
  31004. int iter = 0;
  31005. WOLFSSL_MSG("wolfSSL_BN_rand_range");
  31006. if (r == NULL || range == NULL) {
  31007. WOLFSSL_MSG("Bad parameter");
  31008. return WOLFSSL_FAILURE;
  31009. }
  31010. n = wolfSSL_BN_num_bits(range);
  31011. if (n <= 1) {
  31012. wolfSSL_BN_zero(r);
  31013. }
  31014. else {
  31015. do {
  31016. if (iter >= 100) {
  31017. WOLFSSL_MSG("wolfSSL_BN_rand_range too many iterations");
  31018. return WOLFSSL_FAILURE;
  31019. }
  31020. iter++;
  31021. if (wolfSSL_BN_pseudo_rand(r, n, -1, 0) == WOLFSSL_FAILURE) {
  31022. WOLFSSL_MSG("wolfSSL_BN_rand error");
  31023. return WOLFSSL_FAILURE;
  31024. }
  31025. } while(wolfSSL_BN_cmp(r, range) >= 0);
  31026. }
  31027. return WOLFSSL_SUCCESS;
  31028. }
  31029. /* WOLFSSL_SUCCESS on ok
  31030. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  31031. * top -1 then leave most sig bit alone
  31032. * top 0 then most sig is set to 1
  31033. * top is 1 then first two most sig bits are 1
  31034. *
  31035. * bottom is hot then odd number */
  31036. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  31037. {
  31038. int ret = 0;
  31039. int len;
  31040. int initTmpRng = 0;
  31041. WC_RNG* rng = NULL;
  31042. #ifdef WOLFSSL_SMALL_STACK
  31043. WC_RNG* tmpRNG = NULL;
  31044. byte* buff = NULL;
  31045. #else
  31046. WC_RNG tmpRNG[1];
  31047. byte buff[1024];
  31048. #endif
  31049. WOLFSSL_ENTER("wolfSSL_BN_pseudo_rand");
  31050. if (bits <= 0) {
  31051. return WOLFSSL_FAILURE;
  31052. }
  31053. len = bits / 8;
  31054. if (bits % 8)
  31055. len++;
  31056. /* has to be a length of at least 1 since we set buf[0] and buf[len-1] */
  31057. if (top == 1 || top == 0 || bottom == 1) {
  31058. if (len < 1) {
  31059. return WOLFSSL_FAILURE;
  31060. }
  31061. }
  31062. #ifdef WOLFSSL_SMALL_STACK
  31063. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31064. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31065. if (buff == NULL || tmpRNG == NULL) {
  31066. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31067. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31068. return ret;
  31069. }
  31070. #endif
  31071. if (bn == NULL || bn->internal == NULL)
  31072. WOLFSSL_MSG("Bad function arguments");
  31073. else if (wc_InitRng(tmpRNG) == 0) {
  31074. rng = tmpRNG;
  31075. initTmpRng = 1;
  31076. }
  31077. else if (initGlobalRNG)
  31078. rng = &globalRNG;
  31079. if (rng) {
  31080. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  31081. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  31082. else {
  31083. switch (top) {
  31084. case -1:
  31085. break;
  31086. case 0:
  31087. buff[0] |= 0x80;
  31088. break;
  31089. case 1:
  31090. buff[0] |= 0x80 | 0x40;
  31091. break;
  31092. }
  31093. if (bottom == 1) {
  31094. buff[len-1] |= 0x01;
  31095. }
  31096. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  31097. WOLFSSL_MSG("mp read bin failed");
  31098. else
  31099. ret = WOLFSSL_SUCCESS;
  31100. }
  31101. }
  31102. if (initTmpRng)
  31103. wc_FreeRng(tmpRNG);
  31104. #ifdef WOLFSSL_SMALL_STACK
  31105. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31106. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31107. #endif
  31108. return ret;
  31109. }
  31110. /* return code compliant with OpenSSL :
  31111. * 1 if bit set, 0 else
  31112. */
  31113. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  31114. {
  31115. if (bn == NULL || bn->internal == NULL) {
  31116. WOLFSSL_MSG("bn NULL error");
  31117. return WOLFSSL_FAILURE;
  31118. }
  31119. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  31120. }
  31121. /* return code compliant with OpenSSL :
  31122. * 1 if success, 0 else
  31123. */
  31124. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  31125. {
  31126. if (bn == NULL || bn->internal == NULL) {
  31127. WOLFSSL_MSG("bn NULL error");
  31128. return WOLFSSL_FAILURE;
  31129. }
  31130. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  31131. WOLFSSL_MSG("mp_set_bit error");
  31132. return WOLFSSL_FAILURE;
  31133. }
  31134. return WOLFSSL_SUCCESS;
  31135. }
  31136. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  31137. {
  31138. int ret = WOLFSSL_FAILURE;
  31139. #ifndef WOLFSSL_SMALL_STACK
  31140. mp_int tmp[1];
  31141. #else
  31142. mp_int* tmp = NULL;
  31143. #endif
  31144. if (bn == NULL || bn->internal == NULL) {
  31145. WOLFSSL_MSG("bn NULL error");
  31146. goto end;
  31147. }
  31148. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  31149. #ifdef WOLFSSL_SMALL_STACK
  31150. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  31151. if (tmp == NULL) {
  31152. goto end;
  31153. }
  31154. #endif
  31155. if (mp_init(tmp) != MP_OKAY) {
  31156. goto end;
  31157. }
  31158. if (mp_set_bit(tmp, n) != MP_OKAY) {
  31159. goto cleanup;
  31160. }
  31161. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  31162. goto cleanup;
  31163. }
  31164. } else {
  31165. goto end;
  31166. }
  31167. ret = WOLFSSL_SUCCESS;
  31168. cleanup:
  31169. mp_clear(tmp);
  31170. end:
  31171. #ifdef WOLFSSL_SMALL_STACK
  31172. if (tmp)
  31173. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  31174. #endif
  31175. return ret;
  31176. }
  31177. /* WOLFSSL_SUCCESS on ok */
  31178. /* Note on use: this function expects str to be an even length. It is
  31179. * converting pairs of bytes into 8-bit values. As an example, the RSA
  31180. * public exponent is commonly 0x010001. To get it to convert, you need
  31181. * to pass in the string "010001", it will fail if you use "10001". This
  31182. * is an affect of how Base16_Decode() works.
  31183. */
  31184. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  31185. {
  31186. int ret = 0;
  31187. word32 decSz = 1024;
  31188. #ifdef WOLFSSL_SMALL_STACK
  31189. byte* decoded;
  31190. #else
  31191. byte decoded[1024];
  31192. #endif
  31193. int weOwn = 0;
  31194. int strLen;
  31195. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  31196. #ifdef WOLFSSL_SMALL_STACK
  31197. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  31198. if (decoded == NULL)
  31199. return ret;
  31200. #endif
  31201. if (str == NULL || str[0] == '\0') {
  31202. WOLFSSL_MSG("Bad function argument");
  31203. ret = WOLFSSL_FAILURE;
  31204. } else {
  31205. strLen = (int)XSTRLEN(str);
  31206. /* ignore trailing new lines */
  31207. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  31208. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  31209. WOLFSSL_MSG("Bad Base16_Decode error");
  31210. else if (bn == NULL)
  31211. ret = decSz;
  31212. else {
  31213. if (*bn == NULL) {
  31214. *bn = wolfSSL_BN_new();
  31215. if (*bn != NULL) {
  31216. weOwn = 1;
  31217. }
  31218. }
  31219. if (*bn == NULL)
  31220. WOLFSSL_MSG("BN new failed");
  31221. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  31222. WOLFSSL_MSG("Bad bin2bn error");
  31223. if (weOwn == 1) {
  31224. wolfSSL_BN_free(*bn); /* Free new BN */
  31225. }
  31226. }
  31227. else
  31228. ret = WOLFSSL_SUCCESS;
  31229. }
  31230. }
  31231. #ifdef WOLFSSL_SMALL_STACK
  31232. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  31233. #endif
  31234. return ret;
  31235. }
  31236. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  31237. {
  31238. WOLFSSL_BIGNUM* ret;
  31239. WOLFSSL_MSG("wolfSSL_BN_dup");
  31240. if (bn == NULL || bn->internal == NULL) {
  31241. WOLFSSL_MSG("bn NULL error");
  31242. return NULL;
  31243. }
  31244. ret = wolfSSL_BN_new();
  31245. if (ret == NULL) {
  31246. WOLFSSL_MSG("bn new error");
  31247. return NULL;
  31248. }
  31249. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  31250. WOLFSSL_MSG("mp_copy error");
  31251. wolfSSL_BN_free(ret);
  31252. return NULL;
  31253. }
  31254. ret->neg = bn->neg;
  31255. return ret;
  31256. }
  31257. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  31258. {
  31259. WOLFSSL_MSG("wolfSSL_BN_copy");
  31260. if (r == NULL || bn == NULL) {
  31261. WOLFSSL_MSG("r or bn NULL error");
  31262. return NULL;
  31263. }
  31264. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  31265. WOLFSSL_MSG("mp_copy error");
  31266. return NULL;
  31267. }
  31268. r->neg = bn->neg;
  31269. return r;
  31270. }
  31271. /* return code compliant with OpenSSL :
  31272. * 1 if success, 0 else
  31273. */
  31274. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
  31275. {
  31276. WOLFSSL_MSG("wolfSSL_BN_set_word");
  31277. if (bn == NULL) {
  31278. WOLFSSL_MSG("bn NULL error");
  31279. return WOLFSSL_FAILURE;
  31280. }
  31281. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  31282. WOLFSSL_MSG("mp_init_set_int error");
  31283. return WOLFSSL_FAILURE;
  31284. }
  31285. return WOLFSSL_SUCCESS;
  31286. }
  31287. static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
  31288. #if DIGIT_BIT >= (SIZEOF_LONG * CHAR_BIT)
  31289. return (WOLFSSL_BN_ULONG)mp->dp[0];
  31290. #else
  31291. WOLFSSL_BN_ULONG ret = 0UL;
  31292. int digit_i;
  31293. for (digit_i = 0; digit_i < mp->used; ++digit_i)
  31294. ret |= ((WOLFSSL_BN_ULONG)mp->dp[digit_i]) << (DIGIT_BIT * digit_i);
  31295. return ret;
  31296. #endif
  31297. }
  31298. /* Returns the big number as an unsigned long if possible.
  31299. *
  31300. * bn big number structure to get value from
  31301. *
  31302. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  31303. */
  31304. WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  31305. {
  31306. WOLFSSL_MSG("wolfSSL_BN_get_word");
  31307. if (bn == NULL) {
  31308. WOLFSSL_MSG("Invalid argument");
  31309. return 0;
  31310. }
  31311. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  31312. WOLFSSL_MSG("bignum is larger than unsigned long");
  31313. return 0xFFFFFFFFL;
  31314. }
  31315. return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
  31316. }
  31317. /* return code compliant with OpenSSL :
  31318. * number length in decimal if success, 0 if error
  31319. */
  31320. #ifndef NO_WOLFSSL_STUB
  31321. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  31322. {
  31323. (void)bn;
  31324. (void)str;
  31325. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  31326. WOLFSSL_STUB("BN_dec2bn");
  31327. return SSL_FAILURE;
  31328. }
  31329. #endif
  31330. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  31331. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  31332. {
  31333. int len = 0;
  31334. char *buf;
  31335. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  31336. if (bn == NULL || bn->internal == NULL) {
  31337. WOLFSSL_MSG("bn NULL error");
  31338. return NULL;
  31339. }
  31340. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  31341. WOLFSSL_MSG("mp_radix_size failure");
  31342. return NULL;
  31343. }
  31344. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  31345. if (buf == NULL) {
  31346. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  31347. return NULL;
  31348. }
  31349. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  31350. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  31351. return NULL;
  31352. }
  31353. return buf;
  31354. }
  31355. #else
  31356. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  31357. {
  31358. (void)bn;
  31359. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  31360. return NULL;
  31361. }
  31362. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  31363. /* Internal function for adding/subtracting an unsigned long from a
  31364. * WOLFSSL_BIGNUM. To add, pass "sub" as 0. To subtract, pass it as 1.
  31365. * Returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on failure.
  31366. */
  31367. static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
  31368. int sub)
  31369. {
  31370. int ret = WOLFSSL_SUCCESS;
  31371. int rc = 0;
  31372. #ifdef WOLFSSL_SMALL_STACK
  31373. mp_int *w_mp = (mp_int *)XMALLOC(sizeof(*w_mp), NULL,
  31374. DYNAMIC_TYPE_TMP_BUFFER);
  31375. if (w_mp == NULL)
  31376. return WOLFSSL_FAILURE;
  31377. #else
  31378. mp_int w_mp[1];
  31379. #endif
  31380. XMEMSET(w_mp, 0, sizeof(*w_mp));
  31381. if (bn == NULL || bn->internal == NULL) {
  31382. WOLFSSL_MSG("bn NULL error");
  31383. ret = WOLFSSL_FAILURE;
  31384. }
  31385. if (ret == WOLFSSL_SUCCESS) {
  31386. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  31387. if (sub == 1) {
  31388. rc = mp_sub_d((mp_int*)bn->internal, (mp_digit)w,
  31389. (mp_int*)bn->internal);
  31390. }
  31391. else {
  31392. rc = mp_add_d((mp_int*)bn->internal, (mp_digit)w,
  31393. (mp_int*)bn->internal);
  31394. }
  31395. if (rc != MP_OKAY) {
  31396. WOLFSSL_MSG("mp_add/sub_d error");
  31397. ret = WOLFSSL_FAILURE;
  31398. }
  31399. }
  31400. else {
  31401. if (mp_init(w_mp) != MP_OKAY) {
  31402. ret = WOLFSSL_FAILURE;
  31403. }
  31404. if (ret == WOLFSSL_SUCCESS) {
  31405. if (mp_set_int(w_mp, w) != MP_OKAY) {
  31406. ret = WOLFSSL_FAILURE;
  31407. }
  31408. }
  31409. if (ret == WOLFSSL_SUCCESS) {
  31410. if (sub == 1) {
  31411. rc = mp_sub((mp_int *)bn->internal, w_mp,
  31412. (mp_int *)bn->internal);
  31413. }
  31414. else {
  31415. rc = mp_add((mp_int *)bn->internal, w_mp,
  31416. (mp_int *)bn->internal);
  31417. }
  31418. if (rc != MP_OKAY) {
  31419. WOLFSSL_MSG("mp_add/sub error");
  31420. ret = WOLFSSL_FAILURE;
  31421. }
  31422. }
  31423. }
  31424. }
  31425. mp_free(w_mp);
  31426. #ifdef WOLFSSL_SMALL_STACK
  31427. XFREE(w_mp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31428. #endif
  31429. return ret;
  31430. }
  31431. /* return code compliant with OpenSSL :
  31432. * 1 if success, 0 else
  31433. */
  31434. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  31435. {
  31436. int ret;
  31437. WOLFSSL_ENTER("wolfSSL_BN_add_word");
  31438. ret = wolfSSL_BN_add_word_int(bn, w, 0);
  31439. WOLFSSL_LEAVE("wolfSSL_BN_add_word", ret);
  31440. return ret;
  31441. }
  31442. /* return code compliant with OpenSSL :
  31443. * 1 if success, 0 else
  31444. */
  31445. WOLFSSL_API int wolfSSL_BN_sub_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  31446. {
  31447. int ret;
  31448. WOLFSSL_ENTER("wolfSSL_BN_sub_word");
  31449. ret = wolfSSL_BN_add_word_int(bn, w, 1);
  31450. WOLFSSL_LEAVE("wolfSSL_BN_sub_word", ret);
  31451. return ret;
  31452. }
  31453. #ifndef WOLFSSL_SP_MATH
  31454. /* return code compliant with OpenSSL :
  31455. * 1 if success, 0 else
  31456. */
  31457. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  31458. {
  31459. WOLFSSL_MSG("wolfSSL_BN_lshift");
  31460. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  31461. WOLFSSL_MSG("bn NULL error");
  31462. return WOLFSSL_FAILURE;
  31463. }
  31464. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  31465. WOLFSSL_MSG("mp_mul_2d error");
  31466. return WOLFSSL_FAILURE;
  31467. }
  31468. return WOLFSSL_SUCCESS;
  31469. }
  31470. /* return code compliant with OpenSSL :
  31471. * 1 if success, 0 else
  31472. */
  31473. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  31474. {
  31475. WOLFSSL_MSG("wolfSSL_BN_rshift");
  31476. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  31477. WOLFSSL_MSG("bn NULL error");
  31478. return WOLFSSL_FAILURE;
  31479. }
  31480. if (mp_div_2d((mp_int*)bn->internal, n,
  31481. (mp_int*)r->internal, NULL) != MP_OKAY) {
  31482. WOLFSSL_MSG("mp_mul_2d error");
  31483. return WOLFSSL_FAILURE;
  31484. }
  31485. return WOLFSSL_SUCCESS;
  31486. }
  31487. #endif
  31488. /* return code compliant with OpenSSL :
  31489. * 1 if success, 0 else
  31490. */
  31491. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  31492. {
  31493. WOLFSSL_MSG("wolfSSL_BN_add");
  31494. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  31495. b == NULL || b->internal == NULL) {
  31496. WOLFSSL_MSG("bn NULL error");
  31497. return WOLFSSL_FAILURE;
  31498. }
  31499. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  31500. (mp_int*)r->internal) != MP_OKAY) {
  31501. WOLFSSL_MSG("mp_add_d error");
  31502. return WOLFSSL_FAILURE;
  31503. }
  31504. return WOLFSSL_SUCCESS;
  31505. }
  31506. #ifndef WOLFSSL_SP_MATH
  31507. /* r = a + b (mod m) */
  31508. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  31509. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  31510. WOLFSSL_BN_CTX *ctx)
  31511. {
  31512. (void)ctx;
  31513. WOLFSSL_MSG("wolfSSL_BN_add");
  31514. if (r == NULL || r->internal == NULL ||
  31515. a == NULL || a->internal == NULL ||
  31516. b == NULL || b->internal == NULL ||
  31517. m == NULL || m->internal == NULL) {
  31518. WOLFSSL_MSG("bn NULL error");
  31519. return WOLFSSL_FAILURE;
  31520. }
  31521. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  31522. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  31523. WOLFSSL_MSG("mp_add_d error");
  31524. return WOLFSSL_FAILURE;
  31525. }
  31526. return WOLFSSL_SUCCESS;
  31527. }
  31528. #endif
  31529. #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA))
  31530. int wolfSSL_BN_generate_prime_ex(WOLFSSL_BIGNUM* prime, int bits,
  31531. int safe, const WOLFSSL_BIGNUM* add, const WOLFSSL_BIGNUM* rem,
  31532. WOLFSSL_BN_GENCB* cb)
  31533. {
  31534. int ret = WOLFSSL_SUCCESS;
  31535. #ifdef WOLFSSL_SMALL_STACK
  31536. WC_RNG* rng = NULL;
  31537. #else
  31538. WC_RNG rng[1];
  31539. #endif
  31540. (void)cb;
  31541. WOLFSSL_ENTER("wolfSSL_BN_generate_prime_ex");
  31542. if (safe == 1 || add != NULL || rem != NULL) {
  31543. /* These parameters aren't supported, yet. */
  31544. ret = WOLFSSL_FAILURE;
  31545. }
  31546. if (prime == NULL || prime->internal == NULL) {
  31547. ret = WOLFSSL_FAILURE;
  31548. }
  31549. #ifdef WOLFSSL_SMALL_STACK
  31550. if (ret == WOLFSSL_SUCCESS) {
  31551. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31552. if (rng == NULL) {
  31553. ret = WOLFSSL_FAILURE;
  31554. }
  31555. }
  31556. #endif
  31557. if (ret == WOLFSSL_SUCCESS) {
  31558. XMEMSET(rng, 0, sizeof(WC_RNG));
  31559. if (wc_InitRng(rng) != 0) {
  31560. ret = WOLFSSL_FAILURE;
  31561. }
  31562. }
  31563. if (ret == WOLFSSL_SUCCESS) {
  31564. if (mp_rand_prime((mp_int*)prime->internal, (bits + 7) / 8, rng, NULL)
  31565. != MP_OKAY) {
  31566. ret = WOLFSSL_FAILURE;
  31567. }
  31568. }
  31569. wc_FreeRng(rng);
  31570. #ifdef WOLFSSL_SMALL_STACK
  31571. if (rng != NULL)
  31572. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  31573. #endif
  31574. WOLFSSL_LEAVE("wolfSSL_BN_generate_prime_ex", ret);
  31575. return ret;
  31576. }
  31577. /* return code compliant with OpenSSL :
  31578. * 1 if prime, 0 if not, -1 if error
  31579. */
  31580. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  31581. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  31582. {
  31583. WC_RNG* rng = NULL;
  31584. #ifdef WOLFSSL_SMALL_STACK
  31585. WC_RNG* tmpRNG = NULL;
  31586. #else
  31587. WC_RNG tmpRNG[1];
  31588. #endif
  31589. int initTmpRng = 0;
  31590. int res = MP_NO;
  31591. (void)ctx;
  31592. (void)cb;
  31593. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  31594. if (bn == NULL || bn->internal == NULL) {
  31595. WOLFSSL_MSG("bn NULL error");
  31596. return WOLFSSL_FATAL_ERROR;
  31597. }
  31598. #ifdef WOLFSSL_SMALL_STACK
  31599. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31600. if (tmpRNG == NULL)
  31601. return WOLFSSL_FAILURE;
  31602. #endif
  31603. if (wc_InitRng(tmpRNG) == 0) {
  31604. rng = tmpRNG;
  31605. initTmpRng = 1;
  31606. }
  31607. else {
  31608. WOLFSSL_MSG("Bad RNG Init, trying global");
  31609. if (initGlobalRNG == 0) {
  31610. WOLFSSL_MSG("Global RNG no Init");
  31611. }
  31612. else
  31613. rng = &globalRNG;
  31614. }
  31615. if (rng) {
  31616. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  31617. nbchecks, &res, rng) != MP_OKAY) {
  31618. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  31619. res = MP_NO;
  31620. }
  31621. }
  31622. if (initTmpRng)
  31623. wc_FreeRng(tmpRNG);
  31624. #ifdef WOLFSSL_SMALL_STACK
  31625. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  31626. #endif
  31627. if (res != MP_YES) {
  31628. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  31629. return WOLFSSL_FAILURE;
  31630. }
  31631. return WOLFSSL_SUCCESS;
  31632. }
  31633. /* return code compliant with OpenSSL :
  31634. * (bn mod w) if success, -1 if error
  31635. */
  31636. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  31637. WOLFSSL_BN_ULONG w)
  31638. {
  31639. WOLFSSL_BN_ULONG ret = 0;
  31640. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  31641. if (bn == NULL || bn->internal == NULL) {
  31642. WOLFSSL_MSG("bn NULL error");
  31643. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  31644. }
  31645. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  31646. mp_digit bn_ret;
  31647. if (mp_mod_d((mp_int*)bn->internal, (mp_digit)w, &bn_ret) != MP_OKAY) {
  31648. WOLFSSL_MSG("mp_add_d error");
  31649. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  31650. }
  31651. ret = (WOLFSSL_BN_ULONG)bn_ret;
  31652. } else {
  31653. int mp_ret;
  31654. mp_int w_mp, r_mp;
  31655. if (mp_init(&w_mp) != MP_OKAY)
  31656. return (unsigned long)WOLFSSL_FAILURE;
  31657. if (mp_init(&r_mp) != MP_OKAY)
  31658. return (unsigned long)WOLFSSL_FAILURE;
  31659. if (mp_set_int(&w_mp, w) != MP_OKAY)
  31660. return (unsigned long)WOLFSSL_FAILURE;
  31661. mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
  31662. ret = wolfSSL_BN_get_word_1(&r_mp);
  31663. mp_free(&r_mp);
  31664. mp_free(&w_mp);
  31665. if (mp_ret != MP_OKAY) {
  31666. WOLFSSL_MSG("mp_mod error");
  31667. return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
  31668. }
  31669. }
  31670. return ret;
  31671. }
  31672. #endif /* WOLFSSL_KEY_GEN && (!NO_RSA || !NO_DH || !NO_DSA) */
  31673. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  31674. {
  31675. int len = 0;
  31676. char *buf;
  31677. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  31678. if (bn == NULL || bn->internal == NULL) {
  31679. WOLFSSL_MSG("bn NULL error");
  31680. return NULL;
  31681. }
  31682. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  31683. WOLFSSL_MSG("mp_radix_size failure");
  31684. return NULL;
  31685. }
  31686. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  31687. if (buf == NULL) {
  31688. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  31689. return NULL;
  31690. }
  31691. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  31692. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  31693. return NULL;
  31694. }
  31695. return buf;
  31696. }
  31697. #ifndef NO_FILESYSTEM
  31698. /* return code compliant with OpenSSL :
  31699. * 1 if success, 0 if error
  31700. */
  31701. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  31702. {
  31703. char *buf;
  31704. int ret;
  31705. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  31706. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  31707. WOLFSSL_MSG("bn NULL error");
  31708. return WOLFSSL_FAILURE;
  31709. }
  31710. buf = wolfSSL_BN_bn2hex(bn);
  31711. if (buf == NULL) {
  31712. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  31713. return WOLFSSL_FAILURE;
  31714. }
  31715. if (XFPRINTF(fp, "%s", buf) < 0)
  31716. ret = WOLFSSL_FAILURE;
  31717. else
  31718. ret = WOLFSSL_SUCCESS;
  31719. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  31720. return ret;
  31721. }
  31722. #endif /* !NO_FILESYSTEM */
  31723. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  31724. {
  31725. /* ctx is not used, return new Bignum */
  31726. (void)ctx;
  31727. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  31728. return wolfSSL_BN_new();
  31729. }
  31730. #ifndef NO_WOLFSSL_STUB
  31731. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  31732. {
  31733. (void)ctx;
  31734. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  31735. WOLFSSL_STUB("BN_CTX_start");
  31736. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  31737. }
  31738. #endif
  31739. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  31740. WOLFSSL_BIGNUM *a,
  31741. const WOLFSSL_BIGNUM *n,
  31742. WOLFSSL_BN_CTX *ctx)
  31743. {
  31744. int dynamic = 0;
  31745. /* ctx is not used */
  31746. (void)ctx;
  31747. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  31748. /* check parameter */
  31749. if (r == NULL) {
  31750. r = wolfSSL_BN_new();
  31751. if (r == NULL){
  31752. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  31753. return NULL;
  31754. }
  31755. dynamic = 1;
  31756. }
  31757. if (a == NULL) {
  31758. WOLFSSL_MSG("a NULL error");
  31759. if (dynamic == 1) {
  31760. wolfSSL_BN_free(r);
  31761. }
  31762. return NULL;
  31763. }
  31764. if (n == NULL) {
  31765. WOLFSSL_MSG("n NULL error");
  31766. if (dynamic == 1) {
  31767. wolfSSL_BN_free(r);
  31768. }
  31769. return NULL;
  31770. }
  31771. /* Compute inverse of a modulo n and return r */
  31772. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  31773. (mp_int*)r->internal) == MP_VAL){
  31774. WOLFSSL_MSG("mp_invmod() error");
  31775. if (dynamic == 1) {
  31776. wolfSSL_BN_free(r);
  31777. }
  31778. return NULL;
  31779. }
  31780. return r;
  31781. }
  31782. #endif /* OPENSSL_EXTRA */
  31783. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) && \
  31784. !defined(NO_ASN)
  31785. #ifndef NO_BIO
  31786. static int unprintable_char(char c)
  31787. {
  31788. const unsigned char last_unprintable = 31;
  31789. const unsigned char LF = 10;
  31790. const unsigned char CR = 13;
  31791. if (c <= last_unprintable && c != LF && c != CR) {
  31792. return 1;
  31793. }
  31794. return 0;
  31795. }
  31796. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  31797. {
  31798. int i;
  31799. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  31800. if (out == NULL || str == NULL)
  31801. return WOLFSSL_FAILURE;
  31802. for (i=0; i < str->length; i++) {
  31803. if (unprintable_char(str->data[i])) {
  31804. str->data[i] = '.';
  31805. }
  31806. }
  31807. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  31808. return WOLFSSL_FAILURE;
  31809. }
  31810. return str->length;
  31811. }
  31812. #endif /* !NO_BIO */
  31813. #endif /* (WOLFSSL_QT || OPENSSL_ALL || OPENSSL_EXTRA) && !NO_ASN */
  31814. #if defined(OPENSSL_EXTRA)
  31815. const char *wolfSSL_ASN1_tag2str(int tag)
  31816. {
  31817. static const char *const tag_label[31] = {
  31818. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  31819. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  31820. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  31821. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  31822. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  31823. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  31824. "<ASN1 29>", "BMPSTRING"
  31825. };
  31826. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  31827. tag &= ~0x100;
  31828. if (tag < 0 || tag > 30)
  31829. return "(unknown)";
  31830. return tag_label[tag];
  31831. }
  31832. #ifndef NO_BIO
  31833. static int check_esc_char(char c, char *esc)
  31834. {
  31835. char *ptr;
  31836. ptr = esc;
  31837. while(*ptr != 0){
  31838. if (c == *ptr)
  31839. return 1;
  31840. ptr++;
  31841. }
  31842. return 0;
  31843. }
  31844. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  31845. unsigned long flags)
  31846. {
  31847. size_t str_len = 0, type_len = 0;
  31848. unsigned char *typebuf = NULL;
  31849. const char *hash="#";
  31850. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  31851. if (out == NULL || str == NULL)
  31852. return WOLFSSL_FAILURE;
  31853. /* add ASN1 type tag */
  31854. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  31855. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  31856. /* colon len + tag len + null*/
  31857. type_len = XSTRLEN(tag) + 2;
  31858. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31859. if (typebuf == NULL){
  31860. WOLFSSL_MSG("memory alloc failed.");
  31861. return WOLFSSL_FAILURE;
  31862. }
  31863. XMEMSET(typebuf, 0, type_len);
  31864. if (XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag)
  31865. >= (int)type_len)
  31866. {
  31867. WOLFSSL_MSG("Buffer overrun.");
  31868. return WOLFSSL_FAILURE;
  31869. }
  31870. type_len--;
  31871. }
  31872. /* dump hex */
  31873. if (flags & ASN1_STRFLGS_DUMP_ALL){
  31874. char hex_tmp[4];
  31875. char *str_ptr, *str_end;
  31876. if (type_len > 0){
  31877. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  31878. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31879. return WOLFSSL_FAILURE;
  31880. }
  31881. str_len += type_len;
  31882. }
  31883. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  31884. goto err_exit;
  31885. }
  31886. str_len++;
  31887. if (flags & ASN1_STRFLGS_DUMP_DER){
  31888. ByteToHexStr((byte)str->type, &hex_tmp[0]);
  31889. ByteToHexStr((byte)str->length, &hex_tmp[2]);
  31890. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  31891. goto err_exit;
  31892. }
  31893. str_len += 4;
  31894. XMEMSET(hex_tmp, 0, 4);
  31895. }
  31896. str_ptr = str->data;
  31897. str_end = str->data + str->length;
  31898. while (str_ptr < str_end){
  31899. ByteToHexStr((byte)*str_ptr, &hex_tmp[0]);
  31900. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  31901. goto err_exit;
  31902. }
  31903. str_ptr++;
  31904. str_len += 2;
  31905. }
  31906. if (type_len > 0)
  31907. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31908. return (int)str_len;
  31909. }
  31910. if (type_len > 0){
  31911. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  31912. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31913. return WOLFSSL_FAILURE;
  31914. }
  31915. str_len += type_len;
  31916. }
  31917. if (flags & ASN1_STRFLGS_ESC_2253){
  31918. char esc_ch[] = "+;<>\\";
  31919. char* esc_ptr;
  31920. esc_ptr = str->data;
  31921. while (*esc_ptr != 0){
  31922. if (check_esc_char(*esc_ptr, esc_ch)){
  31923. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  31924. goto err_exit;
  31925. str_len++;
  31926. }
  31927. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  31928. goto err_exit;
  31929. str_len++;
  31930. esc_ptr++;
  31931. }
  31932. if (type_len > 0)
  31933. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31934. return (int)str_len;
  31935. }
  31936. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  31937. goto err_exit;
  31938. }
  31939. str_len += str->length;
  31940. if (type_len > 0)
  31941. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31942. return (int)str_len;
  31943. err_exit:
  31944. if (type_len > 0)
  31945. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31946. return WOLFSSL_FAILURE;
  31947. }
  31948. #endif /* !NO_BIO */
  31949. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  31950. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  31951. int offset_day, long offset_sec)
  31952. {
  31953. const time_t sec_per_day = 24*60*60;
  31954. time_t t_adj = 0;
  31955. time_t offset_day_sec = 0;
  31956. char time_str[MAX_TIME_STRING_SZ];
  31957. int time_get;
  31958. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  31959. if (s == NULL) {
  31960. s = wolfSSL_ASN1_TIME_new();
  31961. if (s == NULL) {
  31962. return NULL;
  31963. }
  31964. }
  31965. /* compute GMT time with offset */
  31966. offset_day_sec = offset_day * sec_per_day;
  31967. t_adj = t + offset_day_sec + offset_sec;
  31968. /* Get time string as either UTC or GeneralizedTime */
  31969. time_get = GetFormattedTime(&t_adj, (byte*)time_str,
  31970. (word32)sizeof(time_str));
  31971. if (time_get <= 0) {
  31972. wolfSSL_ASN1_TIME_free(s);
  31973. return NULL;
  31974. }
  31975. if (wolfSSL_ASN1_TIME_set_string(s, time_str) != WOLFSSL_SUCCESS) {
  31976. wolfSSL_ASN1_TIME_free(s);
  31977. return NULL;
  31978. }
  31979. return s;
  31980. }
  31981. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  31982. #ifndef NO_ASN_TIME
  31983. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  31984. {
  31985. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  31986. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  31987. if (!ret)
  31988. return NULL;
  31989. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  31990. return ret;
  31991. }
  31992. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  31993. {
  31994. if (t) {
  31995. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  31996. }
  31997. }
  31998. /* not a compatibility function - length getter for opaque type */
  31999. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  32000. {
  32001. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  32002. if (t == NULL)
  32003. return WOLFSSL_FAILURE;
  32004. return t->length;
  32005. }
  32006. /* not a compatibility function - data getter for opaque type */
  32007. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  32008. {
  32009. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  32010. if (t == NULL)
  32011. return NULL;
  32012. return t->data;
  32013. }
  32014. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  32015. WOLFSSL_ASN1_TIME **out)
  32016. {
  32017. int time_type = 0;
  32018. WOLFSSL_ASN1_TIME *ret = NULL;
  32019. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  32020. if (t == NULL) {
  32021. WOLFSSL_MSG("Invalid ASN_TIME value");
  32022. } else {
  32023. time_type = t->type;
  32024. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  32025. WOLFSSL_MSG("Invalid ASN_TIME type.");
  32026. } else {
  32027. if (out == NULL || *out == NULL) {
  32028. ret = wolfSSL_ASN1_TIME_new();
  32029. if (ret == NULL){
  32030. WOLFSSL_MSG("memory alloc failed.");
  32031. }
  32032. } else {
  32033. ret = *out;
  32034. }
  32035. }
  32036. }
  32037. if (ret != NULL) {
  32038. if (time_type == ASN_GENERALIZED_TIME){
  32039. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  32040. } else { /* ASN_UTC_TIME */
  32041. /* convert UTC to generalized time */
  32042. ret->type = ASN_GENERALIZED_TIME;
  32043. ret->length = ASN_GENERALIZED_TIME_SIZE;
  32044. if (t->data[0] >= '5') {
  32045. ret->data[0] = '1'; ret->data[1] = '9';
  32046. } else {
  32047. ret->data[0] = '2'; ret->data[1] = '0';
  32048. }
  32049. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  32050. }
  32051. }
  32052. return ret;
  32053. }
  32054. #endif /* !NO_ASN_TIME */
  32055. #ifndef NO_ASN
  32056. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  32057. {
  32058. unsigned char *pptr = NULL;
  32059. char pad = 0 ;
  32060. unsigned char pad_val = 0;
  32061. int ret_size = 0;
  32062. unsigned char data1 = 0;
  32063. unsigned char neg = 0;
  32064. int i = 0;
  32065. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  32066. if (a == NULL)
  32067. return WOLFSSL_FAILURE;
  32068. ret_size = a->intData[1];
  32069. if (ret_size == 0)
  32070. ret_size = 1;
  32071. else{
  32072. ret_size = (int)a->intData[1];
  32073. neg = a->negative;
  32074. data1 = a->intData[2];
  32075. if (ret_size == 1 && data1 == 0)
  32076. neg = 0;
  32077. /* 0x80 or greater positive number in first byte */
  32078. if (!neg && (data1 > 127)){
  32079. pad = 1;
  32080. pad_val = 0;
  32081. } else if (neg){
  32082. /* negative number */
  32083. if (data1 > 128){
  32084. pad = 1;
  32085. pad_val = 0xff;
  32086. } else if (data1 == 128){
  32087. for (i = 3; i < a->intData[1] + 2; i++){
  32088. if (a->intData[i]){
  32089. pad = 1;
  32090. pad_val = 0xff;
  32091. break;
  32092. }
  32093. }
  32094. }
  32095. }
  32096. ret_size += (int)pad;
  32097. }
  32098. if (pp == NULL)
  32099. return ret_size;
  32100. pptr = *pp;
  32101. if (pad)
  32102. *(pptr++) = pad_val;
  32103. if (a->intData[1] == 0)
  32104. *(pptr++) = 0;
  32105. else if (!neg){
  32106. /* positive number */
  32107. for (i=0; i < a->intData[1]; i++){
  32108. *pptr = a->intData[i+2];
  32109. pptr++;
  32110. }
  32111. } else {
  32112. /* negative number */
  32113. int str_len = 0;
  32114. /* 0 padding from end of buffer */
  32115. str_len = (int)a->intData[1];
  32116. pptr += a->intData[1] - 1;
  32117. while (!a->intData[str_len + 2] && str_len > 1){
  32118. *(pptr--) = 0;
  32119. str_len--;
  32120. }
  32121. /* 2's complement next octet */
  32122. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  32123. str_len--;
  32124. /* Complement any octets left */
  32125. while (str_len > 0){
  32126. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  32127. str_len--;
  32128. }
  32129. }
  32130. *pp += ret_size;
  32131. return ret_size;
  32132. }
  32133. #endif /* !NO_ASN */
  32134. #endif /* OPENSSL_EXTRA */
  32135. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  32136. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  32137. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  32138. * disabled since a copy of mpi is made by this function and placed into bn.
  32139. */
  32140. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  32141. {
  32142. byte dynamic = 0;
  32143. #ifdef WOLFSSL_DEBUG_OPENSSL
  32144. WOLFSSL_MSG("Entering SetIndividualExternal");
  32145. #endif
  32146. if (mpi == NULL || bn == NULL) {
  32147. WOLFSSL_MSG("mpi NULL error");
  32148. return WOLFSSL_FATAL_ERROR;
  32149. }
  32150. if (*bn == NULL) {
  32151. *bn = wolfSSL_BN_new();
  32152. if (*bn == NULL) {
  32153. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  32154. return WOLFSSL_FATAL_ERROR;
  32155. }
  32156. dynamic = 1;
  32157. }
  32158. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  32159. WOLFSSL_MSG("mp_copy error");
  32160. if (dynamic == 1) {
  32161. wolfSSL_BN_free(*bn);
  32162. }
  32163. return WOLFSSL_FATAL_ERROR;
  32164. }
  32165. return WOLFSSL_SUCCESS;
  32166. }
  32167. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  32168. {
  32169. if (bn)
  32170. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  32171. }
  32172. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  32173. {
  32174. WOLFSSL_BIGNUM* external;
  32175. mp_int* mpi;
  32176. #ifdef WOLFSSL_DEBUG_OPENSSL
  32177. WOLFSSL_MSG("wolfSSL_BN_new");
  32178. #endif
  32179. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  32180. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  32181. if (mpi == NULL) {
  32182. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  32183. return NULL;
  32184. }
  32185. #endif
  32186. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  32187. DYNAMIC_TYPE_BIGINT);
  32188. if (external == NULL) {
  32189. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  32190. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  32191. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  32192. #endif
  32193. return NULL;
  32194. }
  32195. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  32196. mpi = &external->fp;
  32197. #endif
  32198. InitwolfSSL_BigNum(external);
  32199. if (mp_init(mpi) != MP_OKAY) {
  32200. wolfSSL_BN_free(external);
  32201. return NULL;
  32202. }
  32203. external->internal = mpi;
  32204. return external;
  32205. }
  32206. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  32207. /* This function works without BN_free only with TFM */
  32208. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  32209. {
  32210. if(bn == NULL)return;
  32211. #ifdef WOLFSSL_DEBUG_OPENSSL
  32212. WOLFSSL_MSG("wolfSSL_BN_init");
  32213. #endif
  32214. InitwolfSSL_BigNum(bn);
  32215. if (mp_init(&bn->fp) != MP_OKAY)
  32216. return;
  32217. bn->internal = (void *)&bn->fp;
  32218. }
  32219. #endif
  32220. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  32221. {
  32222. #ifdef WOLFSSL_DEBUG_OPENSSL
  32223. WOLFSSL_MSG("wolfSSL_BN_free");
  32224. #endif
  32225. if (bn) {
  32226. if (bn->internal) {
  32227. mp_int* bni = (mp_int*)bn->internal;
  32228. mp_free(bni);
  32229. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  32230. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  32231. #endif
  32232. bn->internal = NULL;
  32233. }
  32234. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  32235. /* bn = NULL, don't try to access or double free it */
  32236. }
  32237. }
  32238. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  32239. {
  32240. #ifdef WOLFSSL_DEBUG_OPENSSL
  32241. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  32242. #endif
  32243. if (bn) {
  32244. if (bn->internal) {
  32245. mp_int* bni = (mp_int*)bn->internal;
  32246. mp_forcezero(bni);
  32247. }
  32248. wolfSSL_BN_free(bn);
  32249. }
  32250. }
  32251. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  32252. {
  32253. #ifdef WOLFSSL_DEBUG_OPENSSL
  32254. WOLFSSL_MSG("wolfSSL_BN_clear");
  32255. #endif
  32256. if (bn && bn->internal) {
  32257. mp_forcezero((mp_int*)bn->internal);
  32258. }
  32259. }
  32260. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  32261. #ifdef OPENSSL_ALL
  32262. #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8)
  32263. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  32264. WOLFSSL_EVP_PKEY* pkey,
  32265. const WOLFSSL_EVP_CIPHER* enc,
  32266. char* passwd, int passwdSz,
  32267. wc_pem_password_cb* cb, void* ctx)
  32268. {
  32269. int ret = 0;
  32270. char password[NAME_SZ];
  32271. byte* key = NULL;
  32272. word32 keySz;
  32273. byte* pem = NULL;
  32274. int pemSz;
  32275. int type = PKCS8_PRIVATEKEY_TYPE;
  32276. int algId;
  32277. const byte* curveOid;
  32278. word32 oidSz;
  32279. int encAlgId = 0;
  32280. if (bio == NULL || pkey == NULL)
  32281. return -1;
  32282. keySz = pkey->pkey_sz + 128;
  32283. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32284. if (key == NULL)
  32285. ret = MEMORY_E;
  32286. if (ret == 0 && enc != NULL && passwd == NULL) {
  32287. passwdSz = cb(password, sizeof(password), 1, ctx);
  32288. if (passwdSz < 0)
  32289. ret = WOLFSSL_FAILURE;
  32290. passwd = password;
  32291. }
  32292. if (ret == 0 && enc != NULL) {
  32293. WC_RNG rng;
  32294. ret = wc_InitRng(&rng);
  32295. if (ret == 0) {
  32296. #ifndef NO_DES3
  32297. if (enc == EVP_DES_CBC)
  32298. encAlgId = DESb;
  32299. else if (enc == EVP_DES_EDE3_CBC)
  32300. encAlgId = DES3b;
  32301. else
  32302. #endif
  32303. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  32304. #ifdef WOLFSSL_AES_256
  32305. if (enc == EVP_AES_256_CBC)
  32306. encAlgId = AES256CBCb;
  32307. else
  32308. #endif
  32309. #endif
  32310. ret = -1;
  32311. if (ret == 0) {
  32312. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  32313. &keySz, passwd, passwdSz, PKCS5, PBES2,
  32314. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  32315. &rng, NULL);
  32316. if (ret > 0) {
  32317. keySz = ret;
  32318. ret = 0;
  32319. }
  32320. }
  32321. wc_FreeRng(&rng);
  32322. }
  32323. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  32324. }
  32325. if (ret == 0 && enc == NULL) {
  32326. type = PKCS8_PRIVATEKEY_TYPE;
  32327. #ifdef HAVE_ECC
  32328. if (pkey->type == EVP_PKEY_EC) {
  32329. algId = ECDSAk;
  32330. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  32331. &oidSz);
  32332. }
  32333. else
  32334. #endif
  32335. {
  32336. algId = RSAk;
  32337. curveOid = NULL;
  32338. oidSz = 0;
  32339. }
  32340. #ifdef HAVE_ECC
  32341. if (ret >= 0)
  32342. #endif
  32343. {
  32344. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  32345. pkey->pkey_sz, algId, curveOid, oidSz);
  32346. keySz = ret;
  32347. }
  32348. }
  32349. if (password == passwd)
  32350. XMEMSET(password, 0, passwdSz);
  32351. if (ret >= 0) {
  32352. pemSz = 2 * keySz + 2 * 64;
  32353. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32354. if (pem == NULL)
  32355. ret = MEMORY_E;
  32356. }
  32357. if (ret >= 0)
  32358. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  32359. if (key != NULL)
  32360. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32361. if (ret >= 0) {
  32362. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  32363. ret = -1;
  32364. }
  32365. if (pem != NULL)
  32366. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32367. return ret < 0 ? 0 : ret;
  32368. }
  32369. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  32370. int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey,
  32371. const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz,
  32372. wc_pem_password_cb* cb, void* ctx)
  32373. {
  32374. int ret = WOLFSSL_SUCCESS;
  32375. BIO *b;
  32376. WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey");
  32377. b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE);
  32378. if (b == NULL) {
  32379. ret = WOLFSSL_FAILURE;
  32380. }
  32381. if (ret == WOLFSSL_SUCCESS) {
  32382. ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd,
  32383. passwdSz, cb, ctx);
  32384. }
  32385. wolfSSL_BIO_free(b);
  32386. return ret;
  32387. }
  32388. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  32389. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  32390. {
  32391. int ret = 0;
  32392. byte* mem = NULL;
  32393. ret = wolfSSL_BIO_get_len(bio);
  32394. if (ret > 0) {
  32395. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32396. if (mem == NULL) {
  32397. WOLFSSL_MSG("Memory error");
  32398. ret = MEMORY_E;
  32399. }
  32400. if (ret >= 0) {
  32401. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  32402. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32403. ret = MEMORY_E;
  32404. mem = NULL;
  32405. }
  32406. }
  32407. }
  32408. *data = mem;
  32409. return ret;
  32410. }
  32411. /* DER data is PKCS#8 encrypted. */
  32412. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  32413. WOLFSSL_EVP_PKEY** pkey,
  32414. wc_pem_password_cb* cb,
  32415. void* ctx)
  32416. {
  32417. int ret;
  32418. byte* der;
  32419. int len;
  32420. byte* p;
  32421. word32 algId;
  32422. WOLFSSL_EVP_PKEY* key;
  32423. if ((len = bio_get_data(bio, &der)) < 0)
  32424. return NULL;
  32425. if (cb != NULL) {
  32426. char password[NAME_SZ];
  32427. int passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  32428. if (passwordSz < 0) {
  32429. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32430. return NULL;
  32431. }
  32432. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32433. wc_MemZero_Add("wolfSSL_d2i_PKCS8PrivateKey_bio password", password,
  32434. passwordSz);
  32435. #endif
  32436. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  32437. if (ret < 0) {
  32438. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32439. return NULL;
  32440. }
  32441. ForceZero(password, passwordSz);
  32442. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32443. wc_MemZero_Check(password, passwordSz);
  32444. #endif
  32445. }
  32446. p = der;
  32447. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  32448. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32449. return key;
  32450. }
  32451. #endif /* !NO_BIO && !NO_PWDBASED && HAVE_PKCS8 */
  32452. /* Detect which type of key it is before decoding. */
  32453. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  32454. const unsigned char** pp,
  32455. long length)
  32456. {
  32457. int ret;
  32458. WOLFSSL_EVP_PKEY* key = NULL;
  32459. const byte* der = *pp;
  32460. word32 idx = 0;
  32461. int len = 0;
  32462. word32 end = 0;
  32463. int cnt = 0;
  32464. int type;
  32465. word32 algId;
  32466. word32 keyLen = (word32)length;
  32467. /* Take off PKCS#8 wrapper if found. */
  32468. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  32469. der += idx;
  32470. keyLen = len;
  32471. }
  32472. idx = 0;
  32473. len = 0;
  32474. /* Use the number of elements in the outer sequence to determine key type.
  32475. */
  32476. ret = GetSequence(der, &idx, &len, keyLen);
  32477. if (ret >= 0) {
  32478. end = idx + len;
  32479. while (ret >= 0 && idx < end) {
  32480. /* Skip type */
  32481. idx++;
  32482. /* Get length and skip over - keeping count */
  32483. len = 0;
  32484. ret = GetLength(der, &idx, &len, keyLen);
  32485. if (ret >= 0) {
  32486. if (idx + len > end)
  32487. ret = ASN_PARSE_E;
  32488. else {
  32489. idx += len;
  32490. cnt++;
  32491. }
  32492. }
  32493. }
  32494. }
  32495. if (ret >= 0) {
  32496. /* ECC includes version, private[, curve][, public key] */
  32497. if (cnt >= 2 && cnt <= 4)
  32498. type = EVP_PKEY_EC;
  32499. else
  32500. type = EVP_PKEY_RSA;
  32501. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  32502. *pp = der;
  32503. }
  32504. return key;
  32505. }
  32506. #endif /* OPENSSL_ALL */
  32507. #ifdef WOLFSSL_STATIC_EPHEMERAL
  32508. int wolfSSL_StaticEphemeralKeyLoad(WOLFSSL* ssl, int keyAlgo, void* keyPtr)
  32509. {
  32510. int ret;
  32511. word32 idx = 0;
  32512. DerBuffer* der = NULL;
  32513. if (ssl == NULL || ssl->ctx == NULL || keyPtr == NULL) {
  32514. return BAD_FUNC_ARG;
  32515. }
  32516. #ifndef SINGLE_THREADED
  32517. if (!ssl->ctx->staticKELockInit) {
  32518. return BUFFER_E; /* no keys set */
  32519. }
  32520. ret = wc_LockMutex(&ssl->ctx->staticKELock);
  32521. if (ret != 0) {
  32522. return ret;
  32523. }
  32524. #endif
  32525. ret = BUFFER_E; /* set default error */
  32526. switch (keyAlgo) {
  32527. #ifndef NO_DH
  32528. case WC_PK_TYPE_DH:
  32529. if (ssl != NULL)
  32530. der = ssl->staticKE.dhKey;
  32531. if (der == NULL)
  32532. der = ssl->ctx->staticKE.dhKey;
  32533. if (der != NULL) {
  32534. DhKey* key = (DhKey*)keyPtr;
  32535. WOLFSSL_MSG("Using static DH key");
  32536. ret = wc_DhKeyDecode(der->buffer, &idx, key, der->length);
  32537. }
  32538. break;
  32539. #endif
  32540. #ifdef HAVE_ECC
  32541. case WC_PK_TYPE_ECDH:
  32542. if (ssl != NULL)
  32543. der = ssl->staticKE.ecKey;
  32544. if (der == NULL)
  32545. der = ssl->ctx->staticKE.ecKey;
  32546. if (der != NULL) {
  32547. ecc_key* key = (ecc_key*)keyPtr;
  32548. WOLFSSL_MSG("Using static ECDH key");
  32549. ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length);
  32550. }
  32551. break;
  32552. #endif
  32553. #ifdef HAVE_CURVE25519
  32554. case WC_PK_TYPE_CURVE25519:
  32555. if (ssl != NULL)
  32556. der = ssl->staticKE.x25519Key;
  32557. if (der == NULL)
  32558. der = ssl->ctx->staticKE.x25519Key;
  32559. if (der != NULL) {
  32560. curve25519_key* key = (curve25519_key*)keyPtr;
  32561. WOLFSSL_MSG("Using static X25519 key");
  32562. ret = wc_Curve25519PrivateKeyDecode(der->buffer, &idx, key,
  32563. der->length);
  32564. }
  32565. break;
  32566. #endif
  32567. #ifdef HAVE_CURVE448
  32568. case WC_PK_TYPE_CURVE448:
  32569. if (ssl != NULL)
  32570. der = ssl->staticKE.x448Key;
  32571. if (der == NULL)
  32572. der = ssl->ctx->staticKE.x448Key;
  32573. if (der != NULL) {
  32574. curve448_key* key = (curve448_key*)keyPtr;
  32575. WOLFSSL_MSG("Using static X448 key");
  32576. ret = wc_Curve448PrivateKeyDecode(der->buffer, &idx, key,
  32577. der->length);
  32578. }
  32579. break;
  32580. #endif
  32581. default:
  32582. /* not supported */
  32583. ret = NOT_COMPILED_IN;
  32584. break;
  32585. }
  32586. #ifndef SINGLE_THREADED
  32587. wc_UnLockMutex(&ssl->ctx->staticKELock);
  32588. #endif
  32589. return ret;
  32590. }
  32591. static int SetStaticEphemeralKey(WOLFSSL_CTX* ctx,
  32592. StaticKeyExchangeInfo_t* staticKE, int keyAlgo, const char* key,
  32593. unsigned int keySz, int format, void* heap)
  32594. {
  32595. int ret = 0;
  32596. DerBuffer* der = NULL;
  32597. byte* keyBuf = NULL;
  32598. #ifndef NO_FILESYSTEM
  32599. const char* keyFile = NULL;
  32600. #endif
  32601. /* allow empty key to free buffer */
  32602. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  32603. return BAD_FUNC_ARG;
  32604. }
  32605. WOLFSSL_ENTER("SetStaticEphemeralKey");
  32606. /* if just free'ing key then skip loading */
  32607. if (key != NULL) {
  32608. #ifndef NO_FILESYSTEM
  32609. /* load file from filesystem */
  32610. if (key != NULL && keySz == 0) {
  32611. size_t keyBufSz = 0;
  32612. keyFile = (const char*)key;
  32613. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  32614. if (ret != 0) {
  32615. return ret;
  32616. }
  32617. keySz = (unsigned int)keyBufSz;
  32618. }
  32619. else
  32620. #endif
  32621. {
  32622. /* use as key buffer directly */
  32623. keyBuf = (byte*)key;
  32624. }
  32625. if (format == WOLFSSL_FILETYPE_PEM) {
  32626. #ifdef WOLFSSL_PEM_TO_DER
  32627. int keyFormat = 0;
  32628. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  32629. heap, NULL, &keyFormat);
  32630. /* auto detect key type */
  32631. if (ret == 0 && keyAlgo == WC_PK_TYPE_NONE) {
  32632. if (keyFormat == ECDSAk)
  32633. keyAlgo = WC_PK_TYPE_ECDH;
  32634. else if (keyFormat == X25519k)
  32635. keyAlgo = WC_PK_TYPE_CURVE25519;
  32636. else
  32637. keyAlgo = WC_PK_TYPE_DH;
  32638. }
  32639. #else
  32640. ret = NOT_COMPILED_IN;
  32641. #endif
  32642. }
  32643. else {
  32644. /* Detect PK type (if required) */
  32645. #ifdef HAVE_ECC
  32646. if (keyAlgo == WC_PK_TYPE_NONE) {
  32647. word32 idx = 0;
  32648. ecc_key eccKey;
  32649. ret = wc_ecc_init_ex(&eccKey, heap, INVALID_DEVID);
  32650. if (ret == 0) {
  32651. ret = wc_EccPrivateKeyDecode(keyBuf, &idx, &eccKey, keySz);
  32652. if (ret == 0)
  32653. keyAlgo = WC_PK_TYPE_ECDH;
  32654. wc_ecc_free(&eccKey);
  32655. }
  32656. }
  32657. #endif
  32658. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
  32659. if (keyAlgo == WC_PK_TYPE_NONE) {
  32660. word32 idx = 0;
  32661. DhKey dhKey;
  32662. ret = wc_InitDhKey_ex(&dhKey, heap, INVALID_DEVID);
  32663. if (ret == 0) {
  32664. ret = wc_DhKeyDecode(keyBuf, &idx, &dhKey, keySz);
  32665. if (ret == 0)
  32666. keyAlgo = WC_PK_TYPE_DH;
  32667. wc_FreeDhKey(&dhKey);
  32668. }
  32669. }
  32670. #endif
  32671. #ifdef HAVE_CURVE25519
  32672. if (keyAlgo == WC_PK_TYPE_NONE) {
  32673. word32 idx = 0;
  32674. curve25519_key x25519Key;
  32675. ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID);
  32676. if (ret == 0) {
  32677. ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key,
  32678. keySz);
  32679. if (ret == 0)
  32680. keyAlgo = WC_PK_TYPE_CURVE25519;
  32681. wc_curve25519_free(&x25519Key);
  32682. }
  32683. }
  32684. #endif
  32685. #ifdef HAVE_CURVE448
  32686. if (keyAlgo == WC_PK_TYPE_NONE) {
  32687. word32 idx = 0;
  32688. curve448_key x448Key;
  32689. ret = wc_curve448_init(&x448Key);
  32690. if (ret == 0) {
  32691. ret = wc_Curve448PrivateKeyDecode(keyBuf, &idx, &x448Key,
  32692. keySz);
  32693. if (ret == 0)
  32694. keyAlgo = WC_PK_TYPE_CURVE448;
  32695. wc_curve448_free(&x448Key);
  32696. }
  32697. }
  32698. #endif
  32699. if (keyAlgo != WC_PK_TYPE_NONE) {
  32700. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  32701. if (ret == 0) {
  32702. XMEMCPY(der->buffer, keyBuf, keySz);
  32703. }
  32704. }
  32705. }
  32706. }
  32707. #ifndef NO_FILESYSTEM
  32708. /* done with keyFile buffer */
  32709. if (keyFile && keyBuf) {
  32710. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  32711. }
  32712. #endif
  32713. #ifndef SINGLE_THREADED
  32714. if (ret == 0 && !ctx->staticKELockInit) {
  32715. ret = wc_InitMutex(&ctx->staticKELock);
  32716. if (ret == 0) {
  32717. ctx->staticKELockInit = 1;
  32718. }
  32719. }
  32720. #endif
  32721. if (ret == 0
  32722. #ifndef SINGLE_THREADED
  32723. && (ret = wc_LockMutex(&ctx->staticKELock)) == 0
  32724. #endif
  32725. ) {
  32726. switch (keyAlgo) {
  32727. #ifndef NO_DH
  32728. case WC_PK_TYPE_DH:
  32729. FreeDer(&staticKE->dhKey);
  32730. staticKE->dhKey = der; der = NULL;
  32731. break;
  32732. #endif
  32733. #ifdef HAVE_ECC
  32734. case WC_PK_TYPE_ECDH:
  32735. FreeDer(&staticKE->ecKey);
  32736. staticKE->ecKey = der; der = NULL;
  32737. break;
  32738. #endif
  32739. #ifdef HAVE_CURVE25519
  32740. case WC_PK_TYPE_CURVE25519:
  32741. FreeDer(&staticKE->x25519Key);
  32742. staticKE->x25519Key = der; der = NULL;
  32743. break;
  32744. #endif
  32745. #ifdef HAVE_CURVE448
  32746. case WC_PK_TYPE_CURVE448:
  32747. FreeDer(&staticKE->x448Key);
  32748. staticKE->x448Key = der; der = NULL;
  32749. break;
  32750. #endif
  32751. default:
  32752. /* not supported */
  32753. ret = NOT_COMPILED_IN;
  32754. break;
  32755. }
  32756. #ifndef SINGLE_THREADED
  32757. wc_UnLockMutex(&ctx->staticKELock);
  32758. #endif
  32759. }
  32760. if (ret != 0) {
  32761. FreeDer(&der);
  32762. }
  32763. (void)ctx; /* not used for single threaded */
  32764. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  32765. return ret;
  32766. }
  32767. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  32768. const char* key, unsigned int keySz, int format)
  32769. {
  32770. if (ctx == NULL) {
  32771. return BAD_FUNC_ARG;
  32772. }
  32773. return SetStaticEphemeralKey(ctx, &ctx->staticKE, keyAlgo,
  32774. key, keySz, format, ctx->heap);
  32775. }
  32776. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  32777. const char* key, unsigned int keySz, int format)
  32778. {
  32779. if (ssl == NULL || ssl->ctx == NULL) {
  32780. return BAD_FUNC_ARG;
  32781. }
  32782. return SetStaticEphemeralKey(ssl->ctx, &ssl->staticKE, keyAlgo,
  32783. key, keySz, format, ssl->heap);
  32784. }
  32785. static int GetStaticEphemeralKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  32786. int keyAlgo, const unsigned char** key, unsigned int* keySz)
  32787. {
  32788. int ret = 0;
  32789. DerBuffer* der = NULL;
  32790. if (key) *key = NULL;
  32791. if (keySz) *keySz = 0;
  32792. #ifndef SINGLE_THREADED
  32793. if (ctx->staticKELockInit &&
  32794. (ret = wc_LockMutex(&ctx->staticKELock)) != 0) {
  32795. return ret;
  32796. }
  32797. #endif
  32798. switch (keyAlgo) {
  32799. #ifndef NO_DH
  32800. case WC_PK_TYPE_DH:
  32801. if (ssl != NULL)
  32802. der = ssl->staticKE.dhKey;
  32803. if (der == NULL)
  32804. der = ctx->staticKE.dhKey;
  32805. break;
  32806. #endif
  32807. #ifdef HAVE_ECC
  32808. case WC_PK_TYPE_ECDH:
  32809. if (ssl != NULL)
  32810. der = ssl->staticKE.ecKey;
  32811. if (der == NULL)
  32812. der = ctx->staticKE.ecKey;
  32813. break;
  32814. #endif
  32815. #ifdef HAVE_CURVE25519
  32816. case WC_PK_TYPE_CURVE25519:
  32817. if (ssl != NULL)
  32818. der = ssl->staticKE.x25519Key;
  32819. if (der == NULL)
  32820. der = ctx->staticKE.x25519Key;
  32821. break;
  32822. #endif
  32823. #ifdef HAVE_CURVE448
  32824. case WC_PK_TYPE_CURVE448:
  32825. if (ssl != NULL)
  32826. der = ssl->staticKE.x448Key;
  32827. if (der == NULL)
  32828. der = ctx->staticKE.x448Key;
  32829. break;
  32830. #endif
  32831. default:
  32832. /* not supported */
  32833. ret = NOT_COMPILED_IN;
  32834. break;
  32835. }
  32836. if (der) {
  32837. if (key)
  32838. *key = der->buffer;
  32839. if (keySz)
  32840. *keySz = der->length;
  32841. }
  32842. #ifndef SINGLE_THREADED
  32843. wc_UnLockMutex(&ctx->staticKELock);
  32844. #endif
  32845. return ret;
  32846. }
  32847. /* returns pointer to currently loaded static ephemeral as ASN.1 */
  32848. /* this can be converted to PEM using wc_DerToPem */
  32849. int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  32850. const unsigned char** key, unsigned int* keySz)
  32851. {
  32852. if (ctx == NULL) {
  32853. return BAD_FUNC_ARG;
  32854. }
  32855. return GetStaticEphemeralKey(ctx, NULL, keyAlgo, key, keySz);
  32856. }
  32857. int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  32858. const unsigned char** key, unsigned int* keySz)
  32859. {
  32860. if (ssl == NULL || ssl->ctx == NULL) {
  32861. return BAD_FUNC_ARG;
  32862. }
  32863. return GetStaticEphemeralKey(ssl->ctx, ssl, keyAlgo, key, keySz);
  32864. }
  32865. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  32866. #if defined(OPENSSL_EXTRA)
  32867. /* wolfSSL_THREADID_current is provided as a compat API with
  32868. * CRYPTO_THREADID_current to register current thread id into given id object.
  32869. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  32870. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  32871. * like as existing wolfSSL_THREADID_set_numeric.
  32872. */
  32873. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  32874. {
  32875. (void)id;
  32876. return;
  32877. }
  32878. /* wolfSSL_THREADID_hash is provided as a compatible API with
  32879. * CRYPTO_THREADID_hash which returns a hash value calcurated from the
  32880. * specified thread id. However, CRYPTO_THREADID_hash API has been
  32881. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  32882. * This API only works as a stub to returns 0. This behavior is
  32883. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  32884. */
  32885. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  32886. {
  32887. (void)id;
  32888. return 0UL;
  32889. }
  32890. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  32891. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  32892. * Since this functionality is enabled by default in wolfSSL,
  32893. * this API exists as a stub.
  32894. */
  32895. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  32896. {
  32897. (void)ctx;
  32898. (void)onoff;
  32899. return WOLFSSL_SUCCESS;
  32900. }
  32901. /**
  32902. * set security level (wolfSSL doesn't support security level)
  32903. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  32904. * @param level security level
  32905. */
  32906. void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
  32907. {
  32908. WOLFSSL_ENTER("wolfSSL_CTX_set_security_level");
  32909. (void)ctx;
  32910. (void)level;
  32911. }
  32912. /**
  32913. * get security level (wolfSSL doesn't support security level)
  32914. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  32915. * @return always 0(level 0)
  32916. */
  32917. int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
  32918. {
  32919. WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
  32920. (void)ctx;
  32921. return 0;
  32922. }
  32923. /**
  32924. * Determine whether a WOLFSSL_SESSION object can be used for resumption
  32925. * @param s a pointer to WOLFSSL_SESSION structure
  32926. * @return return 1 if session is resumable, otherwise 0.
  32927. */
  32928. int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s)
  32929. {
  32930. s = ClientSessionToSession(s);
  32931. if (s == NULL)
  32932. return 0;
  32933. #ifdef HAVE_SESSION_TICKET
  32934. if (s->ticketLen > 0)
  32935. return 1;
  32936. #endif
  32937. if (s->sessionIDSz > 0)
  32938. return 1;
  32939. return 0;
  32940. }
  32941. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  32942. /*
  32943. * This API accepts a user callback which puts key-log records into
  32944. * a KEY LOGFILE. The callback is stored into a CTX and propagated to
  32945. * each SSL object on its creation timing.
  32946. */
  32947. void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb)
  32948. {
  32949. WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
  32950. /* stores the callback into WOLFSSL_CTX */
  32951. if (ctx != NULL) {
  32952. ctx->keyLogCb = cb;
  32953. }
  32954. }
  32955. wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
  32956. const WOLFSSL_CTX* ctx)
  32957. {
  32958. WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
  32959. if (ctx != NULL)
  32960. return ctx->keyLogCb;
  32961. else
  32962. return NULL;
  32963. }
  32964. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  32965. #endif /* OPENSSL_EXTRA */
  32966. #ifndef NO_CERT
  32967. #define WOLFSSL_X509_INCLUDED
  32968. #include "src/x509.c"
  32969. #endif
  32970. /*******************************************************************************
  32971. * START OF standard C library wrapping APIs
  32972. ******************************************************************************/
  32973. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  32974. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  32975. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  32976. #ifndef NO_WOLFSSL_STUB
  32977. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  32978. void *(*r) (void *, size_t, const char *,
  32979. int), void (*f) (void *))
  32980. {
  32981. (void) m;
  32982. (void) r;
  32983. (void) f;
  32984. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  32985. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  32986. return WOLFSSL_FAILURE;
  32987. }
  32988. #endif
  32989. #endif
  32990. #if defined(OPENSSL_EXTRA)
  32991. /**
  32992. * free allocated memory resouce
  32993. * @param str a pointer to resource to be freed
  32994. * @param file dummy argument
  32995. * @param line dummy argument
  32996. */
  32997. void wolfSSL_CRYPTO_free(void *str, const char *file, int line)
  32998. {
  32999. (void)file;
  33000. (void)line;
  33001. XFREE(str, 0, DYNAMIC_TYPE_TMP_BUFFER);
  33002. }
  33003. /**
  33004. * allocate memory with size of num
  33005. * @param num size of memory allocation to be malloced
  33006. * @param file dummy argument
  33007. * @param line dummy argument
  33008. * @return a pointer to allocated memory on succssesful, otherwise NULL
  33009. */
  33010. void *wolfSSL_CRYPTO_malloc(size_t num, const char *file, int line)
  33011. {
  33012. (void)file;
  33013. (void)line;
  33014. return XMALLOC(num, 0, DYNAMIC_TYPE_TMP_BUFFER);
  33015. }
  33016. #endif
  33017. /*******************************************************************************
  33018. * END OF standard C library wrapping APIs
  33019. ******************************************************************************/
  33020. /*******************************************************************************
  33021. * START OF EX_DATA APIs
  33022. ******************************************************************************/
  33023. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  33024. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  33025. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  33026. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  33027. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  33028. }
  33029. #endif
  33030. #ifdef HAVE_EX_DATA
  33031. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  33032. {
  33033. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  33034. #ifdef MAX_EX_DATA
  33035. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  33036. return ex_data->ex_data[idx];
  33037. }
  33038. #else
  33039. (void)ex_data;
  33040. (void)idx;
  33041. #endif
  33042. return NULL;
  33043. }
  33044. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  33045. {
  33046. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  33047. #ifdef MAX_EX_DATA
  33048. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  33049. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  33050. if (ex_data->ex_data_cleanup_routines[idx]) {
  33051. if (ex_data->ex_data[idx])
  33052. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  33053. ex_data->ex_data_cleanup_routines[idx] = NULL;
  33054. }
  33055. #endif
  33056. ex_data->ex_data[idx] = data;
  33057. return WOLFSSL_SUCCESS;
  33058. }
  33059. #else
  33060. (void)ex_data;
  33061. (void)idx;
  33062. (void)data;
  33063. #endif
  33064. return WOLFSSL_FAILURE;
  33065. }
  33066. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  33067. int wolfSSL_CRYPTO_set_ex_data_with_cleanup(
  33068. WOLFSSL_CRYPTO_EX_DATA* ex_data,
  33069. int idx,
  33070. void *data,
  33071. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  33072. {
  33073. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data_with_cleanup");
  33074. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  33075. if (ex_data->ex_data_cleanup_routines[idx] && ex_data->ex_data[idx])
  33076. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  33077. ex_data->ex_data[idx] = data;
  33078. ex_data->ex_data_cleanup_routines[idx] = cleanup_routine;
  33079. return WOLFSSL_SUCCESS;
  33080. }
  33081. return WOLFSSL_FAILURE;
  33082. }
  33083. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  33084. /**
  33085. * Issues unique index for the class specified by class_index.
  33086. * Other parameter except class_index are ignored.
  33087. * Currently, following class_index are accepted:
  33088. * - WOLF_CRYPTO_EX_INDEX_SSL
  33089. * - WOLF_CRYPTO_EX_INDEX_SSL_CTX
  33090. * - WOLF_CRYPTO_EX_INDEX_X509
  33091. * @param class_index index one of CRYPTO_EX_INDEX_xxx
  33092. * @param argp parameters to be saved
  33093. * @param argl parameters to be saved
  33094. * @param new_func a pointer to WOLFSSL_CRYPTO_EX_new
  33095. * @param dup_func a pointer to WOLFSSL_CRYPTO_EX_dup
  33096. * @param free_func a pointer to WOLFSSL_CRYPTO_EX_free
  33097. * @return index value grater or equal to zero on success, -1 on failure.
  33098. */
  33099. int wolfSSL_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
  33100. WOLFSSL_CRYPTO_EX_new* new_func,
  33101. WOLFSSL_CRYPTO_EX_dup* dup_func,
  33102. WOLFSSL_CRYPTO_EX_free* free_func)
  33103. {
  33104. WOLFSSL_ENTER("wolfSSL_CRYPTO_get_ex_new_index");
  33105. WOLFSSL_CRYPTO_EX_DATA_IGNORE_PARAMS(argl, argp, new_func, dup_func,
  33106. free_func);
  33107. return wolfssl_get_ex_new_index(class_index);
  33108. }
  33109. #endif /* HAVE_EX_DATA */
  33110. /*******************************************************************************
  33111. * END OF EX_DATA APIs
  33112. ******************************************************************************/
  33113. /*******************************************************************************
  33114. * START OF BUF_MEM API
  33115. ******************************************************************************/
  33116. #if defined(OPENSSL_EXTRA)
  33117. /* Begin functions for openssl/buffer.h */
  33118. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  33119. {
  33120. WOLFSSL_BUF_MEM* buf;
  33121. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  33122. DYNAMIC_TYPE_OPENSSL);
  33123. if (buf) {
  33124. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  33125. }
  33126. return buf;
  33127. }
  33128. /* non-compat API returns length of buffer on success */
  33129. int wolfSSL_BUF_MEM_grow_ex(WOLFSSL_BUF_MEM* buf, size_t len,
  33130. char zeroFill)
  33131. {
  33132. int len_int = (int)len;
  33133. int mx;
  33134. char* tmp;
  33135. /* verify provided arguments */
  33136. if (buf == NULL || len_int < 0) {
  33137. return 0; /* BAD_FUNC_ARG; */
  33138. }
  33139. /* check to see if fits in existing length */
  33140. if (buf->length > len) {
  33141. buf->length = len;
  33142. return len_int;
  33143. }
  33144. /* check to see if fits in max buffer */
  33145. if (buf->max >= len) {
  33146. if (buf->data != NULL && zeroFill) {
  33147. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33148. }
  33149. buf->length = len;
  33150. return len_int;
  33151. }
  33152. /* expand size, to handle growth */
  33153. mx = (len_int + 3) / 3 * 4;
  33154. /* use realloc */
  33155. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  33156. if (tmp == NULL) {
  33157. return 0; /* ERR_R_MALLOC_FAILURE; */
  33158. }
  33159. buf->data = tmp;
  33160. buf->max = mx;
  33161. if (zeroFill)
  33162. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33163. buf->length = len;
  33164. return len_int;
  33165. }
  33166. /* returns length of buffer on success */
  33167. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  33168. {
  33169. return wolfSSL_BUF_MEM_grow_ex(buf, len, 1);
  33170. }
  33171. /* non-compat API returns length of buffer on success */
  33172. int wolfSSL_BUF_MEM_resize(WOLFSSL_BUF_MEM* buf, size_t len)
  33173. {
  33174. char* tmp;
  33175. int mx;
  33176. /* verify provided arguments */
  33177. if (buf == NULL || len == 0 || (int)len <= 0) {
  33178. return 0; /* BAD_FUNC_ARG; */
  33179. }
  33180. if (len == buf->length)
  33181. return (int)len;
  33182. if (len > buf->length)
  33183. return wolfSSL_BUF_MEM_grow_ex(buf, len, 0);
  33184. /* expand size, to handle growth */
  33185. mx = ((int)len + 3) / 3 * 4;
  33186. /* We want to shrink the internal buffer */
  33187. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  33188. if (tmp == NULL)
  33189. return 0;
  33190. buf->data = tmp;
  33191. buf->length = len;
  33192. buf->max = mx;
  33193. return (int)len;
  33194. }
  33195. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  33196. {
  33197. if (buf) {
  33198. if (buf->data) {
  33199. XFREE(buf->data, NULL, DYNAMIC_TYPE_OPENSSL);
  33200. buf->data = NULL;
  33201. }
  33202. buf->max = 0;
  33203. buf->length = 0;
  33204. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  33205. }
  33206. }
  33207. /* End Functions for openssl/buffer.h */
  33208. #endif /* OPENSSL_EXTRA */
  33209. /*******************************************************************************
  33210. * END OF BUF_MEM API
  33211. ******************************************************************************/
  33212. #define WOLFSSL_CONF_INCLUDED
  33213. #include <src/conf.c>
  33214. /*******************************************************************************
  33215. * START OF RAND API
  33216. ******************************************************************************/
  33217. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  33218. static int wolfSSL_RAND_InitMutex(void)
  33219. {
  33220. if (gRandMethodsInit == 0) {
  33221. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  33222. WOLFSSL_MSG("Bad Init Mutex rand methods");
  33223. return BAD_MUTEX_E;
  33224. }
  33225. gRandMethodsInit = 1;
  33226. }
  33227. return 0;
  33228. }
  33229. #endif
  33230. #ifdef OPENSSL_EXTRA
  33231. /* Checks if the global RNG has been created. If not then one is created.
  33232. *
  33233. * Returns WOLFSSL_SUCCESS when no error is encountered.
  33234. */
  33235. int wolfSSL_RAND_Init(void)
  33236. {
  33237. int ret = WOLFSSL_FAILURE;
  33238. #ifdef HAVE_GLOBAL_RNG
  33239. if (wc_LockMutex(&globalRNGMutex) == 0) {
  33240. if (initGlobalRNG == 0) {
  33241. ret = wc_InitRng(&globalRNG);
  33242. if (ret == 0) {
  33243. initGlobalRNG = 1;
  33244. ret = WOLFSSL_SUCCESS;
  33245. }
  33246. }
  33247. wc_UnLockMutex(&globalRNGMutex);
  33248. }
  33249. #endif
  33250. return ret;
  33251. }
  33252. /* WOLFSSL_SUCCESS on ok */
  33253. int wolfSSL_RAND_seed(const void* seed, int len)
  33254. {
  33255. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33256. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33257. if (gRandMethods && gRandMethods->seed) {
  33258. int ret = gRandMethods->seed(seed, len);
  33259. wc_UnLockMutex(&gRandMethodMutex);
  33260. return ret;
  33261. }
  33262. wc_UnLockMutex(&gRandMethodMutex);
  33263. }
  33264. #else
  33265. (void)seed;
  33266. (void)len;
  33267. #endif
  33268. /* Make sure global shared RNG (globalRNG) is initialized */
  33269. return wolfSSL_RAND_Init();
  33270. }
  33271. /* Returns the path for reading seed data from.
  33272. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  33273. *
  33274. * Note uses stdlib by default unless XGETENV macro is overwritten
  33275. *
  33276. * fname buffer to hold path
  33277. * len length of fname buffer
  33278. *
  33279. * Returns a pointer to fname on success and NULL on failure
  33280. */
  33281. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  33282. {
  33283. #ifndef NO_FILESYSTEM
  33284. char* rt;
  33285. char ap[] = "/.rnd";
  33286. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  33287. if (fname == NULL) {
  33288. return NULL;
  33289. }
  33290. XMEMSET(fname, 0, len);
  33291. /* if access to stdlib.h */
  33292. if ((rt = XGETENV("RANDFILE")) != NULL) {
  33293. if (len > XSTRLEN(rt)) {
  33294. XMEMCPY(fname, rt, XSTRLEN(rt));
  33295. }
  33296. else {
  33297. WOLFSSL_MSG("RANDFILE too large for buffer");
  33298. rt = NULL;
  33299. }
  33300. }
  33301. /* $RANDFILE was not set or is too large, check $HOME */
  33302. if (rt == NULL) {
  33303. WOLFSSL_MSG("Environment variable RANDFILE not set");
  33304. if ((rt = XGETENV("HOME")) == NULL) {
  33305. WOLFSSL_MSG("Environment variable HOME not set");
  33306. return NULL;
  33307. }
  33308. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  33309. fname[0] = '\0';
  33310. XSTRNCAT(fname, rt, len);
  33311. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  33312. return fname;
  33313. }
  33314. else {
  33315. WOLFSSL_MSG("HOME too large for buffer");
  33316. return NULL;
  33317. }
  33318. }
  33319. return fname;
  33320. #else
  33321. /* no filesystem defined */
  33322. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  33323. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  33324. (void)fname;
  33325. (void)len;
  33326. return NULL;
  33327. #endif
  33328. }
  33329. /* Writes 1024 bytes from the RNG to the given file name.
  33330. *
  33331. * fname name of file to write to
  33332. *
  33333. * Returns the number of bytes written
  33334. */
  33335. int wolfSSL_RAND_write_file(const char* fname)
  33336. {
  33337. int bytes = 0;
  33338. WOLFSSL_ENTER("RAND_write_file");
  33339. if (fname == NULL) {
  33340. return SSL_FAILURE;
  33341. }
  33342. #ifndef NO_FILESYSTEM
  33343. {
  33344. #ifndef WOLFSSL_SMALL_STACK
  33345. unsigned char buf[1024];
  33346. #else
  33347. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  33348. DYNAMIC_TYPE_TMP_BUFFER);
  33349. if (buf == NULL) {
  33350. WOLFSSL_MSG("malloc failed");
  33351. return SSL_FAILURE;
  33352. }
  33353. #endif
  33354. bytes = 1024; /* default size of buf */
  33355. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  33356. WOLFSSL_MSG("No RNG to use");
  33357. #ifdef WOLFSSL_SMALL_STACK
  33358. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33359. #endif
  33360. return 0;
  33361. }
  33362. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  33363. WOLFSSL_MSG("Error generating random buffer");
  33364. bytes = 0;
  33365. }
  33366. else {
  33367. XFILE f;
  33368. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33369. wc_MemZero_Add("wolfSSL_RAND_write_file buf", buf, bytes);
  33370. #endif
  33371. f = XFOPEN(fname, "wb");
  33372. if (f == XBADFILE) {
  33373. WOLFSSL_MSG("Error opening the file");
  33374. bytes = 0;
  33375. }
  33376. else {
  33377. size_t bytes_written = XFWRITE(buf, 1, bytes, f);
  33378. bytes = (int)bytes_written;
  33379. XFCLOSE(f);
  33380. }
  33381. }
  33382. ForceZero(buf, bytes);
  33383. #ifdef WOLFSSL_SMALL_STACK
  33384. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33385. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  33386. wc_MemZero_Check(buf, sizeof(buf));
  33387. #endif
  33388. }
  33389. #endif
  33390. return bytes;
  33391. }
  33392. #ifndef FREERTOS_TCP
  33393. /* These constant values are protocol values made by egd */
  33394. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  33395. defined(HAVE_HASHDRBG) && !defined(NETOS) && defined(HAVE_SYS_UN_H)
  33396. #define WOLFSSL_EGD_NBLOCK 0x01
  33397. #include <sys/un.h>
  33398. #endif
  33399. /* This collects entropy from the path nm and seeds the global PRNG with it.
  33400. *
  33401. * nm is the file path to the egd server
  33402. *
  33403. * Returns the number of bytes read.
  33404. */
  33405. int wolfSSL_RAND_egd(const char* nm)
  33406. {
  33407. #ifdef WOLFSSL_EGD_NBLOCK
  33408. struct sockaddr_un rem;
  33409. int fd;
  33410. int ret = WOLFSSL_SUCCESS;
  33411. word32 bytes = 0;
  33412. word32 idx = 0;
  33413. #ifndef WOLFSSL_SMALL_STACK
  33414. unsigned char buf[256];
  33415. #else
  33416. unsigned char* buf;
  33417. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33418. if (buf == NULL) {
  33419. WOLFSSL_MSG("Not enough memory");
  33420. return WOLFSSL_FATAL_ERROR;
  33421. }
  33422. #endif
  33423. XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
  33424. if (nm == NULL) {
  33425. #ifdef WOLFSSL_SMALL_STACK
  33426. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33427. #endif
  33428. return WOLFSSL_FATAL_ERROR;
  33429. }
  33430. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  33431. if (fd < 0) {
  33432. WOLFSSL_MSG("Error creating socket");
  33433. #ifdef WOLFSSL_SMALL_STACK
  33434. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33435. #endif
  33436. return WOLFSSL_FATAL_ERROR;
  33437. }
  33438. rem.sun_family = AF_UNIX;
  33439. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  33440. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  33441. /* connect to egd server */
  33442. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un)) == -1) {
  33443. WOLFSSL_MSG("error connecting to egd server");
  33444. ret = WOLFSSL_FATAL_ERROR;
  33445. }
  33446. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33447. if (ret == WOLFSSL_SUCCESS) {
  33448. wc_MemZero_Add("wolfSSL_RAND_egd buf", buf, 256);
  33449. }
  33450. #endif
  33451. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  33452. buf[idx] = WOLFSSL_EGD_NBLOCK;
  33453. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  33454. ret = (int)write(fd, buf + idx, 2);
  33455. if (ret != 2) {
  33456. if (errno == EAGAIN) {
  33457. ret = WOLFSSL_SUCCESS;
  33458. continue;
  33459. }
  33460. WOLFSSL_MSG("error requesting entropy from egd server");
  33461. ret = WOLFSSL_FATAL_ERROR;
  33462. break;
  33463. }
  33464. /* attempting to read */
  33465. buf[idx] = 0;
  33466. ret = (int)read(fd, buf + idx, 256 - bytes);
  33467. if (ret == 0) {
  33468. WOLFSSL_MSG("error reading entropy from egd server");
  33469. ret = WOLFSSL_FATAL_ERROR;
  33470. break;
  33471. }
  33472. if (ret > 0 && buf[idx] > 0) {
  33473. bytes += buf[idx]; /* egd stores amount sent in first byte */
  33474. if (bytes + idx > 255 || buf[idx] > ret) {
  33475. WOLFSSL_MSG("Buffer error");
  33476. ret = WOLFSSL_FATAL_ERROR;
  33477. break;
  33478. }
  33479. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  33480. idx = bytes;
  33481. ret = WOLFSSL_SUCCESS;
  33482. if (bytes >= 255) {
  33483. break;
  33484. }
  33485. }
  33486. else {
  33487. if (errno == EAGAIN || errno == EINTR) {
  33488. WOLFSSL_MSG("EGD would read");
  33489. ret = WOLFSSL_SUCCESS; /* try again */
  33490. }
  33491. else if (buf[idx] == 0) {
  33492. /* if egd returned 0 then there is no more entropy to be had.
  33493. Do not try more reads. */
  33494. ret = WOLFSSL_SUCCESS;
  33495. break;
  33496. }
  33497. else {
  33498. WOLFSSL_MSG("Error with read");
  33499. ret = WOLFSSL_FATAL_ERROR;
  33500. }
  33501. }
  33502. }
  33503. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  33504. /* call to check global RNG is created */
  33505. if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
  33506. WOLFSSL_MSG("Error with initializing global RNG structure");
  33507. ret = WOLFSSL_FATAL_ERROR;
  33508. }
  33509. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  33510. != 0) {
  33511. WOLFSSL_MSG("Error with reseeding DRBG structure");
  33512. ret = WOLFSSL_FATAL_ERROR;
  33513. }
  33514. #ifdef SHOW_SECRETS
  33515. else { /* print out entropy found only when no error occured */
  33516. word32 i;
  33517. printf("EGD Entropy = ");
  33518. for (i = 0; i < bytes; i++) {
  33519. printf("%02X", buf[i]);
  33520. }
  33521. printf("\n");
  33522. }
  33523. #endif
  33524. }
  33525. ForceZero(buf, bytes);
  33526. #ifdef WOLFSSL_SMALL_STACK
  33527. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33528. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  33529. wc_MemZero_Check(buf, 256);
  33530. #endif
  33531. close(fd);
  33532. if (ret == WOLFSSL_SUCCESS) {
  33533. return bytes;
  33534. }
  33535. else {
  33536. return ret;
  33537. }
  33538. #else
  33539. WOLFSSL_MSG("Type of socket needed is not available");
  33540. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  33541. (void)nm;
  33542. return WOLFSSL_FATAL_ERROR;
  33543. #endif /* WOLFSSL_EGD_NBLOCK */
  33544. }
  33545. #endif /* !FREERTOS_TCP */
  33546. void wolfSSL_RAND_Cleanup(void)
  33547. {
  33548. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33549. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33550. if (gRandMethods && gRandMethods->cleanup)
  33551. gRandMethods->cleanup();
  33552. wc_UnLockMutex(&gRandMethodMutex);
  33553. }
  33554. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  33555. gRandMethodsInit = 0;
  33556. #endif
  33557. #ifdef HAVE_GLOBAL_RNG
  33558. if (wc_LockMutex(&globalRNGMutex) == 0) {
  33559. if (initGlobalRNG) {
  33560. wc_FreeRng(&globalRNG);
  33561. initGlobalRNG = 0;
  33562. }
  33563. wc_UnLockMutex(&globalRNGMutex);
  33564. }
  33565. #endif
  33566. }
  33567. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  33568. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  33569. {
  33570. int ret;
  33571. int hash;
  33572. byte secret[DRBG_SEED_LEN]; /* secret length arbitraily choosen */
  33573. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33574. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33575. if (gRandMethods && gRandMethods->pseudorand) {
  33576. ret = gRandMethods->pseudorand(buf, num);
  33577. wc_UnLockMutex(&gRandMethodMutex);
  33578. return ret;
  33579. }
  33580. wc_UnLockMutex(&gRandMethodMutex);
  33581. }
  33582. #endif
  33583. #ifdef WOLFSSL_HAVE_PRF
  33584. #ifndef NO_SHA256
  33585. hash = WC_SHA256;
  33586. #elif defined(WOLFSSL_SHA384)
  33587. hash = WC_SHA384;
  33588. #elif !defined(NO_SHA)
  33589. hash = WC_SHA;
  33590. #elif !defined(NO_MD5)
  33591. hash = WC_MD5;
  33592. #endif
  33593. /* get secret value from source of entropy */
  33594. ret = wolfSSL_RAND_bytes(secret, DRBG_SEED_LEN);
  33595. /* uses input buffer to seed for pseudo random number generation, each
  33596. * thread will potentially have different results this way */
  33597. if (ret == WOLFSSL_SUCCESS) {
  33598. PRIVATE_KEY_UNLOCK();
  33599. ret = wc_PRF(buf, num, secret, DRBG_SEED_LEN, (const byte*)buf, num,
  33600. hash, NULL, INVALID_DEVID);
  33601. PRIVATE_KEY_LOCK();
  33602. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  33603. }
  33604. #else
  33605. /* fall back to just doing wolfSSL_RAND_bytes if PRF not avialbale */
  33606. ret = wolfSSL_RAND_bytes(buf, num);
  33607. (void)hash;
  33608. (void)secret;
  33609. #endif
  33610. return ret;
  33611. }
  33612. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  33613. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  33614. {
  33615. int ret = 0;
  33616. WC_RNG* rng = NULL;
  33617. #ifdef WOLFSSL_SMALL_STACK
  33618. WC_RNG* tmpRNG = NULL;
  33619. #else
  33620. WC_RNG tmpRNG[1];
  33621. #endif
  33622. int initTmpRng = 0;
  33623. int blockCount = 0;
  33624. #ifdef HAVE_GLOBAL_RNG
  33625. int used_global = 0;
  33626. #endif
  33627. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  33628. /* sanity check */
  33629. if (buf == NULL || num < 0)
  33630. /* return code compliant with OpenSSL */
  33631. return 0;
  33632. /* if a RAND callback has been set try and use it */
  33633. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33634. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33635. if (gRandMethods && gRandMethods->bytes) {
  33636. ret = gRandMethods->bytes(buf, num);
  33637. wc_UnLockMutex(&gRandMethodMutex);
  33638. return ret;
  33639. }
  33640. wc_UnLockMutex(&gRandMethodMutex);
  33641. }
  33642. #endif
  33643. #ifdef HAVE_GLOBAL_RNG
  33644. if (initGlobalRNG) {
  33645. if (wc_LockMutex(&globalRNGMutex) != 0) {
  33646. WOLFSSL_MSG("Bad Lock Mutex rng");
  33647. return ret;
  33648. }
  33649. rng = &globalRNG;
  33650. used_global = 1;
  33651. }
  33652. else
  33653. #endif
  33654. {
  33655. #ifdef WOLFSSL_SMALL_STACK
  33656. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  33657. if (tmpRNG == NULL)
  33658. return ret;
  33659. #endif
  33660. if (wc_InitRng(tmpRNG) == 0) {
  33661. rng = tmpRNG;
  33662. initTmpRng = 1;
  33663. }
  33664. }
  33665. if (rng) {
  33666. /* handles size greater than RNG_MAX_BLOCK_LEN */
  33667. blockCount = num / RNG_MAX_BLOCK_LEN;
  33668. while (blockCount--) {
  33669. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  33670. if (ret != 0) {
  33671. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33672. break;
  33673. }
  33674. num -= RNG_MAX_BLOCK_LEN;
  33675. buf += RNG_MAX_BLOCK_LEN;
  33676. }
  33677. if (ret == 0 && num)
  33678. ret = wc_RNG_GenerateBlock(rng, buf, num);
  33679. if (ret != 0)
  33680. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33681. else
  33682. ret = WOLFSSL_SUCCESS;
  33683. }
  33684. #ifdef HAVE_GLOBAL_RNG
  33685. if (used_global == 1)
  33686. wc_UnLockMutex(&globalRNGMutex);
  33687. #endif
  33688. if (initTmpRng)
  33689. wc_FreeRng(tmpRNG);
  33690. #ifdef WOLFSSL_SMALL_STACK
  33691. if (tmpRNG)
  33692. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  33693. #endif
  33694. return ret;
  33695. }
  33696. int wolfSSL_RAND_poll(void)
  33697. {
  33698. byte entropy[16];
  33699. int ret = 0;
  33700. word32 entropy_sz = 16;
  33701. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  33702. if (initGlobalRNG == 0){
  33703. WOLFSSL_MSG("Global RNG no Init");
  33704. return WOLFSSL_FAILURE;
  33705. }
  33706. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  33707. if (ret != 0){
  33708. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33709. ret = WOLFSSL_FAILURE;
  33710. }else
  33711. ret = WOLFSSL_SUCCESS;
  33712. return ret;
  33713. }
  33714. /* If a valid struct is provided with function pointers, will override
  33715. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  33716. pointer is passed in, it will cancel any previous function overrides.
  33717. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  33718. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  33719. {
  33720. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33721. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33722. gRandMethods = methods;
  33723. wc_UnLockMutex(&gRandMethodMutex);
  33724. return WOLFSSL_SUCCESS;
  33725. }
  33726. #else
  33727. (void)methods;
  33728. #endif
  33729. return WOLFSSL_FAILURE;
  33730. }
  33731. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  33732. int wolfSSL_RAND_status(void)
  33733. {
  33734. int ret = WOLFSSL_SUCCESS;
  33735. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33736. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33737. if (gRandMethods && gRandMethods->status)
  33738. ret = gRandMethods->status();
  33739. wc_UnLockMutex(&gRandMethodMutex);
  33740. }
  33741. else {
  33742. ret = WOLFSSL_FAILURE;
  33743. }
  33744. #else
  33745. /* wolfCrypt provides enough seed internally, so return success */
  33746. #endif
  33747. return ret;
  33748. }
  33749. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  33750. {
  33751. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33752. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33753. if (gRandMethods && gRandMethods->add) {
  33754. /* callback has return code, but RAND_add does not */
  33755. (void)gRandMethods->add(add, len, entropy);
  33756. }
  33757. wc_UnLockMutex(&gRandMethodMutex);
  33758. }
  33759. #else
  33760. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  33761. to take control */
  33762. (void)add;
  33763. (void)len;
  33764. (void)entropy;
  33765. #endif
  33766. }
  33767. #endif /* OPENSSL_EXTRA */
  33768. /*******************************************************************************
  33769. * END OF RAND API
  33770. ******************************************************************************/
  33771. /*******************************************************************************
  33772. * START OF EVP_CIPHER API
  33773. ******************************************************************************/
  33774. #ifdef OPENSSL_EXTRA
  33775. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  33776. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  33777. {
  33778. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  33779. if (ctx == NULL) {
  33780. WOLFSSL_MSG("Bad function argument");
  33781. return WOLFSSL_FATAL_ERROR;
  33782. }
  33783. switch (ctx->cipherType) {
  33784. #ifndef NO_AES
  33785. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  33786. case AES_128_CBC_TYPE :
  33787. case AES_192_CBC_TYPE :
  33788. case AES_256_CBC_TYPE :
  33789. WOLFSSL_MSG("AES CBC");
  33790. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33791. break;
  33792. #endif
  33793. #ifdef HAVE_AESGCM
  33794. case AES_128_GCM_TYPE :
  33795. case AES_192_GCM_TYPE :
  33796. case AES_256_GCM_TYPE :
  33797. WOLFSSL_MSG("AES GCM");
  33798. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33799. break;
  33800. #endif /* HAVE_AESGCM */
  33801. #ifdef HAVE_AES_ECB
  33802. case AES_128_ECB_TYPE :
  33803. case AES_192_ECB_TYPE :
  33804. case AES_256_ECB_TYPE :
  33805. WOLFSSL_MSG("AES ECB");
  33806. break;
  33807. #endif
  33808. #ifdef WOLFSSL_AES_COUNTER
  33809. case AES_128_CTR_TYPE :
  33810. case AES_192_CTR_TYPE :
  33811. case AES_256_CTR_TYPE :
  33812. WOLFSSL_MSG("AES CTR");
  33813. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33814. break;
  33815. #endif /* WOLFSSL_AES_COUNTER */
  33816. #ifdef WOLFSSL_AES_CFB
  33817. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  33818. case AES_128_CFB1_TYPE:
  33819. case AES_192_CFB1_TYPE:
  33820. case AES_256_CFB1_TYPE:
  33821. WOLFSSL_MSG("AES CFB1");
  33822. break;
  33823. case AES_128_CFB8_TYPE:
  33824. case AES_192_CFB8_TYPE:
  33825. case AES_256_CFB8_TYPE:
  33826. WOLFSSL_MSG("AES CFB8");
  33827. break;
  33828. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  33829. case AES_128_CFB128_TYPE:
  33830. case AES_192_CFB128_TYPE:
  33831. case AES_256_CFB128_TYPE:
  33832. WOLFSSL_MSG("AES CFB128");
  33833. break;
  33834. #endif /* WOLFSSL_AES_CFB */
  33835. #if defined(WOLFSSL_AES_OFB)
  33836. case AES_128_OFB_TYPE:
  33837. case AES_192_OFB_TYPE:
  33838. case AES_256_OFB_TYPE:
  33839. WOLFSSL_MSG("AES OFB");
  33840. break;
  33841. #endif /* WOLFSSL_AES_OFB */
  33842. #ifdef WOLFSSL_AES_XTS
  33843. case AES_128_XTS_TYPE:
  33844. case AES_256_XTS_TYPE:
  33845. WOLFSSL_MSG("AES XTS");
  33846. break;
  33847. #endif /* WOLFSSL_AES_XTS */
  33848. #endif /* NO_AES */
  33849. #ifndef NO_DES3
  33850. case DES_CBC_TYPE :
  33851. WOLFSSL_MSG("DES CBC");
  33852. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  33853. break;
  33854. case DES_EDE3_CBC_TYPE :
  33855. WOLFSSL_MSG("DES EDE3 CBC");
  33856. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  33857. break;
  33858. #endif
  33859. #ifdef WOLFSSL_DES_ECB
  33860. case DES_ECB_TYPE :
  33861. WOLFSSL_MSG("DES ECB");
  33862. break;
  33863. case DES_EDE3_ECB_TYPE :
  33864. WOLFSSL_MSG("DES3 ECB");
  33865. break;
  33866. #endif
  33867. case ARC4_TYPE :
  33868. WOLFSSL_MSG("ARC4");
  33869. break;
  33870. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  33871. case CHACHA20_POLY1305_TYPE:
  33872. break;
  33873. #endif
  33874. #ifdef HAVE_CHACHA
  33875. case CHACHA20_TYPE:
  33876. break;
  33877. #endif
  33878. case NULL_CIPHER_TYPE :
  33879. WOLFSSL_MSG("NULL");
  33880. break;
  33881. default: {
  33882. WOLFSSL_MSG("bad type");
  33883. return WOLFSSL_FATAL_ERROR;
  33884. }
  33885. }
  33886. return WOLFSSL_SUCCESS;
  33887. }
  33888. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  33889. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  33890. {
  33891. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  33892. if (ctx == NULL) {
  33893. WOLFSSL_MSG("Bad function argument");
  33894. return WOLFSSL_FATAL_ERROR;
  33895. }
  33896. switch (ctx->cipherType) {
  33897. #ifndef NO_AES
  33898. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  33899. case AES_128_CBC_TYPE :
  33900. case AES_192_CBC_TYPE :
  33901. case AES_256_CBC_TYPE :
  33902. WOLFSSL_MSG("AES CBC");
  33903. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33904. break;
  33905. #endif
  33906. #ifdef HAVE_AESGCM
  33907. case AES_128_GCM_TYPE :
  33908. case AES_192_GCM_TYPE :
  33909. case AES_256_GCM_TYPE :
  33910. WOLFSSL_MSG("AES GCM");
  33911. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33912. break;
  33913. #endif
  33914. #ifdef HAVE_AES_ECB
  33915. case AES_128_ECB_TYPE :
  33916. case AES_192_ECB_TYPE :
  33917. case AES_256_ECB_TYPE :
  33918. WOLFSSL_MSG("AES ECB");
  33919. break;
  33920. #endif
  33921. #ifdef WOLFSSL_AES_COUNTER
  33922. case AES_128_CTR_TYPE :
  33923. case AES_192_CTR_TYPE :
  33924. case AES_256_CTR_TYPE :
  33925. WOLFSSL_MSG("AES CTR");
  33926. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33927. break;
  33928. #endif
  33929. #endif /* NO_AES */
  33930. #ifndef NO_DES3
  33931. case DES_CBC_TYPE :
  33932. WOLFSSL_MSG("DES CBC");
  33933. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  33934. break;
  33935. case DES_EDE3_CBC_TYPE :
  33936. WOLFSSL_MSG("DES EDE3 CBC");
  33937. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  33938. break;
  33939. #endif
  33940. #ifdef WOLFSSL_DES_ECB
  33941. case DES_ECB_TYPE :
  33942. WOLFSSL_MSG("DES ECB");
  33943. break;
  33944. case DES_EDE3_ECB_TYPE :
  33945. WOLFSSL_MSG("DES3 ECB");
  33946. break;
  33947. #endif
  33948. case ARC4_TYPE :
  33949. WOLFSSL_MSG("ARC4");
  33950. break;
  33951. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  33952. case CHACHA20_POLY1305_TYPE:
  33953. break;
  33954. #endif
  33955. #ifdef HAVE_CHACHA
  33956. case CHACHA20_TYPE:
  33957. break;
  33958. #endif
  33959. case NULL_CIPHER_TYPE :
  33960. WOLFSSL_MSG("NULL");
  33961. break;
  33962. default: {
  33963. WOLFSSL_MSG("bad type");
  33964. return WOLFSSL_FATAL_ERROR;
  33965. }
  33966. }
  33967. return WOLFSSL_SUCCESS;
  33968. }
  33969. #ifndef NO_DES3
  33970. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  33971. unsigned char* iv, int len)
  33972. {
  33973. (void)len;
  33974. WOLFSSL_MSG("wolfSSL_3des_iv");
  33975. if (ctx == NULL || iv == NULL) {
  33976. WOLFSSL_MSG("Bad function argument");
  33977. return;
  33978. }
  33979. if (doset)
  33980. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  33981. else
  33982. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  33983. }
  33984. #endif /* NO_DES3 */
  33985. #ifndef NO_AES
  33986. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  33987. unsigned char* iv, int len)
  33988. {
  33989. (void)len;
  33990. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  33991. if (ctx == NULL || iv == NULL) {
  33992. WOLFSSL_MSG("Bad function argument");
  33993. return;
  33994. }
  33995. if (doset)
  33996. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  33997. else
  33998. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33999. }
  34000. #endif /* NO_AES */
  34001. #endif /* OPENSSL_EXTRA */
  34002. /*******************************************************************************
  34003. * END OF EVP_CIPHER API
  34004. ******************************************************************************/
  34005. #ifndef NO_CERTS
  34006. #define WOLFSSL_X509_STORE_INCLUDED
  34007. #include <src/x509_str.c>
  34008. /*******************************************************************************
  34009. * START OF PKCS7 APIs
  34010. ******************************************************************************/
  34011. #ifdef HAVE_PKCS7
  34012. #ifdef OPENSSL_ALL
  34013. PKCS7* wolfSSL_PKCS7_new(void)
  34014. {
  34015. WOLFSSL_PKCS7* pkcs7;
  34016. int ret = 0;
  34017. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL,
  34018. DYNAMIC_TYPE_PKCS7);
  34019. if (pkcs7 != NULL) {
  34020. XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7));
  34021. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  34022. }
  34023. if (ret != 0 && pkcs7 != NULL) {
  34024. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  34025. pkcs7 = NULL;
  34026. }
  34027. return (PKCS7*)pkcs7;
  34028. }
  34029. /******************************************************************************
  34030. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  34031. *
  34032. * RETURNS:
  34033. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  34034. */
  34035. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  34036. {
  34037. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  34038. PKCS7* pkcs7 = NULL;
  34039. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  34040. return NULL;
  34041. pkcs7->contentOID = SIGNED_DATA;
  34042. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  34043. if (pkcs7) {
  34044. wolfSSL_PKCS7_free(pkcs7);
  34045. return NULL;
  34046. }
  34047. }
  34048. return pkcs7;
  34049. }
  34050. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  34051. {
  34052. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34053. if (p7 != NULL) {
  34054. if (p7->data != NULL)
  34055. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  34056. wc_PKCS7_Free(&p7->pkcs7);
  34057. if (p7->certs)
  34058. wolfSSL_sk_pop_free(p7->certs, NULL);
  34059. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  34060. }
  34061. }
  34062. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  34063. {
  34064. wolfSSL_PKCS7_free(p7);
  34065. return;
  34066. }
  34067. /**
  34068. * Convert DER/ASN.1 encoded signedData structure to internal PKCS7
  34069. * structure. Note, does not support detached content.
  34070. *
  34071. * p7 - pointer to set to address of newly created PKCS7 structure on return
  34072. * in - pointer to pointer of DER/ASN.1 data
  34073. * len - length of input data, bytes
  34074. *
  34075. * Returns newly allocated and populated PKCS7 structure or NULL on error.
  34076. */
  34077. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  34078. {
  34079. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  34080. }
  34081. /*****************************************************************************
  34082. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  34083. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  34084. * is stored as the PKCS7 object's content, to support detached signatures.
  34085. * @param content The content which is signed, in case the signature is
  34086. * detached. Ignored if NULL.
  34087. * @param contentSz The size of the passed in content.
  34088. *
  34089. * RETURNS:
  34090. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  34091. */
  34092. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  34093. byte* content, word32 contentSz)
  34094. {
  34095. WOLFSSL_PKCS7* pkcs7 = NULL;
  34096. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  34097. if (in == NULL || *in == NULL || len < 0)
  34098. return NULL;
  34099. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  34100. return NULL;
  34101. pkcs7->len = len;
  34102. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  34103. if (pkcs7->data == NULL) {
  34104. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  34105. return NULL;
  34106. }
  34107. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  34108. if (content != NULL) {
  34109. pkcs7->pkcs7.content = content;
  34110. pkcs7->pkcs7.contentSz = contentSz;
  34111. }
  34112. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  34113. != 0) {
  34114. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  34115. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  34116. return NULL;
  34117. }
  34118. if (p7 != NULL)
  34119. *p7 = (PKCS7*)pkcs7;
  34120. *in += pkcs7->len;
  34121. return (PKCS7*)pkcs7;
  34122. }
  34123. /**
  34124. * This API was added as a helper function for libest. It
  34125. * extracts a stack of certificates from the pkcs7 object.
  34126. * @param pkcs7 PKCS7 parameter object
  34127. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  34128. */
  34129. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  34130. {
  34131. int i;
  34132. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34133. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  34134. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  34135. if (!p7) {
  34136. WOLFSSL_MSG("Bad parameter");
  34137. return NULL;
  34138. }
  34139. if (p7->certs)
  34140. return p7->certs;
  34141. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  34142. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  34143. p7->pkcs7.certSz[i]);
  34144. if (!ret)
  34145. ret = wolfSSL_sk_X509_new_null();
  34146. if (x509) {
  34147. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  34148. wolfSSL_X509_free(x509);
  34149. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  34150. goto error;
  34151. }
  34152. }
  34153. else {
  34154. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  34155. goto error;
  34156. }
  34157. }
  34158. /* Save stack to free later */
  34159. if (p7->certs)
  34160. wolfSSL_sk_pop_free(p7->certs, NULL);
  34161. p7->certs = ret;
  34162. return ret;
  34163. error:
  34164. if (ret) {
  34165. wolfSSL_sk_pop_free(ret, NULL);
  34166. }
  34167. return NULL;
  34168. }
  34169. /**
  34170. * Return stack of signers contained in PKCS7 cert.
  34171. * Notes:
  34172. * - Currently only PKCS#7 messages with a single signer cert is supported.
  34173. * - Returned WOLFSSL_STACK must be freed by caller.
  34174. *
  34175. * pkcs7 - PKCS7 struct to retrieve signer certs from.
  34176. * certs - currently unused
  34177. * flags - flags to control function behavior.
  34178. *
  34179. * Return WOLFSSL_STACK of signers on success, NULL on error.
  34180. */
  34181. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  34182. int flags)
  34183. {
  34184. WOLFSSL_X509* x509 = NULL;
  34185. WOLFSSL_STACK* signers = NULL;
  34186. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34187. if (p7 == NULL)
  34188. return NULL;
  34189. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  34190. * is supported.
  34191. */
  34192. if (flags & PKCS7_NOINTERN) {
  34193. WOLFSSL_MSG("PKCS7_NOINTERN flag not supported");
  34194. return NULL;
  34195. }
  34196. signers = wolfSSL_sk_X509_new_null();
  34197. if (signers == NULL)
  34198. return NULL;
  34199. if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert,
  34200. p7->pkcs7.singleCertSz) == NULL) {
  34201. wolfSSL_sk_X509_pop_free(signers, NULL);
  34202. return NULL;
  34203. }
  34204. if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) {
  34205. wolfSSL_sk_X509_pop_free(signers, NULL);
  34206. return NULL;
  34207. }
  34208. (void)certs;
  34209. return signers;
  34210. }
  34211. #ifndef NO_BIO
  34212. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  34213. {
  34214. WOLFSSL_PKCS7* pkcs7;
  34215. int ret;
  34216. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  34217. if (bio == NULL)
  34218. return NULL;
  34219. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  34220. return NULL;
  34221. pkcs7->len = wolfSSL_BIO_get_len(bio);
  34222. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  34223. if (pkcs7->data == NULL) {
  34224. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  34225. return NULL;
  34226. }
  34227. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  34228. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  34229. return NULL;
  34230. }
  34231. /* pkcs7->len may change if using b64 for example */
  34232. pkcs7->len = ret;
  34233. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  34234. != 0) {
  34235. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  34236. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  34237. return NULL;
  34238. }
  34239. if (p7 != NULL)
  34240. *p7 = (PKCS7*)pkcs7;
  34241. return (PKCS7*)pkcs7;
  34242. }
  34243. int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out)
  34244. {
  34245. byte* output = NULL;
  34246. int localBuf = 0;
  34247. int len;
  34248. WC_RNG rng;
  34249. int ret = WOLFSSL_FAILURE;
  34250. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7");
  34251. if (!out || !p7) {
  34252. WOLFSSL_MSG("Bad parameter");
  34253. return WOLFSSL_FAILURE;
  34254. }
  34255. if (!p7->rng) {
  34256. if (wc_InitRng(&rng) != 0) {
  34257. WOLFSSL_MSG("wc_InitRng error");
  34258. return WOLFSSL_FAILURE;
  34259. }
  34260. p7->rng = &rng; // cppcheck-suppress autoVariables
  34261. }
  34262. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  34263. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  34264. goto cleanup;
  34265. }
  34266. if (*out == NULL) {
  34267. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34268. if (!output) {
  34269. WOLFSSL_MSG("malloc error");
  34270. goto cleanup;
  34271. }
  34272. localBuf = 1;
  34273. }
  34274. else {
  34275. output = *out;
  34276. }
  34277. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  34278. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  34279. goto cleanup;
  34280. }
  34281. ret = len;
  34282. cleanup:
  34283. if (p7->rng == &rng) {
  34284. wc_FreeRng(&rng);
  34285. p7->rng = NULL;
  34286. }
  34287. if (ret == WOLFSSL_FAILURE && localBuf && output)
  34288. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34289. if (ret != WOLFSSL_FAILURE)
  34290. *out = output;
  34291. return ret;
  34292. }
  34293. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  34294. {
  34295. byte* output = NULL;
  34296. int len;
  34297. int ret = WOLFSSL_FAILURE;
  34298. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  34299. if (!bio || !p7) {
  34300. WOLFSSL_MSG("Bad parameter");
  34301. return WOLFSSL_FAILURE;
  34302. }
  34303. if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) {
  34304. WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error");
  34305. goto cleanup;
  34306. }
  34307. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  34308. WOLFSSL_MSG("wolfSSL_BIO_write error");
  34309. goto cleanup;
  34310. }
  34311. ret = WOLFSSL_SUCCESS;
  34312. cleanup:
  34313. if (output)
  34314. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34315. return ret;
  34316. }
  34317. /**
  34318. * Creates and returns a PKCS7 signedData structure.
  34319. *
  34320. * Inner content type is set to DATA to match OpenSSL behavior.
  34321. *
  34322. * signer - certificate to sign bundle with
  34323. * pkey - private key matching signer
  34324. * certs - optional additional set of certificates to include
  34325. * in - input data to be signed
  34326. * flags - optional set of flags to control sign behavior
  34327. *
  34328. * PKCS7_BINARY - Do not translate input data to MIME canonical
  34329. * format (\r\n line endings), thus preventing corruption of
  34330. * binary content.
  34331. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  34332. * PKCS7_DETACHED - Set signature detached, omit content from output bundle.
  34333. * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data.
  34334. *
  34335. * Flags not currently supported:
  34336. * PKCS7_NOCERTS - Do not include the signer cert in the output bundle.
  34337. * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up,
  34338. * then signers etc to be added separately before
  34339. * calling PKCS7_final().
  34340. *
  34341. * Returns valid PKCS7 structure pointer, or NULL if an error occurred.
  34342. */
  34343. PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey,
  34344. WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags)
  34345. {
  34346. int err = 0;
  34347. WOLFSSL_PKCS7* p7 = NULL;
  34348. WOLFSSL_STACK* cert = certs;
  34349. WOLFSSL_ENTER("wolfSSL_PKCS7_sign");
  34350. if (flags & PKCS7_NOCERTS) {
  34351. WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported");
  34352. err = 1;
  34353. }
  34354. if (flags & PKCS7_PARTIAL) {
  34355. WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported");
  34356. err = 1;
  34357. }
  34358. if ((err == 0) && (signer == NULL || signer->derCert == NULL ||
  34359. signer->derCert->length == 0)) {
  34360. WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete");
  34361. err = 1;
  34362. }
  34363. if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL ||
  34364. pkey->pkey_sz <= 0)) {
  34365. WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete");
  34366. err = 1;
  34367. }
  34368. if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) {
  34369. WOLFSSL_MSG("input data required unless PKCS7_STREAM used");
  34370. err = 1;
  34371. }
  34372. if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) {
  34373. WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7");
  34374. err = 1;
  34375. }
  34376. /* load signer certificate */
  34377. if (err == 0) {
  34378. if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer,
  34379. signer->derCert->length) != 0) {
  34380. WOLFSSL_MSG("Failed to load signer certificate");
  34381. err = 1;
  34382. }
  34383. }
  34384. /* set signer private key, data types, defaults */
  34385. if (err == 0) {
  34386. p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr;
  34387. p7->pkcs7.privateKeySz = pkey->pkey_sz;
  34388. p7->pkcs7.contentOID = DATA; /* inner content default is DATA */
  34389. p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */
  34390. p7->type = SIGNED_DATA; /* PKCS7_final switches on type */
  34391. }
  34392. /* add additional chain certs if provided */
  34393. while (cert && (err == 0)) {
  34394. if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) {
  34395. if (wc_PKCS7_AddCertificate(&p7->pkcs7,
  34396. cert->data.x509->derCert->buffer,
  34397. cert->data.x509->derCert->length) != 0) {
  34398. WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate");
  34399. err = 1;
  34400. }
  34401. }
  34402. cert = cert->next;
  34403. }
  34404. if ((err == 0) && (flags & PKCS7_DETACHED)) {
  34405. if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) {
  34406. WOLFSSL_MSG("Failed to set signature detached");
  34407. err = 1;
  34408. }
  34409. }
  34410. if ((err == 0) && (flags & PKCS7_STREAM)) {
  34411. /* if streaming, return before finalizing */
  34412. return (PKCS7*)p7;
  34413. }
  34414. if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) {
  34415. WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final");
  34416. err = 1;
  34417. }
  34418. if ((err != 0) && (p7 != NULL)) {
  34419. wolfSSL_PKCS7_free((PKCS7*)p7);
  34420. p7 = NULL;
  34421. }
  34422. return (PKCS7*)p7;
  34423. }
  34424. #ifdef HAVE_SMIME
  34425. #ifndef MAX_MIME_LINE_LEN
  34426. #define MAX_MIME_LINE_LEN 1024
  34427. #endif
  34428. /**
  34429. * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n),
  34430. * used by PKCS7_final().
  34431. *
  34432. * in - input WOLFSSL_BIO to be converted
  34433. * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted
  34434. *
  34435. * Return 0 on success, negative on error
  34436. */
  34437. static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out)
  34438. {
  34439. int ret = 0;
  34440. int lineLen = 0;
  34441. word32 canonLineLen = 0;
  34442. char* canonLine = NULL;
  34443. #ifdef WOLFSSL_SMALL_STACK
  34444. char* line = NULL;
  34445. #else
  34446. char line[MAX_MIME_LINE_LEN];
  34447. #endif
  34448. if (in == NULL || out == NULL) {
  34449. return BAD_FUNC_ARG;
  34450. }
  34451. #ifdef WOLFSSL_SMALL_STACK
  34452. line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap,
  34453. DYNAMIC_TYPE_TMP_BUFFER);
  34454. if (line == NULL) {
  34455. return MEMORY_E;
  34456. }
  34457. #endif
  34458. XMEMSET(line, 0, MAX_MIME_LINE_LEN);
  34459. while ((lineLen = wolfSSL_BIO_gets(in, line, (int)sizeof(line))) > 0) {
  34460. if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') {
  34461. canonLineLen = (word32)lineLen;
  34462. if ((canonLine = wc_MIME_single_canonicalize(
  34463. line, &canonLineLen)) == NULL) {
  34464. ret = -1;
  34465. break;
  34466. }
  34467. /* remove trailing null */
  34468. if (canonLine[canonLineLen] == '\0') {
  34469. canonLineLen--;
  34470. }
  34471. if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) {
  34472. ret = -1;
  34473. break;
  34474. }
  34475. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  34476. canonLine = NULL;
  34477. }
  34478. else {
  34479. /* no line ending in current line, write direct to out */
  34480. if (wolfSSL_BIO_write(out, line, lineLen) < 0) {
  34481. ret = -1;
  34482. break;
  34483. }
  34484. }
  34485. }
  34486. if (canonLine != NULL) {
  34487. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  34488. }
  34489. #ifdef WOLFSSL_SMALL_STACK
  34490. XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34491. #endif
  34492. return ret;
  34493. }
  34494. #endif /* HAVE_SMIME */
  34495. /* Used by both PKCS7_final() and PKCS7_verify() */
  34496. static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n";
  34497. /**
  34498. * Finalize PKCS7 structure, currently supports signedData only.
  34499. *
  34500. * Does not generate final bundle (ie: signedData), but finalizes
  34501. * the PKCS7 structure in preparation for a output function to be called next.
  34502. *
  34503. * pkcs7 - initialized PKCS7 structure, populated with signer, etc
  34504. * in - input data
  34505. * flags - flags to control PKCS7 behavior. Other flags except those noted
  34506. * below are ignored:
  34507. *
  34508. * PKCS7_BINARY - Do not translate input data to MIME canonical
  34509. * format (\r\n line endings), thus preventing corruption of
  34510. * binary content.
  34511. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  34512. *
  34513. * Returns 1 on success, 0 on error
  34514. */
  34515. int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags)
  34516. {
  34517. int ret = 1;
  34518. int memSz = 0;
  34519. unsigned char* mem = NULL;
  34520. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34521. WOLFSSL_BIO* data = NULL;
  34522. WOLFSSL_ENTER("wolfSSL_PKCS7_final");
  34523. if (p7 == NULL || in == NULL) {
  34524. WOLFSSL_MSG("Bad input args to PKCS7_final");
  34525. ret = 0;
  34526. }
  34527. if (ret == 1) {
  34528. if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) {
  34529. WOLFSSL_MSG("Error in wolfSSL_BIO_new");
  34530. ret = 0;
  34531. }
  34532. }
  34533. /* prepend Content-Type header if PKCS7_TEXT */
  34534. if ((ret == 1) && (flags & PKCS7_TEXT)) {
  34535. if (wolfSSL_BIO_write(data, contTypeText,
  34536. (int)XSTR_SIZEOF(contTypeText)) < 0) {
  34537. WOLFSSL_MSG("Error prepending Content-Type header");
  34538. ret = 0;
  34539. }
  34540. }
  34541. /* convert line endings to CRLF if !PKCS7_BINARY */
  34542. if (ret == 1) {
  34543. if (flags & PKCS7_BINARY) {
  34544. /* no CRLF conversion, direct copy content */
  34545. if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) {
  34546. ret = 0;
  34547. }
  34548. if (ret == 1) {
  34549. mem = (unsigned char*)XMALLOC(memSz, in->heap,
  34550. DYNAMIC_TYPE_TMP_BUFFER);
  34551. if (mem == NULL) {
  34552. WOLFSSL_MSG("Failed to allocate memory for input data");
  34553. ret = 0;
  34554. }
  34555. }
  34556. if (ret == 1) {
  34557. if (wolfSSL_BIO_read(in, mem, memSz) != memSz) {
  34558. WOLFSSL_MSG("Error reading from input BIO");
  34559. ret = 0;
  34560. }
  34561. else if (wolfSSL_BIO_write(data, mem, memSz) < 0) {
  34562. ret = 0;
  34563. }
  34564. }
  34565. if (mem != NULL) {
  34566. XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34567. }
  34568. }
  34569. else {
  34570. #ifdef HAVE_SMIME
  34571. /* convert content line endings to CRLF */
  34572. if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) {
  34573. WOLFSSL_MSG("Error converting line endings to CRLF");
  34574. ret = 0;
  34575. }
  34576. else {
  34577. p7->pkcs7.contentCRLF = 1;
  34578. }
  34579. #else
  34580. WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built "
  34581. "with HAVE_SMIME");
  34582. ret = 0;
  34583. #endif
  34584. }
  34585. }
  34586. if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) {
  34587. WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data");
  34588. ret = 0;
  34589. }
  34590. if (ret == 1) {
  34591. if (p7->data != NULL) {
  34592. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  34593. }
  34594. p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7);
  34595. if (p7->data == NULL) {
  34596. ret = 0;
  34597. }
  34598. else {
  34599. XMEMCPY(p7->data, mem, memSz);
  34600. p7->len = memSz;
  34601. }
  34602. }
  34603. if (ret == 1) {
  34604. p7->pkcs7.content = p7->data;
  34605. p7->pkcs7.contentSz = p7->len;
  34606. }
  34607. if (data != NULL) {
  34608. wolfSSL_BIO_free(data);
  34609. }
  34610. return ret;
  34611. }
  34612. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  34613. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags)
  34614. {
  34615. int i, ret = 0;
  34616. unsigned char* mem = NULL;
  34617. int memSz = 0;
  34618. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34619. int contTypeLen;
  34620. WOLFSSL_X509* signer = NULL;
  34621. WOLFSSL_STACK* signers = NULL;
  34622. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  34623. if (pkcs7 == NULL)
  34624. return WOLFSSL_FAILURE;
  34625. if (in != NULL) {
  34626. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  34627. return WOLFSSL_FAILURE;
  34628. p7->pkcs7.content = mem;
  34629. p7->pkcs7.contentSz = memSz;
  34630. }
  34631. /* certs is the list of certificates to find the cert with issuer/serial. */
  34632. (void)certs;
  34633. /* store is the certificate store to use to verify signer certificate
  34634. * associated with the signers.
  34635. */
  34636. (void)store;
  34637. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  34638. if (ret != 0)
  34639. return WOLFSSL_FAILURE;
  34640. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  34641. /* Verify signer certificates */
  34642. if (store == NULL || store->cm == NULL) {
  34643. WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set");
  34644. return WOLFSSL_FAILURE;
  34645. }
  34646. signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags);
  34647. if (signers == NULL) {
  34648. WOLFSSL_MSG("No signers found to verify");
  34649. return WOLFSSL_FAILURE;
  34650. }
  34651. for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) {
  34652. signer = wolfSSL_sk_X509_value(signers, i);
  34653. if (wolfSSL_CertManagerVerifyBuffer(store->cm,
  34654. signer->derCert->buffer,
  34655. signer->derCert->length,
  34656. WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
  34657. WOLFSSL_MSG("Failed to verify signer certificate");
  34658. wolfSSL_sk_X509_pop_free(signers, NULL);
  34659. return WOLFSSL_FAILURE;
  34660. }
  34661. }
  34662. wolfSSL_sk_X509_pop_free(signers, NULL);
  34663. }
  34664. if (flags & PKCS7_TEXT) {
  34665. /* strip MIME header for text/plain, otherwise error */
  34666. contTypeLen = XSTR_SIZEOF(contTypeText);
  34667. if ((p7->pkcs7.contentSz < (word32)contTypeLen) ||
  34668. (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) {
  34669. WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT");
  34670. return WOLFSSL_FAILURE;
  34671. }
  34672. p7->pkcs7.content += contTypeLen;
  34673. p7->pkcs7.contentSz -= contTypeLen;
  34674. }
  34675. if (out != NULL) {
  34676. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  34677. }
  34678. WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS);
  34679. return WOLFSSL_SUCCESS;
  34680. }
  34681. /**
  34682. * This API was added as a helper function for libest. It
  34683. * encodes a stack of certificates to pkcs7 format.
  34684. * @param pkcs7 PKCS7 parameter object
  34685. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  34686. * @param out Output bio
  34687. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  34688. */
  34689. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  34690. WOLFSSL_BIO* out)
  34691. {
  34692. int ret;
  34693. WOLFSSL_PKCS7* p7;
  34694. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  34695. if (!pkcs7 || !certs || !out) {
  34696. WOLFSSL_MSG("Bad parameter");
  34697. return WOLFSSL_FAILURE;
  34698. }
  34699. p7 = (WOLFSSL_PKCS7*)pkcs7;
  34700. /* take ownership of certs */
  34701. p7->certs = certs;
  34702. if (pkcs7->certList) {
  34703. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  34704. "struct");
  34705. return WOLFSSL_FAILURE;
  34706. }
  34707. if (certs) {
  34708. /* Save some of the values */
  34709. int hashOID = pkcs7->hashOID;
  34710. byte version = pkcs7->version;
  34711. if (!certs->data.x509 || !certs->data.x509->derCert) {
  34712. WOLFSSL_MSG("Missing cert");
  34713. return WOLFSSL_FAILURE;
  34714. }
  34715. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  34716. certs->data.x509->derCert->length) != 0) {
  34717. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  34718. return WOLFSSL_FAILURE;
  34719. }
  34720. certs = certs->next;
  34721. pkcs7->hashOID = hashOID;
  34722. pkcs7->version = version;
  34723. }
  34724. /* Add the certs to the PKCS7 struct */
  34725. while (certs) {
  34726. if (!certs->data.x509 || !certs->data.x509->derCert) {
  34727. WOLFSSL_MSG("Missing cert");
  34728. return WOLFSSL_FAILURE;
  34729. }
  34730. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  34731. certs->data.x509->derCert->length) != 0) {
  34732. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  34733. return WOLFSSL_FAILURE;
  34734. }
  34735. certs = certs->next;
  34736. }
  34737. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  34738. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  34739. return WOLFSSL_FAILURE;
  34740. }
  34741. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  34742. return ret;
  34743. }
  34744. /******************************************************************************
  34745. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  34746. *
  34747. * RETURNS:
  34748. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  34749. */
  34750. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  34751. {
  34752. #ifdef WOLFSSL_SMALL_STACK
  34753. byte* outputHead;
  34754. byte* outputFoot;
  34755. #else
  34756. byte outputHead[2048];
  34757. byte outputFoot[2048];
  34758. #endif
  34759. word32 outputHeadSz = 2048;
  34760. word32 outputFootSz = 2048;
  34761. word32 outputSz = 0;
  34762. byte* output = NULL;
  34763. byte* pem = NULL;
  34764. int pemSz = -1;
  34765. enum wc_HashType hashType;
  34766. byte hashBuf[WC_MAX_DIGEST_SIZE];
  34767. word32 hashSz = -1;
  34768. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  34769. if (bio == NULL || p7 == NULL)
  34770. return WOLFSSL_FAILURE;
  34771. #ifdef WOLFSSL_SMALL_STACK
  34772. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap,
  34773. DYNAMIC_TYPE_TMP_BUFFER);
  34774. if (outputHead == NULL)
  34775. return MEMORY_E;
  34776. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap,
  34777. DYNAMIC_TYPE_TMP_BUFFER);
  34778. if (outputFoot == NULL)
  34779. goto error;
  34780. #endif
  34781. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  34782. XMEMSET(outputHead, 0, outputHeadSz);
  34783. XMEMSET(outputFoot, 0, outputFootSz);
  34784. hashType = wc_OidGetHash(p7->hashOID);
  34785. hashSz = wc_HashGetDigestSize(hashType);
  34786. if (hashSz > WC_MAX_DIGEST_SIZE)
  34787. return WOLFSSL_FAILURE;
  34788. /* only SIGNED_DATA is supported */
  34789. switch (p7->contentOID) {
  34790. case SIGNED_DATA:
  34791. break;
  34792. default:
  34793. WOLFSSL_MSG("Unknown PKCS#7 Type");
  34794. return WOLFSSL_FAILURE;
  34795. };
  34796. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  34797. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  34798. return WOLFSSL_FAILURE;
  34799. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  34800. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34801. if (!output)
  34802. return WOLFSSL_FAILURE;
  34803. XMEMSET(output, 0, outputSz);
  34804. outputSz = 0;
  34805. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  34806. outputSz += outputHeadSz;
  34807. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  34808. outputSz += p7->contentSz;
  34809. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  34810. outputSz += outputFootSz;
  34811. /* get PEM size */
  34812. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  34813. if (pemSz < 0)
  34814. goto error;
  34815. pemSz++; /* for '\0'*/
  34816. /* create PEM buffer and convert from DER to PEM*/
  34817. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER))
  34818. == NULL)
  34819. goto error;
  34820. XMEMSET(pem, 0, pemSz);
  34821. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  34822. goto error;
  34823. }
  34824. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  34825. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34826. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34827. #ifdef WOLFSSL_SMALL_STACK
  34828. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34829. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34830. #endif
  34831. return WOLFSSL_SUCCESS;
  34832. }
  34833. error:
  34834. #ifdef WOLFSSL_SMALL_STACK
  34835. if (outputHead) {
  34836. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34837. }
  34838. if (outputFoot) {
  34839. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34840. }
  34841. #endif
  34842. if (output) {
  34843. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34844. }
  34845. if (pem) {
  34846. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34847. }
  34848. return WOLFSSL_FAILURE;
  34849. }
  34850. #ifdef HAVE_SMIME
  34851. /*****************************************************************************
  34852. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  34853. * a PKCS7 object. In case of a multipart message, stores the signed data in
  34854. * bcont.
  34855. *
  34856. * RETURNS:
  34857. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  34858. */
  34859. WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  34860. WOLFSSL_BIO** bcont)
  34861. {
  34862. MimeHdr* allHdrs = NULL;
  34863. MimeHdr* curHdr = NULL;
  34864. MimeParam* curParam = NULL;
  34865. int inLen = 0;
  34866. byte* bcontMem = NULL;
  34867. int bcontMemSz = 0;
  34868. int sectionLen = 0;
  34869. int ret = -1;
  34870. char* section = NULL;
  34871. char* canonLine = NULL;
  34872. char* canonSection = NULL;
  34873. PKCS7* pkcs7 = NULL;
  34874. word32 outLen = 0;
  34875. word32 canonLineLen = 0;
  34876. byte* out = NULL;
  34877. byte* outHead = NULL;
  34878. int canonPos = 0;
  34879. int lineLen = 0;
  34880. int remainLen = 0;
  34881. byte isEnd = 0;
  34882. size_t canonSize = 0;
  34883. size_t boundLen = 0;
  34884. char* boundary = NULL;
  34885. static const char kContType[] = "Content-Type";
  34886. static const char kCTE[] = "Content-Transfer-Encoding";
  34887. static const char kMultSigned[] = "multipart/signed";
  34888. static const char kAppPkcsSign[] = "application/pkcs7-signature";
  34889. static const char kAppXPkcsSign[] = "application/x-pkcs7-signature";
  34890. static const char kAppPkcs7Mime[] = "application/pkcs7-mime";
  34891. static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime";
  34892. WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7");
  34893. if (in == NULL || bcont == NULL) {
  34894. goto error;
  34895. }
  34896. inLen = wolfSSL_BIO_get_len(in);
  34897. if (inLen <= 0) {
  34898. goto error;
  34899. }
  34900. remainLen = wolfSSL_BIO_get_len(in);
  34901. if (remainLen <= 0) {
  34902. goto error;
  34903. }
  34904. section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  34905. if (section == NULL) {
  34906. goto error;
  34907. }
  34908. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34909. if (lineLen <= 0) {
  34910. goto error;
  34911. }
  34912. while (isEnd == 0 && remainLen > 0) {
  34913. sectionLen += lineLen;
  34914. remainLen -= lineLen;
  34915. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  34916. if (lineLen <= 0) {
  34917. goto error;
  34918. }
  34919. /* Line with just newline signals end of headers. */
  34920. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  34921. "\r\n", 2)) ||
  34922. (lineLen==1 && (section[sectionLen] == '\r' ||
  34923. section[sectionLen] == '\n'))) {
  34924. isEnd = 1;
  34925. }
  34926. }
  34927. section[sectionLen] = '\0';
  34928. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  34929. if (ret < 0) {
  34930. WOLFSSL_MSG("Parsing MIME headers failed.");
  34931. goto error;
  34932. }
  34933. isEnd = 0;
  34934. section[0] = '\0';
  34935. sectionLen = 0;
  34936. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  34937. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  34938. XSTR_SIZEOF(kMultSigned))) {
  34939. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  34940. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  34941. XSTR_SIZEOF(kAppPkcsSign)) ||
  34942. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  34943. XSTR_SIZEOF(kAppXPkcsSign)))) {
  34944. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  34945. if (curParam == NULL) {
  34946. goto error;
  34947. }
  34948. boundLen = XSTRLEN(curParam->value) + 2;
  34949. boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  34950. if (boundary == NULL) {
  34951. goto error;
  34952. }
  34953. XMEMSET(boundary, 0, (word32)(boundLen+1));
  34954. boundary[0] = boundary[1] = '-';
  34955. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  34956. /* Parse up to first boundary, ignore everything here. */
  34957. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34958. if (lineLen <= 0) {
  34959. goto error;
  34960. }
  34961. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  34962. remainLen > 0) {
  34963. sectionLen += lineLen;
  34964. remainLen -= lineLen;
  34965. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  34966. remainLen);
  34967. if (lineLen <= 0) {
  34968. goto error;
  34969. }
  34970. }
  34971. section[0] = '\0';
  34972. sectionLen = 0;
  34973. canonSize = remainLen + 1;
  34974. canonSection = (char*)XMALLOC(canonSize, NULL,
  34975. DYNAMIC_TYPE_PKCS7);
  34976. if (canonSection == NULL) {
  34977. goto error;
  34978. }
  34979. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34980. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  34981. remainLen > 0) {
  34982. canonLineLen = lineLen;
  34983. canonLine = wc_MIME_single_canonicalize(&section[sectionLen],
  34984. &canonLineLen);
  34985. if (canonLine == NULL) {
  34986. goto error;
  34987. }
  34988. /* If line endings were added, the initial length may be
  34989. * exceeded. */
  34990. if ((canonPos + canonLineLen) >= canonSize) {
  34991. canonSize = canonPos + canonLineLen;
  34992. canonSection = (char*)XREALLOC(canonSection, canonSize,
  34993. NULL, DYNAMIC_TYPE_PKCS7);
  34994. if (canonSection == NULL) {
  34995. goto error;
  34996. }
  34997. }
  34998. XMEMCPY(&canonSection[canonPos], canonLine,
  34999. (int)canonLineLen - 1);
  35000. canonPos += canonLineLen - 1;
  35001. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  35002. canonLine = NULL;
  35003. sectionLen += lineLen;
  35004. remainLen -= lineLen;
  35005. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  35006. remainLen);
  35007. if (lineLen <= 0) {
  35008. goto error;
  35009. }
  35010. }
  35011. if (canonPos > 0) {
  35012. canonPos--;
  35013. }
  35014. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  35015. if (canonSection[canonPos] == '\n') {
  35016. if (canonPos > 0) {
  35017. canonPos--;
  35018. }
  35019. }
  35020. if (canonSection[canonPos] == '\r') {
  35021. if (canonPos > 0) {
  35022. canonPos--;
  35023. }
  35024. }
  35025. canonSection[canonPos+1] = '\0';
  35026. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  35027. ret = wolfSSL_BIO_write(*bcont, canonSection,
  35028. canonPos + 1);
  35029. if (ret != (canonPos+1)) {
  35030. goto error;
  35031. }
  35032. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem))
  35033. < 0) {
  35034. goto error;
  35035. }
  35036. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  35037. canonSection = NULL;
  35038. wc_MIME_free_hdrs(allHdrs);
  35039. allHdrs = NULL;
  35040. section[0] = '\0';
  35041. sectionLen = 0;
  35042. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  35043. if (lineLen <= 0) {
  35044. goto error;
  35045. }
  35046. while (isEnd == 0 && remainLen > 0) {
  35047. sectionLen += lineLen;
  35048. remainLen -= lineLen;
  35049. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  35050. remainLen);
  35051. if (lineLen <= 0) {
  35052. goto error;
  35053. }
  35054. /* Line with just newline signals end of headers. */
  35055. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  35056. "\r\n", 2)) ||
  35057. (lineLen==1 && (section[sectionLen] == '\r' ||
  35058. section[sectionLen] == '\n'))) {
  35059. isEnd = 1;
  35060. }
  35061. }
  35062. section[sectionLen] = '\0';
  35063. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  35064. if (ret < 0) {
  35065. WOLFSSL_MSG("Parsing MIME headers failed.");
  35066. goto error;
  35067. }
  35068. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  35069. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  35070. XSTR_SIZEOF(kAppPkcsSign)) &&
  35071. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  35072. XSTR_SIZEOF(kAppXPkcsSign)))) {
  35073. WOLFSSL_MSG("S/MIME headers not found inside "
  35074. "multipart message.\n");
  35075. goto error;
  35076. }
  35077. section[0] = '\0';
  35078. sectionLen = 0;
  35079. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  35080. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  35081. remainLen > 0) {
  35082. sectionLen += lineLen;
  35083. remainLen -= lineLen;
  35084. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  35085. remainLen);
  35086. if (lineLen <= 0) {
  35087. goto error;
  35088. }
  35089. }
  35090. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  35091. boundary = NULL;
  35092. }
  35093. }
  35094. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  35095. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  35096. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  35097. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  35098. sectionLen = wolfSSL_BIO_get_len(in);
  35099. if (sectionLen <= 0) {
  35100. goto error;
  35101. }
  35102. ret = wolfSSL_BIO_read(in, section, sectionLen);
  35103. if (ret < 0 || ret != sectionLen) {
  35104. WOLFSSL_MSG("Error reading input BIO.");
  35105. goto error;
  35106. }
  35107. }
  35108. else {
  35109. WOLFSSL_MSG("S/MIME headers not found.");
  35110. goto error;
  35111. }
  35112. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  35113. if (curHdr == NULL) {
  35114. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  35115. "assuming base64 encoding.");
  35116. }
  35117. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  35118. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  35119. "currently supported.\n");
  35120. goto error;
  35121. }
  35122. if (section == NULL || sectionLen <= 0) {
  35123. goto error;
  35124. }
  35125. outLen = ((sectionLen*3+3)/4)+1;
  35126. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  35127. outHead = out;
  35128. if (outHead == NULL) {
  35129. goto error;
  35130. }
  35131. /* Strip trailing newlines. */
  35132. while ((sectionLen > 0) &&
  35133. (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) {
  35134. sectionLen--;
  35135. }
  35136. section[sectionLen] = '\0';
  35137. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  35138. if (ret < 0) {
  35139. WOLFSSL_MSG("Error base64 decoding S/MIME message.");
  35140. goto error;
  35141. }
  35142. pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
  35143. bcontMem, bcontMemSz);
  35144. wc_MIME_free_hdrs(allHdrs);
  35145. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  35146. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  35147. return pkcs7;
  35148. error:
  35149. wc_MIME_free_hdrs(allHdrs);
  35150. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  35151. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  35152. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  35153. if (canonSection != NULL)
  35154. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  35155. if (bcont) {
  35156. wolfSSL_BIO_free(*bcont);
  35157. *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */
  35158. }
  35159. return NULL;
  35160. }
  35161. /* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent.
  35162. * Returns hash algorithm string or "unknown" if not found */
  35163. static const char* wolfSSL_SMIME_HashOIDToString(int hashOID)
  35164. {
  35165. switch (hashOID) {
  35166. case MD5h:
  35167. return "md5";
  35168. case SHAh:
  35169. return "sha1";
  35170. case SHA224h:
  35171. return "sha-224";
  35172. case SHA256h:
  35173. return "sha-256";
  35174. case SHA384h:
  35175. return "sha-384";
  35176. case SHA512h:
  35177. return "sha-512";
  35178. case SHA3_224h:
  35179. return "sha3-224";
  35180. case SHA3_384h:
  35181. return "sha3-384";
  35182. case SHA3_512h:
  35183. return "sha3-512";
  35184. default:
  35185. break;
  35186. }
  35187. return "unknown";
  35188. }
  35189. /* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string.
  35190. * RFC2633 only defines signed-data, enveloped-data, certs-only.
  35191. * Returns string on success, NULL on unknown type. */
  35192. static const char* wolfSSL_SMIME_PKCS7TypeToString(int type)
  35193. {
  35194. switch (type) {
  35195. case SIGNED_DATA:
  35196. return "signed-data";
  35197. case ENVELOPED_DATA:
  35198. return "enveloped-data";
  35199. default:
  35200. break;
  35201. }
  35202. return NULL;
  35203. }
  35204. /**
  35205. * Convert PKCS7 structure to SMIME format, adding necessary headers.
  35206. *
  35207. * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure
  35208. * should be set up beforehand with PKCS7_sign/final/etc. Output is always
  35209. * Base64 encoded.
  35210. *
  35211. * out - output BIO for SMIME formatted data to be placed
  35212. * pkcs7 - input PKCS7 structure, initialized and set up
  35213. * in - input content to be encoded into PKCS7
  35214. * flags - flags to control behavior of PKCS7 generation
  35215. *
  35216. * Returns 1 on success, 0 or negative on failure
  35217. */
  35218. int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in,
  35219. int flags)
  35220. {
  35221. int i;
  35222. int ret = 1;
  35223. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  35224. byte* p7out = NULL;
  35225. int len = 0;
  35226. char boundary[33]; /* 32 chars + \0 */
  35227. byte* sigBase64 = NULL;
  35228. word32 sigBase64Len = 0;
  35229. const char* p7TypeString = NULL;
  35230. static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  35231. if (out == NULL || p7 == NULL) {
  35232. WOLFSSL_MSG("Bad function arguments");
  35233. return 0;
  35234. }
  35235. if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 ||
  35236. p7->pkcs7.contentCRLF == 0)) {
  35237. /* store and adjust content line endings for CRLF if needed */
  35238. if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) {
  35239. ret = 0;
  35240. }
  35241. }
  35242. if (ret > 0) {
  35243. /* Generate signedData bundle, DER in output (dynamic) */
  35244. if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) {
  35245. WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7");
  35246. ret = 0;
  35247. }
  35248. }
  35249. /* Base64 encode signedData bundle */
  35250. if (ret > 0) {
  35251. if (Base64_Encode(p7out, len, NULL, &sigBase64Len) != LENGTH_ONLY_E) {
  35252. ret = 0;
  35253. }
  35254. else {
  35255. sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL,
  35256. DYNAMIC_TYPE_TMP_BUFFER);
  35257. if (sigBase64 == NULL) {
  35258. ret = 0;
  35259. }
  35260. }
  35261. }
  35262. if (ret > 0) {
  35263. XMEMSET(sigBase64, 0, sigBase64Len);
  35264. if (Base64_Encode(p7out, len, sigBase64, &sigBase64Len) < 0) {
  35265. WOLFSSL_MSG("Error in Base64_Encode of signature");
  35266. ret = 0;
  35267. }
  35268. }
  35269. /* build up SMIME message */
  35270. if (ret > 0) {
  35271. if (flags & PKCS7_DETACHED) {
  35272. /* generate random boundary */
  35273. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  35274. WOLFSSL_MSG("No RNG to use");
  35275. ret = 0;
  35276. }
  35277. /* no need to generate random byte for null terminator (size-1) */
  35278. if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary,
  35279. sizeof(boundary) - 1 ) != 0)) {
  35280. WOLFSSL_MSG("Error in wc_RNG_GenerateBlock");
  35281. ret = 0;
  35282. }
  35283. if (ret > 0) {
  35284. for (i = 0; i < (int)sizeof(boundary) - 1; i++) {
  35285. boundary[i] =
  35286. alphanum[boundary[i] % XSTR_SIZEOF(alphanum)];
  35287. }
  35288. boundary[sizeof(boundary)-1] = 0;
  35289. }
  35290. if (ret > 0) {
  35291. /* S/MIME header beginning */
  35292. ret = wolfSSL_BIO_printf(out,
  35293. "MIME-Version: 1.0\n"
  35294. "Content-Type: multipart/signed; "
  35295. "protocol=\"application/x-pkcs7-signature\"; "
  35296. "micalg=\"%s\"; "
  35297. "boundary=\"----%s\"\n\n"
  35298. "This is an S/MIME signed message\n\n"
  35299. "------%s\n",
  35300. wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID),
  35301. boundary, boundary);
  35302. }
  35303. if (ret > 0) {
  35304. /* S/MIME content */
  35305. ret = wolfSSL_BIO_write(out,
  35306. p7->pkcs7.content, p7->pkcs7.contentSz);
  35307. }
  35308. if (ret > 0) {
  35309. /* S/SMIME header end boundary */
  35310. ret = wolfSSL_BIO_printf(out,
  35311. "\n------%s\n", boundary);
  35312. }
  35313. if (ret > 0) {
  35314. /* Signature and header */
  35315. ret = wolfSSL_BIO_printf(out,
  35316. "Content-Type: application/x-pkcs7-signature; "
  35317. "name=\"smime.p7s\"\n"
  35318. "Content-Transfer-Encoding: base64\n"
  35319. "Content-Disposition: attachment; "
  35320. "filename=\"smime.p7s\"\n\n"
  35321. "%.*s\n" /* Base64 encoded signature */
  35322. "------%s--\n\n",
  35323. sigBase64Len, sigBase64,
  35324. boundary);
  35325. }
  35326. }
  35327. else {
  35328. p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type);
  35329. if (p7TypeString == NULL) {
  35330. WOLFSSL_MSG("Unsupported PKCS7 SMIME type");
  35331. ret = 0;
  35332. }
  35333. if (ret > 0) {
  35334. /* not detached */
  35335. ret = wolfSSL_BIO_printf(out,
  35336. "MIME-Version: 1.0\n"
  35337. "Content-Disposition: attachment; "
  35338. "filename=\"smime.p7m\"\n"
  35339. "Content-Type: application/x-pkcs7-mime; "
  35340. "smime-type=%s; name=\"smime.p7m\"\n"
  35341. "Content-Transfer-Encoding: base64\n\n"
  35342. "%.*s\n" /* signature */,
  35343. p7TypeString, sigBase64Len, sigBase64);
  35344. }
  35345. }
  35346. }
  35347. if (p7out != NULL) {
  35348. XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35349. }
  35350. if (sigBase64 != NULL) {
  35351. XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35352. }
  35353. if (ret > 0) {
  35354. return WOLFSSL_SUCCESS;
  35355. }
  35356. return WOLFSSL_FAILURE;
  35357. }
  35358. #endif /* HAVE_SMIME */
  35359. #endif /* !NO_BIO */
  35360. #endif /* OPENSSL_ALL */
  35361. #endif /* HAVE_PKCS7 */
  35362. /*******************************************************************************
  35363. * END OF PKCS7 APIs
  35364. ******************************************************************************/
  35365. /*******************************************************************************
  35366. * START OF PKCS12 APIs
  35367. ******************************************************************************/
  35368. #ifdef OPENSSL_EXTRA
  35369. /* no-op function. Was initially used for adding encryption algorithms available
  35370. * for PKCS12 */
  35371. void wolfSSL_PKCS12_PBE_add(void)
  35372. {
  35373. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  35374. }
  35375. #if !defined(NO_FILESYSTEM)
  35376. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp,
  35377. WOLFSSL_X509_PKCS12 **pkcs12)
  35378. {
  35379. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  35380. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12,
  35381. PKCS12_TYPE);
  35382. }
  35383. #endif /* !NO_FILESYSTEM */
  35384. #endif /* OPENSSL_EXTRA */
  35385. #if defined(HAVE_PKCS12)
  35386. #ifdef OPENSSL_EXTRA
  35387. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  35388. #ifndef NO_BIO
  35389. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  35390. {
  35391. WC_PKCS12* localPkcs12 = NULL;
  35392. unsigned char* mem = NULL;
  35393. long memSz;
  35394. int ret = -1;
  35395. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  35396. if (bio == NULL) {
  35397. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  35398. return NULL;
  35399. }
  35400. memSz = wolfSSL_BIO_get_len(bio);
  35401. if (memSz <= 0) {
  35402. return NULL;
  35403. }
  35404. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  35405. if (mem == NULL) {
  35406. return NULL;
  35407. }
  35408. if (mem != NULL) {
  35409. localPkcs12 = wc_PKCS12_new();
  35410. if (localPkcs12 == NULL) {
  35411. WOLFSSL_MSG("Memory error");
  35412. }
  35413. }
  35414. if (mem != NULL && localPkcs12 != NULL) {
  35415. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  35416. ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12);
  35417. if (ret < 0) {
  35418. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  35419. }
  35420. }
  35421. else {
  35422. WOLFSSL_MSG("Failed to get data from bio struct");
  35423. }
  35424. }
  35425. /* cleanup */
  35426. if (mem != NULL)
  35427. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  35428. if (ret < 0 && localPkcs12 != NULL) {
  35429. wc_PKCS12_free(localPkcs12);
  35430. localPkcs12 = NULL;
  35431. }
  35432. if (pkcs12 != NULL)
  35433. *pkcs12 = localPkcs12;
  35434. return localPkcs12;
  35435. }
  35436. /* Converts the PKCS12 to DER format and outputs it into bio.
  35437. *
  35438. * bio is the structure to hold output DER
  35439. * pkcs12 structure to create DER from
  35440. *
  35441. * return 1 for success or 0 if an error occurs
  35442. */
  35443. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  35444. {
  35445. int ret = WOLFSSL_FAILURE;
  35446. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  35447. if ((bio != NULL) && (pkcs12 != NULL)) {
  35448. word32 certSz = 0;
  35449. byte *certDer = NULL;
  35450. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  35451. if ((certSz > 0) && (certDer != NULL)) {
  35452. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  35453. ret = WOLFSSL_SUCCESS;
  35454. }
  35455. }
  35456. if (certDer != NULL) {
  35457. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  35458. }
  35459. }
  35460. return ret;
  35461. }
  35462. #endif /* !NO_BIO */
  35463. /* Creates a new WC_PKCS12 structure
  35464. *
  35465. * pass password to use
  35466. * name friendlyName to use
  35467. * pkey private key to go into PKCS12 bundle
  35468. * cert certificate to go into PKCS12 bundle
  35469. * ca extra certificates that can be added to bundle. Can be NULL
  35470. * keyNID type of encryption to use on the key (-1 means no encryption)
  35471. * certNID type of encryption to use on the certificate
  35472. * itt number of iterations with encryption
  35473. * macItt number of iterations with mac creation
  35474. * keyType flag for signature and/or encryption key
  35475. *
  35476. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  35477. */
  35478. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey,
  35479. WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID,
  35480. int certNID, int itt, int macItt, int keyType)
  35481. {
  35482. WC_PKCS12* pkcs12;
  35483. WC_DerCertList* list = NULL;
  35484. word32 passSz;
  35485. byte* keyDer = NULL;
  35486. word32 keyDerSz;
  35487. byte* certDer;
  35488. int certDerSz;
  35489. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  35490. if (pass == NULL || pkey == NULL || cert == NULL) {
  35491. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  35492. return NULL;
  35493. }
  35494. passSz = (word32)XSTRLEN(pass);
  35495. keyDer = (byte*)pkey->pkey.ptr;
  35496. keyDerSz = pkey->pkey_sz;
  35497. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  35498. if (certDer == NULL) {
  35499. return NULL;
  35500. }
  35501. if (ca != NULL) {
  35502. WC_DerCertList* cur;
  35503. unsigned long numCerts = ca->num;
  35504. byte* curDer;
  35505. int curDerSz = 0;
  35506. WOLFSSL_STACK* sk = ca;
  35507. while (numCerts > 0 && sk != NULL) {
  35508. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  35509. DYNAMIC_TYPE_PKCS);
  35510. if (cur == NULL) {
  35511. wc_FreeCertList(list, NULL);
  35512. return NULL;
  35513. }
  35514. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  35515. if (curDer == NULL || curDerSz < 0) {
  35516. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  35517. wc_FreeCertList(list, NULL);
  35518. return NULL;
  35519. }
  35520. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  35521. if (cur->buffer == NULL) {
  35522. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  35523. wc_FreeCertList(list, NULL);
  35524. return NULL;
  35525. }
  35526. XMEMCPY(cur->buffer, curDer, curDerSz);
  35527. cur->bufferSz = curDerSz;
  35528. cur->next = list;
  35529. list = cur;
  35530. sk = sk->next;
  35531. numCerts--;
  35532. }
  35533. }
  35534. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  35535. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  35536. keyType, NULL);
  35537. if (ca != NULL) {
  35538. wc_FreeCertList(list, NULL);
  35539. }
  35540. return pkcs12;
  35541. }
  35542. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  35543. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  35544. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
  35545. WOLF_STACK_OF(WOLFSSL_X509)** ca)
  35546. {
  35547. void* heap = NULL;
  35548. int ret;
  35549. byte* certData = NULL;
  35550. word32 certDataSz;
  35551. byte* pk = NULL;
  35552. word32 pkSz;
  35553. WC_DerCertList* certList = NULL;
  35554. #ifdef WOLFSSL_SMALL_STACK
  35555. DecodedCert *DeCert;
  35556. #else
  35557. DecodedCert DeCert[1];
  35558. #endif
  35559. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  35560. /* make sure we init return args */
  35561. if (pkey) *pkey = NULL;
  35562. if (cert) *cert = NULL;
  35563. if (ca) *ca = NULL;
  35564. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  35565. WOLFSSL_MSG("Bad argument value");
  35566. return WOLFSSL_FAILURE;
  35567. }
  35568. heap = wc_PKCS12_GetHeap(pkcs12);
  35569. if (ca == NULL) {
  35570. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  35571. NULL);
  35572. }
  35573. else {
  35574. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  35575. &certList);
  35576. }
  35577. if (ret < 0) {
  35578. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  35579. return WOLFSSL_FAILURE;
  35580. }
  35581. #ifdef WOLFSSL_SMALL_STACK
  35582. DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap,
  35583. DYNAMIC_TYPE_DCERT);
  35584. if (DeCert == NULL) {
  35585. WOLFSSL_MSG("out of memory");
  35586. return WOLFSSL_FAILURE;
  35587. }
  35588. #endif
  35589. /* Decode cert and place in X509 stack struct */
  35590. if (certList != NULL) {
  35591. WC_DerCertList* current = certList;
  35592. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(
  35593. sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509);
  35594. if (*ca == NULL) {
  35595. if (pk != NULL) {
  35596. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35597. }
  35598. if (certData != NULL) {
  35599. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  35600. }
  35601. /* Free up WC_DerCertList and move on */
  35602. while (current != NULL) {
  35603. WC_DerCertList* next = current->next;
  35604. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35605. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35606. current = next;
  35607. }
  35608. ret = WOLFSSL_FAILURE;
  35609. goto out;
  35610. }
  35611. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  35612. /* add list of DER certs as X509's to stack */
  35613. while (current != NULL) {
  35614. WC_DerCertList* toFree = current;
  35615. WOLFSSL_X509* x509;
  35616. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  35617. DYNAMIC_TYPE_X509);
  35618. InitX509(x509, 1, heap);
  35619. InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap);
  35620. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  35621. WOLFSSL_MSG("Issue with parsing certificate");
  35622. FreeDecodedCert(DeCert);
  35623. wolfSSL_X509_free(x509);
  35624. }
  35625. else {
  35626. if (CopyDecodedToX509(x509, DeCert) != 0) {
  35627. WOLFSSL_MSG("Failed to copy decoded cert");
  35628. FreeDecodedCert(DeCert);
  35629. wolfSSL_X509_free(x509);
  35630. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35631. if (pk != NULL) {
  35632. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35633. }
  35634. if (certData != NULL) {
  35635. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35636. }
  35637. /* Free up WC_DerCertList */
  35638. while (current != NULL) {
  35639. WC_DerCertList* next = current->next;
  35640. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35641. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35642. current = next;
  35643. }
  35644. ret = WOLFSSL_FAILURE;
  35645. goto out;
  35646. }
  35647. FreeDecodedCert(DeCert);
  35648. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  35649. WOLFSSL_MSG("Failed to push x509 onto stack");
  35650. wolfSSL_X509_free(x509);
  35651. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35652. if (pk != NULL) {
  35653. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35654. }
  35655. if (certData != NULL) {
  35656. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35657. }
  35658. /* Free up WC_DerCertList */
  35659. while (current != NULL) {
  35660. WC_DerCertList* next = current->next;
  35661. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35662. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35663. current = next;
  35664. }
  35665. ret = WOLFSSL_FAILURE;
  35666. goto out;
  35667. }
  35668. }
  35669. current = current->next;
  35670. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  35671. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  35672. }
  35673. }
  35674. /* Decode cert and place in X509 struct */
  35675. if (certData != NULL) {
  35676. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  35677. DYNAMIC_TYPE_X509);
  35678. if (*cert == NULL) {
  35679. if (pk != NULL) {
  35680. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35681. }
  35682. if (ca != NULL) {
  35683. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35684. }
  35685. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35686. ret = WOLFSSL_FAILURE;
  35687. goto out;
  35688. }
  35689. InitX509(*cert, 1, heap);
  35690. InitDecodedCert(DeCert, certData, certDataSz, heap);
  35691. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  35692. WOLFSSL_MSG("Issue with parsing certificate");
  35693. }
  35694. if (CopyDecodedToX509(*cert, DeCert) != 0) {
  35695. WOLFSSL_MSG("Failed to copy decoded cert");
  35696. FreeDecodedCert(DeCert);
  35697. if (pk != NULL) {
  35698. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35699. }
  35700. if (ca != NULL) {
  35701. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35702. }
  35703. wolfSSL_X509_free(*cert); *cert = NULL;
  35704. ret = WOLFSSL_FAILURE;
  35705. goto out;
  35706. }
  35707. FreeDecodedCert(DeCert);
  35708. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35709. }
  35710. /* get key type */
  35711. ret = BAD_STATE_E;
  35712. if (pk != NULL) { /* decode key if present */
  35713. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  35714. if (*pkey == NULL) {
  35715. wolfSSL_X509_free(*cert); *cert = NULL;
  35716. if (ca != NULL) {
  35717. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35718. }
  35719. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35720. ret = WOLFSSL_FAILURE;
  35721. goto out;
  35722. }
  35723. #ifndef NO_RSA
  35724. {
  35725. const unsigned char* pt = pk;
  35726. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) !=
  35727. NULL) {
  35728. ret = 0;
  35729. }
  35730. }
  35731. #endif /* NO_RSA */
  35732. #ifdef HAVE_ECC
  35733. if (ret != 0) { /* if is in fail state check if ECC key */
  35734. const unsigned char* pt = pk;
  35735. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) !=
  35736. NULL) {
  35737. ret = 0;
  35738. }
  35739. }
  35740. #endif /* HAVE_ECC */
  35741. if (pk != NULL)
  35742. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  35743. if (ret != 0) { /* if is in fail state and no PKEY then fail */
  35744. wolfSSL_X509_free(*cert); *cert = NULL;
  35745. if (ca != NULL) {
  35746. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35747. }
  35748. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  35749. WOLFSSL_MSG("Bad PKCS12 key format");
  35750. ret = WOLFSSL_FAILURE;
  35751. goto out;
  35752. }
  35753. if (pkey != NULL && *pkey != NULL) {
  35754. (*pkey)->save_type = 0;
  35755. }
  35756. }
  35757. (void)ret;
  35758. (void)ca;
  35759. ret = WOLFSSL_SUCCESS;
  35760. out:
  35761. #ifdef WOLFSSL_SMALL_STACK
  35762. XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT);
  35763. #endif
  35764. return ret;
  35765. }
  35766. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  35767. int pswLen)
  35768. {
  35769. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  35770. if (!pkcs12) {
  35771. return WOLFSSL_FAILURE;
  35772. }
  35773. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  35774. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  35775. }
  35776. #endif /* !NO_ASN && !NO_PWDBASED */
  35777. #endif /* OPENSSL_EXTRA */
  35778. #endif /* HAVE_PKCS12 */
  35779. /*******************************************************************************
  35780. * END OF PKCS12 APIs
  35781. ******************************************************************************/
  35782. #endif /* !NO_CERTS */
  35783. /*******************************************************************************
  35784. * BEGIN OPENSSL FIPS DRBG APIs
  35785. ******************************************************************************/
  35786. #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG)
  35787. int wolfSSL_FIPS_drbg_init(WOLFSSL_DRBG_CTX *ctx, int type, unsigned int flags)
  35788. {
  35789. int ret = WOLFSSL_FAILURE;
  35790. if (ctx != NULL) {
  35791. XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX));
  35792. ctx->type = type;
  35793. ctx->xflags = flags;
  35794. ctx->status = DRBG_STATUS_UNINITIALISED;
  35795. ret = WOLFSSL_SUCCESS;
  35796. }
  35797. return ret;
  35798. }
  35799. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_drbg_new(int type, unsigned int flags)
  35800. {
  35801. int ret = WOLFSSL_FAILURE;
  35802. WOLFSSL_DRBG_CTX* ctx = (WOLFSSL_DRBG_CTX*)XMALLOC(sizeof(WOLFSSL_DRBG_CTX),
  35803. NULL, DYNAMIC_TYPE_OPENSSL);
  35804. ret = wolfSSL_FIPS_drbg_init(ctx, type, flags);
  35805. if (ret == WOLFSSL_SUCCESS && type != 0) {
  35806. ret = wolfSSL_FIPS_drbg_instantiate(ctx, NULL, 0);
  35807. }
  35808. if (ret != WOLFSSL_SUCCESS) {
  35809. WOLFSSL_ERROR(ret);
  35810. wolfSSL_FIPS_drbg_free(ctx);
  35811. ctx = NULL;
  35812. }
  35813. return ctx;
  35814. }
  35815. int wolfSSL_FIPS_drbg_instantiate(WOLFSSL_DRBG_CTX* ctx,
  35816. const unsigned char* pers, size_t perslen)
  35817. {
  35818. int ret = WOLFSSL_FAILURE;
  35819. if (ctx != NULL && ctx->rng == NULL) {
  35820. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35821. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  35822. ctx->rng = wc_rng_new((byte*)pers, (word32)perslen, NULL);
  35823. #else
  35824. ctx->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35825. if (ctx->rng != NULL) {
  35826. #if defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)
  35827. ret = wc_InitRngNonce(ctx->rng, (byte*)pers, (word32)perslen);
  35828. #else
  35829. ret = wc_InitRng(ctx->rng);
  35830. (void)pers;
  35831. (void)perslen;
  35832. #endif
  35833. if (ret != 0) {
  35834. WOLFSSL_ERROR(ret);
  35835. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  35836. ctx->rng = NULL;
  35837. }
  35838. }
  35839. #endif
  35840. }
  35841. if (ctx != NULL && ctx->rng != NULL) {
  35842. ctx->status = DRBG_STATUS_READY;
  35843. ret = WOLFSSL_SUCCESS;
  35844. }
  35845. return ret;
  35846. }
  35847. int wolfSSL_FIPS_drbg_set_callbacks(WOLFSSL_DRBG_CTX* ctx,
  35848. drbg_entropy_get entropy_get, drbg_entropy_clean entropy_clean,
  35849. size_t entropy_blocklen,
  35850. drbg_nonce_get none_get, drbg_nonce_clean nonce_clean)
  35851. {
  35852. int ret = WOLFSSL_FAILURE;
  35853. if (ctx != NULL) {
  35854. ctx->entropy_get = entropy_get;
  35855. ctx->entropy_clean = entropy_clean;
  35856. ctx->entropy_blocklen = entropy_blocklen;
  35857. ctx->none_get = none_get;
  35858. ctx->nonce_clean = nonce_clean;
  35859. ret = WOLFSSL_SUCCESS;
  35860. }
  35861. return ret;
  35862. }
  35863. void wolfSSL_FIPS_rand_add(const void* buf, int num, double entropy)
  35864. {
  35865. /* not implemented */
  35866. (void)buf;
  35867. (void)num;
  35868. (void)entropy;
  35869. }
  35870. int wolfSSL_FIPS_drbg_reseed(WOLFSSL_DRBG_CTX* ctx, const unsigned char* adin,
  35871. size_t adinlen)
  35872. {
  35873. int ret = WOLFSSL_FAILURE;
  35874. if (ctx != NULL && ctx->rng != NULL) {
  35875. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35876. (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)))
  35877. if (wc_RNG_DRBG_Reseed(ctx->rng, adin, (word32)adinlen) == 0) {
  35878. ret = WOLFSSL_SUCCESS;
  35879. }
  35880. #else
  35881. ret = WOLFSSL_SUCCESS;
  35882. (void)adin;
  35883. (void)adinlen;
  35884. #endif
  35885. }
  35886. return ret;
  35887. }
  35888. int wolfSSL_FIPS_drbg_generate(WOLFSSL_DRBG_CTX* ctx, unsigned char* out,
  35889. size_t outlen, int prediction_resistance, const unsigned char* adin,
  35890. size_t adinlen)
  35891. {
  35892. int ret = WOLFSSL_FAILURE;
  35893. if (ctx != NULL && ctx->rng != NULL) {
  35894. ret = wc_RNG_GenerateBlock(ctx->rng, out, (word32)outlen);
  35895. if (ret == 0) {
  35896. ret = WOLFSSL_SUCCESS;
  35897. }
  35898. }
  35899. (void)prediction_resistance;
  35900. (void)adin;
  35901. (void)adinlen;
  35902. return ret;
  35903. }
  35904. int wolfSSL_FIPS_drbg_uninstantiate(WOLFSSL_DRBG_CTX *ctx)
  35905. {
  35906. if (ctx != NULL && ctx->rng != NULL) {
  35907. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35908. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  35909. wc_rng_free(ctx->rng);
  35910. #else
  35911. wc_FreeRng(ctx->rng);
  35912. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  35913. #endif
  35914. ctx->rng = NULL;
  35915. ctx->status = DRBG_STATUS_UNINITIALISED;
  35916. }
  35917. return WOLFSSL_SUCCESS;
  35918. }
  35919. void wolfSSL_FIPS_drbg_free(WOLFSSL_DRBG_CTX *ctx)
  35920. {
  35921. if (ctx != NULL) {
  35922. /* As saftey check if free'ing the default drbg, then mark global NULL.
  35923. * Technically the user should not call free on the default drbg. */
  35924. if (ctx == gDrbgDefCtx) {
  35925. gDrbgDefCtx = NULL;
  35926. }
  35927. wolfSSL_FIPS_drbg_uninstantiate(ctx);
  35928. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  35929. }
  35930. }
  35931. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_get_default_drbg(void)
  35932. {
  35933. if (gDrbgDefCtx == NULL) {
  35934. gDrbgDefCtx = wolfSSL_FIPS_drbg_new(0, 0);
  35935. }
  35936. return gDrbgDefCtx;
  35937. }
  35938. void wolfSSL_FIPS_get_timevec(unsigned char* buf, unsigned long* pctr)
  35939. {
  35940. /* not implemented */
  35941. (void)buf;
  35942. (void)pctr;
  35943. }
  35944. void* wolfSSL_FIPS_drbg_get_app_data(WOLFSSL_DRBG_CTX *ctx)
  35945. {
  35946. if (ctx != NULL) {
  35947. return ctx->app_data;
  35948. }
  35949. return NULL;
  35950. }
  35951. void wolfSSL_FIPS_drbg_set_app_data(WOLFSSL_DRBG_CTX *ctx, void *app_data)
  35952. {
  35953. if (ctx != NULL) {
  35954. ctx->app_data = app_data;
  35955. }
  35956. }
  35957. #endif
  35958. /*******************************************************************************
  35959. * END OF OPENSSL FIPS DRBG APIs
  35960. ******************************************************************************/
  35961. #endif /* !WOLFCRYPT_ONLY */
  35962. /*******************************************************************************
  35963. * START OF CRYPTO-ONLY APIs
  35964. ******************************************************************************/
  35965. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  35966. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  35967. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  35968. defined(WOLFSSL_HAPROXY)
  35969. #ifndef NO_SHA
  35970. /* One shot SHA1 hash of message.
  35971. *
  35972. * d message to hash
  35973. * n size of d buffer
  35974. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  35975. *
  35976. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  35977. * When the static buffer is used this function is not thread safe.
  35978. *
  35979. * Returns a pointer to the message digest on success and NULL on failure.
  35980. */
  35981. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  35982. unsigned char *md)
  35983. {
  35984. static byte dig[WC_SHA_DIGEST_SIZE];
  35985. byte* ret = md;
  35986. wc_Sha sha;
  35987. WOLFSSL_ENTER("wolfSSL_SHA1");
  35988. if (wc_InitSha_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35989. WOLFSSL_MSG("SHA1 Init failed");
  35990. return NULL;
  35991. }
  35992. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  35993. WOLFSSL_MSG("SHA1 Update failed");
  35994. return NULL;
  35995. }
  35996. if (md == NULL) {
  35997. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
  35998. "THREAD SAFE WHEN md == NULL");
  35999. ret = dig;
  36000. }
  36001. if (wc_ShaFinal(&sha, ret) != 0) {
  36002. WOLFSSL_MSG("SHA1 Final failed");
  36003. wc_ShaFree(&sha);
  36004. return NULL;
  36005. }
  36006. wc_ShaFree(&sha);
  36007. return ret;
  36008. }
  36009. #endif /* ! NO_SHA */
  36010. #ifdef WOLFSSL_SHA224
  36011. /* One shot SHA224 hash of message.
  36012. *
  36013. * d message to hash
  36014. * n size of d buffer
  36015. * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE.
  36016. *
  36017. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36018. * When the static buffer is used this function is not thread safe.
  36019. *
  36020. * Returns a pointer to the message digest on success and NULL on failure.
  36021. */
  36022. unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n,
  36023. unsigned char *md)
  36024. {
  36025. static byte dig[WC_SHA224_DIGEST_SIZE];
  36026. byte* ret = md;
  36027. wc_Sha256 sha;
  36028. WOLFSSL_ENTER("wolfSSL_SHA224");
  36029. if (wc_InitSha224_ex(&sha, NULL, INVALID_DEVID) != 0) {
  36030. WOLFSSL_MSG("SHA224 Init failed");
  36031. return NULL;
  36032. }
  36033. if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) {
  36034. WOLFSSL_MSG("SHA224 Update failed");
  36035. return NULL;
  36036. }
  36037. if (md == NULL) {
  36038. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT "
  36039. "THREAD SAFE WHEN md == NULL");
  36040. ret = dig;
  36041. }
  36042. if (wc_Sha224Final(&sha, ret) != 0) {
  36043. WOLFSSL_MSG("SHA224 Final failed");
  36044. wc_Sha224Free(&sha);
  36045. return NULL;
  36046. }
  36047. wc_Sha224Free(&sha);
  36048. return ret;
  36049. }
  36050. #endif
  36051. #ifndef NO_SHA256
  36052. /* One shot SHA256 hash of message.
  36053. *
  36054. * d message to hash
  36055. * n size of d buffer
  36056. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36057. *
  36058. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36059. * When the static buffer is used this function is not thread safe.
  36060. *
  36061. * Returns a pointer to the message digest on success and NULL on failure.
  36062. */
  36063. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  36064. unsigned char *md)
  36065. {
  36066. static byte dig[WC_SHA256_DIGEST_SIZE];
  36067. byte* ret = md;
  36068. wc_Sha256 sha;
  36069. WOLFSSL_ENTER("wolfSSL_SHA256");
  36070. if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) {
  36071. WOLFSSL_MSG("SHA256 Init failed");
  36072. return NULL;
  36073. }
  36074. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  36075. WOLFSSL_MSG("SHA256 Update failed");
  36076. return NULL;
  36077. }
  36078. if (md == NULL) {
  36079. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
  36080. "THREAD SAFE WHEN md == NULL");
  36081. ret = dig;
  36082. }
  36083. if (wc_Sha256Final(&sha, ret) != 0) {
  36084. WOLFSSL_MSG("SHA256 Final failed");
  36085. wc_Sha256Free(&sha);
  36086. return NULL;
  36087. }
  36088. wc_Sha256Free(&sha);
  36089. return ret;
  36090. }
  36091. #endif /* ! NO_SHA256 */
  36092. #ifdef WOLFSSL_SHA384
  36093. /* One shot SHA384 hash of message.
  36094. *
  36095. * d message to hash
  36096. * n size of d buffer
  36097. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36098. *
  36099. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36100. * When the static buffer is used this function is not thread safe.
  36101. *
  36102. * Returns a pointer to the message digest on success and NULL on failure.
  36103. */
  36104. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  36105. unsigned char *md)
  36106. {
  36107. static byte dig[WC_SHA384_DIGEST_SIZE];
  36108. byte* ret = md;
  36109. wc_Sha384 sha;
  36110. WOLFSSL_ENTER("wolfSSL_SHA384");
  36111. if (wc_InitSha384_ex(&sha, NULL, INVALID_DEVID) != 0) {
  36112. WOLFSSL_MSG("SHA384 Init failed");
  36113. return NULL;
  36114. }
  36115. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  36116. WOLFSSL_MSG("SHA384 Update failed");
  36117. return NULL;
  36118. }
  36119. if (md == NULL) {
  36120. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
  36121. "THREAD SAFE WHEN md == NULL");
  36122. ret = dig;
  36123. }
  36124. if (wc_Sha384Final(&sha, ret) != 0) {
  36125. WOLFSSL_MSG("SHA384 Final failed");
  36126. wc_Sha384Free(&sha);
  36127. return NULL;
  36128. }
  36129. wc_Sha384Free(&sha);
  36130. return ret;
  36131. }
  36132. #endif /* WOLFSSL_SHA384 */
  36133. #if defined(WOLFSSL_SHA512)
  36134. /* One shot SHA512 hash of message.
  36135. *
  36136. * d message to hash
  36137. * n size of d buffer
  36138. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36139. *
  36140. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36141. * When the static buffer is used this function is not thread safe.
  36142. *
  36143. * Returns a pointer to the message digest on success and NULL on failure.
  36144. */
  36145. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  36146. unsigned char *md)
  36147. {
  36148. static byte dig[WC_SHA512_DIGEST_SIZE];
  36149. byte* ret = md;
  36150. wc_Sha512 sha;
  36151. WOLFSSL_ENTER("wolfSSL_SHA512");
  36152. if (wc_InitSha512_ex(&sha, NULL, INVALID_DEVID) != 0) {
  36153. WOLFSSL_MSG("SHA512 Init failed");
  36154. return NULL;
  36155. }
  36156. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  36157. WOLFSSL_MSG("SHA512 Update failed");
  36158. return NULL;
  36159. }
  36160. if (md == NULL) {
  36161. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
  36162. "THREAD SAFE WHEN md == NULL");
  36163. ret = dig;
  36164. }
  36165. if (wc_Sha512Final(&sha, ret) != 0) {
  36166. WOLFSSL_MSG("SHA512 Final failed");
  36167. wc_Sha512Free(&sha);
  36168. return NULL;
  36169. }
  36170. wc_Sha512Free(&sha);
  36171. return ret;
  36172. }
  36173. #endif /* WOLFSSL_SHA512 */
  36174. #endif /* OPENSSL_EXTRA || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  36175. * HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  36176. /*******************************************************************************
  36177. * END OF CRYPTO-ONLY APIs
  36178. ******************************************************************************/