ssl.c 1.2 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577
  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. /*
  150. * OPENSSL_COMPATIBLE_DEFAULTS:
  151. * Enable default behaviour that is compatible with OpenSSL. For example
  152. * SSL_CTX by default doesn't verify the loaded certs. Enabling this
  153. * should make porting to new projects easier.
  154. * WOLFSSL_CHECK_ALERT_ON_ERR:
  155. * Check for alerts during the handshake in the event of an error.
  156. * NO_SESSION_CACHE_REF:
  157. * wolfSSL_get_session on a client will return a reference to the internal
  158. * ClientCache by default for backwards compatibility. This define will
  159. * make wolfSSL_get_session return a reference to ssl->session. The returned
  160. * pointer will be freed with the related WOLFSSL object.
  161. */
  162. #define WOLFSSL_EVP_INCLUDED
  163. #include "wolfcrypt/src/evp.c"
  164. #ifndef WOLFCRYPT_ONLY
  165. #define WOLFSSL_PK_INCLUDED
  166. #include "src/pk.c"
  167. #ifdef OPENSSL_EXTRA
  168. /* Global pointer to constant BN on */
  169. static WOLFSSL_BIGNUM* bn_one = NULL;
  170. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  171. * OPENSSL_EXTRA where RAND callbacks are not used */
  172. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  173. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  174. static int gRandMethodsInit = 0;
  175. static wolfSSL_Mutex gRandMethodMutex;
  176. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  177. #endif /* OPENSSL_EXTRA */
  178. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  179. const WOLF_EC_NIST_NAME kNistCurves[] = {
  180. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  181. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  182. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  183. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  184. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  185. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  186. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  187. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  188. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  189. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  190. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  191. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  192. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  193. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  194. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  195. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  196. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  197. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  198. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  199. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  200. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  201. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  202. #ifdef HAVE_PQC
  203. {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
  204. {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
  205. {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
  206. {XSTR_SIZEOF("NTRU_HPS_LEVEL1"), "NTRU_HPS_LEVEL1", WOLFSSL_NTRU_HPS_LEVEL1},
  207. {XSTR_SIZEOF("NTRU_HPS_LEVEL3"), "NTRU_HPS_LEVEL3", WOLFSSL_NTRU_HPS_LEVEL3},
  208. {XSTR_SIZEOF("NTRU_HPS_LEVEL5"), "NTRU_HPS_LEVEL5", WOLFSSL_NTRU_HPS_LEVEL5},
  209. {XSTR_SIZEOF("NTRU_HRSS_LEVEL3"), "NTRU_HRSS_LEVEL3", WOLFSSL_NTRU_HRSS_LEVEL3},
  210. {XSTR_SIZEOF("SABER_LEVEL1"), "SABER_LEVEL1", WOLFSSL_SABER_LEVEL1},
  211. {XSTR_SIZEOF("SABER_LEVEL3"), "SABER_LEVEL3", WOLFSSL_SABER_LEVEL3},
  212. {XSTR_SIZEOF("SABER_LEVEL5"), "SABER_LEVEL5", WOLFSSL_SABER_LEVEL5},
  213. {XSTR_SIZEOF("KYBER_90S_LEVEL1"), "KYBER_90S_LEVEL1", WOLFSSL_KYBER_90S_LEVEL1},
  214. {XSTR_SIZEOF("KYBER_90S_LEVEL3"), "KYBER_90S_LEVEL3", WOLFSSL_KYBER_90S_LEVEL3},
  215. {XSTR_SIZEOF("KYBER_90S_LEVEL5"), "KYBER_90S_LEVEL5", WOLFSSL_KYBER_90S_LEVEL5},
  216. {XSTR_SIZEOF("P256_NTRU_HPS_LEVEL1"), "P256_NTRU_HPS_LEVEL1", WOLFSSL_P256_NTRU_HPS_LEVEL1},
  217. {XSTR_SIZEOF("P384_NTRU_HPS_LEVEL3"), "P384_NTRU_HPS_LEVEL3", WOLFSSL_P384_NTRU_HPS_LEVEL3},
  218. {XSTR_SIZEOF("P521_NTRU_HPS_LEVEL5"), "P521_NTRU_HPS_LEVEL5", WOLFSSL_P521_NTRU_HPS_LEVEL5},
  219. {XSTR_SIZEOF("P384_NTRU_HRSS_LEVEL3"), "P384_NTRU_HRSS_LEVEL3", WOLFSSL_P384_NTRU_HRSS_LEVEL3},
  220. {XSTR_SIZEOF("P256_SABER_LEVEL1"), "P256_SABER_LEVEL1", WOLFSSL_P256_SABER_LEVEL1},
  221. {XSTR_SIZEOF("P384_SABER_LEVEL3"), "P384_SABER_LEVEL3", WOLFSSL_P384_SABER_LEVEL3},
  222. {XSTR_SIZEOF("P521_SABER_LEVEL5"), "P521_SABER_LEVEL5", WOLFSSL_P521_SABER_LEVEL5},
  223. {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1},
  224. {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3},
  225. {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5},
  226. {XSTR_SIZEOF("P256_KYBER_90S_LEVEL1"), "P256_KYBER_90S_LEVEL1", WOLFSSL_P256_KYBER_90S_LEVEL1},
  227. {XSTR_SIZEOF("P384_KYBER_90S_LEVEL3"), "P384_KYBER_90S_LEVEL3", WOLFSSL_P384_KYBER_90S_LEVEL3},
  228. {XSTR_SIZEOF("P521_KYBER_90S_LEVEL5"), "P521_KYBER_90S_LEVEL5", WOLFSSL_P521_KYBER_90S_LEVEL5},
  229. #endif
  230. {0, NULL, 0},
  231. };
  232. #endif
  233. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  234. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  235. #endif
  236. #ifdef WOLFSSL_SESSION_EXPORT
  237. /* Used to import a serialized TLS session.
  238. * WARNING: buf contains sensitive information about the state and is best to be
  239. * encrypted before storing if stored.
  240. *
  241. * @param ssl WOLFSSL structure to import the session into
  242. * @param buf serialized session
  243. * @param sz size of buffer 'buf'
  244. * @return the number of bytes read from buffer 'buf'
  245. */
  246. int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  247. {
  248. if (ssl == NULL || buf == NULL) {
  249. return BAD_FUNC_ARG;
  250. }
  251. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  252. }
  253. /* Used to export a serialized TLS session.
  254. * WARNING: buf contains sensitive information about the state and is best to be
  255. * encrypted before storing if stored.
  256. *
  257. * @param ssl WOLFSSL structure to export the session from
  258. * @param buf output of serialized session
  259. * @param sz size in bytes set in 'buf'
  260. * @return the number of bytes written into buffer 'buf'
  261. */
  262. int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  263. {
  264. if (ssl == NULL || sz == NULL) {
  265. return BAD_FUNC_ARG;
  266. }
  267. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  268. }
  269. #ifdef WOLFSSL_DTLS
  270. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  271. {
  272. WOLFSSL_ENTER("wolfSSL_session_import");
  273. if (ssl == NULL || buf == NULL) {
  274. return BAD_FUNC_ARG;
  275. }
  276. /* sanity checks on buffer and protocol are done in internal function */
  277. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  278. }
  279. /* Sets the function to call for serializing the session. This function is
  280. * called right after the handshake is completed. */
  281. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  282. {
  283. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  284. /* purposefully allow func to be NULL */
  285. if (ctx == NULL) {
  286. return BAD_FUNC_ARG;
  287. }
  288. ctx->dtls_export = func;
  289. return WOLFSSL_SUCCESS;
  290. }
  291. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  292. * function is called right after the handshake is completed. */
  293. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  294. {
  295. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  296. /* purposefully allow func to be NULL */
  297. if (ssl == NULL) {
  298. return BAD_FUNC_ARG;
  299. }
  300. ssl->dtls_export = func;
  301. return WOLFSSL_SUCCESS;
  302. }
  303. /* This function allows for directly serializing a session rather than using
  304. * callbacks. It has less overhead by removing a temporary buffer and gives
  305. * control over when the session gets serialized. When using callbacks the
  306. * session is always serialized immediately after the handshake is finished.
  307. *
  308. * buf is the argument to contain the serialized session
  309. * sz is the size of the buffer passed in
  310. * ssl is the WOLFSSL struct to serialize
  311. * returns the size of serialized session on success, 0 on no action, and
  312. * negative value on error */
  313. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  314. {
  315. WOLFSSL_ENTER("wolfSSL_dtls_export");
  316. if (ssl == NULL || sz == NULL) {
  317. return BAD_FUNC_ARG;
  318. }
  319. if (buf == NULL) {
  320. *sz = MAX_EXPORT_BUFFER;
  321. return 0;
  322. }
  323. /* if not DTLS do nothing */
  324. if (!ssl->options.dtls) {
  325. WOLFSSL_MSG("Currently only DTLS export is supported");
  326. return 0;
  327. }
  328. /* copy over keys, options, and dtls state struct */
  329. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  330. }
  331. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  332. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  333. * sequence number, epoch, AEAD state etc.
  334. *
  335. * buf is the argument to contain the serialized state, if null then set "sz" to
  336. * buffer size required
  337. * sz is the size of the buffer passed in
  338. * ssl is the WOLFSSL struct to serialize
  339. * returns the size of serialized session on success, 0 on no action, and
  340. * negative value on error */
  341. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  342. unsigned int* sz)
  343. {
  344. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  345. if (ssl == NULL || sz == NULL) {
  346. return BAD_FUNC_ARG;
  347. }
  348. if (buf == NULL) {
  349. *sz = MAX_EXPORT_STATE_BUFFER;
  350. return 0;
  351. }
  352. /* if not DTLS do nothing */
  353. if (!ssl->options.dtls) {
  354. WOLFSSL_MSG("Currently only DTLS export state is supported");
  355. return 0;
  356. }
  357. /* copy over keys, options, and dtls state struct */
  358. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  359. }
  360. /* returns 0 on success */
  361. int wolfSSL_send_session(WOLFSSL* ssl)
  362. {
  363. int ret;
  364. byte* buf;
  365. word32 bufSz = MAX_EXPORT_BUFFER;
  366. WOLFSSL_ENTER("wolfSSL_send_session");
  367. if (ssl == NULL) {
  368. return BAD_FUNC_ARG;
  369. }
  370. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  371. if (buf == NULL) {
  372. return MEMORY_E;
  373. }
  374. /* if not DTLS do nothing */
  375. if (!ssl->options.dtls) {
  376. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  377. WOLFSSL_MSG("Currently only DTLS export is supported");
  378. return 0;
  379. }
  380. /* copy over keys, options, and dtls state struct */
  381. ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS);
  382. if (ret < 0) {
  383. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  384. return ret;
  385. }
  386. /* if no error ret has size of buffer */
  387. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  388. if (ret != WOLFSSL_SUCCESS) {
  389. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  390. return ret;
  391. }
  392. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  393. return 0;
  394. }
  395. #endif /* WOLFSSL_DTLS */
  396. #endif /* WOLFSSL_SESSION_EXPORT */
  397. /* prevent multiple mutex initializations */
  398. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  399. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  400. static WOLFSSL_GLOBAL int count_mutex_valid = 0;
  401. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  402. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  403. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  404. success is freed when ctx is freed.
  405. */
  406. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  407. {
  408. WOLFSSL_CTX* ctx = NULL;
  409. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  410. if (initRefCount == 0) {
  411. /* user no longer forced to call Init themselves */
  412. int ret = wolfSSL_Init();
  413. if (ret != WOLFSSL_SUCCESS) {
  414. WOLFSSL_MSG("wolfSSL_Init failed");
  415. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  416. if (method != NULL) {
  417. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  418. }
  419. return NULL;
  420. }
  421. }
  422. if (method == NULL)
  423. return ctx;
  424. ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  425. if (ctx) {
  426. int ret;
  427. ret = InitSSL_Ctx(ctx, method, heap);
  428. #ifdef WOLFSSL_STATIC_MEMORY
  429. if (heap != NULL) {
  430. ctx->onHeapHint = 1; /* free the memory back to heap when done */
  431. }
  432. #endif
  433. if (ret < 0) {
  434. WOLFSSL_MSG("Init CTX failed");
  435. wolfSSL_CTX_free(ctx);
  436. ctx = NULL;
  437. }
  438. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  439. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  440. else {
  441. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  442. if (ctx->srp == NULL){
  443. WOLFSSL_MSG("Init CTX failed");
  444. wolfSSL_CTX_free(ctx);
  445. return NULL;
  446. }
  447. XMEMSET(ctx->srp, 0, sizeof(Srp));
  448. }
  449. #endif
  450. }
  451. else {
  452. WOLFSSL_MSG("Alloc CTX failed, method freed");
  453. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  454. }
  455. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  456. if (ctx) {
  457. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  458. wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
  459. if (wolfSSL_CTX_set_min_proto_version(ctx,
  460. (method->version.major == DTLS_MAJOR) ?
  461. DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS ||
  462. #ifdef HAVE_ANON
  463. wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS ||
  464. #endif
  465. wolfSSL_CTX_set_group_messages(ctx) != WOLFSSL_SUCCESS) {
  466. WOLFSSL_MSG("Setting OpenSSL CTX defaults failed");
  467. wolfSSL_CTX_free(ctx);
  468. ctx = NULL;
  469. }
  470. }
  471. #endif
  472. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  473. return ctx;
  474. }
  475. WOLFSSL_ABI
  476. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  477. {
  478. #ifdef WOLFSSL_HEAP_TEST
  479. /* if testing the heap hint then set top level CTX to have test value */
  480. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  481. #else
  482. return wolfSSL_CTX_new_ex(method, NULL);
  483. #endif
  484. }
  485. /* increases CTX reference count to track proper time to "free" */
  486. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  487. {
  488. int refCount = SSL_CTX_RefCount(ctx, 1);
  489. return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  490. }
  491. WOLFSSL_ABI
  492. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  493. {
  494. WOLFSSL_ENTER("SSL_CTX_free");
  495. if (ctx) {
  496. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  497. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  498. if (ctx->srp != NULL) {
  499. if (ctx->srp_password != NULL){
  500. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  501. ctx->srp_password = NULL;
  502. }
  503. wc_SrpTerm(ctx->srp);
  504. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  505. ctx->srp = NULL;
  506. }
  507. #endif
  508. FreeSSL_Ctx(ctx);
  509. }
  510. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  511. }
  512. #ifdef HAVE_ENCRYPT_THEN_MAC
  513. /**
  514. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  515. * The default value: enabled.
  516. *
  517. * ctx SSL/TLS context.
  518. * set Whether to allow or not: 1 is allow and 0 is disallow.
  519. * returns WOLFSSL_SUCCESS
  520. */
  521. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  522. {
  523. ctx->disallowEncThenMac = !set;
  524. return WOLFSSL_SUCCESS;
  525. }
  526. /**
  527. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  528. * The default value comes from context.
  529. *
  530. * ctx SSL/TLS context.
  531. * set Whether to allow or not: 1 is allow and 0 is disallow.
  532. * returns WOLFSSL_SUCCESS
  533. */
  534. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  535. {
  536. ssl->options.disallowEncThenMac = !set;
  537. return WOLFSSL_SUCCESS;
  538. }
  539. #endif
  540. #ifdef SINGLE_THREADED
  541. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  542. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  543. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  544. {
  545. WC_RNG* rng;
  546. int ret;
  547. if (ctx == NULL) {
  548. return BAD_FUNC_ARG;
  549. }
  550. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  551. if (rng == NULL) {
  552. return MEMORY_E;
  553. }
  554. #ifndef HAVE_FIPS
  555. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  556. #else
  557. ret = wc_InitRng(rng);
  558. #endif
  559. if (ret != 0) {
  560. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  561. return ret;
  562. }
  563. ctx->rng = rng;
  564. return WOLFSSL_SUCCESS;
  565. }
  566. #endif
  567. WOLFSSL_ABI
  568. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  569. {
  570. WOLFSSL* ssl = NULL;
  571. int ret = 0;
  572. WOLFSSL_ENTER("SSL_new");
  573. if (ctx == NULL)
  574. return ssl;
  575. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  576. if (ssl)
  577. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  578. FreeSSL(ssl, ctx->heap);
  579. ssl = 0;
  580. }
  581. WOLFSSL_LEAVE("SSL_new", ret);
  582. (void)ret;
  583. return ssl;
  584. }
  585. WOLFSSL_ABI
  586. void wolfSSL_free(WOLFSSL* ssl)
  587. {
  588. WOLFSSL_ENTER("SSL_free");
  589. if (ssl)
  590. FreeSSL(ssl, ssl->ctx->heap);
  591. WOLFSSL_LEAVE("SSL_free", 0);
  592. }
  593. int wolfSSL_is_server(WOLFSSL* ssl)
  594. {
  595. if (ssl == NULL)
  596. return BAD_FUNC_ARG;
  597. return ssl->options.side == WOLFSSL_SERVER_END;
  598. }
  599. #ifdef HAVE_WRITE_DUP
  600. /*
  601. * Release resources around WriteDup object
  602. *
  603. * ssl WOLFSSL object
  604. *
  605. * no return, destruction so make best attempt
  606. */
  607. void FreeWriteDup(WOLFSSL* ssl)
  608. {
  609. int doFree = 0;
  610. WOLFSSL_ENTER("FreeWriteDup");
  611. if (ssl->dupWrite) {
  612. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  613. ssl->dupWrite->dupCount--;
  614. if (ssl->dupWrite->dupCount == 0) {
  615. doFree = 1;
  616. } else {
  617. WOLFSSL_MSG("WriteDup count not zero, no full free");
  618. }
  619. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  620. }
  621. }
  622. if (doFree) {
  623. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  624. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  625. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  626. }
  627. }
  628. /*
  629. * duplicate existing ssl members into dup needed for writing
  630. *
  631. * dup write only WOLFSSL
  632. * ssl existing WOLFSSL
  633. *
  634. * 0 on success
  635. */
  636. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  637. {
  638. /* shared dupWrite setup */
  639. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  640. DYNAMIC_TYPE_WRITEDUP);
  641. if (ssl->dupWrite == NULL) {
  642. return MEMORY_E;
  643. }
  644. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  645. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  646. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  647. ssl->dupWrite = NULL;
  648. return BAD_MUTEX_E;
  649. }
  650. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  651. dup->dupWrite = ssl->dupWrite; /* each side uses */
  652. /* copy write parts over to dup writer */
  653. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  654. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  655. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  656. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  657. XMEMCPY(&dup->version, &ssl->version, sizeof(ProtocolVersion));
  658. XMEMCPY(&dup->chVersion, &ssl->chVersion, sizeof(ProtocolVersion));
  659. /* dup side now owns encrypt/write ciphers */
  660. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  661. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  662. dup->CBIOSend = ssl->CBIOSend;
  663. #ifdef OPENSSL_EXTRA
  664. dup->cbioFlag = ssl->cbioFlag;
  665. #endif
  666. dup->wfd = ssl->wfd;
  667. dup->wflags = ssl->wflags;
  668. #ifndef WOLFSSL_AEAD_ONLY
  669. dup->hmac = ssl->hmac;
  670. #endif
  671. #ifdef HAVE_TRUNCATED_HMAC
  672. dup->truncated_hmac = ssl->truncated_hmac;
  673. #endif
  674. /* unique side dup setup */
  675. dup->dupSide = WRITE_DUP_SIDE;
  676. ssl->dupSide = READ_DUP_SIDE;
  677. return 0;
  678. }
  679. /*
  680. * duplicate a WOLFSSL object post handshake for writing only
  681. * turn existing object into read only. Allows concurrent access from two
  682. * different threads.
  683. *
  684. * ssl existing WOLFSSL object
  685. *
  686. * return dup'd WOLFSSL object on success
  687. */
  688. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  689. {
  690. WOLFSSL* dup = NULL;
  691. int ret = 0;
  692. (void)ret;
  693. WOLFSSL_ENTER("wolfSSL_write_dup");
  694. if (ssl == NULL) {
  695. return ssl;
  696. }
  697. if (ssl->options.handShakeDone == 0) {
  698. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  699. return NULL;
  700. }
  701. if (ssl->dupWrite) {
  702. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  703. return NULL;
  704. }
  705. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  706. if (dup) {
  707. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  708. FreeSSL(dup, ssl->ctx->heap);
  709. dup = NULL;
  710. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  711. FreeSSL(dup, ssl->ctx->heap);
  712. dup = NULL;
  713. }
  714. }
  715. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  716. return dup;
  717. }
  718. /*
  719. * Notify write dup side of fatal error or close notify
  720. *
  721. * ssl WOLFSSL object
  722. * err Notify err
  723. *
  724. * 0 on success
  725. */
  726. int NotifyWriteSide(WOLFSSL* ssl, int err)
  727. {
  728. int ret;
  729. WOLFSSL_ENTER("NotifyWriteSide");
  730. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  731. if (ret == 0) {
  732. ssl->dupWrite->dupErr = err;
  733. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  734. }
  735. return ret;
  736. }
  737. #endif /* HAVE_WRITE_DUP */
  738. #ifdef HAVE_POLY1305
  739. /* set if to use old poly 1 for yes 0 to use new poly */
  740. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  741. {
  742. (void)ssl;
  743. (void)value;
  744. #ifndef WOLFSSL_NO_TLS12
  745. WOLFSSL_ENTER("SSL_use_old_poly");
  746. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  747. "is depreciated");
  748. ssl->options.oldPoly = (word16)value;
  749. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  750. #endif
  751. return 0;
  752. }
  753. #endif
  754. WOLFSSL_ABI
  755. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  756. {
  757. int ret;
  758. WOLFSSL_ENTER("SSL_set_fd");
  759. if (ssl == NULL) {
  760. return BAD_FUNC_ARG;
  761. }
  762. ret = wolfSSL_set_read_fd(ssl, fd);
  763. if (ret == WOLFSSL_SUCCESS) {
  764. ret = wolfSSL_set_write_fd(ssl, fd);
  765. }
  766. return ret;
  767. }
  768. #ifdef WOLFSSL_DTLS
  769. int wolfSSL_set_dtls_fd_connected(WOLFSSL* ssl, int fd)
  770. {
  771. int ret;
  772. WOLFSSL_ENTER("SSL_set_dtls_fd_connected");
  773. if (ssl == NULL) {
  774. return BAD_FUNC_ARG;
  775. }
  776. ret = wolfSSL_set_fd(ssl, fd);
  777. if (ret == WOLFSSL_SUCCESS)
  778. ssl->buffers.dtlsCtx.connected = 1;
  779. return ret;
  780. }
  781. #endif
  782. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  783. {
  784. WOLFSSL_ENTER("SSL_set_read_fd");
  785. if (ssl == NULL) {
  786. return BAD_FUNC_ARG;
  787. }
  788. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  789. ssl->IOCB_ReadCtx = &ssl->rfd;
  790. #ifdef WOLFSSL_DTLS
  791. ssl->buffers.dtlsCtx.connected = 0;
  792. if (ssl->options.dtls) {
  793. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  794. ssl->buffers.dtlsCtx.rfd = fd;
  795. }
  796. #endif
  797. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  798. return WOLFSSL_SUCCESS;
  799. }
  800. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  801. {
  802. WOLFSSL_ENTER("SSL_set_write_fd");
  803. if (ssl == NULL) {
  804. return BAD_FUNC_ARG;
  805. }
  806. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  807. ssl->IOCB_WriteCtx = &ssl->wfd;
  808. #ifdef WOLFSSL_DTLS
  809. ssl->buffers.dtlsCtx.connected = 0;
  810. if (ssl->options.dtls) {
  811. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  812. ssl->buffers.dtlsCtx.wfd = fd;
  813. }
  814. #endif
  815. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  816. return WOLFSSL_SUCCESS;
  817. }
  818. /**
  819. * Get the name of cipher at priority level passed in.
  820. */
  821. char* wolfSSL_get_cipher_list(int priority)
  822. {
  823. const CipherSuiteInfo* ciphers = GetCipherNames();
  824. if (priority >= GetCipherNamesSize() || priority < 0) {
  825. return 0;
  826. }
  827. return (char*)ciphers[priority].name;
  828. }
  829. /**
  830. * Get the name of cipher at priority level passed in.
  831. */
  832. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  833. {
  834. if (ssl == NULL) {
  835. return NULL;
  836. }
  837. else {
  838. const char* cipher;
  839. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  840. if (priority == 0) {
  841. return (char*)cipher;
  842. }
  843. else {
  844. return NULL;
  845. }
  846. }
  847. else {
  848. return wolfSSL_get_cipher_list(priority);
  849. }
  850. }
  851. }
  852. int wolfSSL_get_ciphers(char* buf, int len)
  853. {
  854. const CipherSuiteInfo* ciphers = GetCipherNames();
  855. int ciphersSz = GetCipherNamesSize();
  856. int i;
  857. int cipherNameSz;
  858. if (buf == NULL || len <= 0)
  859. return BAD_FUNC_ARG;
  860. /* Add each member to the buffer delimited by a : */
  861. for (i = 0; i < ciphersSz; i++) {
  862. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  863. if (cipherNameSz + 1 < len) {
  864. XSTRNCPY(buf, ciphers[i].name, len);
  865. buf += cipherNameSz;
  866. if (i < ciphersSz - 1)
  867. *buf++ = ':';
  868. *buf = 0;
  869. len -= cipherNameSz + 1;
  870. }
  871. else
  872. return BUFFER_E;
  873. }
  874. return WOLFSSL_SUCCESS;
  875. }
  876. #ifndef NO_ERROR_STRINGS
  877. /* places a list of all supported cipher suites in TLS_* format into "buf"
  878. * return WOLFSSL_SUCCESS on success */
  879. int wolfSSL_get_ciphers_iana(char* buf, int len)
  880. {
  881. const CipherSuiteInfo* ciphers = GetCipherNames();
  882. int ciphersSz = GetCipherNamesSize();
  883. int i;
  884. int cipherNameSz;
  885. if (buf == NULL || len <= 0)
  886. return BAD_FUNC_ARG;
  887. /* Add each member to the buffer delimited by a : */
  888. for (i = 0; i < ciphersSz; i++) {
  889. #ifndef NO_CIPHER_SUITE_ALIASES
  890. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  891. continue;
  892. #endif
  893. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  894. if (cipherNameSz + 1 < len) {
  895. XSTRNCPY(buf, ciphers[i].name_iana, len);
  896. buf += cipherNameSz;
  897. if (i < ciphersSz - 1)
  898. *buf++ = ':';
  899. *buf = 0;
  900. len -= cipherNameSz + 1;
  901. }
  902. else
  903. return BUFFER_E;
  904. }
  905. return WOLFSSL_SUCCESS;
  906. }
  907. #endif /* NO_ERROR_STRINGS */
  908. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  909. {
  910. const char* cipher;
  911. if (ssl == NULL)
  912. return NULL;
  913. cipher = wolfSSL_get_cipher_name_iana(ssl);
  914. len = min(len, (int)(XSTRLEN(cipher) + 1));
  915. XMEMCPY(buf, cipher, len);
  916. return buf;
  917. }
  918. int wolfSSL_get_fd(const WOLFSSL* ssl)
  919. {
  920. int fd = -1;
  921. WOLFSSL_ENTER("SSL_get_fd");
  922. if (ssl) {
  923. fd = ssl->rfd;
  924. }
  925. WOLFSSL_LEAVE("SSL_get_fd", fd);
  926. return fd;
  927. }
  928. int wolfSSL_dtls(WOLFSSL* ssl)
  929. {
  930. int dtlsOpt = 0;
  931. if (ssl)
  932. dtlsOpt = ssl->options.dtls;
  933. return dtlsOpt;
  934. }
  935. #if !defined(NO_CERTS)
  936. /* Set whether mutual authentication is required for connections.
  937. * Server side only.
  938. *
  939. * ctx The SSL/TLS CTX object.
  940. * req 1 to indicate required and 0 when not.
  941. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  942. * 0 on success.
  943. */
  944. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  945. {
  946. if (ctx == NULL)
  947. return BAD_FUNC_ARG;
  948. if (ctx->method->side == WOLFSSL_CLIENT_END)
  949. return SIDE_ERROR;
  950. ctx->mutualAuth = (byte)req;
  951. return 0;
  952. }
  953. /* Set whether mutual authentication is required for the connection.
  954. * Server side only.
  955. *
  956. * ssl The SSL/TLS object.
  957. * req 1 to indicate required and 0 when not.
  958. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  959. * SIDE_ERROR when not a client and 0 on success.
  960. */
  961. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  962. {
  963. if (ssl == NULL)
  964. return BAD_FUNC_ARG;
  965. if (ssl->options.side == WOLFSSL_SERVER_END)
  966. return SIDE_ERROR;
  967. ssl->options.mutualAuth = (word16)req;
  968. return 0;
  969. }
  970. #endif /* NO_CERTS */
  971. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  972. int wolfSSL_CTX_set_AcceptFilter(
  973. WOLFSSL_CTX *ctx,
  974. NetworkFilterCallback_t AcceptFilter,
  975. void *AcceptFilter_arg)
  976. {
  977. if (ctx == NULL)
  978. return BAD_FUNC_ARG;
  979. ctx->AcceptFilter = AcceptFilter;
  980. ctx->AcceptFilter_arg = AcceptFilter_arg;
  981. return 0;
  982. }
  983. int wolfSSL_set_AcceptFilter(
  984. WOLFSSL *ssl,
  985. NetworkFilterCallback_t AcceptFilter,
  986. void *AcceptFilter_arg)
  987. {
  988. if (ssl == NULL)
  989. return BAD_FUNC_ARG;
  990. ssl->AcceptFilter = AcceptFilter;
  991. ssl->AcceptFilter_arg = AcceptFilter_arg;
  992. return 0;
  993. }
  994. int wolfSSL_CTX_set_ConnectFilter(
  995. WOLFSSL_CTX *ctx,
  996. NetworkFilterCallback_t ConnectFilter,
  997. void *ConnectFilter_arg)
  998. {
  999. if (ctx == NULL)
  1000. return BAD_FUNC_ARG;
  1001. ctx->ConnectFilter = ConnectFilter;
  1002. ctx->ConnectFilter_arg = ConnectFilter_arg;
  1003. return 0;
  1004. }
  1005. int wolfSSL_set_ConnectFilter(
  1006. WOLFSSL *ssl,
  1007. NetworkFilterCallback_t ConnectFilter,
  1008. void *ConnectFilter_arg)
  1009. {
  1010. if (ssl == NULL)
  1011. return BAD_FUNC_ARG;
  1012. ssl->ConnectFilter = ConnectFilter;
  1013. ssl->ConnectFilter_arg = ConnectFilter_arg;
  1014. return 0;
  1015. }
  1016. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  1017. #ifndef WOLFSSL_LEANPSK
  1018. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  1019. {
  1020. #ifdef WOLFSSL_DTLS
  1021. void* sa;
  1022. if (ssl == NULL)
  1023. return WOLFSSL_FAILURE;
  1024. if (peer == NULL || peerSz == 0) {
  1025. if (ssl->buffers.dtlsCtx.peer.sa != NULL)
  1026. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1027. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1028. ssl->buffers.dtlsCtx.peer.sz = 0;
  1029. ssl->buffers.dtlsCtx.peer.bufSz = 0;
  1030. ssl->buffers.dtlsCtx.userSet = 0;
  1031. return WOLFSSL_SUCCESS;
  1032. }
  1033. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  1034. if (sa != NULL) {
  1035. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1036. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  1037. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1038. }
  1039. XMEMCPY(sa, peer, peerSz);
  1040. ssl->buffers.dtlsCtx.peer.sa = sa;
  1041. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  1042. ssl->buffers.dtlsCtx.peer.bufSz = peerSz;
  1043. ssl->buffers.dtlsCtx.userSet = 1;
  1044. return WOLFSSL_SUCCESS;
  1045. }
  1046. return WOLFSSL_FAILURE;
  1047. #else
  1048. (void)ssl;
  1049. (void)peer;
  1050. (void)peerSz;
  1051. return WOLFSSL_NOT_IMPLEMENTED;
  1052. #endif
  1053. }
  1054. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  1055. {
  1056. #ifdef WOLFSSL_DTLS
  1057. if (ssl == NULL) {
  1058. return WOLFSSL_FAILURE;
  1059. }
  1060. if (peer != NULL && peerSz != NULL
  1061. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  1062. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1063. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  1064. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  1065. return WOLFSSL_SUCCESS;
  1066. }
  1067. return WOLFSSL_FAILURE;
  1068. #else
  1069. (void)ssl;
  1070. (void)peer;
  1071. (void)peerSz;
  1072. return WOLFSSL_NOT_IMPLEMENTED;
  1073. #endif
  1074. }
  1075. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  1076. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  1077. {
  1078. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  1079. if (ctx == NULL)
  1080. return BAD_FUNC_ARG;
  1081. ctx->dtlsSctp = 1;
  1082. return WOLFSSL_SUCCESS;
  1083. }
  1084. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  1085. {
  1086. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  1087. if (ssl == NULL)
  1088. return BAD_FUNC_ARG;
  1089. ssl->options.dtlsSctp = 1;
  1090. return WOLFSSL_SUCCESS;
  1091. }
  1092. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  1093. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  1094. defined(WOLFSSL_DTLS)
  1095. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  1096. {
  1097. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  1098. return BAD_FUNC_ARG;
  1099. ctx->dtlsMtuSz = newMtu;
  1100. return WOLFSSL_SUCCESS;
  1101. }
  1102. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  1103. {
  1104. if (ssl == NULL)
  1105. return BAD_FUNC_ARG;
  1106. if (newMtu > MAX_RECORD_SIZE) {
  1107. ssl->error = BAD_FUNC_ARG;
  1108. return WOLFSSL_FAILURE;
  1109. }
  1110. ssl->dtlsMtuSz = newMtu;
  1111. return WOLFSSL_SUCCESS;
  1112. }
  1113. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  1114. #ifdef WOLFSSL_SRTP
  1115. static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = {
  1116. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits
  1117. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1118. {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) },
  1119. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits
  1120. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1121. {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) },
  1122. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */
  1123. {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)},
  1124. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */
  1125. {"SRTP_NULL_SHA1_32", SRTP_NULL_SHA1_32, ((112 * 2) / 8)},
  1126. /* AES GCM 128, Salt: 96-bits, Auth GCM Tag 128-bits
  1127. * (master_key:128bits + master_salt:96bits) * 2 = 448 bits (56) */
  1128. {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM, (((128 + 96) * 2) / 8) },
  1129. /* AES GCM 256, Salt: 96-bits, Auth GCM Tag 128-bits
  1130. * (master_key:256bits + master_salt:96bits) * 2 = 704 bits (88) */
  1131. {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM, (((256 + 96) * 2) / 8) },
  1132. };
  1133. static const WOLFSSL_SRTP_PROTECTION_PROFILE* DtlsSrtpFindProfile(
  1134. const char* profile_str, word32 profile_str_len, unsigned long id)
  1135. {
  1136. int i;
  1137. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1138. for (i=0;
  1139. i<(int)(sizeof(gSrtpProfiles)/sizeof(WOLFSSL_SRTP_PROTECTION_PROFILE));
  1140. i++) {
  1141. if (profile_str != NULL) {
  1142. word32 srtp_profile_len = (word32)XSTRLEN(gSrtpProfiles[i].name);
  1143. if (srtp_profile_len == profile_str_len &&
  1144. XMEMCMP(gSrtpProfiles[i].name, profile_str, profile_str_len)
  1145. == 0) {
  1146. profile = &gSrtpProfiles[i];
  1147. break;
  1148. }
  1149. }
  1150. else if (id != 0 && gSrtpProfiles[i].id == id) {
  1151. profile = &gSrtpProfiles[i];
  1152. break;
  1153. }
  1154. }
  1155. return profile;
  1156. }
  1157. /* profile_str: accepts ":" colon separated list of SRTP profiles */
  1158. static int DtlsSrtpSelProfiles(word16* id, const char* profile_str)
  1159. {
  1160. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile;
  1161. const char *current, *next = NULL;
  1162. word32 length = 0, current_length;
  1163. *id = 0; /* reset destination ID's */
  1164. if (profile_str == NULL) {
  1165. return WOLFSSL_FAILURE;
  1166. }
  1167. /* loop on end of line or colon ":" */
  1168. next = profile_str;
  1169. length = (word32)XSTRLEN(profile_str);
  1170. do {
  1171. current = next;
  1172. next = XSTRSTR(current, ":");
  1173. current_length = (!next) ? (word32)XSTRLEN(current)
  1174. : (word32)(next - current);
  1175. if (current_length < length)
  1176. length = current_length;
  1177. profile = DtlsSrtpFindProfile(current, current_length, 0);
  1178. if (profile != NULL) {
  1179. *id |= (1 << profile->id); /* selected bit based on ID */
  1180. }
  1181. } while (next != NULL && next++); /* ++ needed to skip ':' */
  1182. return WOLFSSL_SUCCESS;
  1183. }
  1184. int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char* profile_str)
  1185. {
  1186. int ret = WOLFSSL_FAILURE;
  1187. if (ctx != NULL) {
  1188. ret = DtlsSrtpSelProfiles(&ctx->dtlsSrtpProfiles, profile_str);
  1189. }
  1190. return ret;
  1191. }
  1192. int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char* profile_str)
  1193. {
  1194. int ret = WOLFSSL_FAILURE;
  1195. if (ssl != NULL) {
  1196. ret = DtlsSrtpSelProfiles(&ssl->dtlsSrtpProfiles, profile_str);
  1197. }
  1198. return ret;
  1199. }
  1200. const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(
  1201. WOLFSSL* ssl)
  1202. {
  1203. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1204. if (ssl) {
  1205. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1206. }
  1207. return profile;
  1208. }
  1209. #ifndef NO_WOLFSSL_STUB
  1210. WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* wolfSSL_get_srtp_profiles(
  1211. WOLFSSL* ssl)
  1212. {
  1213. /* Not yet implemented - should return list of available SRTP profiles
  1214. * ssl->dtlsSrtpProfiles */
  1215. (void)ssl;
  1216. return NULL;
  1217. }
  1218. #endif
  1219. int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl,
  1220. unsigned char* out, size_t* olen)
  1221. {
  1222. int ret = WOLFSSL_FAILURE;
  1223. const char* label = "EXTRACTOR-dtls_srtp";
  1224. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1225. byte seed[SEED_LEN];
  1226. if (ssl == NULL || olen == NULL) {
  1227. return BAD_FUNC_ARG;
  1228. }
  1229. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1230. if (profile == NULL) {
  1231. WOLFSSL_MSG("Not using DTLS SRTP");
  1232. return EXT_MISSING;
  1233. }
  1234. if (out == NULL) {
  1235. *olen = profile->kdfBits;
  1236. return LENGTH_ONLY_E;
  1237. }
  1238. if (*olen < (size_t)profile->kdfBits) {
  1239. return BUFFER_E;
  1240. }
  1241. #ifdef WOLFSSL_HAVE_PRF
  1242. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  1243. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  1244. PRIVATE_KEY_UNLOCK();
  1245. ret = wc_PRF_TLS(out, profile->kdfBits, /* out: generated keys / salt */
  1246. ssl->arrays->masterSecret, SECRET_LEN, /* existing master secret */
  1247. (const byte*)label, (int)XSTRLEN(label),/* label */
  1248. seed, SEED_LEN, /* seed: client/server random */
  1249. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  1250. ssl->heap, INVALID_DEVID);
  1251. if (ret == 0) {
  1252. *olen = profile->kdfBits;
  1253. ret = WOLFSSL_SUCCESS;
  1254. }
  1255. PRIVATE_KEY_LOCK();
  1256. #else
  1257. /* Pseudo random function must be enabled in the configuration */
  1258. ret = PRF_MISSING;
  1259. #endif
  1260. return ret;
  1261. }
  1262. #endif /* WOLFSSL_SRTP */
  1263. #ifdef WOLFSSL_DTLS_DROP_STATS
  1264. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  1265. word32* macDropCount, word32* replayDropCount)
  1266. {
  1267. int ret;
  1268. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  1269. if (ssl == NULL)
  1270. ret = BAD_FUNC_ARG;
  1271. else {
  1272. ret = WOLFSSL_SUCCESS;
  1273. if (macDropCount != NULL)
  1274. *macDropCount = ssl->macDropCount;
  1275. if (replayDropCount != NULL)
  1276. *replayDropCount = ssl->replayDropCount;
  1277. }
  1278. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  1279. return ret;
  1280. }
  1281. #endif /* WOLFSSL_DTLS_DROP_STATS */
  1282. #if defined(WOLFSSL_MULTICAST)
  1283. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  1284. {
  1285. int ret = 0;
  1286. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  1287. if (ctx == NULL || id > 255)
  1288. ret = BAD_FUNC_ARG;
  1289. if (ret == 0) {
  1290. ctx->haveEMS = 0;
  1291. ctx->haveMcast = 1;
  1292. ctx->mcastID = (byte)id;
  1293. #ifndef WOLFSSL_USER_IO
  1294. ctx->CBIORecv = EmbedReceiveFromMcast;
  1295. #endif /* WOLFSSL_USER_IO */
  1296. ret = WOLFSSL_SUCCESS;
  1297. }
  1298. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  1299. return ret;
  1300. }
  1301. int wolfSSL_mcast_get_max_peers(void)
  1302. {
  1303. return WOLFSSL_MULTICAST_PEERS;
  1304. }
  1305. #ifdef WOLFSSL_DTLS
  1306. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  1307. word32 second, word32 high)
  1308. {
  1309. word32 newCur = 0;
  1310. if (cur < first)
  1311. newCur = first;
  1312. else if (cur < second)
  1313. newCur = second;
  1314. else if (cur < high)
  1315. newCur = high;
  1316. return newCur;
  1317. }
  1318. #endif /* WOLFSSL_DTLS */
  1319. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  1320. const byte* preMasterSecret, word32 preMasterSz,
  1321. const byte* clientRandom, const byte* serverRandom,
  1322. const byte* suite)
  1323. {
  1324. int ret = 0;
  1325. WOLFSSL_ENTER("wolfSSL_set_secret()");
  1326. if (ssl == NULL || preMasterSecret == NULL ||
  1327. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  1328. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  1329. ret = BAD_FUNC_ARG;
  1330. }
  1331. if (ret == 0 && ssl->arrays->preMasterSecret == NULL) {
  1332. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  1333. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  1334. DYNAMIC_TYPE_SECRET);
  1335. if (ssl->arrays->preMasterSecret == NULL) {
  1336. ret = MEMORY_E;
  1337. }
  1338. }
  1339. if (ret == 0) {
  1340. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  1341. XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz);
  1342. ssl->arrays->preMasterSz = preMasterSz;
  1343. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  1344. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  1345. ssl->options.cipherSuite0 = suite[0];
  1346. ssl->options.cipherSuite = suite[1];
  1347. ret = SetCipherSpecs(ssl);
  1348. }
  1349. if (ret == 0)
  1350. ret = MakeTlsMasterSecret(ssl);
  1351. if (ret == 0) {
  1352. ssl->keys.encryptionOn = 1;
  1353. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1354. }
  1355. if (ret == 0) {
  1356. if (ssl->options.dtls) {
  1357. #ifdef WOLFSSL_DTLS
  1358. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1359. int i;
  1360. ssl->keys.dtls_epoch = epoch;
  1361. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1362. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1363. i++, peerSeq++) {
  1364. peerSeq->nextEpoch = epoch;
  1365. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1366. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1367. peerSeq->nextSeq_lo = 0;
  1368. peerSeq->nextSeq_hi = 0;
  1369. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1370. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1371. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1372. ssl->ctx->mcastFirstSeq,
  1373. ssl->ctx->mcastSecondSeq,
  1374. ssl->ctx->mcastMaxSeq);
  1375. }
  1376. #else
  1377. (void)epoch;
  1378. #endif
  1379. }
  1380. FreeHandshakeResources(ssl);
  1381. ret = WOLFSSL_SUCCESS;
  1382. }
  1383. else {
  1384. if (ssl)
  1385. ssl->error = ret;
  1386. ret = WOLFSSL_FATAL_ERROR;
  1387. }
  1388. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1389. return ret;
  1390. }
  1391. #ifdef WOLFSSL_DTLS
  1392. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int sub)
  1393. {
  1394. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1395. int ret = WOLFSSL_SUCCESS;
  1396. int i;
  1397. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1398. if (ssl == NULL || peerId > 255)
  1399. return BAD_FUNC_ARG;
  1400. if (!sub) {
  1401. /* Make sure it isn't already present, while keeping the first
  1402. * open spot. */
  1403. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1404. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1405. p = &ssl->keys.peerSeq[i];
  1406. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1407. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1408. p = NULL;
  1409. }
  1410. }
  1411. if (p != NULL) {
  1412. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1413. p->peerId = peerId;
  1414. p->highwaterMark = UpdateHighwaterMark(0,
  1415. ssl->ctx->mcastFirstSeq,
  1416. ssl->ctx->mcastSecondSeq,
  1417. ssl->ctx->mcastMaxSeq);
  1418. }
  1419. else {
  1420. WOLFSSL_MSG("No room in peer list.");
  1421. ret = -1;
  1422. }
  1423. }
  1424. else {
  1425. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1426. if (ssl->keys.peerSeq[i].peerId == peerId)
  1427. p = &ssl->keys.peerSeq[i];
  1428. }
  1429. if (p != NULL) {
  1430. p->peerId = INVALID_PEER_ID;
  1431. }
  1432. else {
  1433. WOLFSSL_MSG("Peer not found in list.");
  1434. }
  1435. }
  1436. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1437. return ret;
  1438. }
  1439. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1440. * return 1, otherwise return 0. */
  1441. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1442. {
  1443. int known = 0;
  1444. int i;
  1445. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1446. if (ssl == NULL || peerId > 255) {
  1447. return BAD_FUNC_ARG;
  1448. }
  1449. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1450. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1451. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1452. ssl->keys.peerSeq[i].nextSeq_lo) {
  1453. known = 1;
  1454. }
  1455. break;
  1456. }
  1457. }
  1458. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1459. return known;
  1460. }
  1461. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1462. word32 first, word32 second,
  1463. CallbackMcastHighwater cb)
  1464. {
  1465. if (ctx == NULL || (second && first > second) ||
  1466. first > maxSeq || second > maxSeq || cb == NULL) {
  1467. return BAD_FUNC_ARG;
  1468. }
  1469. ctx->mcastHwCb = cb;
  1470. ctx->mcastFirstSeq = first;
  1471. ctx->mcastSecondSeq = second;
  1472. ctx->mcastMaxSeq = maxSeq;
  1473. return WOLFSSL_SUCCESS;
  1474. }
  1475. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1476. {
  1477. if (ssl == NULL || ctx == NULL)
  1478. return BAD_FUNC_ARG;
  1479. ssl->mcastHwCbCtx = ctx;
  1480. return WOLFSSL_SUCCESS;
  1481. }
  1482. #endif /* WOLFSSL_DTLS */
  1483. #endif /* WOLFSSL_MULTICAST */
  1484. #endif /* WOLFSSL_LEANPSK */
  1485. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1486. int wolfSSL_negotiate(WOLFSSL* ssl)
  1487. {
  1488. int err = WOLFSSL_FATAL_ERROR;
  1489. WOLFSSL_ENTER("wolfSSL_negotiate");
  1490. #ifndef NO_WOLFSSL_SERVER
  1491. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1492. #ifdef WOLFSSL_TLS13
  1493. if (IsAtLeastTLSv1_3(ssl->version))
  1494. err = wolfSSL_accept_TLSv13(ssl);
  1495. else
  1496. #endif
  1497. err = wolfSSL_accept(ssl);
  1498. }
  1499. #endif
  1500. #ifndef NO_WOLFSSL_CLIENT
  1501. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1502. #ifdef WOLFSSL_TLS13
  1503. if (IsAtLeastTLSv1_3(ssl->version))
  1504. err = wolfSSL_connect_TLSv13(ssl);
  1505. else
  1506. #endif
  1507. err = wolfSSL_connect(ssl);
  1508. }
  1509. #endif
  1510. (void)ssl;
  1511. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1512. return err;
  1513. }
  1514. WOLFSSL_ABI
  1515. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1516. {
  1517. if (ssl) {
  1518. return ssl->rng;
  1519. }
  1520. return NULL;
  1521. }
  1522. #ifndef WOLFSSL_LEANPSK
  1523. /* object size based on build */
  1524. int wolfSSL_GetObjectSize(void)
  1525. {
  1526. #ifdef SHOW_SIZES
  1527. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1528. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1529. #ifndef NO_RC4
  1530. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1531. #endif
  1532. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1533. #ifndef NO_DES3
  1534. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1535. #endif
  1536. #ifdef HAVE_CHACHA
  1537. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1538. #endif
  1539. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1540. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1541. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1542. #ifndef NO_MD5
  1543. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1544. #endif
  1545. #ifndef NO_SHA
  1546. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1547. #endif
  1548. #ifdef WOLFSSL_SHA224
  1549. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1550. #endif
  1551. #ifndef NO_SHA256
  1552. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1553. #endif
  1554. #ifdef WOLFSSL_SHA384
  1555. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1556. #endif
  1557. #ifdef WOLFSSL_SHA384
  1558. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1559. #endif
  1560. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1561. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1562. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1563. #ifndef NO_RSA
  1564. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1565. #endif
  1566. #ifdef HAVE_ECC
  1567. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1568. #endif
  1569. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1570. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1571. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1572. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1573. #endif
  1574. return sizeof(WOLFSSL);
  1575. }
  1576. int wolfSSL_CTX_GetObjectSize(void)
  1577. {
  1578. return sizeof(WOLFSSL_CTX);
  1579. }
  1580. int wolfSSL_METHOD_GetObjectSize(void)
  1581. {
  1582. return sizeof(WOLFSSL_METHOD);
  1583. }
  1584. #endif
  1585. #ifdef WOLFSSL_STATIC_MEMORY
  1586. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1587. unsigned char* buf, unsigned int sz,
  1588. int flag, int maxSz)
  1589. {
  1590. WOLFSSL_HEAP* heap;
  1591. WOLFSSL_HEAP_HINT* hint;
  1592. word32 idx = 0;
  1593. if (ctx == NULL || buf == NULL) {
  1594. return BAD_FUNC_ARG;
  1595. }
  1596. if (*ctx == NULL && method == NULL) {
  1597. return BAD_FUNC_ARG;
  1598. }
  1599. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1600. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1601. return BUFFER_E; /* not enough memory for structures */
  1602. }
  1603. heap = (WOLFSSL_HEAP*)buf;
  1604. idx += sizeof(WOLFSSL_HEAP);
  1605. if (wolfSSL_init_memory_heap(heap) != 0) {
  1606. return WOLFSSL_FAILURE;
  1607. }
  1608. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1609. idx += sizeof(WOLFSSL_HEAP_HINT);
  1610. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1611. hint->memory = heap;
  1612. if (*ctx && (*ctx)->heap == NULL) {
  1613. (*ctx)->heap = (void*)hint;
  1614. }
  1615. }
  1616. else {
  1617. #ifdef WOLFSSL_HEAP_TEST
  1618. /* do not load in memory if test has been set */
  1619. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1620. return WOLFSSL_SUCCESS;
  1621. }
  1622. #endif
  1623. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1624. heap = hint->memory;
  1625. }
  1626. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1627. WOLFSSL_MSG("Error partitioning memory");
  1628. return WOLFSSL_FAILURE;
  1629. }
  1630. /* create ctx if needed */
  1631. if (*ctx == NULL) {
  1632. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1633. if (*ctx == NULL) {
  1634. WOLFSSL_MSG("Error creating ctx");
  1635. return WOLFSSL_FAILURE;
  1636. }
  1637. }
  1638. /* determine what max applies too */
  1639. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1640. heap->maxIO = maxSz;
  1641. }
  1642. else { /* general memory used in handshakes */
  1643. heap->maxHa = maxSz;
  1644. }
  1645. heap->flag |= flag;
  1646. (void)maxSz;
  1647. (void)method;
  1648. return WOLFSSL_SUCCESS;
  1649. }
  1650. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1651. {
  1652. if (ssl == NULL) {
  1653. return BAD_FUNC_ARG;
  1654. }
  1655. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1656. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1657. if (mem_stats != NULL && ssl->heap != NULL) {
  1658. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1659. WOLFSSL_HEAP* heap = hint->memory;
  1660. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1661. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1662. }
  1663. }
  1664. return (ssl->heap) ? 1 : 0;
  1665. }
  1666. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1667. {
  1668. if (ctx == NULL) {
  1669. return BAD_FUNC_ARG;
  1670. }
  1671. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1672. /* fill out statistics if wanted */
  1673. if (mem_stats != NULL && ctx->heap != NULL) {
  1674. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1675. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1676. return MEMORY_E;
  1677. }
  1678. }
  1679. return (ctx->heap) ? 1 : 0;
  1680. }
  1681. #endif /* WOLFSSL_STATIC_MEMORY */
  1682. /* return max record layer size plaintext input size */
  1683. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1684. {
  1685. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1686. if (ssl == NULL)
  1687. return BAD_FUNC_ARG;
  1688. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1689. WOLFSSL_MSG("Handshake not complete yet");
  1690. return BAD_FUNC_ARG;
  1691. }
  1692. return wolfSSL_GetMaxFragSize(ssl, OUTPUT_RECORD_SIZE);
  1693. }
  1694. /* return record layer size of plaintext input size */
  1695. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1696. {
  1697. int maxSize;
  1698. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1699. if (inSz < 0)
  1700. return BAD_FUNC_ARG;
  1701. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1702. if (maxSize < 0)
  1703. return maxSize; /* error */
  1704. if (inSz > maxSize)
  1705. return INPUT_SIZE_E;
  1706. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1707. }
  1708. #ifdef HAVE_ECC
  1709. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1710. {
  1711. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1712. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1713. return BAD_FUNC_ARG;
  1714. }
  1715. ctx->minEccKeySz = keySz / 8;
  1716. #ifndef NO_CERTS
  1717. ctx->cm->minEccKeySz = keySz / 8;
  1718. #endif
  1719. return WOLFSSL_SUCCESS;
  1720. }
  1721. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1722. {
  1723. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1724. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1725. return BAD_FUNC_ARG;
  1726. }
  1727. ssl->options.minEccKeySz = keySz / 8;
  1728. return WOLFSSL_SUCCESS;
  1729. }
  1730. #endif /* HAVE_ECC */
  1731. #ifndef NO_RSA
  1732. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1733. {
  1734. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1735. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1736. return BAD_FUNC_ARG;
  1737. }
  1738. ctx->minRsaKeySz = keySz / 8;
  1739. ctx->cm->minRsaKeySz = keySz / 8;
  1740. return WOLFSSL_SUCCESS;
  1741. }
  1742. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1743. {
  1744. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1745. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1746. return BAD_FUNC_ARG;
  1747. }
  1748. ssl->options.minRsaKeySz = keySz / 8;
  1749. return WOLFSSL_SUCCESS;
  1750. }
  1751. #endif /* !NO_RSA */
  1752. #ifndef NO_DH
  1753. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1754. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1755. const unsigned char* g, int gSz)
  1756. {
  1757. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1758. if (ssl == NULL || p == NULL || g == NULL)
  1759. return BAD_FUNC_ARG;
  1760. if ((word16)pSz < ssl->options.minDhKeySz)
  1761. return DH_KEY_SIZE_E;
  1762. if ((word16)pSz > ssl->options.maxDhKeySz)
  1763. return DH_KEY_SIZE_E;
  1764. /* this function is for server only */
  1765. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1766. return SIDE_ERROR;
  1767. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1768. !defined(HAVE_SELFTEST)
  1769. ssl->options.dhKeyTested = 0;
  1770. ssl->options.dhDoKeyTest = 1;
  1771. #endif
  1772. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1773. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1774. ssl->buffers.serverDH_P.buffer = NULL;
  1775. }
  1776. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1777. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1778. ssl->buffers.serverDH_G.buffer = NULL;
  1779. }
  1780. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1781. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1782. DYNAMIC_TYPE_PUBLIC_KEY);
  1783. if (ssl->buffers.serverDH_P.buffer == NULL)
  1784. return MEMORY_E;
  1785. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1786. DYNAMIC_TYPE_PUBLIC_KEY);
  1787. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1788. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1789. ssl->buffers.serverDH_P.buffer = NULL;
  1790. return MEMORY_E;
  1791. }
  1792. ssl->buffers.serverDH_P.length = pSz;
  1793. ssl->buffers.serverDH_G.length = gSz;
  1794. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1795. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1796. ssl->options.haveDH = 1;
  1797. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1798. word16 havePSK;
  1799. word16 haveRSA;
  1800. int keySz = 0;
  1801. #ifndef NO_PSK
  1802. havePSK = ssl->options.havePSK;
  1803. #else
  1804. havePSK = 0;
  1805. #endif
  1806. #ifdef NO_RSA
  1807. haveRSA = 0;
  1808. #else
  1809. haveRSA = 1;
  1810. #endif
  1811. #ifndef NO_CERTS
  1812. keySz = ssl->buffers.keySz;
  1813. #endif
  1814. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1815. ssl->options.haveDH, ssl->options.haveECDSAsig,
  1816. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  1817. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  1818. ssl->options.haveAnon, TRUE, ssl->options.side);
  1819. }
  1820. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1821. return WOLFSSL_SUCCESS;
  1822. }
  1823. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1824. !defined(HAVE_SELFTEST)
  1825. /* Enables or disables the session's DH key prime test. */
  1826. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1827. {
  1828. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1829. if (ssl == NULL)
  1830. return BAD_FUNC_ARG;
  1831. if (!enable)
  1832. ssl->options.dhDoKeyTest = 0;
  1833. else
  1834. ssl->options.dhDoKeyTest = 1;
  1835. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1836. return WOLFSSL_SUCCESS;
  1837. }
  1838. #endif
  1839. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1840. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1841. const unsigned char* g, int gSz)
  1842. {
  1843. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1844. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1845. if ((word16)pSz < ctx->minDhKeySz)
  1846. return DH_KEY_SIZE_E;
  1847. if ((word16)pSz > ctx->maxDhKeySz)
  1848. return DH_KEY_SIZE_E;
  1849. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1850. !defined(HAVE_SELFTEST)
  1851. {
  1852. WC_RNG rng;
  1853. int error, freeKey = 0;
  1854. #ifdef WOLFSSL_SMALL_STACK
  1855. DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  1856. if (checkKey == NULL)
  1857. return MEMORY_E;
  1858. #else
  1859. DhKey checkKey[1];
  1860. #endif
  1861. error = wc_InitRng(&rng);
  1862. if (!error)
  1863. error = wc_InitDhKey(checkKey);
  1864. if (!error) {
  1865. freeKey = 1;
  1866. error = wc_DhSetCheckKey(checkKey,
  1867. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1868. }
  1869. if (freeKey)
  1870. wc_FreeDhKey(checkKey);
  1871. #ifdef WOLFSSL_SMALL_STACK
  1872. XFREE(checkKey, NULL, DYNAMIC_TYPE_DH);
  1873. #endif
  1874. wc_FreeRng(&rng);
  1875. if (error)
  1876. return error;
  1877. ctx->dhKeyTested = 1;
  1878. }
  1879. #endif
  1880. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1881. ctx->serverDH_P.buffer = NULL;
  1882. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1883. ctx->serverDH_G.buffer = NULL;
  1884. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1885. if (ctx->serverDH_P.buffer == NULL)
  1886. return MEMORY_E;
  1887. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1888. if (ctx->serverDH_G.buffer == NULL) {
  1889. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1890. ctx->serverDH_P.buffer = NULL;
  1891. return MEMORY_E;
  1892. }
  1893. ctx->serverDH_P.length = pSz;
  1894. ctx->serverDH_G.length = gSz;
  1895. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1896. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1897. ctx->haveDH = 1;
  1898. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1899. return WOLFSSL_SUCCESS;
  1900. }
  1901. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1902. {
  1903. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1904. return BAD_FUNC_ARG;
  1905. ctx->minDhKeySz = keySz_bits / 8;
  1906. return WOLFSSL_SUCCESS;
  1907. }
  1908. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1909. {
  1910. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1911. return BAD_FUNC_ARG;
  1912. ssl->options.minDhKeySz = keySz_bits / 8;
  1913. return WOLFSSL_SUCCESS;
  1914. }
  1915. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1916. {
  1917. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1918. return BAD_FUNC_ARG;
  1919. ctx->maxDhKeySz = keySz_bits / 8;
  1920. return WOLFSSL_SUCCESS;
  1921. }
  1922. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1923. {
  1924. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1925. return BAD_FUNC_ARG;
  1926. ssl->options.maxDhKeySz = keySz_bits / 8;
  1927. return WOLFSSL_SUCCESS;
  1928. }
  1929. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1930. {
  1931. if (ssl == NULL)
  1932. return BAD_FUNC_ARG;
  1933. return (ssl->options.dhKeySz * 8);
  1934. }
  1935. #endif /* !NO_DH */
  1936. WOLFSSL_ABI
  1937. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1938. {
  1939. int ret;
  1940. WOLFSSL_ENTER("SSL_write()");
  1941. if (ssl == NULL || data == NULL || sz < 0)
  1942. return BAD_FUNC_ARG;
  1943. #ifdef WOLFSSL_QUIC
  1944. if (WOLFSSL_IS_QUIC(ssl)) {
  1945. WOLFSSL_MSG("SSL_write() on QUIC not allowed");
  1946. return BAD_FUNC_ARG;
  1947. }
  1948. #endif
  1949. #ifdef WOLFSSL_EARLY_DATA
  1950. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1951. ssl->error = ret;
  1952. return WOLFSSL_FATAL_ERROR;
  1953. }
  1954. ssl->earlyData = no_early_data;
  1955. #endif
  1956. #ifdef HAVE_WRITE_DUP
  1957. { /* local variable scope */
  1958. int dupErr = 0; /* local copy */
  1959. ret = 0;
  1960. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1961. WOLFSSL_MSG("Read dup side cannot write");
  1962. return WRITE_DUP_WRITE_E;
  1963. }
  1964. if (ssl->dupWrite) {
  1965. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1966. return BAD_MUTEX_E;
  1967. }
  1968. dupErr = ssl->dupWrite->dupErr;
  1969. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1970. }
  1971. if (ret != 0) {
  1972. ssl->error = ret; /* high priority fatal error */
  1973. return WOLFSSL_FATAL_ERROR;
  1974. }
  1975. if (dupErr != 0) {
  1976. WOLFSSL_MSG("Write dup error from other side");
  1977. ssl->error = dupErr;
  1978. return WOLFSSL_FATAL_ERROR;
  1979. }
  1980. }
  1981. #endif
  1982. #ifdef HAVE_ERRNO_H
  1983. errno = 0;
  1984. #endif
  1985. #ifdef OPENSSL_EXTRA
  1986. if (ssl->CBIS != NULL) {
  1987. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  1988. ssl->cbmode = SSL_CB_WRITE;
  1989. }
  1990. #endif
  1991. ret = SendData(ssl, data, sz);
  1992. WOLFSSL_LEAVE("SSL_write()", ret);
  1993. if (ret < 0)
  1994. return WOLFSSL_FATAL_ERROR;
  1995. else
  1996. return ret;
  1997. }
  1998. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1999. {
  2000. int ret;
  2001. WOLFSSL_ENTER("wolfSSL_read_internal()");
  2002. if (ssl == NULL || data == NULL || sz < 0)
  2003. return BAD_FUNC_ARG;
  2004. #ifdef WOLFSSL_QUIC
  2005. if (WOLFSSL_IS_QUIC(ssl)) {
  2006. WOLFSSL_MSG("SSL_read() on QUIC not allowed");
  2007. return BAD_FUNC_ARG;
  2008. }
  2009. #endif
  2010. #if defined(WOLFSSL_ERROR_CODE_OPENSSL) && defined(OPENSSL_EXTRA)
  2011. /* This additional logic is meant to simulate following openSSL behavior:
  2012. * After bidirectional SSL_shutdown complete, SSL_read returns 0 and
  2013. * SSL_get_error_code returns SSL_ERROR_ZERO_RETURN.
  2014. * This behavior is used to know the disconnect of the underlying
  2015. * transport layer.
  2016. *
  2017. * In this logic, CBIORecv is called with a read size of 0 to check the
  2018. * transport layer status. It also returns WOLFSSL_FAILURE so that
  2019. * SSL_read does not return a positive number on failure.
  2020. */
  2021. /* make sure bidirectional TLS shutdown completes */
  2022. if (ssl->error == WOLFSSL_ERROR_SYSCALL) {
  2023. /* ask the underlying transport the connection is closed */
  2024. if (ssl->CBIORecv(ssl, (char*)data, 0, ssl->IOCB_ReadCtx) ==
  2025. WOLFSSL_CBIO_ERR_CONN_CLOSE) {
  2026. ssl->options.isClosed = 1;
  2027. ssl->error = WOLFSSL_ERROR_ZERO_RETURN;
  2028. }
  2029. return WOLFSSL_FAILURE;
  2030. }
  2031. #endif
  2032. #ifdef HAVE_WRITE_DUP
  2033. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  2034. WOLFSSL_MSG("Write dup side cannot read");
  2035. return WRITE_DUP_READ_E;
  2036. }
  2037. #endif
  2038. #ifdef HAVE_ERRNO_H
  2039. errno = 0;
  2040. #endif
  2041. #ifdef WOLFSSL_DTLS
  2042. if (ssl->options.dtls) {
  2043. ssl->dtls_expected_rx = max(sz + DTLS_MTU_ADDITIONAL_READ_BUFFER,
  2044. MAX_MTU);
  2045. #ifdef WOLFSSL_SCTP
  2046. if (ssl->options.dtlsSctp)
  2047. #endif
  2048. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  2049. /* Add some bytes so that we can operate with slight difference
  2050. * in set MTU size on each peer */
  2051. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx,
  2052. ssl->dtlsMtuSz + (word32)DTLS_MTU_ADDITIONAL_READ_BUFFER);
  2053. #endif
  2054. }
  2055. #endif
  2056. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  2057. #ifdef HAVE_WRITE_DUP
  2058. if (ssl->dupWrite) {
  2059. if (ssl->error != 0 && ssl->error != WANT_READ
  2060. #ifdef WOLFSSL_ASYNC_CRYPT
  2061. && ssl->error != WC_PENDING_E
  2062. #endif
  2063. ) {
  2064. int notifyErr;
  2065. WOLFSSL_MSG("Notifying write side of fatal read error");
  2066. notifyErr = NotifyWriteSide(ssl, ssl->error);
  2067. if (notifyErr < 0) {
  2068. ret = ssl->error = notifyErr;
  2069. }
  2070. }
  2071. }
  2072. #endif
  2073. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  2074. if (ret < 0)
  2075. return WOLFSSL_FATAL_ERROR;
  2076. else
  2077. return ret;
  2078. }
  2079. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  2080. {
  2081. WOLFSSL_ENTER("wolfSSL_peek()");
  2082. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  2083. }
  2084. WOLFSSL_ABI
  2085. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  2086. {
  2087. WOLFSSL_ENTER("wolfSSL_read()");
  2088. #ifdef OPENSSL_EXTRA
  2089. if (ssl == NULL) {
  2090. return BAD_FUNC_ARG;
  2091. }
  2092. if (ssl->CBIS != NULL) {
  2093. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  2094. ssl->cbmode = SSL_CB_READ;
  2095. }
  2096. #endif
  2097. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  2098. }
  2099. #ifdef WOLFSSL_MULTICAST
  2100. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  2101. {
  2102. int ret = 0;
  2103. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  2104. if (ssl == NULL)
  2105. return BAD_FUNC_ARG;
  2106. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  2107. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  2108. *id = ssl->keys.curPeerId;
  2109. return ret;
  2110. }
  2111. #endif /* WOLFSSL_MULTICAST */
  2112. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  2113. WOLFSSL_ABI
  2114. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  2115. {
  2116. if (ssl == NULL)
  2117. return BAD_FUNC_ARG;
  2118. ssl->devId = devId;
  2119. return WOLFSSL_SUCCESS;
  2120. }
  2121. WOLFSSL_ABI
  2122. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  2123. {
  2124. if (ctx == NULL)
  2125. return BAD_FUNC_ARG;
  2126. ctx->devId = devId;
  2127. return WOLFSSL_SUCCESS;
  2128. }
  2129. /* helpers to get device id and heap */
  2130. WOLFSSL_ABI
  2131. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2132. {
  2133. int devId = INVALID_DEVID;
  2134. if (ssl != NULL)
  2135. devId = ssl->devId;
  2136. if (ctx != NULL && devId == INVALID_DEVID)
  2137. devId = ctx->devId;
  2138. return devId;
  2139. }
  2140. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2141. {
  2142. void* heap = NULL;
  2143. if (ctx != NULL)
  2144. heap = ctx->heap;
  2145. else if (ssl != NULL)
  2146. heap = ssl->heap;
  2147. return heap;
  2148. }
  2149. #ifdef HAVE_SNI
  2150. WOLFSSL_ABI
  2151. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  2152. {
  2153. if (ssl == NULL)
  2154. return BAD_FUNC_ARG;
  2155. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  2156. }
  2157. WOLFSSL_ABI
  2158. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  2159. word16 size)
  2160. {
  2161. if (ctx == NULL)
  2162. return BAD_FUNC_ARG;
  2163. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  2164. }
  2165. #ifndef NO_WOLFSSL_SERVER
  2166. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  2167. {
  2168. if (ssl && ssl->extensions)
  2169. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  2170. }
  2171. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  2172. {
  2173. if (ctx && ctx->extensions)
  2174. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  2175. }
  2176. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  2177. {
  2178. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  2179. }
  2180. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  2181. {
  2182. if (data)
  2183. *data = NULL;
  2184. if (ssl && ssl->extensions)
  2185. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  2186. return 0;
  2187. }
  2188. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  2189. byte type, byte* sni, word32* inOutSz)
  2190. {
  2191. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  2192. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  2193. return BAD_FUNC_ARG;
  2194. }
  2195. #endif /* NO_WOLFSSL_SERVER */
  2196. #endif /* HAVE_SNI */
  2197. #ifdef HAVE_TRUSTED_CA
  2198. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  2199. const byte* certId, word32 certIdSz)
  2200. {
  2201. if (ssl == NULL)
  2202. return BAD_FUNC_ARG;
  2203. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  2204. if (certId != NULL || certIdSz != 0)
  2205. return BAD_FUNC_ARG;
  2206. }
  2207. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  2208. if (certId == NULL || certIdSz == 0)
  2209. return BAD_FUNC_ARG;
  2210. }
  2211. #ifndef NO_SHA
  2212. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  2213. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  2214. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  2215. return BAD_FUNC_ARG;
  2216. }
  2217. #endif
  2218. else
  2219. return BAD_FUNC_ARG;
  2220. return TLSX_UseTrustedCA(&ssl->extensions,
  2221. type, certId, certIdSz, ssl->heap);
  2222. }
  2223. #endif /* HAVE_TRUSTED_CA */
  2224. #ifdef HAVE_MAX_FRAGMENT
  2225. #ifndef NO_WOLFSSL_CLIENT
  2226. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  2227. {
  2228. if (ssl == NULL)
  2229. return BAD_FUNC_ARG;
  2230. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  2231. /* The following is a non-standard way to reconfigure the max packet size
  2232. post-handshake for wolfSSL_write/wolfSSL_read */
  2233. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  2234. switch (mfl) {
  2235. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2236. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2237. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2238. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2239. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2240. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2241. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  2242. }
  2243. return WOLFSSL_SUCCESS;
  2244. }
  2245. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  2246. /* This call sets the max fragment TLS extension, which gets sent to server.
  2247. The server_hello response is what sets the `ssl->max_fragment` in
  2248. TLSX_MFL_Parse */
  2249. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  2250. }
  2251. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  2252. {
  2253. if (ctx == NULL)
  2254. return BAD_FUNC_ARG;
  2255. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  2256. }
  2257. #endif /* NO_WOLFSSL_CLIENT */
  2258. #endif /* HAVE_MAX_FRAGMENT */
  2259. #ifdef HAVE_TRUNCATED_HMAC
  2260. #ifndef NO_WOLFSSL_CLIENT
  2261. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  2262. {
  2263. if (ssl == NULL)
  2264. return BAD_FUNC_ARG;
  2265. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  2266. }
  2267. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  2268. {
  2269. if (ctx == NULL)
  2270. return BAD_FUNC_ARG;
  2271. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  2272. }
  2273. #endif /* NO_WOLFSSL_CLIENT */
  2274. #endif /* HAVE_TRUNCATED_HMAC */
  2275. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2276. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  2277. {
  2278. WOLFSSL_ENTER("wolfSSL_UseOCSPStapling");
  2279. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2280. return BAD_FUNC_ARG;
  2281. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  2282. options, NULL, ssl->heap, ssl->devId);
  2283. }
  2284. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  2285. byte options)
  2286. {
  2287. WOLFSSL_ENTER("wolfSSL_CTX_UseOCSPStapling");
  2288. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2289. return BAD_FUNC_ARG;
  2290. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  2291. options, NULL, ctx->heap, ctx->devId);
  2292. }
  2293. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  2294. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2295. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  2296. {
  2297. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2298. return BAD_FUNC_ARG;
  2299. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  2300. options, ssl->heap, ssl->devId);
  2301. }
  2302. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  2303. byte options)
  2304. {
  2305. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2306. return BAD_FUNC_ARG;
  2307. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  2308. options, ctx->heap, ctx->devId);
  2309. }
  2310. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2311. /* Elliptic Curves */
  2312. #if defined(HAVE_SUPPORTED_CURVES)
  2313. static int isValidCurveGroup(word16 name)
  2314. {
  2315. switch (name) {
  2316. case WOLFSSL_ECC_SECP160K1:
  2317. case WOLFSSL_ECC_SECP160R1:
  2318. case WOLFSSL_ECC_SECP160R2:
  2319. case WOLFSSL_ECC_SECP192K1:
  2320. case WOLFSSL_ECC_SECP192R1:
  2321. case WOLFSSL_ECC_SECP224K1:
  2322. case WOLFSSL_ECC_SECP224R1:
  2323. case WOLFSSL_ECC_SECP256K1:
  2324. case WOLFSSL_ECC_SECP256R1:
  2325. case WOLFSSL_ECC_SECP384R1:
  2326. case WOLFSSL_ECC_SECP521R1:
  2327. case WOLFSSL_ECC_BRAINPOOLP256R1:
  2328. case WOLFSSL_ECC_BRAINPOOLP384R1:
  2329. case WOLFSSL_ECC_BRAINPOOLP512R1:
  2330. case WOLFSSL_ECC_X25519:
  2331. case WOLFSSL_ECC_X448:
  2332. case WOLFSSL_FFDHE_2048:
  2333. case WOLFSSL_FFDHE_3072:
  2334. case WOLFSSL_FFDHE_4096:
  2335. case WOLFSSL_FFDHE_6144:
  2336. case WOLFSSL_FFDHE_8192:
  2337. #ifdef HAVE_PQC
  2338. case WOLFSSL_KYBER_LEVEL1:
  2339. case WOLFSSL_KYBER_LEVEL3:
  2340. case WOLFSSL_KYBER_LEVEL5:
  2341. case WOLFSSL_NTRU_HPS_LEVEL1:
  2342. case WOLFSSL_NTRU_HPS_LEVEL3:
  2343. case WOLFSSL_NTRU_HPS_LEVEL5:
  2344. case WOLFSSL_NTRU_HRSS_LEVEL3:
  2345. case WOLFSSL_SABER_LEVEL1:
  2346. case WOLFSSL_SABER_LEVEL3:
  2347. case WOLFSSL_SABER_LEVEL5:
  2348. case WOLFSSL_KYBER_90S_LEVEL1:
  2349. case WOLFSSL_KYBER_90S_LEVEL3:
  2350. case WOLFSSL_KYBER_90S_LEVEL5:
  2351. case WOLFSSL_P256_NTRU_HPS_LEVEL1:
  2352. case WOLFSSL_P384_NTRU_HPS_LEVEL3:
  2353. case WOLFSSL_P521_NTRU_HPS_LEVEL5:
  2354. case WOLFSSL_P384_NTRU_HRSS_LEVEL3:
  2355. case WOLFSSL_P256_SABER_LEVEL1:
  2356. case WOLFSSL_P384_SABER_LEVEL3:
  2357. case WOLFSSL_P521_SABER_LEVEL5:
  2358. case WOLFSSL_P256_KYBER_LEVEL1:
  2359. case WOLFSSL_P384_KYBER_LEVEL3:
  2360. case WOLFSSL_P521_KYBER_LEVEL5:
  2361. case WOLFSSL_P256_KYBER_90S_LEVEL1:
  2362. case WOLFSSL_P384_KYBER_90S_LEVEL3:
  2363. case WOLFSSL_P521_KYBER_90S_LEVEL5:
  2364. #endif
  2365. return 1;
  2366. default:
  2367. return 0;
  2368. }
  2369. }
  2370. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  2371. {
  2372. if (ssl == NULL || !isValidCurveGroup(name))
  2373. return BAD_FUNC_ARG;
  2374. ssl->options.userCurves = 1;
  2375. #if defined(NO_TLS)
  2376. return WOLFSSL_FAILURE;
  2377. #else
  2378. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  2379. #endif /* NO_TLS */
  2380. }
  2381. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  2382. {
  2383. if (ctx == NULL || !isValidCurveGroup(name))
  2384. return BAD_FUNC_ARG;
  2385. ctx->userCurves = 1;
  2386. #if defined(NO_TLS)
  2387. return WOLFSSL_FAILURE;
  2388. #else
  2389. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  2390. #endif /* NO_TLS */
  2391. }
  2392. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  2393. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  2394. int count)
  2395. {
  2396. int i;
  2397. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2398. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2399. if (count == 0) {
  2400. WOLFSSL_MSG("Group count is zero");
  2401. return WOLFSSL_FAILURE;
  2402. }
  2403. for (i = 0; i < count; i++) {
  2404. if (isValidCurveGroup((word16)groups[i])) {
  2405. _groups[i] = groups[i];
  2406. }
  2407. #ifdef HAVE_ECC
  2408. else {
  2409. /* groups may be populated with curve NIDs */
  2410. int oid = nid2oid(groups[i], oidCurveType);
  2411. int name = (int)GetCurveByOID(oid);
  2412. if (name == 0) {
  2413. WOLFSSL_MSG("Invalid group name");
  2414. return WOLFSSL_FAILURE;
  2415. }
  2416. _groups[i] = name;
  2417. }
  2418. #else
  2419. else {
  2420. WOLFSSL_MSG("Invalid group name");
  2421. return WOLFSSL_FAILURE;
  2422. }
  2423. #endif
  2424. }
  2425. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  2426. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2427. }
  2428. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  2429. {
  2430. int i;
  2431. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2432. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2433. if (count == 0) {
  2434. WOLFSSL_MSG("Group count is zero");
  2435. return WOLFSSL_FAILURE;
  2436. }
  2437. for (i = 0; i < count; i++) {
  2438. if (isValidCurveGroup((word16)groups[i])) {
  2439. _groups[i] = groups[i];
  2440. }
  2441. #ifdef HAVE_ECC
  2442. else {
  2443. /* groups may be populated with curve NIDs */
  2444. int oid = nid2oid(groups[i], oidCurveType);
  2445. int name = (int)GetCurveByOID(oid);
  2446. if (name == 0) {
  2447. WOLFSSL_MSG("Invalid group name");
  2448. return WOLFSSL_FAILURE;
  2449. }
  2450. _groups[i] = name;
  2451. }
  2452. #else
  2453. else {
  2454. WOLFSSL_MSG("Invalid group name");
  2455. return WOLFSSL_FAILURE;
  2456. }
  2457. #endif
  2458. }
  2459. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  2460. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2461. }
  2462. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  2463. #endif /* HAVE_SUPPORTED_CURVES */
  2464. /* Application-Layer Protocol Negotiation */
  2465. #ifdef HAVE_ALPN
  2466. WOLFSSL_ABI
  2467. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2468. word32 protocol_name_listSz, byte options)
  2469. {
  2470. char *list, *ptr, **token;
  2471. word16 len;
  2472. int idx = 0;
  2473. int ret = WOLFSSL_FAILURE;
  2474. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2475. if (ssl == NULL || protocol_name_list == NULL)
  2476. return BAD_FUNC_ARG;
  2477. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2478. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2479. WOLFSSL_MAX_ALPN_NUMBER)) {
  2480. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2481. return BAD_FUNC_ARG;
  2482. }
  2483. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2484. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2485. WOLFSSL_MSG("Invalid arguments, options not supported");
  2486. return BAD_FUNC_ARG;
  2487. }
  2488. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2489. DYNAMIC_TYPE_ALPN);
  2490. if (list == NULL) {
  2491. WOLFSSL_MSG("Memory failure");
  2492. return MEMORY_ERROR;
  2493. }
  2494. token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN);
  2495. if (token == NULL) {
  2496. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2497. WOLFSSL_MSG("Memory failure");
  2498. return MEMORY_ERROR;
  2499. }
  2500. XMEMSET(token, 0, sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1));
  2501. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2502. list[protocol_name_listSz] = '\0';
  2503. /* read all protocol name from the list */
  2504. token[idx] = XSTRTOK(list, ",", &ptr);
  2505. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2506. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2507. /* add protocol name list in the TLS extension in reverse order */
  2508. while ((idx--) > 0) {
  2509. len = (word16)XSTRLEN(token[idx]);
  2510. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2511. ssl->heap);
  2512. if (ret != WOLFSSL_SUCCESS) {
  2513. WOLFSSL_MSG("TLSX_UseALPN failure");
  2514. break;
  2515. }
  2516. }
  2517. XFREE(token, ssl->heap, DYNAMIC_TYPE_ALPN);
  2518. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2519. return ret;
  2520. }
  2521. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2522. {
  2523. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2524. (void **)protocol_name, size);
  2525. }
  2526. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2527. {
  2528. if (list == NULL || listSz == NULL)
  2529. return BAD_FUNC_ARG;
  2530. if (ssl->alpn_client_list == NULL)
  2531. return BUFFER_ERROR;
  2532. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2533. if (*listSz == 0)
  2534. return BUFFER_ERROR;
  2535. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2536. if (*list == NULL)
  2537. return MEMORY_ERROR;
  2538. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2539. (*list)[*listSz] = 0;
  2540. return WOLFSSL_SUCCESS;
  2541. }
  2542. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2543. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2544. {
  2545. if (ssl == NULL) {
  2546. return BAD_FUNC_ARG;
  2547. }
  2548. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2549. *list = NULL;
  2550. return WOLFSSL_SUCCESS;
  2551. }
  2552. #endif /* HAVE_ALPN */
  2553. /* Secure Renegotiation */
  2554. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2555. /* user is forcing ability to use secure renegotiation, we discourage it */
  2556. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2557. {
  2558. int ret = BAD_FUNC_ARG;
  2559. #if defined(NO_TLS)
  2560. (void)ssl;
  2561. #else
  2562. if (ssl)
  2563. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2564. if (ret == WOLFSSL_SUCCESS) {
  2565. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2566. if (extension)
  2567. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2568. }
  2569. #endif /* !NO_TLS */
  2570. return ret;
  2571. }
  2572. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2573. {
  2574. if (ctx == NULL)
  2575. return BAD_FUNC_ARG;
  2576. ctx->useSecureReneg = 1;
  2577. return WOLFSSL_SUCCESS;
  2578. }
  2579. /* do a secure renegotiation handshake, user forced, we discourage */
  2580. static int _Rehandshake(WOLFSSL* ssl)
  2581. {
  2582. int ret;
  2583. if (ssl == NULL)
  2584. return BAD_FUNC_ARG;
  2585. if (ssl->secure_renegotiation == NULL) {
  2586. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2587. return SECURE_RENEGOTIATION_E;
  2588. }
  2589. if (ssl->secure_renegotiation->enabled == 0) {
  2590. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2591. return SECURE_RENEGOTIATION_E;
  2592. }
  2593. /* If the client started the renegotiation, the server will already
  2594. * have processed the client's hello. */
  2595. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2596. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2597. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2598. if (!ssl->options.handShakeDone) {
  2599. WOLFSSL_MSG("Can't renegotiate until initial "
  2600. "handshake complete");
  2601. return SECURE_RENEGOTIATION_E;
  2602. }
  2603. else {
  2604. WOLFSSL_MSG("Renegotiation already started. "
  2605. "Moving it forward.");
  2606. ret = wolfSSL_negotiate(ssl);
  2607. if (ret == WOLFSSL_SUCCESS)
  2608. ssl->secure_rene_count++;
  2609. return ret;
  2610. }
  2611. }
  2612. #ifndef NO_FORCE_SCR_SAME_SUITE
  2613. /* force same suite */
  2614. if (ssl->suites) {
  2615. ssl->suites->suiteSz = SUITE_LEN;
  2616. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2617. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2618. }
  2619. #endif
  2620. /* reset handshake states */
  2621. ssl->options.sendVerify = 0;
  2622. ssl->options.serverState = NULL_STATE;
  2623. ssl->options.clientState = NULL_STATE;
  2624. ssl->options.connectState = CONNECT_BEGIN;
  2625. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2626. ssl->options.handShakeState = NULL_STATE;
  2627. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2628. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2629. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2630. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SECURE_RENEGOTIATION)
  2631. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2632. ret = SendHelloRequest(ssl);
  2633. if (ret != 0) {
  2634. ssl->error = ret;
  2635. return WOLFSSL_FATAL_ERROR;
  2636. }
  2637. }
  2638. #endif /* !NO_WOLFSSL_SERVER && HAVE_SECURE_RENEGOTIATION */
  2639. ret = InitHandshakeHashes(ssl);
  2640. if (ret != 0) {
  2641. ssl->error = ret;
  2642. return WOLFSSL_FATAL_ERROR;
  2643. }
  2644. }
  2645. ret = wolfSSL_negotiate(ssl);
  2646. if (ret == WOLFSSL_SUCCESS)
  2647. ssl->secure_rene_count++;
  2648. return ret;
  2649. }
  2650. /* do a secure renegotiation handshake, user forced, we discourage */
  2651. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2652. {
  2653. int ret;
  2654. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2655. if (ssl == NULL)
  2656. return WOLFSSL_FAILURE;
  2657. #ifdef HAVE_SESSION_TICKET
  2658. ret = WOLFSSL_SUCCESS;
  2659. #endif
  2660. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2661. /* Reset option to send certificate verify. */
  2662. ssl->options.sendVerify = 0;
  2663. }
  2664. else {
  2665. /* Reset resuming flag to do full secure handshake. */
  2666. ssl->options.resuming = 0;
  2667. #ifdef HAVE_SESSION_TICKET
  2668. /* Clearing the ticket. */
  2669. ret = wolfSSL_UseSessionTicket(ssl);
  2670. #endif
  2671. }
  2672. /* CLIENT/SERVER: Reset peer authentication for full secure handshake. */
  2673. ssl->options.peerAuthGood = 0;
  2674. #ifdef HAVE_SESSION_TICKET
  2675. if (ret == WOLFSSL_SUCCESS)
  2676. #endif
  2677. ret = _Rehandshake(ssl);
  2678. return ret;
  2679. }
  2680. #ifndef NO_WOLFSSL_CLIENT
  2681. /* do a secure resumption handshake, user forced, we discourage */
  2682. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2683. {
  2684. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2685. if (ssl == NULL)
  2686. return BAD_FUNC_ARG;
  2687. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2688. ssl->error = SIDE_ERROR;
  2689. return WOLFSSL_FATAL_ERROR;
  2690. }
  2691. return _Rehandshake(ssl);
  2692. }
  2693. #endif /* NO_WOLFSSL_CLIENT */
  2694. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2695. {
  2696. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2697. if (!ssl || !ssl->secure_renegotiation)
  2698. return WOLFSSL_FAILURE;
  2699. return ssl->secure_renegotiation->enabled;
  2700. }
  2701. #endif /* HAVE_SECURE_RENEGOTIATION_INFO */
  2702. #if defined(HAVE_SESSION_TICKET)
  2703. /* Session Ticket */
  2704. #if !defined(NO_WOLFSSL_SERVER)
  2705. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  2706. {
  2707. if (ctx == NULL)
  2708. return BAD_FUNC_ARG;
  2709. ctx->noTicketTls12 = 1;
  2710. return WOLFSSL_SUCCESS;
  2711. }
  2712. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  2713. {
  2714. if (ssl == NULL)
  2715. return BAD_FUNC_ARG;
  2716. ssl->options.noTicketTls12 = 1;
  2717. return WOLFSSL_SUCCESS;
  2718. }
  2719. /* WOLFSSL_SUCCESS on ok */
  2720. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2721. {
  2722. if (ctx == NULL)
  2723. return BAD_FUNC_ARG;
  2724. ctx->ticketEncCb = cb;
  2725. return WOLFSSL_SUCCESS;
  2726. }
  2727. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2728. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2729. {
  2730. if (ctx == NULL)
  2731. return BAD_FUNC_ARG;
  2732. ctx->ticketHint = hint;
  2733. return WOLFSSL_SUCCESS;
  2734. }
  2735. /* set user context, WOLFSSL_SUCCESS on ok */
  2736. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2737. {
  2738. if (ctx == NULL)
  2739. return BAD_FUNC_ARG;
  2740. ctx->ticketEncCtx = userCtx;
  2741. return WOLFSSL_SUCCESS;
  2742. }
  2743. /* get user context - returns userCtx on success, NULL on failure */
  2744. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  2745. {
  2746. if (ctx == NULL)
  2747. return NULL;
  2748. return ctx->ticketEncCtx;
  2749. }
  2750. #ifdef WOLFSSL_TLS13
  2751. /* set the maximum number of tickets to send
  2752. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  2753. */
  2754. int wolfSSL_CTX_set_num_tickets(WOLFSSL_CTX* ctx, size_t mxTickets)
  2755. {
  2756. if (ctx == NULL)
  2757. return WOLFSSL_FAILURE;
  2758. ctx->maxTicketTls13 = (unsigned int)mxTickets;
  2759. return WOLFSSL_SUCCESS;
  2760. }
  2761. /* get the maximum number of tickets to send
  2762. * return number of tickets set to be sent
  2763. */
  2764. size_t wolfSSL_CTX_get_num_tickets(WOLFSSL_CTX* ctx)
  2765. {
  2766. if (ctx == NULL)
  2767. return 0;
  2768. return (size_t)ctx->maxTicketTls13;
  2769. }
  2770. #endif /* WOLFSSL_TLS13 */
  2771. #endif /* !NO_WOLFSSL_SERVER */
  2772. #if !defined(NO_WOLFSSL_CLIENT)
  2773. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2774. {
  2775. if (ssl == NULL)
  2776. return BAD_FUNC_ARG;
  2777. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2778. }
  2779. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2780. {
  2781. if (ctx == NULL)
  2782. return BAD_FUNC_ARG;
  2783. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2784. }
  2785. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2786. byte* buf, word32* bufSz)
  2787. {
  2788. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2789. return BAD_FUNC_ARG;
  2790. if (ssl->session->ticketLen <= *bufSz) {
  2791. XMEMCPY(buf, ssl->session->ticket, ssl->session->ticketLen);
  2792. *bufSz = ssl->session->ticketLen;
  2793. }
  2794. else
  2795. *bufSz = 0;
  2796. return WOLFSSL_SUCCESS;
  2797. }
  2798. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2799. word32 bufSz)
  2800. {
  2801. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2802. return BAD_FUNC_ARG;
  2803. if (bufSz > 0) {
  2804. /* Ticket will fit into static ticket */
  2805. if (bufSz <= SESSION_TICKET_LEN) {
  2806. if (ssl->session->ticketLenAlloc > 0) {
  2807. XFREE(ssl->session->ticket, ssl->session->heap,
  2808. DYNAMIC_TYPE_SESSION_TICK);
  2809. ssl->session->ticketLenAlloc = 0;
  2810. ssl->session->ticket = ssl->session->_staticTicket;
  2811. }
  2812. }
  2813. else { /* Ticket requires dynamic ticket storage */
  2814. if (ssl->session->ticketLen < bufSz) { /* is dyn buffer big enough */
  2815. if (ssl->session->ticketLenAlloc > 0) {
  2816. XFREE(ssl->session->ticket, ssl->session->heap,
  2817. DYNAMIC_TYPE_SESSION_TICK);
  2818. }
  2819. ssl->session->ticket = (byte*)XMALLOC(bufSz, ssl->session->heap,
  2820. DYNAMIC_TYPE_SESSION_TICK);
  2821. if(ssl->session->ticket == NULL) {
  2822. ssl->session->ticket = ssl->session->_staticTicket;
  2823. ssl->session->ticketLenAlloc = 0;
  2824. return MEMORY_ERROR;
  2825. }
  2826. ssl->session->ticketLenAlloc = (word16)bufSz;
  2827. }
  2828. }
  2829. XMEMCPY(ssl->session->ticket, buf, bufSz);
  2830. }
  2831. ssl->session->ticketLen = (word16)bufSz;
  2832. return WOLFSSL_SUCCESS;
  2833. }
  2834. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2835. CallbackSessionTicket cb, void* ctx)
  2836. {
  2837. if (ssl == NULL)
  2838. return BAD_FUNC_ARG;
  2839. ssl->session_ticket_cb = cb;
  2840. ssl->session_ticket_ctx = ctx;
  2841. return WOLFSSL_SUCCESS;
  2842. }
  2843. #endif /* !NO_WOLFSSL_CLIENT */
  2844. #endif /* HAVE_SESSION_TICKET */
  2845. #ifdef HAVE_EXTENDED_MASTER
  2846. #ifndef NO_WOLFSSL_CLIENT
  2847. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2848. {
  2849. if (ctx == NULL)
  2850. return BAD_FUNC_ARG;
  2851. ctx->haveEMS = 0;
  2852. return WOLFSSL_SUCCESS;
  2853. }
  2854. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2855. {
  2856. if (ssl == NULL)
  2857. return BAD_FUNC_ARG;
  2858. ssl->options.haveEMS = 0;
  2859. return WOLFSSL_SUCCESS;
  2860. }
  2861. #endif
  2862. #endif
  2863. #ifndef WOLFSSL_LEANPSK
  2864. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2865. {
  2866. int ret;
  2867. int oldFlags;
  2868. WOLFSSL_ENTER("wolfSSL_send()");
  2869. if (ssl == NULL || data == NULL || sz < 0)
  2870. return BAD_FUNC_ARG;
  2871. oldFlags = ssl->wflags;
  2872. ssl->wflags = flags;
  2873. ret = wolfSSL_write(ssl, data, sz);
  2874. ssl->wflags = oldFlags;
  2875. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2876. return ret;
  2877. }
  2878. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2879. {
  2880. int ret;
  2881. int oldFlags;
  2882. WOLFSSL_ENTER("wolfSSL_recv()");
  2883. if (ssl == NULL || data == NULL || sz < 0)
  2884. return BAD_FUNC_ARG;
  2885. oldFlags = ssl->rflags;
  2886. ssl->rflags = flags;
  2887. ret = wolfSSL_read(ssl, data, sz);
  2888. ssl->rflags = oldFlags;
  2889. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2890. return ret;
  2891. }
  2892. #endif
  2893. /* WOLFSSL_SUCCESS on ok */
  2894. WOLFSSL_ABI
  2895. int wolfSSL_shutdown(WOLFSSL* ssl)
  2896. {
  2897. int ret = WOLFSSL_FATAL_ERROR;
  2898. WOLFSSL_ENTER("SSL_shutdown()");
  2899. if (ssl == NULL)
  2900. return WOLFSSL_FATAL_ERROR;
  2901. if (ssl->options.quietShutdown) {
  2902. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2903. ret = WOLFSSL_SUCCESS;
  2904. }
  2905. else {
  2906. /* try to send close notify, not an error if can't */
  2907. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2908. !ssl->options.sentNotify) {
  2909. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2910. if (ssl->error < 0) {
  2911. WOLFSSL_ERROR(ssl->error);
  2912. return WOLFSSL_FATAL_ERROR;
  2913. }
  2914. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2915. if (ssl->options.closeNotify)
  2916. ret = WOLFSSL_SUCCESS;
  2917. else {
  2918. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2919. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2920. return ret;
  2921. }
  2922. }
  2923. #ifdef WOLFSSL_SHUTDOWNONCE
  2924. if (ssl->options.isClosed || ssl->options.connReset) {
  2925. /* Shutdown has already occurred.
  2926. * Caller is free to ignore this error. */
  2927. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2928. }
  2929. #endif
  2930. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2931. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2932. ret = ProcessReply(ssl);
  2933. if (ret == ZERO_RETURN) {
  2934. /* simulate OpenSSL behavior */
  2935. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2936. ret = WOLFSSL_SUCCESS;
  2937. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2938. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2939. } else {
  2940. WOLFSSL_ERROR(ssl->error);
  2941. ret = WOLFSSL_FATAL_ERROR;
  2942. }
  2943. }
  2944. }
  2945. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2946. /* reset WOLFSSL structure state for possible re-use */
  2947. if (ret == WOLFSSL_SUCCESS) {
  2948. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2949. WOLFSSL_MSG("could not clear WOLFSSL");
  2950. ret = WOLFSSL_FATAL_ERROR;
  2951. }
  2952. }
  2953. #endif
  2954. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2955. return ret;
  2956. }
  2957. /* get current error state value */
  2958. int wolfSSL_state(WOLFSSL* ssl)
  2959. {
  2960. if (ssl == NULL) {
  2961. return BAD_FUNC_ARG;
  2962. }
  2963. return ssl->error;
  2964. }
  2965. WOLFSSL_ABI
  2966. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2967. {
  2968. WOLFSSL_ENTER("SSL_get_error");
  2969. if (ret > 0)
  2970. return WOLFSSL_ERROR_NONE;
  2971. if (ssl == NULL)
  2972. return BAD_FUNC_ARG;
  2973. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2974. /* make sure converted types are handled in SetErrorString() too */
  2975. if (ssl->error == WANT_READ)
  2976. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2977. else if (ssl->error == WANT_WRITE)
  2978. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2979. else if (ssl->error == ZERO_RETURN)
  2980. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2981. return ssl->error;
  2982. }
  2983. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2984. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2985. {
  2986. if (ssl && h) {
  2987. *h = ssl->alert_history;
  2988. }
  2989. return WOLFSSL_SUCCESS;
  2990. }
  2991. #ifdef OPENSSL_EXTRA
  2992. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2993. int wolfSSL_want(WOLFSSL* ssl)
  2994. {
  2995. int rw_state = SSL_NOTHING;
  2996. if (ssl) {
  2997. if (ssl->error == WANT_READ)
  2998. rw_state = SSL_READING;
  2999. else if (ssl->error == WANT_WRITE)
  3000. rw_state = SSL_WRITING;
  3001. }
  3002. return rw_state;
  3003. }
  3004. #endif
  3005. /* return TRUE if current error is want read */
  3006. int wolfSSL_want_read(WOLFSSL* ssl)
  3007. {
  3008. WOLFSSL_ENTER("SSL_want_read");
  3009. if (ssl->error == WANT_READ)
  3010. return 1;
  3011. return 0;
  3012. }
  3013. /* return TRUE if current error is want write */
  3014. int wolfSSL_want_write(WOLFSSL* ssl)
  3015. {
  3016. WOLFSSL_ENTER("SSL_want_write");
  3017. if (ssl->error == WANT_WRITE)
  3018. return 1;
  3019. return 0;
  3020. }
  3021. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  3022. {
  3023. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  3024. WOLFSSL_ENTER("ERR_error_string");
  3025. if (data) {
  3026. SetErrorString((int)errNumber, data);
  3027. return data;
  3028. }
  3029. else {
  3030. SetErrorString((int)errNumber, tmp);
  3031. return tmp;
  3032. }
  3033. }
  3034. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  3035. {
  3036. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  3037. if (len >= WOLFSSL_MAX_ERROR_SZ)
  3038. wolfSSL_ERR_error_string(e, buf);
  3039. else {
  3040. char tmp[WOLFSSL_MAX_ERROR_SZ];
  3041. WOLFSSL_MSG("Error buffer too short, truncating");
  3042. if (len) {
  3043. wolfSSL_ERR_error_string(e, tmp);
  3044. XMEMCPY(buf, tmp, len-1);
  3045. buf[len-1] = '\0';
  3046. }
  3047. }
  3048. }
  3049. /* don't free temporary arrays at end of handshake */
  3050. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  3051. {
  3052. if (ssl)
  3053. ssl->options.saveArrays = 1;
  3054. }
  3055. /* user doesn't need temporary arrays anymore, Free */
  3056. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  3057. {
  3058. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  3059. ssl->options.saveArrays = 0;
  3060. FreeArrays(ssl, 1);
  3061. }
  3062. }
  3063. /* Set option to indicate that the resources are not to be freed after
  3064. * handshake.
  3065. *
  3066. * ssl The SSL/TLS object.
  3067. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3068. */
  3069. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  3070. {
  3071. if (ssl == NULL)
  3072. return BAD_FUNC_ARG;
  3073. ssl->options.keepResources = 1;
  3074. return 0;
  3075. }
  3076. /* Free the handshake resources after handshake.
  3077. *
  3078. * ssl The SSL/TLS object.
  3079. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3080. */
  3081. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  3082. {
  3083. if (ssl == NULL)
  3084. return BAD_FUNC_ARG;
  3085. FreeHandshakeResources(ssl);
  3086. return 0;
  3087. }
  3088. /* Use the client's order of preference when matching cipher suites.
  3089. *
  3090. * ssl The SSL/TLS context object.
  3091. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3092. */
  3093. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  3094. {
  3095. if (ctx == NULL)
  3096. return BAD_FUNC_ARG;
  3097. ctx->useClientOrder = 1;
  3098. return 0;
  3099. }
  3100. /* Use the client's order of preference when matching cipher suites.
  3101. *
  3102. * ssl The SSL/TLS object.
  3103. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3104. */
  3105. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  3106. {
  3107. if (ssl == NULL)
  3108. return BAD_FUNC_ARG;
  3109. ssl->options.useClientOrder = 1;
  3110. return 0;
  3111. }
  3112. #ifdef WOLFSSL_DTLS
  3113. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  3114. {
  3115. #ifndef WOLFSSL_AEAD_ONLY
  3116. Keys* keys = NULL;
  3117. (void)epochOrder;
  3118. if (ssl == NULL)
  3119. return NULL;
  3120. #ifdef HAVE_SECURE_RENEGOTIATION
  3121. switch (epochOrder) {
  3122. case PEER_ORDER:
  3123. if (IsDtlsMsgSCRKeys(ssl))
  3124. keys = &ssl->secure_renegotiation->tmp_keys;
  3125. else
  3126. keys = &ssl->keys;
  3127. break;
  3128. case PREV_ORDER:
  3129. keys = &ssl->keys;
  3130. break;
  3131. case CUR_ORDER:
  3132. if (DtlsUseSCRKeys(ssl))
  3133. keys = &ssl->secure_renegotiation->tmp_keys;
  3134. else
  3135. keys = &ssl->keys;
  3136. break;
  3137. default:
  3138. WOLFSSL_MSG("Unknown epoch order");
  3139. return NULL;
  3140. }
  3141. #else
  3142. keys = &ssl->keys;
  3143. #endif
  3144. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3145. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3146. return keys->client_write_MAC_secret;
  3147. else
  3148. return keys->server_write_MAC_secret;
  3149. #else
  3150. (void)ssl;
  3151. (void)verify;
  3152. (void)epochOrder;
  3153. return NULL;
  3154. #endif
  3155. }
  3156. #endif /* WOLFSSL_DTLS */
  3157. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  3158. {
  3159. #ifndef WOLFSSL_AEAD_ONLY
  3160. if (ssl == NULL)
  3161. return NULL;
  3162. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3163. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3164. return ssl->keys.client_write_MAC_secret;
  3165. else
  3166. return ssl->keys.server_write_MAC_secret;
  3167. #else
  3168. (void)ssl;
  3169. (void)verify;
  3170. return NULL;
  3171. #endif
  3172. }
  3173. #ifdef ATOMIC_USER
  3174. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  3175. {
  3176. if (ctx)
  3177. ctx->MacEncryptCb = cb;
  3178. }
  3179. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  3180. {
  3181. if (ssl)
  3182. ssl->MacEncryptCtx = ctx;
  3183. }
  3184. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  3185. {
  3186. if (ssl)
  3187. return ssl->MacEncryptCtx;
  3188. return NULL;
  3189. }
  3190. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  3191. {
  3192. if (ctx)
  3193. ctx->DecryptVerifyCb = cb;
  3194. }
  3195. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  3196. {
  3197. if (ssl)
  3198. ssl->DecryptVerifyCtx = ctx;
  3199. }
  3200. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  3201. {
  3202. if (ssl)
  3203. return ssl->DecryptVerifyCtx;
  3204. return NULL;
  3205. }
  3206. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3207. /**
  3208. * Set the callback, against the context, that encrypts then MACs.
  3209. *
  3210. * ctx SSL/TLS context.
  3211. * cb Callback function to use with Encrypt-Then-MAC.
  3212. */
  3213. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  3214. {
  3215. if (ctx)
  3216. ctx->EncryptMacCb = cb;
  3217. }
  3218. /**
  3219. * Set the context to use with callback that encrypts then MACs.
  3220. *
  3221. * ssl SSL/TLS object.
  3222. * ctx Callback function's context.
  3223. */
  3224. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  3225. {
  3226. if (ssl)
  3227. ssl->EncryptMacCtx = ctx;
  3228. }
  3229. /**
  3230. * Get the context being used with callback that encrypts then MACs.
  3231. *
  3232. * ssl SSL/TLS object.
  3233. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3234. */
  3235. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  3236. {
  3237. if (ssl)
  3238. return ssl->EncryptMacCtx;
  3239. return NULL;
  3240. }
  3241. /**
  3242. * Set the callback, against the context, that MAC verifies then decrypts.
  3243. *
  3244. * ctx SSL/TLS context.
  3245. * cb Callback function to use with Encrypt-Then-MAC.
  3246. */
  3247. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  3248. {
  3249. if (ctx)
  3250. ctx->VerifyDecryptCb = cb;
  3251. }
  3252. /**
  3253. * Set the context to use with callback that MAC verifies then decrypts.
  3254. *
  3255. * ssl SSL/TLS object.
  3256. * ctx Callback function's context.
  3257. */
  3258. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  3259. {
  3260. if (ssl)
  3261. ssl->VerifyDecryptCtx = ctx;
  3262. }
  3263. /**
  3264. * Get the context being used with callback that MAC verifies then decrypts.
  3265. *
  3266. * ssl SSL/TLS object.
  3267. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3268. */
  3269. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  3270. {
  3271. if (ssl)
  3272. return ssl->VerifyDecryptCtx;
  3273. return NULL;
  3274. }
  3275. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  3276. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  3277. {
  3278. if (ssl)
  3279. return ssl->keys.client_write_key;
  3280. return NULL;
  3281. }
  3282. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  3283. {
  3284. if (ssl)
  3285. return ssl->keys.client_write_IV;
  3286. return NULL;
  3287. }
  3288. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  3289. {
  3290. if (ssl)
  3291. return ssl->keys.server_write_key;
  3292. return NULL;
  3293. }
  3294. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  3295. {
  3296. if (ssl)
  3297. return ssl->keys.server_write_IV;
  3298. return NULL;
  3299. }
  3300. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  3301. {
  3302. if (ssl)
  3303. return ssl->specs.key_size;
  3304. return BAD_FUNC_ARG;
  3305. }
  3306. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  3307. {
  3308. if (ssl)
  3309. return ssl->specs.iv_size;
  3310. return BAD_FUNC_ARG;
  3311. }
  3312. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  3313. {
  3314. if (ssl)
  3315. return ssl->specs.bulk_cipher_algorithm;
  3316. return BAD_FUNC_ARG;
  3317. }
  3318. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  3319. {
  3320. if (ssl == NULL)
  3321. return BAD_FUNC_ARG;
  3322. #ifndef WOLFSSL_AEAD_ONLY
  3323. if (ssl->specs.cipher_type == block)
  3324. return WOLFSSL_BLOCK_TYPE;
  3325. if (ssl->specs.cipher_type == stream)
  3326. return WOLFSSL_STREAM_TYPE;
  3327. #endif
  3328. if (ssl->specs.cipher_type == aead)
  3329. return WOLFSSL_AEAD_TYPE;
  3330. return -1;
  3331. }
  3332. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  3333. {
  3334. if (ssl == NULL)
  3335. return BAD_FUNC_ARG;
  3336. return ssl->specs.block_size;
  3337. }
  3338. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  3339. {
  3340. if (ssl == NULL)
  3341. return BAD_FUNC_ARG;
  3342. return ssl->specs.aead_mac_size;
  3343. }
  3344. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  3345. {
  3346. if (ssl == NULL)
  3347. return BAD_FUNC_ARG;
  3348. if (ssl->options.tls1_1)
  3349. return 1;
  3350. return 0;
  3351. }
  3352. int wolfSSL_GetSide(WOLFSSL* ssl)
  3353. {
  3354. if (ssl)
  3355. return ssl->options.side;
  3356. return BAD_FUNC_ARG;
  3357. }
  3358. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  3359. {
  3360. /* AEAD ciphers don't have HMAC keys */
  3361. if (ssl)
  3362. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  3363. return BAD_FUNC_ARG;
  3364. }
  3365. #ifdef WORD64_AVAILABLE
  3366. int wolfSSL_GetPeerSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3367. {
  3368. if ((ssl == NULL) || (seq == NULL))
  3369. return BAD_FUNC_ARG;
  3370. *seq = ((word64)ssl->keys.peer_sequence_number_hi << 32) |
  3371. ssl->keys.peer_sequence_number_lo;
  3372. return !(*seq);
  3373. }
  3374. int wolfSSL_GetSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3375. {
  3376. if ((ssl == NULL) || (seq == NULL))
  3377. return BAD_FUNC_ARG;
  3378. *seq = ((word64)ssl->keys.sequence_number_hi << 32) |
  3379. ssl->keys.sequence_number_lo;
  3380. return !(*seq);
  3381. }
  3382. #endif
  3383. #endif /* ATOMIC_USER */
  3384. #ifndef NO_CERTS
  3385. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  3386. {
  3387. WOLFSSL_CERT_MANAGER* cm = NULL;
  3388. if (ctx)
  3389. cm = ctx->cm;
  3390. return cm;
  3391. }
  3392. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  3393. {
  3394. WOLFSSL_CERT_MANAGER* cm;
  3395. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  3396. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  3397. DYNAMIC_TYPE_CERT_MANAGER);
  3398. if (cm) {
  3399. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  3400. cm->refCount = 1;
  3401. if (wc_InitMutex(&cm->caLock) != 0) {
  3402. WOLFSSL_MSG("Bad mutex init");
  3403. wolfSSL_CertManagerFree(cm);
  3404. return NULL;
  3405. }
  3406. #ifndef SINGLE_THREADED
  3407. if (wc_InitMutex(&cm->refMutex) != 0) {
  3408. WOLFSSL_MSG("Bad mutex init");
  3409. wolfSSL_CertManagerFree(cm);
  3410. return NULL;
  3411. }
  3412. #endif
  3413. #ifdef WOLFSSL_TRUST_PEER_CERT
  3414. if (wc_InitMutex(&cm->tpLock) != 0) {
  3415. WOLFSSL_MSG("Bad mutex init");
  3416. wolfSSL_CertManagerFree(cm);
  3417. return NULL;
  3418. }
  3419. #endif
  3420. /* set default minimum key size allowed */
  3421. #ifndef NO_RSA
  3422. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  3423. #endif
  3424. #ifdef HAVE_ECC
  3425. cm->minEccKeySz = MIN_ECCKEY_SZ;
  3426. #endif
  3427. #ifdef HAVE_PQC
  3428. #ifdef HAVE_FALCON
  3429. cm->minFalconKeySz = MIN_FALCONKEY_SZ;
  3430. #endif /* HAVE_FALCON */
  3431. #ifdef HAVE_DILITHIUM
  3432. cm->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  3433. #endif /* HAVE_DILITHIUM */
  3434. #endif /* HAVE_PQC */
  3435. cm->heap = heap;
  3436. }
  3437. return cm;
  3438. }
  3439. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  3440. {
  3441. return wolfSSL_CertManagerNew_ex(NULL);
  3442. }
  3443. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  3444. {
  3445. int doFree = 0;
  3446. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  3447. if (cm) {
  3448. #ifndef SINGLE_THREADED
  3449. if (wc_LockMutex(&cm->refMutex) != 0) {
  3450. WOLFSSL_MSG("Couldn't lock cm mutex");
  3451. }
  3452. #endif
  3453. cm->refCount--;
  3454. if (cm->refCount == 0)
  3455. doFree = 1;
  3456. #ifndef SINGLE_THREADED
  3457. wc_UnLockMutex(&cm->refMutex);
  3458. #endif
  3459. if (doFree) {
  3460. #ifdef HAVE_CRL
  3461. if (cm->crl)
  3462. FreeCRL(cm->crl, 1);
  3463. #endif
  3464. #ifdef HAVE_OCSP
  3465. if (cm->ocsp)
  3466. FreeOCSP(cm->ocsp, 1);
  3467. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  3468. #if !defined(NO_WOLFSSL_SERVER) && \
  3469. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  3470. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  3471. if (cm->ocsp_stapling)
  3472. FreeOCSP(cm->ocsp_stapling, 1);
  3473. #endif
  3474. #endif
  3475. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3476. wc_FreeMutex(&cm->caLock);
  3477. #ifdef WOLFSSL_TRUST_PEER_CERT
  3478. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3479. wc_FreeMutex(&cm->tpLock);
  3480. #endif
  3481. #ifndef SINGLE_THREADED
  3482. if (wc_FreeMutex(&cm->refMutex) != 0) {
  3483. WOLFSSL_MSG("Couldn't free refMutex mutex");
  3484. }
  3485. #endif
  3486. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  3487. }
  3488. }
  3489. }
  3490. int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
  3491. {
  3492. if (cm) {
  3493. #ifndef SINGLE_THREADED
  3494. if (wc_LockMutex(&cm->refMutex) != 0) {
  3495. WOLFSSL_MSG("Failed to lock cm mutex");
  3496. return WOLFSSL_FAILURE;
  3497. }
  3498. #endif
  3499. cm->refCount++;
  3500. #ifndef SINGLE_THREADED
  3501. wc_UnLockMutex(&cm->refMutex);
  3502. #endif
  3503. return WOLFSSL_SUCCESS;
  3504. }
  3505. return WOLFSSL_FAILURE;
  3506. }
  3507. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  3508. #if defined(WOLFSSL_SIGNER_DER_CERT)
  3509. /******************************************************************************
  3510. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  3511. * certificate manager (CM).
  3512. *
  3513. * RETURNS:
  3514. * returns stack of X509 certs on success, otherwise returns a NULL.
  3515. */
  3516. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  3517. {
  3518. WOLFSSL_STACK* sk = NULL;
  3519. int numCerts = 0;
  3520. DerBuffer** certBuffers = NULL;
  3521. const byte* derBuffer = NULL;
  3522. Signer* signers = NULL;
  3523. word32 row = 0;
  3524. WOLFSSL_X509* x509 = NULL;
  3525. int i = 0;
  3526. int ret = 0;
  3527. if (cm == NULL)
  3528. return NULL;
  3529. sk = wolfSSL_sk_X509_new();
  3530. if (sk == NULL)
  3531. goto error;
  3532. if (wc_LockMutex(&cm->caLock) != 0)
  3533. goto error;
  3534. /* Iterate once to get the number of certs, for memory allocation
  3535. purposes. */
  3536. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3537. signers = cm->caTable[row];
  3538. while (signers && signers->derCert && signers->derCert->buffer) {
  3539. ++numCerts;
  3540. signers = signers->next;
  3541. }
  3542. }
  3543. if (numCerts == 0) {
  3544. wc_UnLockMutex(&cm->caLock);
  3545. goto error;
  3546. }
  3547. certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap,
  3548. DYNAMIC_TYPE_TMP_BUFFER);
  3549. if (certBuffers == NULL) {
  3550. wc_UnLockMutex(&cm->caLock);
  3551. goto error;
  3552. }
  3553. XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts);
  3554. /* Copy the certs locally so that we can release the caLock. If the lock is
  3555. held when wolfSSL_d2i_X509 is called, GetCA will also try to get the
  3556. lock, leading to deadlock. */
  3557. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3558. signers = cm->caTable[row];
  3559. while (signers && signers->derCert && signers->derCert->buffer) {
  3560. ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE,
  3561. cm->heap);
  3562. if (ret < 0) {
  3563. wc_UnLockMutex(&cm->caLock);
  3564. goto error;
  3565. }
  3566. XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer,
  3567. signers->derCert->length);
  3568. certBuffers[i]->length = signers->derCert->length;
  3569. ++i;
  3570. signers = signers->next;
  3571. }
  3572. }
  3573. wc_UnLockMutex(&cm->caLock);
  3574. for (i = 0; i < numCerts; ++i) {
  3575. derBuffer = certBuffers[i]->buffer;
  3576. wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length);
  3577. if (x509 == NULL)
  3578. goto error;
  3579. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS)
  3580. goto error;
  3581. }
  3582. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3583. FreeDer(&certBuffers[i]);
  3584. }
  3585. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3586. return sk;
  3587. error:
  3588. if (sk)
  3589. wolfSSL_sk_X509_pop_free(sk, NULL);
  3590. if (certBuffers != NULL) {
  3591. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3592. FreeDer(&certBuffers[i]);
  3593. }
  3594. }
  3595. if (certBuffers)
  3596. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3597. return NULL;
  3598. }
  3599. #endif /* WOLFSSL_SIGNER_DER_CERT */
  3600. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3601. /* Unload the CA signer list */
  3602. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3603. {
  3604. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3605. if (cm == NULL)
  3606. return BAD_FUNC_ARG;
  3607. if (wc_LockMutex(&cm->caLock) != 0)
  3608. return BAD_MUTEX_E;
  3609. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3610. wc_UnLockMutex(&cm->caLock);
  3611. return WOLFSSL_SUCCESS;
  3612. }
  3613. #ifdef WOLFSSL_TRUST_PEER_CERT
  3614. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3615. {
  3616. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3617. if (cm == NULL)
  3618. return BAD_FUNC_ARG;
  3619. if (wc_LockMutex(&cm->tpLock) != 0)
  3620. return BAD_MUTEX_E;
  3621. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3622. wc_UnLockMutex(&cm->tpLock);
  3623. return WOLFSSL_SUCCESS;
  3624. }
  3625. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3626. #endif /* NO_CERTS */
  3627. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3628. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3629. {
  3630. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3631. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3632. SetErrorString(err, data);
  3633. if (XFPRINTF(fp, "%s", data) < 0)
  3634. WOLFSSL_MSG("fprintf failed in wolfSSL_ERR_print_errors_fp");
  3635. }
  3636. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3637. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3638. {
  3639. wc_ERR_print_errors_fp(fp);
  3640. }
  3641. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3642. void *u), void *u)
  3643. {
  3644. wc_ERR_print_errors_cb(cb, u);
  3645. }
  3646. #endif
  3647. #endif
  3648. /*
  3649. * TODO This ssl parameter needs to be changed to const once our ABI checker
  3650. * stops flagging qualifier additions as ABI breaking.
  3651. */
  3652. WOLFSSL_ABI
  3653. int wolfSSL_pending(WOLFSSL* ssl)
  3654. {
  3655. WOLFSSL_ENTER("SSL_pending");
  3656. if (ssl == NULL)
  3657. return WOLFSSL_FAILURE;
  3658. return ssl->buffers.clearOutputBuffer.length;
  3659. }
  3660. int wolfSSL_has_pending(const WOLFSSL* ssl)
  3661. {
  3662. WOLFSSL_ENTER("wolfSSL_has_pending");
  3663. if (ssl == NULL)
  3664. return WOLFSSL_FAILURE;
  3665. return ssl->buffers.clearOutputBuffer.length > 0;
  3666. }
  3667. #ifndef WOLFSSL_LEANPSK
  3668. /* turn on handshake group messages for context */
  3669. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3670. {
  3671. if (ctx == NULL)
  3672. return BAD_FUNC_ARG;
  3673. ctx->groupMessages = 1;
  3674. return WOLFSSL_SUCCESS;
  3675. }
  3676. #endif
  3677. #ifndef NO_WOLFSSL_CLIENT
  3678. /* connect enough to get peer cert chain */
  3679. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3680. {
  3681. int ret;
  3682. if (ssl == NULL)
  3683. return WOLFSSL_FAILURE;
  3684. ssl->options.certOnly = 1;
  3685. ret = wolfSSL_connect(ssl);
  3686. ssl->options.certOnly = 0;
  3687. return ret;
  3688. }
  3689. #endif
  3690. #ifndef WOLFSSL_LEANPSK
  3691. /* turn on handshake group messages for ssl object */
  3692. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3693. {
  3694. if (ssl == NULL)
  3695. return BAD_FUNC_ARG;
  3696. ssl->options.groupMessages = 1;
  3697. return WOLFSSL_SUCCESS;
  3698. }
  3699. /* make minVersion the internal equivalent SSL version */
  3700. static int SetMinVersionHelper(byte* minVersion, int version)
  3701. {
  3702. #ifdef NO_TLS
  3703. (void)minVersion;
  3704. #endif
  3705. switch (version) {
  3706. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3707. case WOLFSSL_SSLV3:
  3708. *minVersion = SSLv3_MINOR;
  3709. break;
  3710. #endif
  3711. #ifndef NO_TLS
  3712. #ifndef NO_OLD_TLS
  3713. #ifdef WOLFSSL_ALLOW_TLSV10
  3714. case WOLFSSL_TLSV1:
  3715. *minVersion = TLSv1_MINOR;
  3716. break;
  3717. #endif
  3718. case WOLFSSL_TLSV1_1:
  3719. *minVersion = TLSv1_1_MINOR;
  3720. break;
  3721. #endif
  3722. #ifndef WOLFSSL_NO_TLS12
  3723. case WOLFSSL_TLSV1_2:
  3724. *minVersion = TLSv1_2_MINOR;
  3725. break;
  3726. #endif
  3727. #endif
  3728. #ifdef WOLFSSL_TLS13
  3729. case WOLFSSL_TLSV1_3:
  3730. *minVersion = TLSv1_3_MINOR;
  3731. break;
  3732. #endif
  3733. #ifdef WOLFSSL_DTLS
  3734. case WOLFSSL_DTLSV1:
  3735. *minVersion = DTLS_MINOR;
  3736. break;
  3737. case WOLFSSL_DTLSV1_2:
  3738. *minVersion = DTLSv1_2_MINOR;
  3739. break;
  3740. #ifdef WOLFSSL_DTLS13
  3741. case WOLFSSL_DTLSV1_3:
  3742. *minVersion = DTLSv1_3_MINOR;
  3743. break;
  3744. #endif /* WOLFSSL_DTLS13 */
  3745. #endif /* WOLFSSL_DTLS */
  3746. default:
  3747. WOLFSSL_MSG("Bad function argument");
  3748. return BAD_FUNC_ARG;
  3749. }
  3750. return WOLFSSL_SUCCESS;
  3751. }
  3752. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3753. WOLFSSL_ABI
  3754. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3755. {
  3756. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3757. if (ctx == NULL) {
  3758. WOLFSSL_MSG("Bad function argument");
  3759. return BAD_FUNC_ARG;
  3760. }
  3761. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3762. }
  3763. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3764. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3765. {
  3766. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3767. if (ssl == NULL) {
  3768. WOLFSSL_MSG("Bad function argument");
  3769. return BAD_FUNC_ARG;
  3770. }
  3771. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3772. }
  3773. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3774. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  3775. {
  3776. if (ssl == NULL)
  3777. return BAD_FUNC_ARG;
  3778. if (ssl->version.major == SSLv3_MAJOR) {
  3779. switch (ssl->version.minor) {
  3780. case SSLv3_MINOR :
  3781. return WOLFSSL_SSLV3;
  3782. case TLSv1_MINOR :
  3783. return WOLFSSL_TLSV1;
  3784. case TLSv1_1_MINOR :
  3785. return WOLFSSL_TLSV1_1;
  3786. case TLSv1_2_MINOR :
  3787. return WOLFSSL_TLSV1_2;
  3788. case TLSv1_3_MINOR :
  3789. return WOLFSSL_TLSV1_3;
  3790. default:
  3791. break;
  3792. }
  3793. }
  3794. return VERSION_ERROR;
  3795. }
  3796. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3797. {
  3798. word16 haveRSA = 1;
  3799. word16 havePSK = 0;
  3800. int keySz = 0;
  3801. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3802. if (ssl == NULL) {
  3803. WOLFSSL_MSG("Bad function argument");
  3804. return BAD_FUNC_ARG;
  3805. }
  3806. switch (version) {
  3807. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3808. case WOLFSSL_SSLV3:
  3809. ssl->version = MakeSSLv3();
  3810. break;
  3811. #endif
  3812. #ifndef NO_TLS
  3813. #ifndef NO_OLD_TLS
  3814. #ifdef WOLFSSL_ALLOW_TLSV10
  3815. case WOLFSSL_TLSV1:
  3816. ssl->version = MakeTLSv1();
  3817. break;
  3818. #endif
  3819. case WOLFSSL_TLSV1_1:
  3820. ssl->version = MakeTLSv1_1();
  3821. break;
  3822. #endif
  3823. #ifndef WOLFSSL_NO_TLS12
  3824. case WOLFSSL_TLSV1_2:
  3825. ssl->version = MakeTLSv1_2();
  3826. break;
  3827. #endif
  3828. #ifdef WOLFSSL_TLS13
  3829. case WOLFSSL_TLSV1_3:
  3830. ssl->version = MakeTLSv1_3();
  3831. break;
  3832. #endif /* WOLFSSL_TLS13 */
  3833. #endif
  3834. default:
  3835. WOLFSSL_MSG("Bad function argument");
  3836. return BAD_FUNC_ARG;
  3837. }
  3838. #ifdef NO_RSA
  3839. haveRSA = 0;
  3840. #endif
  3841. #ifndef NO_PSK
  3842. havePSK = ssl->options.havePSK;
  3843. #endif
  3844. #ifndef NO_CERTS
  3845. keySz = ssl->buffers.keySz;
  3846. #endif
  3847. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3848. ssl->options.haveDH, ssl->options.haveECDSAsig,
  3849. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  3850. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  3851. ssl->options.haveAnon, TRUE, ssl->options.side);
  3852. return WOLFSSL_SUCCESS;
  3853. }
  3854. #endif /* !leanpsk */
  3855. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3856. /* Make a work from the front of random hash */
  3857. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3858. {
  3859. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3860. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3861. }
  3862. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3863. #ifndef NO_CERTS
  3864. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3865. static WC_INLINE word32 HashSigner(const byte* hash)
  3866. {
  3867. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3868. }
  3869. /* does CA already exist on signer list */
  3870. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3871. {
  3872. Signer* signers;
  3873. int ret = 0;
  3874. word32 row;
  3875. if (cm == NULL || hash == NULL) {
  3876. return ret;
  3877. }
  3878. row = HashSigner(hash);
  3879. if (wc_LockMutex(&cm->caLock) != 0) {
  3880. return ret;
  3881. }
  3882. signers = cm->caTable[row];
  3883. while (signers) {
  3884. byte* subjectHash;
  3885. #ifndef NO_SKID
  3886. subjectHash = signers->subjectKeyIdHash;
  3887. #else
  3888. subjectHash = signers->subjectNameHash;
  3889. #endif
  3890. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3891. ret = 1; /* success */
  3892. break;
  3893. }
  3894. signers = signers->next;
  3895. }
  3896. wc_UnLockMutex(&cm->caLock);
  3897. return ret;
  3898. }
  3899. #ifdef WOLFSSL_TRUST_PEER_CERT
  3900. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3901. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3902. {
  3903. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3904. }
  3905. /* does trusted peer already exist on signer list */
  3906. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DecodedCert* cert)
  3907. {
  3908. TrustedPeerCert* tp;
  3909. int ret = 0;
  3910. word32 row = TrustedPeerHashSigner(cert->subjectHash);
  3911. if (wc_LockMutex(&cm->tpLock) != 0)
  3912. return ret;
  3913. tp = cm->tpTable[row];
  3914. while (tp) {
  3915. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  3916. SIGNER_DIGEST_SIZE) == 0)
  3917. ret = 1;
  3918. #ifndef NO_SKID
  3919. if (cert->extSubjKeyIdSet) {
  3920. /* Compare SKID as well if available */
  3921. if (ret == 1 && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  3922. SIGNER_DIGEST_SIZE) != 0)
  3923. ret = 0;
  3924. }
  3925. #endif
  3926. if (ret == 1)
  3927. break;
  3928. tp = tp->next;
  3929. }
  3930. wc_UnLockMutex(&cm->tpLock);
  3931. return ret;
  3932. }
  3933. /* return Trusted Peer if found, otherwise NULL
  3934. type is what to match on
  3935. */
  3936. TrustedPeerCert* GetTrustedPeer(void* vp, DecodedCert* cert)
  3937. {
  3938. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3939. TrustedPeerCert* ret = NULL;
  3940. TrustedPeerCert* tp = NULL;
  3941. word32 row;
  3942. if (cm == NULL || cert == NULL)
  3943. return NULL;
  3944. row = TrustedPeerHashSigner(cert->subjectHash);
  3945. if (wc_LockMutex(&cm->tpLock) != 0)
  3946. return ret;
  3947. tp = cm->tpTable[row];
  3948. while (tp) {
  3949. if (XMEMCMP(cert->subjectHash, tp->subjectNameHash,
  3950. SIGNER_DIGEST_SIZE) == 0)
  3951. ret = tp;
  3952. #ifndef NO_SKID
  3953. if (cert->extSubjKeyIdSet) {
  3954. /* Compare SKID as well if available */
  3955. if (ret != NULL && XMEMCMP(cert->extSubjKeyId, tp->subjectKeyIdHash,
  3956. SIGNER_DIGEST_SIZE) != 0)
  3957. ret = NULL;
  3958. }
  3959. #endif
  3960. if (ret != NULL)
  3961. break;
  3962. tp = tp->next;
  3963. }
  3964. wc_UnLockMutex(&cm->tpLock);
  3965. return ret;
  3966. }
  3967. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3968. {
  3969. if (tp == NULL || cert == NULL)
  3970. return BAD_FUNC_ARG;
  3971. /* subject key id or subject hash has been compared when searching
  3972. tpTable for the cert from function GetTrustedPeer */
  3973. /* compare signatures */
  3974. if (tp->sigLen == cert->sigLength) {
  3975. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3976. return WOLFSSL_FAILURE;
  3977. }
  3978. }
  3979. else {
  3980. return WOLFSSL_FAILURE;
  3981. }
  3982. return WOLFSSL_SUCCESS;
  3983. }
  3984. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3985. /* return CA if found, otherwise NULL */
  3986. Signer* GetCA(void* vp, byte* hash)
  3987. {
  3988. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3989. Signer* ret = NULL;
  3990. Signer* signers;
  3991. word32 row = 0;
  3992. if (cm == NULL || hash == NULL)
  3993. return NULL;
  3994. row = HashSigner(hash);
  3995. if (wc_LockMutex(&cm->caLock) != 0)
  3996. return ret;
  3997. signers = cm->caTable[row];
  3998. while (signers) {
  3999. byte* subjectHash;
  4000. #ifndef NO_SKID
  4001. subjectHash = signers->subjectKeyIdHash;
  4002. #else
  4003. subjectHash = signers->subjectNameHash;
  4004. #endif
  4005. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  4006. ret = signers;
  4007. break;
  4008. }
  4009. signers = signers->next;
  4010. }
  4011. wc_UnLockMutex(&cm->caLock);
  4012. return ret;
  4013. }
  4014. #ifndef NO_SKID
  4015. /* return CA if found, otherwise NULL. Walk through hash table. */
  4016. Signer* GetCAByName(void* vp, byte* hash)
  4017. {
  4018. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  4019. Signer* ret = NULL;
  4020. Signer* signers;
  4021. word32 row;
  4022. if (cm == NULL)
  4023. return NULL;
  4024. if (wc_LockMutex(&cm->caLock) != 0)
  4025. return ret;
  4026. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  4027. signers = cm->caTable[row];
  4028. while (signers && ret == NULL) {
  4029. if (XMEMCMP(hash, signers->subjectNameHash,
  4030. SIGNER_DIGEST_SIZE) == 0) {
  4031. ret = signers;
  4032. }
  4033. signers = signers->next;
  4034. }
  4035. }
  4036. wc_UnLockMutex(&cm->caLock);
  4037. return ret;
  4038. }
  4039. #endif
  4040. #ifdef WOLFSSL_TRUST_PEER_CERT
  4041. /* add a trusted peer cert to linked list */
  4042. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  4043. {
  4044. int ret, row;
  4045. TrustedPeerCert* peerCert;
  4046. DecodedCert* cert;
  4047. DerBuffer* der = *pDer;
  4048. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  4049. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4050. DYNAMIC_TYPE_DCERT);
  4051. if (cert == NULL) {
  4052. FreeDer(&der);
  4053. return MEMORY_E;
  4054. }
  4055. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4056. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  4057. FreeDecodedCert(cert);
  4058. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4059. FreeDer(&der);
  4060. return ret;
  4061. }
  4062. WOLFSSL_MSG("\tParsed new trusted peer cert");
  4063. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  4064. DYNAMIC_TYPE_CERT);
  4065. if (peerCert == NULL) {
  4066. FreeDecodedCert(cert);
  4067. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4068. FreeDer(&der);
  4069. return MEMORY_E;
  4070. }
  4071. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  4072. #ifndef IGNORE_NAME_CONSTRAINTS
  4073. if (peerCert->permittedNames)
  4074. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  4075. if (peerCert->excludedNames)
  4076. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  4077. #endif
  4078. if (AlreadyTrustedPeer(cm, cert)) {
  4079. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4080. FreeTrustedPeer(peerCert, cm->heap);
  4081. (void)ret;
  4082. }
  4083. else {
  4084. /* add trusted peer signature */
  4085. peerCert->sigLen = cert->sigLength;
  4086. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  4087. DYNAMIC_TYPE_SIGNATURE);
  4088. if (peerCert->sig == NULL) {
  4089. FreeDecodedCert(cert);
  4090. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4091. FreeTrustedPeer(peerCert, cm->heap);
  4092. FreeDer(&der);
  4093. return MEMORY_E;
  4094. }
  4095. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  4096. /* add trusted peer name */
  4097. peerCert->nameLen = cert->subjectCNLen;
  4098. peerCert->name = cert->subjectCN;
  4099. #ifndef IGNORE_NAME_CONSTRAINTS
  4100. peerCert->permittedNames = cert->permittedNames;
  4101. peerCert->excludedNames = cert->excludedNames;
  4102. #endif
  4103. /* add SKID when available and hash of name */
  4104. #ifndef NO_SKID
  4105. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  4106. SIGNER_DIGEST_SIZE);
  4107. #endif
  4108. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  4109. SIGNER_DIGEST_SIZE);
  4110. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  4111. cert->subjectCN = 0;
  4112. #ifndef IGNORE_NAME_CONSTRAINTS
  4113. cert->permittedNames = NULL;
  4114. cert->excludedNames = NULL;
  4115. #endif
  4116. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4117. if (wc_LockMutex(&cm->tpLock) == 0) {
  4118. peerCert->next = cm->tpTable[row];
  4119. cm->tpTable[row] = peerCert; /* takes ownership */
  4120. wc_UnLockMutex(&cm->tpLock);
  4121. }
  4122. else {
  4123. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  4124. FreeDecodedCert(cert);
  4125. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4126. FreeTrustedPeer(peerCert, cm->heap);
  4127. FreeDer(&der);
  4128. return BAD_MUTEX_E;
  4129. }
  4130. }
  4131. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  4132. FreeDecodedCert(cert);
  4133. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4134. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  4135. FreeDer(&der);
  4136. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  4137. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  4138. return WOLFSSL_SUCCESS;
  4139. }
  4140. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4141. /* owns der, internal now uses too */
  4142. /* type flag ids from user or from chain received during verify
  4143. don't allow chain ones to be added w/o isCA extension */
  4144. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  4145. {
  4146. int ret;
  4147. Signer* signer = NULL;
  4148. word32 row;
  4149. byte* subjectHash;
  4150. #ifdef WOLFSSL_SMALL_STACK
  4151. DecodedCert* cert = NULL;
  4152. #else
  4153. DecodedCert cert[1];
  4154. #endif
  4155. DerBuffer* der = *pDer;
  4156. WOLFSSL_MSG("Adding a CA");
  4157. if (cm == NULL) {
  4158. FreeDer(pDer);
  4159. return BAD_FUNC_ARG;
  4160. }
  4161. #ifdef WOLFSSL_SMALL_STACK
  4162. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4163. DYNAMIC_TYPE_DCERT);
  4164. if (cert == NULL) {
  4165. FreeDer(pDer);
  4166. return MEMORY_E;
  4167. }
  4168. #endif
  4169. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4170. ret = ParseCert(cert, CA_TYPE, verify, cm);
  4171. WOLFSSL_MSG("\tParsed new CA");
  4172. #ifndef NO_SKID
  4173. subjectHash = cert->extSubjKeyId;
  4174. #else
  4175. subjectHash = cert->subjectHash;
  4176. #endif
  4177. /* check CA key size */
  4178. if (verify) {
  4179. switch (cert->keyOID) {
  4180. #ifndef NO_RSA
  4181. #ifdef WC_RSA_PSS
  4182. case RSAPSSk:
  4183. #endif
  4184. case RSAk:
  4185. if (cm->minRsaKeySz < 0 ||
  4186. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  4187. ret = RSA_KEY_SIZE_E;
  4188. WOLFSSL_MSG("\tCA RSA key size error");
  4189. }
  4190. break;
  4191. #endif /* !NO_RSA */
  4192. #ifdef HAVE_ECC
  4193. case ECDSAk:
  4194. if (cm->minEccKeySz < 0 ||
  4195. cert->pubKeySize < (word16)cm->minEccKeySz) {
  4196. ret = ECC_KEY_SIZE_E;
  4197. WOLFSSL_MSG("\tCA ECC key size error");
  4198. }
  4199. break;
  4200. #endif /* HAVE_ECC */
  4201. #ifdef HAVE_ED25519
  4202. case ED25519k:
  4203. if (cm->minEccKeySz < 0 ||
  4204. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  4205. ret = ECC_KEY_SIZE_E;
  4206. WOLFSSL_MSG("\tCA ECC key size error");
  4207. }
  4208. break;
  4209. #endif /* HAVE_ED25519 */
  4210. #ifdef HAVE_ED448
  4211. case ED448k:
  4212. if (cm->minEccKeySz < 0 ||
  4213. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  4214. ret = ECC_KEY_SIZE_E;
  4215. WOLFSSL_MSG("\tCA ECC key size error");
  4216. }
  4217. break;
  4218. #endif /* HAVE_ED448 */
  4219. #if defined(HAVE_PQC)
  4220. #if defined(HAVE_FALCON)
  4221. case FALCON_LEVEL1k:
  4222. if (cm->minFalconKeySz < 0 ||
  4223. FALCON_LEVEL1_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4224. ret = FALCON_KEY_SIZE_E;
  4225. WOLFSSL_MSG("\tCA Falcon level 1 key size error");
  4226. }
  4227. break;
  4228. case FALCON_LEVEL5k:
  4229. if (cm->minFalconKeySz < 0 ||
  4230. FALCON_LEVEL5_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4231. ret = FALCON_KEY_SIZE_E;
  4232. WOLFSSL_MSG("\tCA Falcon level 5 key size error");
  4233. }
  4234. break;
  4235. #endif /* HAVE_FALCON */
  4236. #if defined(HAVE_DILITHIUM)
  4237. case DILITHIUM_LEVEL2k:
  4238. case DILITHIUM_AES_LEVEL2k:
  4239. if (cm->minDilithiumKeySz < 0 ||
  4240. DILITHIUM_LEVEL2_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4241. ret = DILITHIUM_KEY_SIZE_E;
  4242. WOLFSSL_MSG("\tCA Dilithium level 2 key size error");
  4243. }
  4244. break;
  4245. case DILITHIUM_LEVEL3k:
  4246. case DILITHIUM_AES_LEVEL3k:
  4247. if (cm->minDilithiumKeySz < 0 ||
  4248. DILITHIUM_LEVEL3_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4249. ret = DILITHIUM_KEY_SIZE_E;
  4250. WOLFSSL_MSG("\tCA Dilithium level 3 key size error");
  4251. }
  4252. break;
  4253. case DILITHIUM_LEVEL5k:
  4254. case DILITHIUM_AES_LEVEL5k:
  4255. if (cm->minDilithiumKeySz < 0 ||
  4256. DILITHIUM_LEVEL5_KEY_SIZE < (word16)cm->minDilithiumKeySz) {
  4257. ret = DILITHIUM_KEY_SIZE_E;
  4258. WOLFSSL_MSG("\tCA Dilithium level 5 key size error");
  4259. }
  4260. break;
  4261. #endif /* HAVE_DILITHIUM */
  4262. #endif /* HAVE_PQC */
  4263. default:
  4264. WOLFSSL_MSG("\tNo key size check done on CA");
  4265. break; /* no size check if key type is not in switch */
  4266. }
  4267. }
  4268. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  4269. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  4270. ret = NOT_CA_ERROR;
  4271. }
  4272. #ifndef ALLOW_INVALID_CERTSIGN
  4273. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  4274. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  4275. /* Intermediate CA certs are required to have the keyCertSign
  4276. * extension set. User loaded root certs are not. */
  4277. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  4278. ret = NOT_CA_ERROR;
  4279. }
  4280. #endif
  4281. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  4282. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4283. (void)ret;
  4284. }
  4285. else if (ret == 0) {
  4286. /* take over signer parts */
  4287. signer = MakeSigner(cm->heap);
  4288. if (!signer)
  4289. ret = MEMORY_ERROR;
  4290. }
  4291. if (ret == 0 && signer != NULL) {
  4292. #ifdef WOLFSSL_SIGNER_DER_CERT
  4293. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  4294. }
  4295. if (ret == 0 && signer != NULL) {
  4296. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  4297. #endif
  4298. signer->keyOID = cert->keyOID;
  4299. if (cert->pubKeyStored) {
  4300. signer->publicKey = cert->publicKey;
  4301. signer->pubKeySize = cert->pubKeySize;
  4302. }
  4303. if (cert->subjectCNStored) {
  4304. signer->nameLen = cert->subjectCNLen;
  4305. signer->name = cert->subjectCN;
  4306. }
  4307. signer->pathLength = cert->pathLength;
  4308. signer->maxPathLen = cert->maxPathLen;
  4309. signer->pathLengthSet = cert->pathLengthSet;
  4310. signer->selfSigned = cert->selfSigned;
  4311. #ifndef IGNORE_NAME_CONSTRAINTS
  4312. signer->permittedNames = cert->permittedNames;
  4313. signer->excludedNames = cert->excludedNames;
  4314. #endif
  4315. #ifndef NO_SKID
  4316. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  4317. SIGNER_DIGEST_SIZE);
  4318. #endif
  4319. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  4320. SIGNER_DIGEST_SIZE);
  4321. #ifdef HAVE_OCSP
  4322. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  4323. KEYID_SIZE);
  4324. #endif
  4325. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  4326. : 0xFFFF;
  4327. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  4328. cert->publicKey = 0; /* in case lock fails don't free here. */
  4329. cert->subjectCN = 0;
  4330. #ifndef IGNORE_NAME_CONSTRAINTS
  4331. cert->permittedNames = NULL;
  4332. cert->excludedNames = NULL;
  4333. #endif
  4334. #ifndef NO_SKID
  4335. row = HashSigner(signer->subjectKeyIdHash);
  4336. #else
  4337. row = HashSigner(signer->subjectNameHash);
  4338. #endif
  4339. if (wc_LockMutex(&cm->caLock) == 0) {
  4340. signer->next = cm->caTable[row];
  4341. cm->caTable[row] = signer; /* takes ownership */
  4342. wc_UnLockMutex(&cm->caLock);
  4343. if (cm->caCacheCallback)
  4344. cm->caCacheCallback(der->buffer, (int)der->length, type);
  4345. }
  4346. else {
  4347. WOLFSSL_MSG("\tCA Mutex Lock failed");
  4348. ret = BAD_MUTEX_E;
  4349. FreeSigner(signer, cm->heap);
  4350. }
  4351. }
  4352. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  4353. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  4354. /* be used for peer's cert verification */
  4355. /* TSIP is only able to handle USER CA, and only one CA. */
  4356. /* Therefore, it doesn't need to call TSIP again if there is already */
  4357. /* verified CA. */
  4358. if ( ret == 0 && signer != NULL ) {
  4359. signer->cm_idx = row;
  4360. if (type == WOLFSSL_USER_CA) {
  4361. if ((ret = wc_Renesas_cmn_RootCertVerify(cert->source, cert->maxIdx,
  4362. cert->sigCtx.CertAtt.pubkey_n_start,
  4363. cert->sigCtx.CertAtt.pubkey_n_len - 1,
  4364. cert->sigCtx.CertAtt.pubkey_e_start,
  4365. cert->sigCtx.CertAtt.pubkey_e_len - 1,
  4366. row/* cm index */))
  4367. < 0)
  4368. WOLFSSL_MSG("Renesas_RootCertVerify() failed");
  4369. else
  4370. WOLFSSL_MSG("Renesas_RootCertVerify() succeed or skipped");
  4371. }
  4372. }
  4373. #endif /* TSIP or SCE */
  4374. WOLFSSL_MSG("\tFreeing Parsed CA");
  4375. FreeDecodedCert(cert);
  4376. #ifdef WOLFSSL_SMALL_STACK
  4377. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4378. #endif
  4379. WOLFSSL_MSG("\tFreeing der CA");
  4380. FreeDer(pDer);
  4381. WOLFSSL_MSG("\t\tOK Freeing der CA");
  4382. WOLFSSL_LEAVE("AddCA", ret);
  4383. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  4384. }
  4385. #endif /* !NO_CERTS */
  4386. #ifndef NO_SESSION_CACHE
  4387. /* basic config gives a cache with 33 sessions, adequate for clients and
  4388. embedded servers
  4389. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  4390. with titanic amounts of memory with long session ID timeouts and high
  4391. levels of traffic.
  4392. ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased
  4393. performance with large session caches
  4394. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  4395. allows over 13,000 new sessions per minute or over 200 new sessions per
  4396. second
  4397. BIG_SESSION_CACHE yields 20,027 sessions
  4398. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  4399. aren't under heavy load, basically allows 200 new sessions per minute
  4400. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  4401. or systems where the default of nearly 3kB is too much RAM, this define
  4402. uses less than 500 bytes RAM
  4403. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  4404. */
  4405. #if defined(TITAN_SESSION_CACHE)
  4406. #define SESSIONS_PER_ROW 31
  4407. #define SESSION_ROWS 64937
  4408. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4409. #define ENABLE_SESSION_CACHE_ROW_LOCK
  4410. #endif
  4411. #elif defined(HUGE_SESSION_CACHE)
  4412. #define SESSIONS_PER_ROW 11
  4413. #define SESSION_ROWS 5981
  4414. #elif defined(BIG_SESSION_CACHE)
  4415. #define SESSIONS_PER_ROW 7
  4416. #define SESSION_ROWS 2861
  4417. #elif defined(MEDIUM_SESSION_CACHE)
  4418. #define SESSIONS_PER_ROW 5
  4419. #define SESSION_ROWS 211
  4420. #elif defined(SMALL_SESSION_CACHE)
  4421. #define SESSIONS_PER_ROW 2
  4422. #define SESSION_ROWS 3
  4423. #else
  4424. #define SESSIONS_PER_ROW 3
  4425. #define SESSION_ROWS 11
  4426. #endif
  4427. #define INVALID_SESSION_ROW (-1)
  4428. #ifdef NO_SESSION_CACHE_ROW_LOCK
  4429. #undef ENABLE_SESSION_CACHE_ROW_LOCK
  4430. #endif
  4431. typedef struct SessionRow {
  4432. int nextIdx; /* where to place next one */
  4433. int totalCount; /* sessions ever on this row */
  4434. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  4435. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4436. /* not included in import/export */
  4437. wolfSSL_Mutex row_mutex;
  4438. int mutex_valid;
  4439. #endif
  4440. } SessionRow;
  4441. #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2))
  4442. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  4443. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  4444. static WOLFSSL_GLOBAL word32 PeakSessions;
  4445. #endif
  4446. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4447. #define SESSION_ROW_LOCK(row) wc_LockMutex(&(row)->row_mutex)
  4448. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&(row)->row_mutex);
  4449. #else
  4450. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  4451. static WOLFSSL_GLOBAL int session_mutex_valid = 0;
  4452. #define SESSION_ROW_LOCK(row) wc_LockMutex(&session_mutex)
  4453. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&session_mutex);
  4454. #endif
  4455. #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE)
  4456. #error ClientCache is required when not using NO_SESSION_CACHE_REF
  4457. #endif
  4458. #ifndef NO_CLIENT_CACHE
  4459. #ifndef CLIENT_SESSIONS_MULTIPLIER
  4460. #ifdef NO_SESSION_CACHE_REF
  4461. #define CLIENT_SESSIONS_MULTIPLIER 1
  4462. #else
  4463. /* ClientSession objects are lightweight (compared to
  4464. * WOLFSSL_SESSION) so to decrease chance that user will reuse
  4465. * thse wrong session, increase the ClientCache size. This will
  4466. * make the entire ClientCache about the size of one
  4467. * WOLFSSL_SESSION object. */
  4468. #define CLIENT_SESSIONS_MULTIPLIER 8
  4469. #endif
  4470. #endif
  4471. #define CLIENT_SESSIONS_PER_ROW \
  4472. (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER)
  4473. #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER)
  4474. #if CLIENT_SESSIONS_PER_ROW > 65535
  4475. #error CLIENT_SESSIONS_PER_ROW too big
  4476. #endif
  4477. #if CLIENT_SESSION_ROWS > 65535
  4478. #error CLIENT_SESSION_ROWS too big
  4479. #endif
  4480. struct ClientSession {
  4481. word16 serverRow; /* SessionCache Row id */
  4482. word16 serverIdx; /* SessionCache Idx (column) */
  4483. word32 sessionIDHash;
  4484. };
  4485. #ifndef WOLFSSL_CLIENT_SESSION_DEFINED
  4486. typedef struct ClientSession ClientSession;
  4487. #define WOLFSSL_CLIENT_SESSION_DEFINED
  4488. #endif
  4489. typedef struct ClientRow {
  4490. int nextIdx; /* where to place next one */
  4491. int totalCount; /* sessions ever on this row */
  4492. ClientSession Clients[CLIENT_SESSIONS_PER_ROW];
  4493. } ClientRow;
  4494. static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS];
  4495. /* Client Cache */
  4496. /* uses session mutex */
  4497. static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex; /* ClientCache mutex */
  4498. static WOLFSSL_GLOBAL int clisession_mutex_valid = 0;
  4499. #endif /* !NO_CLIENT_CACHE */
  4500. #endif /* !NO_SESSION_CACHE */
  4501. #if !defined(WC_NO_RNG) && (defined(OPENSSL_EXTRA) || \
  4502. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA)))
  4503. #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */
  4504. static WC_RNG globalRNG;
  4505. static int initGlobalRNG = 0;
  4506. static wolfSSL_Mutex globalRNGMutex;
  4507. static int globalRNGMutex_valid = 0;
  4508. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  4509. static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL;
  4510. #endif
  4511. WC_RNG* wolfssl_get_global_rng(void)
  4512. {
  4513. WC_RNG* ret = NULL;
  4514. if (initGlobalRNG == 0)
  4515. WOLFSSL_MSG("Global RNG no Init");
  4516. else
  4517. ret = &globalRNG;
  4518. return ret;
  4519. }
  4520. #endif
  4521. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  4522. static int wolfSSL_RAND_InitMutex(void);
  4523. #endif
  4524. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4525. static void AtExitCleanup(void)
  4526. {
  4527. if (initRefCount > 0) {
  4528. initRefCount = 1;
  4529. (void)wolfSSL_Cleanup();
  4530. }
  4531. }
  4532. #endif
  4533. WOLFSSL_ABI
  4534. int wolfSSL_Init(void)
  4535. {
  4536. int ret = WOLFSSL_SUCCESS;
  4537. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  4538. int i;
  4539. #endif
  4540. WOLFSSL_ENTER("wolfSSL_Init");
  4541. #if FIPS_VERSION_GE(5,1)
  4542. ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL);
  4543. if (ret != 0)
  4544. return ret;
  4545. else
  4546. ret = WOLFSSL_SUCCESS;
  4547. #endif
  4548. if (initRefCount == 0) {
  4549. /* Initialize crypto for use with TLS connection */
  4550. if (wolfCrypt_Init() != 0) {
  4551. WOLFSSL_MSG("Bad wolfCrypt Init");
  4552. ret = WC_INIT_E;
  4553. }
  4554. #ifdef HAVE_GLOBAL_RNG
  4555. if (ret == WOLFSSL_SUCCESS) {
  4556. if (wc_InitMutex(&globalRNGMutex) != 0) {
  4557. WOLFSSL_MSG("Bad Init Mutex rng");
  4558. ret = BAD_MUTEX_E;
  4559. }
  4560. else {
  4561. globalRNGMutex_valid = 1;
  4562. }
  4563. }
  4564. #endif
  4565. #ifdef WC_RNG_SEED_CB
  4566. wc_SetSeed_Cb(wc_GenerateSeed);
  4567. #endif
  4568. #ifdef OPENSSL_EXTRA
  4569. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  4570. if ((ret == WOLFSSL_SUCCESS) && (wolfSSL_RAND_InitMutex() != 0)) {
  4571. ret = BAD_MUTEX_E;
  4572. }
  4573. #endif
  4574. if ((ret == WOLFSSL_SUCCESS) &&
  4575. (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS)) {
  4576. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  4577. ret = WC_INIT_E;
  4578. }
  4579. #endif
  4580. #ifndef NO_SESSION_CACHE
  4581. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4582. for (i = 0; i < SESSION_ROWS; ++i) {
  4583. SessionCache[i].mutex_valid = 0;
  4584. }
  4585. for (i = 0; (ret == WOLFSSL_SUCCESS) && (i < SESSION_ROWS); ++i) {
  4586. if (wc_InitMutex(&SessionCache[i].row_mutex) != 0) {
  4587. WOLFSSL_MSG("Bad Init Mutex session");
  4588. ret = BAD_MUTEX_E;
  4589. }
  4590. else {
  4591. SessionCache[i].mutex_valid = 1;
  4592. }
  4593. }
  4594. #else
  4595. if (ret == WOLFSSL_SUCCESS) {
  4596. if (wc_InitMutex(&session_mutex) != 0) {
  4597. WOLFSSL_MSG("Bad Init Mutex session");
  4598. ret = BAD_MUTEX_E;
  4599. }
  4600. else {
  4601. session_mutex_valid = 1;
  4602. }
  4603. }
  4604. #endif
  4605. #ifndef NO_CLIENT_CACHE
  4606. if (ret == WOLFSSL_SUCCESS) {
  4607. if (wc_InitMutex(&clisession_mutex) != 0) {
  4608. WOLFSSL_MSG("Bad Init Mutex session");
  4609. ret = BAD_MUTEX_E;
  4610. }
  4611. else {
  4612. clisession_mutex_valid = 1;
  4613. }
  4614. }
  4615. #endif
  4616. #endif
  4617. if (ret == WOLFSSL_SUCCESS) {
  4618. if (wc_InitMutex(&count_mutex) != 0) {
  4619. WOLFSSL_MSG("Bad Init Mutex count");
  4620. ret = BAD_MUTEX_E;
  4621. }
  4622. else {
  4623. count_mutex_valid = 1;
  4624. }
  4625. }
  4626. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4627. /* OpenSSL registers cleanup using atexit */
  4628. if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) {
  4629. WOLFSSL_MSG("Bad atexit registration");
  4630. ret = WC_INIT_E;
  4631. }
  4632. #endif
  4633. }
  4634. if (ret == WOLFSSL_SUCCESS) {
  4635. if (wc_LockMutex(&count_mutex) != 0) {
  4636. WOLFSSL_MSG("Bad Lock Mutex count");
  4637. ret = BAD_MUTEX_E;
  4638. }
  4639. else {
  4640. initRefCount++;
  4641. wc_UnLockMutex(&count_mutex);
  4642. }
  4643. }
  4644. if (ret != WOLFSSL_SUCCESS) {
  4645. initRefCount = 1; /* Force cleanup */
  4646. (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */
  4647. }
  4648. return ret;
  4649. }
  4650. #ifndef NO_CERTS
  4651. /* process user cert chain to pass during the handshake */
  4652. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4653. long sz, int format, int type, WOLFSSL* ssl,
  4654. long* used, EncryptedInfo* info, int verify)
  4655. {
  4656. int ret = 0;
  4657. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4658. #ifdef WOLFSSL_TLS13
  4659. int cnt = 0;
  4660. #endif
  4661. if ((type == CA_TYPE) && (ctx == NULL)) {
  4662. WOLFSSL_MSG("Need context for CA load");
  4663. return BAD_FUNC_ARG;
  4664. }
  4665. /* we may have a user cert chain, try to consume */
  4666. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  4667. #ifdef WOLFSSL_SMALL_STACK
  4668. byte staticBuffer[1]; /* force heap usage */
  4669. #else
  4670. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  4671. #endif
  4672. byte* chainBuffer = staticBuffer;
  4673. int dynamicBuffer = 0;
  4674. word32 bufferSz;
  4675. long consumed = info->consumed;
  4676. word32 idx = 0;
  4677. int gotOne = 0;
  4678. /* Calculate max possible size, including max headers */
  4679. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  4680. if (bufferSz > sizeof(staticBuffer)) {
  4681. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  4682. /* will shrink to actual size */
  4683. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  4684. if (chainBuffer == NULL) {
  4685. return MEMORY_E;
  4686. }
  4687. dynamicBuffer = 1;
  4688. }
  4689. WOLFSSL_MSG("Processing Cert Chain");
  4690. while (consumed < sz) {
  4691. DerBuffer* part = NULL;
  4692. word32 remain = (word32)(sz - consumed);
  4693. info->consumed = 0;
  4694. if (format == WOLFSSL_FILETYPE_PEM) {
  4695. #ifdef WOLFSSL_PEM_TO_DER
  4696. ret = PemToDer(buff + consumed, remain, type, &part,
  4697. heap, info, NULL);
  4698. #else
  4699. ret = NOT_COMPILED_IN;
  4700. #endif
  4701. }
  4702. else {
  4703. int length = remain;
  4704. if (format == WOLFSSL_FILETYPE_ASN1) {
  4705. /* get length of der (read sequence) */
  4706. word32 inOutIdx = 0;
  4707. if (GetSequence(buff + consumed, &inOutIdx, &length,
  4708. remain) < 0) {
  4709. ret = ASN_NO_PEM_HEADER;
  4710. }
  4711. length += inOutIdx; /* include leading sequence */
  4712. }
  4713. info->consumed = length;
  4714. if (ret == 0) {
  4715. ret = AllocDer(&part, length, type, heap);
  4716. if (ret == 0) {
  4717. XMEMCPY(part->buffer, buff + consumed, length);
  4718. }
  4719. }
  4720. }
  4721. if (ret == 0) {
  4722. gotOne = 1;
  4723. #ifdef WOLFSSL_TLS13
  4724. cnt++;
  4725. #endif
  4726. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  4727. WOLFSSL_MSG(" Cert Chain bigger than buffer. "
  4728. "Consider increasing MAX_CHAIN_DEPTH");
  4729. ret = BUFFER_E;
  4730. }
  4731. else {
  4732. c32to24(part->length, &chainBuffer[idx]);
  4733. idx += CERT_HEADER_SZ;
  4734. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  4735. idx += part->length;
  4736. consumed += info->consumed;
  4737. if (used)
  4738. *used += info->consumed;
  4739. }
  4740. /* add CA's to certificate manager */
  4741. if (ret == 0 && type == CA_TYPE) {
  4742. /* verify CA unless user set to no verify */
  4743. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  4744. if (ret == WOLFSSL_SUCCESS) {
  4745. ret = 0; /* converted success case */
  4746. }
  4747. gotOne = 0; /* don't exit loop for CA type */
  4748. }
  4749. }
  4750. FreeDer(&part);
  4751. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  4752. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  4753. break;
  4754. }
  4755. if (ret < 0) {
  4756. WOLFSSL_MSG(" Error in Cert in Chain");
  4757. if (dynamicBuffer)
  4758. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4759. return ret;
  4760. }
  4761. WOLFSSL_MSG(" Consumed another Cert in Chain");
  4762. }
  4763. WOLFSSL_MSG("Finished Processing Cert Chain");
  4764. /* only retain actual size used */
  4765. ret = 0;
  4766. if (idx > 0) {
  4767. if (ssl) {
  4768. if (ssl->buffers.weOwnCertChain) {
  4769. FreeDer(&ssl->buffers.certChain);
  4770. }
  4771. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4772. if (ret == 0) {
  4773. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4774. idx);
  4775. ssl->buffers.weOwnCertChain = 1;
  4776. }
  4777. #ifdef WOLFSSL_TLS13
  4778. ssl->buffers.certChainCnt = cnt;
  4779. #endif
  4780. } else if (ctx) {
  4781. FreeDer(&ctx->certChain);
  4782. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4783. if (ret == 0) {
  4784. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4785. }
  4786. #ifdef WOLFSSL_TLS13
  4787. ctx->certChainCnt = cnt;
  4788. #endif
  4789. }
  4790. }
  4791. if (dynamicBuffer)
  4792. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4793. }
  4794. return ret;
  4795. }
  4796. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4797. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4798. {
  4799. int ret = 0;
  4800. (void)heap;
  4801. (void)devId;
  4802. if (ctx == NULL && ssl == NULL)
  4803. return BAD_FUNC_ARG;
  4804. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4805. return BAD_FUNC_ARG;
  4806. #ifndef NO_RSA
  4807. if ((*keyFormat == 0 || *keyFormat == RSAk)) {
  4808. /* make sure RSA key can be used */
  4809. #ifdef WOLFSSL_SMALL_STACK
  4810. RsaKey* key;
  4811. #else
  4812. RsaKey key[1];
  4813. #endif
  4814. #ifdef WOLFSSL_SMALL_STACK
  4815. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4816. if (key == NULL)
  4817. return MEMORY_E;
  4818. #endif
  4819. ret = wc_InitRsaKey_ex(key, heap, devId);
  4820. if (ret == 0) {
  4821. *idx = 0;
  4822. ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length);
  4823. #ifdef WOLF_PRIVATE_KEY_ID
  4824. if (ret != 0 && (devId != INVALID_DEVID
  4825. #ifdef HAVE_PK_CALLBACKS
  4826. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  4827. #endif
  4828. )) {
  4829. /* if using crypto or PK callbacks, try public key decode */
  4830. *idx = 0;
  4831. ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length);
  4832. }
  4833. #endif
  4834. if (ret != 0) {
  4835. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4836. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  4837. WOLFSSL_MSG("RSA decode failed and other algorithms "
  4838. "not enabled to try");
  4839. ret = WOLFSSL_BAD_FILE;
  4840. #else
  4841. ret = 0; /* continue trying other algorithms */
  4842. #endif
  4843. }
  4844. else {
  4845. /* check that the size of the RSA key is enough */
  4846. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4847. ctx->minRsaKeySz;
  4848. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4849. if (*keySz < minRsaSz) {
  4850. ret = RSA_KEY_SIZE_E;
  4851. WOLFSSL_MSG("Private Key size too small");
  4852. }
  4853. if (ssl) {
  4854. ssl->buffers.keyType = rsa_sa_algo;
  4855. ssl->buffers.keySz = *keySz;
  4856. }
  4857. else {
  4858. ctx->privateKeyType = rsa_sa_algo;
  4859. ctx->privateKeySz = *keySz;
  4860. }
  4861. *keyFormat = RSAk;
  4862. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4863. ssl->options.haveStaticECC = 0;
  4864. *resetSuites = 1;
  4865. }
  4866. }
  4867. wc_FreeRsaKey(key);
  4868. }
  4869. #ifdef WOLFSSL_SMALL_STACK
  4870. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4871. #endif
  4872. if (ret != 0)
  4873. return ret;
  4874. }
  4875. #endif
  4876. #ifdef HAVE_ECC
  4877. if ((*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4878. /* make sure ECC key can be used */
  4879. #ifdef WOLFSSL_SMALL_STACK
  4880. ecc_key* key;
  4881. #else
  4882. ecc_key key[1];
  4883. #endif
  4884. #ifdef WOLFSSL_SMALL_STACK
  4885. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4886. if (key == NULL)
  4887. return MEMORY_E;
  4888. #endif
  4889. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4890. *idx = 0;
  4891. ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length);
  4892. #ifdef WOLF_PRIVATE_KEY_ID
  4893. if (ret != 0 && (devId != INVALID_DEVID
  4894. #ifdef HAVE_PK_CALLBACKS
  4895. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  4896. #endif
  4897. )) {
  4898. /* if using crypto or PK callbacks, try public key decode */
  4899. *idx = 0;
  4900. ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length);
  4901. }
  4902. #endif
  4903. if (ret == 0) {
  4904. /* check for minimum ECC key size and then free */
  4905. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4906. ctx->minEccKeySz;
  4907. *keySz = wc_ecc_size(key);
  4908. if (*keySz < minKeySz) {
  4909. WOLFSSL_MSG("ECC private key too small");
  4910. ret = ECC_KEY_SIZE_E;
  4911. }
  4912. *keyFormat = ECDSAk;
  4913. if (ssl) {
  4914. ssl->options.haveStaticECC = 1;
  4915. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4916. ssl->buffers.keySz = *keySz;
  4917. }
  4918. else {
  4919. ctx->haveStaticECC = 1;
  4920. ctx->privateKeyType = ecc_dsa_sa_algo;
  4921. ctx->privateKeySz = *keySz;
  4922. }
  4923. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4924. *resetSuites = 1;
  4925. }
  4926. }
  4927. else {
  4928. ret = 0; /* continue trying other algorithms */
  4929. }
  4930. wc_ecc_free(key);
  4931. }
  4932. #ifdef WOLFSSL_SMALL_STACK
  4933. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4934. #endif
  4935. if (ret != 0)
  4936. return ret;
  4937. }
  4938. #endif /* HAVE_ECC */
  4939. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  4940. if ((*keyFormat == 0 || *keyFormat == ED25519k)) {
  4941. /* make sure Ed25519 key can be used */
  4942. #ifdef WOLFSSL_SMALL_STACK
  4943. ed25519_key* key;
  4944. #else
  4945. ed25519_key key[1];
  4946. #endif
  4947. #ifdef WOLFSSL_SMALL_STACK
  4948. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4949. DYNAMIC_TYPE_ED25519);
  4950. if (key == NULL)
  4951. return MEMORY_E;
  4952. #endif
  4953. ret = wc_ed25519_init_ex(key, heap, devId);
  4954. if (ret == 0) {
  4955. *idx = 0;
  4956. ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length);
  4957. #ifdef WOLF_PRIVATE_KEY_ID
  4958. if (ret != 0 && (devId != INVALID_DEVID
  4959. #ifdef HAVE_PK_CALLBACKS
  4960. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  4961. #endif
  4962. )) {
  4963. /* if using crypto or PK callbacks, try public key decode */
  4964. *idx = 0;
  4965. ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key,
  4966. der->length);
  4967. }
  4968. #endif
  4969. if (ret == 0) {
  4970. /* check for minimum key size and then free */
  4971. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4972. ctx->minEccKeySz;
  4973. *keySz = ED25519_KEY_SIZE;
  4974. if (*keySz < minKeySz) {
  4975. WOLFSSL_MSG("ED25519 private key too small");
  4976. ret = ECC_KEY_SIZE_E;
  4977. }
  4978. if (ret == 0) {
  4979. if (ssl) {
  4980. ssl->buffers.keyType = ed25519_sa_algo;
  4981. ssl->buffers.keySz = *keySz;
  4982. }
  4983. else if (ctx) {
  4984. ctx->privateKeyType = ed25519_sa_algo;
  4985. ctx->privateKeySz = *keySz;
  4986. }
  4987. *keyFormat = ED25519k;
  4988. if (ssl != NULL) {
  4989. /* ED25519 requires caching enabled for tracking message
  4990. * hash used in EdDSA_Update for signing */
  4991. ssl->options.cacheMessages = 1;
  4992. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4993. *resetSuites = 1;
  4994. }
  4995. }
  4996. }
  4997. }
  4998. else {
  4999. ret = 0; /* continue trying other algorithms */
  5000. }
  5001. wc_ed25519_free(key);
  5002. }
  5003. #ifdef WOLFSSL_SMALL_STACK
  5004. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  5005. #endif
  5006. if (ret != 0)
  5007. return ret;
  5008. }
  5009. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  5010. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  5011. if ((*keyFormat == 0 || *keyFormat == ED448k)) {
  5012. /* make sure Ed448 key can be used */
  5013. #ifdef WOLFSSL_SMALL_STACK
  5014. ed448_key* key = NULL;
  5015. #else
  5016. ed448_key key[1];
  5017. #endif
  5018. #ifdef WOLFSSL_SMALL_STACK
  5019. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  5020. if (key == NULL)
  5021. return MEMORY_E;
  5022. #endif
  5023. ret = wc_ed448_init(key);
  5024. if (ret == 0) {
  5025. *idx = 0;
  5026. ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length);
  5027. #ifdef WOLF_PRIVATE_KEY_ID
  5028. if (ret != 0 && (devId != INVALID_DEVID
  5029. #ifdef HAVE_PK_CALLBACKS
  5030. || wolfSSL_CTX_IsPrivatePkSet(ctx)
  5031. #endif
  5032. )) {
  5033. /* if using crypto or PK callbacks, try public key decode */
  5034. *idx = 0;
  5035. ret = wc_Ed448PublicKeyDecode(der->buffer, idx, key,
  5036. der->length);
  5037. }
  5038. #endif
  5039. if (ret == 0) {
  5040. /* check for minimum key size and then free */
  5041. int minKeySz = ssl ? ssl->options.minEccKeySz :
  5042. ctx->minEccKeySz;
  5043. *keySz = ED448_KEY_SIZE;
  5044. if (*keySz < minKeySz) {
  5045. WOLFSSL_MSG("ED448 private key too small");
  5046. ret = ECC_KEY_SIZE_E;
  5047. }
  5048. }
  5049. if (ret == 0) {
  5050. if (ssl) {
  5051. ssl->buffers.keyType = ed448_sa_algo;
  5052. ssl->buffers.keySz = *keySz;
  5053. }
  5054. else if (ctx) {
  5055. ctx->privateKeyType = ed448_sa_algo;
  5056. ctx->privateKeySz = *keySz;
  5057. }
  5058. *keyFormat = ED448k;
  5059. if (ssl != NULL) {
  5060. /* ED448 requires caching enabled for tracking message
  5061. * hash used in EdDSA_Update for signing */
  5062. ssl->options.cacheMessages = 1;
  5063. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5064. *resetSuites = 1;
  5065. }
  5066. }
  5067. }
  5068. wc_ed448_free(key);
  5069. }
  5070. #ifdef WOLFSSL_SMALL_STACK
  5071. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  5072. #endif
  5073. if (ret != 0)
  5074. return ret;
  5075. }
  5076. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  5077. #if defined(HAVE_PQC)
  5078. #if defined(HAVE_FALCON)
  5079. if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) ||
  5080. (*keyFormat == FALCON_LEVEL5k))) {
  5081. /* make sure Falcon key can be used */
  5082. falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  5083. DYNAMIC_TYPE_FALCON);
  5084. if (key == NULL) {
  5085. return MEMORY_E;
  5086. }
  5087. ret = wc_falcon_init(key);
  5088. if (ret == 0) {
  5089. if (*keyFormat == FALCON_LEVEL1k) {
  5090. ret = wc_falcon_set_level(key, 1);
  5091. }
  5092. else if (*keyFormat == FALCON_LEVEL5k) {
  5093. ret = wc_falcon_set_level(key, 5);
  5094. }
  5095. else {
  5096. /* What if *keyformat is 0? We might want to do something more
  5097. * graceful here. */
  5098. wc_falcon_free(key);
  5099. ret = ALGO_ID_E;
  5100. }
  5101. }
  5102. if (ret == 0) {
  5103. *idx = 0;
  5104. ret = wc_falcon_import_private_only(der->buffer, der->length, key);
  5105. if (ret == 0) {
  5106. /* check for minimum key size and then free */
  5107. int minKeySz = ssl ? ssl->options.minFalconKeySz :
  5108. ctx->minFalconKeySz;
  5109. *keySz = FALCON_MAX_KEY_SIZE;
  5110. if (*keySz < minKeySz) {
  5111. WOLFSSL_MSG("Falcon private key too small");
  5112. ret = FALCON_KEY_SIZE_E;
  5113. }
  5114. if (ssl) {
  5115. if (*keyFormat == FALCON_LEVEL1k) {
  5116. ssl->buffers.keyType = falcon_level1_sa_algo;
  5117. }
  5118. else {
  5119. ssl->buffers.keyType = falcon_level5_sa_algo;
  5120. }
  5121. ssl->buffers.keySz = *keySz;
  5122. }
  5123. else {
  5124. if (*keyFormat == FALCON_LEVEL1k) {
  5125. ctx->privateKeyType = falcon_level1_sa_algo;
  5126. }
  5127. else {
  5128. ctx->privateKeyType = falcon_level5_sa_algo;
  5129. }
  5130. ctx->privateKeySz = *keySz;
  5131. }
  5132. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5133. *resetSuites = 1;
  5134. }
  5135. }
  5136. wc_falcon_free(key);
  5137. }
  5138. XFREE(key, heap, DYNAMIC_TYPE_FALCON);
  5139. if (ret != 0)
  5140. return ret;
  5141. }
  5142. #endif /* HAVE_FALCON */
  5143. #if defined(HAVE_DILITHIUM)
  5144. if ((*keyFormat == 0) ||
  5145. (*keyFormat == DILITHIUM_LEVEL2k) ||
  5146. (*keyFormat == DILITHIUM_LEVEL3k) ||
  5147. (*keyFormat == DILITHIUM_LEVEL5k) ||
  5148. (*keyFormat == DILITHIUM_AES_LEVEL2k) ||
  5149. (*keyFormat == DILITHIUM_AES_LEVEL3k) ||
  5150. (*keyFormat == DILITHIUM_AES_LEVEL5k)) {
  5151. /* make sure Dilithium key can be used */
  5152. dilithium_key* key = (dilithium_key*)XMALLOC(sizeof(dilithium_key),
  5153. heap,
  5154. DYNAMIC_TYPE_DILITHIUM);
  5155. if (key == NULL) {
  5156. return MEMORY_E;
  5157. }
  5158. ret = wc_dilithium_init(key);
  5159. if (ret == 0) {
  5160. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5161. ret = wc_dilithium_set_level_and_sym(key, 2, SHAKE_VARIANT);
  5162. }
  5163. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5164. ret = wc_dilithium_set_level_and_sym(key, 3, SHAKE_VARIANT);
  5165. }
  5166. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5167. ret = wc_dilithium_set_level_and_sym(key, 5, SHAKE_VARIANT);
  5168. }
  5169. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5170. ret = wc_dilithium_set_level_and_sym(key, 2, AES_VARIANT);
  5171. }
  5172. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5173. ret = wc_dilithium_set_level_and_sym(key, 3, AES_VARIANT);
  5174. }
  5175. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5176. ret = wc_dilithium_set_level_and_sym(key, 5, AES_VARIANT);
  5177. }
  5178. else {
  5179. /* What if *keyformat is 0? We might want to do something more
  5180. * graceful here. */
  5181. wc_dilithium_free(key);
  5182. ret = ALGO_ID_E;
  5183. }
  5184. }
  5185. if (ret == 0) {
  5186. *idx = 0;
  5187. ret = wc_dilithium_import_private_only(der->buffer, der->length,
  5188. key);
  5189. if (ret == 0) {
  5190. /* check for minimum key size and then free */
  5191. int minKeySz = ssl ? ssl->options.minDilithiumKeySz :
  5192. ctx->minDilithiumKeySz;
  5193. *keySz = DILITHIUM_MAX_KEY_SIZE;
  5194. if (*keySz < minKeySz) {
  5195. WOLFSSL_MSG("Dilithium private key too small");
  5196. ret = DILITHIUM_KEY_SIZE_E;
  5197. }
  5198. if (ssl) {
  5199. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5200. ssl->buffers.keyType = dilithium_level2_sa_algo;
  5201. }
  5202. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5203. ssl->buffers.keyType = dilithium_level3_sa_algo;
  5204. }
  5205. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5206. ssl->buffers.keyType = dilithium_level5_sa_algo;
  5207. }
  5208. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5209. ssl->buffers.keyType = dilithium_aes_level2_sa_algo;
  5210. }
  5211. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5212. ssl->buffers.keyType = dilithium_aes_level3_sa_algo;
  5213. }
  5214. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5215. ssl->buffers.keyType = dilithium_aes_level5_sa_algo;
  5216. }
  5217. ssl->buffers.keySz = *keySz;
  5218. }
  5219. else {
  5220. if (*keyFormat == DILITHIUM_LEVEL2k) {
  5221. ctx->privateKeyType = dilithium_level2_sa_algo;
  5222. }
  5223. else if (*keyFormat == DILITHIUM_LEVEL3k) {
  5224. ctx->privateKeyType = dilithium_level3_sa_algo;
  5225. }
  5226. else if (*keyFormat == DILITHIUM_LEVEL5k) {
  5227. ctx->privateKeyType = dilithium_level5_sa_algo;
  5228. }
  5229. else if (*keyFormat == DILITHIUM_AES_LEVEL2k) {
  5230. ctx->privateKeyType = dilithium_aes_level2_sa_algo;
  5231. }
  5232. else if (*keyFormat == DILITHIUM_AES_LEVEL3k) {
  5233. ctx->privateKeyType = dilithium_aes_level3_sa_algo;
  5234. }
  5235. else if (*keyFormat == DILITHIUM_AES_LEVEL5k) {
  5236. ctx->privateKeyType = dilithium_aes_level5_sa_algo;
  5237. }
  5238. ctx->privateKeySz = *keySz;
  5239. }
  5240. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5241. *resetSuites = 1;
  5242. }
  5243. }
  5244. wc_dilithium_free(key);
  5245. }
  5246. XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM);
  5247. if (ret != 0) {
  5248. return ret;
  5249. }
  5250. }
  5251. #endif /* HAVE_DILITHIUM */
  5252. #endif /* HAVE_PQC */
  5253. return ret;
  5254. }
  5255. /* process the buffer buff, length sz, into ctx of format and type
  5256. used tracks bytes consumed, userChain specifies a user cert chain
  5257. to pass during the handshake */
  5258. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5259. long sz, int format, int type, WOLFSSL* ssl,
  5260. long* used, int userChain, int verify)
  5261. {
  5262. DerBuffer* der = NULL;
  5263. int ret = 0;
  5264. int done = 0;
  5265. int keyFormat = 0;
  5266. int resetSuites = 0;
  5267. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  5268. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  5269. word32 idx = 0;
  5270. int keySz = 0;
  5271. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  5272. defined(HAVE_PKCS8)
  5273. word32 algId = 0;
  5274. #endif
  5275. #ifdef WOLFSSL_SMALL_STACK
  5276. EncryptedInfo* info = NULL;
  5277. #else
  5278. EncryptedInfo info[1];
  5279. #endif
  5280. (void)devId;
  5281. (void)idx;
  5282. (void)keySz;
  5283. if (used)
  5284. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  5285. /* check args */
  5286. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  5287. return WOLFSSL_BAD_FILETYPE;
  5288. if (ctx == NULL && ssl == NULL)
  5289. return BAD_FUNC_ARG;
  5290. #ifdef WOLFSSL_SMALL_STACK
  5291. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  5292. DYNAMIC_TYPE_ENCRYPTEDINFO);
  5293. if (info == NULL)
  5294. return MEMORY_E;
  5295. #endif
  5296. XMEMSET(info, 0, sizeof(EncryptedInfo));
  5297. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5298. if (ctx) {
  5299. info->passwd_cb = ctx->passwd_cb;
  5300. info->passwd_userdata = ctx->passwd_userdata;
  5301. }
  5302. #endif
  5303. if (format == WOLFSSL_FILETYPE_PEM) {
  5304. #ifdef WOLFSSL_PEM_TO_DER
  5305. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  5306. #else
  5307. ret = NOT_COMPILED_IN;
  5308. #endif
  5309. }
  5310. else {
  5311. /* ASN1 (DER) */
  5312. int length = (int)sz;
  5313. if (format == WOLFSSL_FILETYPE_ASN1) {
  5314. /* get length of der (read sequence or octet string) */
  5315. word32 inOutIdx = 0;
  5316. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5317. length += inOutIdx; /* include leading sequence */
  5318. }
  5319. /* get length using octect string (allowed for private key types) */
  5320. else if (type == PRIVATEKEY_TYPE &&
  5321. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5322. length += inOutIdx; /* include leading oct string */
  5323. }
  5324. else {
  5325. ret = ASN_PARSE_E;
  5326. }
  5327. }
  5328. info->consumed = length;
  5329. if (ret == 0) {
  5330. ret = AllocDer(&der, (word32)length, type, heap);
  5331. if (ret == 0) {
  5332. XMEMCPY(der->buffer, buff, length);
  5333. }
  5334. #ifdef HAVE_PKCS8
  5335. /* if private key try and remove PKCS8 header */
  5336. if (type == PRIVATEKEY_TYPE) {
  5337. if ((ret = ToTraditional_ex(der->buffer, der->length,
  5338. &algId)) > 0) {
  5339. /* Found PKCS8 header */
  5340. /* ToTraditional_ex moves buff and returns adjusted length */
  5341. der->length = ret;
  5342. keyFormat = algId;
  5343. }
  5344. ret = 0; /* failures should be ignored */
  5345. }
  5346. #endif
  5347. }
  5348. }
  5349. if (used) {
  5350. *used = info->consumed;
  5351. }
  5352. /* process user chain */
  5353. if (ret >= 0) {
  5354. /* Chain should have server cert first, then intermediates, then root.
  5355. * First certificate in chain is processed below after ProcessUserChain
  5356. * and is loaded into ssl->buffers.certificate.
  5357. * Remainder are processed using ProcessUserChain and are loaded into
  5358. * ssl->buffers.certChain. */
  5359. if (userChain) {
  5360. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  5361. verify);
  5362. if (ret == ASN_NO_PEM_HEADER) { /* Additional chain is optional */
  5363. unsigned long pemErr;
  5364. CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr);
  5365. ret = 0;
  5366. }
  5367. }
  5368. }
  5369. /* info is only used for private key with DER or PEM, so free now */
  5370. if (ret < 0 || type != PRIVATEKEY_TYPE) {
  5371. #ifdef WOLFSSL_SMALL_STACK
  5372. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5373. #endif
  5374. }
  5375. /* check for error */
  5376. if (ret < 0) {
  5377. FreeDer(&der);
  5378. done = 1;
  5379. }
  5380. if (done == 1) {
  5381. /* No operation, just skip the next section */
  5382. }
  5383. /* Handle DER owner */
  5384. else if (type == CA_TYPE) {
  5385. if (ctx == NULL) {
  5386. WOLFSSL_MSG("Need context for CA load");
  5387. FreeDer(&der);
  5388. return BAD_FUNC_ARG;
  5389. }
  5390. /* verify CA unless user set to no verify */
  5391. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  5392. done = 1;
  5393. }
  5394. #ifdef WOLFSSL_TRUST_PEER_CERT
  5395. else if (type == TRUSTED_PEER_TYPE) {
  5396. /* add trusted peer cert. der is freed within */
  5397. if (ctx != NULL)
  5398. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  5399. else
  5400. ret = AddTrustedPeer(SSL_CM(ssl), &der, !ssl->options.verifyNone);
  5401. if (ret != WOLFSSL_SUCCESS) {
  5402. WOLFSSL_MSG("Error adding trusted peer");
  5403. }
  5404. done = 1;
  5405. }
  5406. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5407. else if (type == CERT_TYPE) {
  5408. if (ssl != NULL) {
  5409. /* Make sure previous is free'd */
  5410. if (ssl->buffers.weOwnCert) {
  5411. FreeDer(&ssl->buffers.certificate);
  5412. #ifdef KEEP_OUR_CERT
  5413. wolfSSL_X509_free(ssl->ourCert);
  5414. ssl->ourCert = NULL;
  5415. #endif
  5416. }
  5417. ssl->buffers.certificate = der;
  5418. #ifdef KEEP_OUR_CERT
  5419. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  5420. #endif
  5421. ssl->buffers.weOwnCert = 1;
  5422. }
  5423. else if (ctx != NULL) {
  5424. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  5425. #ifdef KEEP_OUR_CERT
  5426. if (ctx->ourCert) {
  5427. if (ctx->ownOurCert)
  5428. wolfSSL_X509_free(ctx->ourCert);
  5429. ctx->ourCert = NULL;
  5430. }
  5431. #endif
  5432. ctx->certificate = der;
  5433. }
  5434. }
  5435. else if (type == PRIVATEKEY_TYPE) {
  5436. if (ssl != NULL) {
  5437. /* Make sure previous is free'd */
  5438. if (ssl->buffers.weOwnKey) {
  5439. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  5440. FreeDer(&ssl->buffers.key);
  5441. }
  5442. ssl->buffers.key = der;
  5443. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5444. wc_MemZero_Add("SSL Buffers key", der->buffer, der->length);
  5445. #endif
  5446. ssl->buffers.weOwnKey = 1;
  5447. }
  5448. else if (ctx != NULL) {
  5449. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  5450. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  5451. }
  5452. FreeDer(&ctx->privateKey);
  5453. ctx->privateKey = der;
  5454. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5455. wc_MemZero_Add("CTX private key", der->buffer, der->length);
  5456. #endif
  5457. }
  5458. }
  5459. else {
  5460. FreeDer(&der);
  5461. return WOLFSSL_BAD_CERTTYPE;
  5462. }
  5463. if (done == 1) {
  5464. /* No operation, just skip the next section */
  5465. }
  5466. else if (type == PRIVATEKEY_TYPE) {
  5467. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  5468. &keyFormat, heap, devId);
  5469. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5470. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  5471. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  5472. if ((ret != 0 || keyFormat == 0)
  5473. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  5474. {
  5475. int passwordSz = NAME_SZ;
  5476. #ifndef WOLFSSL_SMALL_STACK
  5477. char password[NAME_SZ];
  5478. #else
  5479. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  5480. if (password == NULL) {
  5481. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5482. FreeDer(&der);
  5483. return MEMORY_E;
  5484. }
  5485. #endif
  5486. /* get password */
  5487. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  5488. info->passwd_userdata);
  5489. if (ret >= 0) {
  5490. passwordSz = ret;
  5491. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5492. wc_MemZero_Add("ProcessBuffer password", password, passwordSz);
  5493. #endif
  5494. /* PKCS8 decrypt */
  5495. ret = ToTraditionalEnc(der->buffer, der->length,
  5496. password, passwordSz, &algId);
  5497. if (ret >= 0) {
  5498. ForceZero(der->buffer + ret, der->length - ret);
  5499. der->length = ret;
  5500. }
  5501. /* ignore failures and try parsing as unencrypted */
  5502. ForceZero(password, passwordSz);
  5503. }
  5504. #ifdef WOLFSSL_SMALL_STACK
  5505. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  5506. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  5507. wc_MemZero_Check(password, NAME_SZ);
  5508. #endif
  5509. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  5510. &resetSuites, &keyFormat, heap, devId);
  5511. }
  5512. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  5513. #ifdef WOLFSSL_SMALL_STACK
  5514. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5515. #endif
  5516. if (ret != 0)
  5517. return ret;
  5518. if (keyFormat == 0) {
  5519. #ifdef OPENSSL_EXTRA
  5520. /* Reaching this point probably means that the
  5521. * decryption password is wrong */
  5522. if (info->passwd_cb)
  5523. EVPerr(0, EVP_R_BAD_DECRYPT);
  5524. #endif
  5525. WOLFSSL_ERROR(WOLFSSL_BAD_FILE);
  5526. return WOLFSSL_BAD_FILE;
  5527. }
  5528. (void)devId;
  5529. }
  5530. else if (type == CERT_TYPE) {
  5531. #ifdef WOLFSSL_SMALL_STACK
  5532. DecodedCert* cert;
  5533. #else
  5534. DecodedCert cert[1];
  5535. #endif
  5536. #ifdef WOLF_PRIVATE_KEY_ID
  5537. int keyType = 0;
  5538. #endif
  5539. #ifdef WOLFSSL_SMALL_STACK
  5540. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  5541. DYNAMIC_TYPE_DCERT);
  5542. if (cert == NULL)
  5543. return MEMORY_E;
  5544. #endif
  5545. WOLFSSL_MSG("Checking cert signature type");
  5546. InitDecodedCert(cert, der->buffer, der->length, heap);
  5547. if (DecodeToKey(cert, 0) < 0) {
  5548. WOLFSSL_MSG("Decode to key failed");
  5549. FreeDecodedCert(cert);
  5550. #ifdef WOLFSSL_SMALL_STACK
  5551. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5552. #endif
  5553. return WOLFSSL_BAD_FILE;
  5554. }
  5555. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5556. resetSuites = 1;
  5557. }
  5558. if (ssl && ssl->ctx->haveECDSAsig) {
  5559. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  5560. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  5561. }
  5562. switch (cert->signatureOID) {
  5563. case CTC_SHAwECDSA:
  5564. case CTC_SHA256wECDSA:
  5565. case CTC_SHA384wECDSA:
  5566. case CTC_SHA512wECDSA:
  5567. case CTC_ED25519:
  5568. case CTC_ED448:
  5569. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  5570. if (ssl)
  5571. ssl->options.haveECDSAsig = 1;
  5572. else if (ctx)
  5573. ctx->haveECDSAsig = 1;
  5574. break;
  5575. case CTC_FALCON_LEVEL1:
  5576. case CTC_FALCON_LEVEL5:
  5577. WOLFSSL_MSG("Falcon cert signature");
  5578. if (ssl)
  5579. ssl->options.haveFalconSig = 1;
  5580. else if (ctx)
  5581. ctx->haveFalconSig = 1;
  5582. break;
  5583. case CTC_DILITHIUM_LEVEL2:
  5584. case CTC_DILITHIUM_LEVEL3:
  5585. case CTC_DILITHIUM_LEVEL5:
  5586. case CTC_DILITHIUM_AES_LEVEL2:
  5587. case CTC_DILITHIUM_AES_LEVEL3:
  5588. case CTC_DILITHIUM_AES_LEVEL5:
  5589. WOLFSSL_MSG("Dilithium cert signature");
  5590. if (ssl)
  5591. ssl->options.haveDilithiumSig = 1;
  5592. else if (ctx)
  5593. ctx->haveDilithiumSig = 1;
  5594. break;
  5595. default:
  5596. WOLFSSL_MSG("Not ECDSA cert signature");
  5597. break;
  5598. }
  5599. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5600. defined(HAVE_PQC) || !defined(NO_RSA)
  5601. if (ssl) {
  5602. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5603. (defined(HAVE_CURVE448) && defined(HAVE_ED448))
  5604. ssl->pkCurveOID = cert->pkCurveOID;
  5605. #endif
  5606. #ifndef WC_STRICT_SIG
  5607. if (cert->keyOID == ECDSAk) {
  5608. ssl->options.haveECC = 1;
  5609. }
  5610. #ifndef NO_RSA
  5611. else if (cert->keyOID == RSAk) {
  5612. ssl->options.haveRSA = 1;
  5613. }
  5614. #ifdef WC_RSA_PSS
  5615. else if (cert->keyOID == RSAPSSk) {
  5616. ssl->options.haveRSA = 1;
  5617. }
  5618. #endif
  5619. #endif
  5620. #ifdef HAVE_ED25519
  5621. else if (cert->keyOID == ED25519k) {
  5622. ssl->options.haveECC = 1;
  5623. }
  5624. #endif
  5625. #ifdef HAVE_ED448
  5626. else if (cert->keyOID == ED448k) {
  5627. ssl->options.haveECC = 1;
  5628. }
  5629. #endif
  5630. #ifdef HAVE_PQC
  5631. #ifdef HAVE_FALCON
  5632. else if (cert->keyOID == FALCON_LEVEL1k ||
  5633. cert->keyOID == FALCON_LEVEL5k) {
  5634. ssl->options.haveFalconSig = 1;
  5635. }
  5636. #endif /* HAVE_FALCON */
  5637. #ifdef HAVE_DILITHIUM
  5638. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  5639. cert->keyOID == DILITHIUM_LEVEL3k ||
  5640. cert->keyOID == DILITHIUM_LEVEL5k ||
  5641. cert->keyOID == DILITHIUM_AES_LEVEL2k ||
  5642. cert->keyOID == DILITHIUM_AES_LEVEL3k ||
  5643. cert->keyOID == DILITHIUM_AES_LEVEL5k) {
  5644. ssl->options.haveDilithiumSig = 1;
  5645. }
  5646. #endif /* HAVE_DILITHIUM */
  5647. #endif /* HAVE_PQC */
  5648. #else
  5649. ssl->options.haveECC = ssl->options.haveECDSAsig;
  5650. #endif
  5651. }
  5652. else if (ctx) {
  5653. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5654. ctx->pkCurveOID = cert->pkCurveOID;
  5655. #endif
  5656. #ifndef WC_STRICT_SIG
  5657. if (cert->keyOID == ECDSAk) {
  5658. ctx->haveECC = 1;
  5659. }
  5660. #ifndef NO_RSA
  5661. else if (cert->keyOID == RSAk) {
  5662. ctx->haveRSA = 1;
  5663. }
  5664. #ifdef WC_RSA_PSS
  5665. else if (cert->keyOID == RSAPSSk) {
  5666. ctx->haveRSA = 1;
  5667. }
  5668. #endif
  5669. #endif
  5670. #ifdef HAVE_ED25519
  5671. else if (cert->keyOID == ED25519k) {
  5672. ctx->haveECC = 1;
  5673. }
  5674. #endif
  5675. #ifdef HAVE_ED448
  5676. else if (cert->keyOID == ED448k) {
  5677. ctx->haveECC = 1;
  5678. }
  5679. #endif
  5680. #ifdef HAVE_PQC
  5681. #ifdef HAVE_FALCON
  5682. else if (cert->keyOID == FALCON_LEVEL1k ||
  5683. cert->keyOID == FALCON_LEVEL5k) {
  5684. ctx->haveFalconSig = 1;
  5685. }
  5686. #endif /* HAVE_FALCON */
  5687. #ifdef HAVE_DILITHIUM
  5688. else if (cert->keyOID == DILITHIUM_LEVEL2k ||
  5689. cert->keyOID == DILITHIUM_LEVEL3k ||
  5690. cert->keyOID == DILITHIUM_LEVEL5k ||
  5691. cert->keyOID == DILITHIUM_AES_LEVEL2k ||
  5692. cert->keyOID == DILITHIUM_AES_LEVEL3k ||
  5693. cert->keyOID == DILITHIUM_AES_LEVEL5k) {
  5694. ctx->haveDilithiumSig = 1;
  5695. }
  5696. #endif /* HAVE_DILITHIUM */
  5697. #endif /* HAVE_PQC */
  5698. #else
  5699. ctx->haveECC = ctx->haveECDSAsig;
  5700. #endif
  5701. }
  5702. #endif
  5703. /* check key size of cert unless specified not to */
  5704. switch (cert->keyOID) {
  5705. #ifndef NO_RSA
  5706. #ifdef WC_RSA_PSS
  5707. case RSAPSSk:
  5708. #endif
  5709. case RSAk:
  5710. #ifdef WOLF_PRIVATE_KEY_ID
  5711. keyType = rsa_sa_algo;
  5712. #endif
  5713. /* Determine RSA key size by parsing public key */
  5714. idx = 0;
  5715. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  5716. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  5717. if (ret < 0)
  5718. break;
  5719. if (ssl && !ssl->options.verifyNone) {
  5720. if (ssl->options.minRsaKeySz < 0 ||
  5721. keySz < (int)ssl->options.minRsaKeySz) {
  5722. ret = RSA_KEY_SIZE_E;
  5723. WOLFSSL_MSG("Certificate RSA key size too small");
  5724. }
  5725. }
  5726. else if (ctx && !ctx->verifyNone) {
  5727. if (ctx->minRsaKeySz < 0 ||
  5728. keySz < (int)ctx->minRsaKeySz) {
  5729. ret = RSA_KEY_SIZE_E;
  5730. WOLFSSL_MSG("Certificate RSA key size too small");
  5731. }
  5732. }
  5733. break;
  5734. #endif /* !NO_RSA */
  5735. #ifdef HAVE_ECC
  5736. case ECDSAk:
  5737. #ifdef WOLF_PRIVATE_KEY_ID
  5738. keyType = ecc_dsa_sa_algo;
  5739. #endif
  5740. /* Determine ECC key size based on curve */
  5741. keySz = wc_ecc_get_curve_size_from_id(
  5742. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  5743. if (ssl && !ssl->options.verifyNone) {
  5744. if (ssl->options.minEccKeySz < 0 ||
  5745. keySz < (int)ssl->options.minEccKeySz) {
  5746. ret = ECC_KEY_SIZE_E;
  5747. WOLFSSL_MSG("Certificate ECC key size error");
  5748. }
  5749. }
  5750. else if (ctx && !ctx->verifyNone) {
  5751. if (ctx->minEccKeySz < 0 ||
  5752. keySz < (int)ctx->minEccKeySz) {
  5753. ret = ECC_KEY_SIZE_E;
  5754. WOLFSSL_MSG("Certificate ECC key size error");
  5755. }
  5756. }
  5757. break;
  5758. #endif /* HAVE_ECC */
  5759. #ifdef HAVE_ED25519
  5760. case ED25519k:
  5761. #ifdef WOLF_PRIVATE_KEY_ID
  5762. keyType = ed25519_sa_algo;
  5763. #endif
  5764. /* ED25519 is fixed key size */
  5765. keySz = ED25519_KEY_SIZE;
  5766. if (ssl && !ssl->options.verifyNone) {
  5767. if (ssl->options.minEccKeySz < 0 ||
  5768. keySz < (int)ssl->options.minEccKeySz) {
  5769. ret = ECC_KEY_SIZE_E;
  5770. WOLFSSL_MSG("Certificate Ed key size error");
  5771. }
  5772. }
  5773. else if (ctx && !ctx->verifyNone) {
  5774. if (ctx->minEccKeySz < 0 ||
  5775. keySz < (int)ctx->minEccKeySz) {
  5776. ret = ECC_KEY_SIZE_E;
  5777. WOLFSSL_MSG("Certificate ECC key size error");
  5778. }
  5779. }
  5780. break;
  5781. #endif /* HAVE_ED25519 */
  5782. #ifdef HAVE_ED448
  5783. case ED448k:
  5784. #ifdef WOLF_PRIVATE_KEY_ID
  5785. keyType = ed448_sa_algo;
  5786. #endif
  5787. /* ED448 is fixed key size */
  5788. keySz = ED448_KEY_SIZE;
  5789. if (ssl && !ssl->options.verifyNone) {
  5790. if (ssl->options.minEccKeySz < 0 ||
  5791. keySz < (int)ssl->options.minEccKeySz) {
  5792. ret = ECC_KEY_SIZE_E;
  5793. WOLFSSL_MSG("Certificate Ed key size error");
  5794. }
  5795. }
  5796. else if (ctx && !ctx->verifyNone) {
  5797. if (ctx->minEccKeySz < 0 ||
  5798. keySz < (int)ctx->minEccKeySz) {
  5799. ret = ECC_KEY_SIZE_E;
  5800. WOLFSSL_MSG("Certificate ECC key size error");
  5801. }
  5802. }
  5803. break;
  5804. #endif /* HAVE_ED448 */
  5805. #if defined(HAVE_PQC)
  5806. #if defined(HAVE_FALCON)
  5807. case FALCON_LEVEL1k:
  5808. case FALCON_LEVEL5k:
  5809. /* Falcon is fixed key size */
  5810. keySz = FALCON_MAX_KEY_SIZE;
  5811. if (ssl && !ssl->options.verifyNone) {
  5812. if (ssl->options.minFalconKeySz < 0 ||
  5813. keySz < (int)ssl->options.minFalconKeySz) {
  5814. ret = FALCON_KEY_SIZE_E;
  5815. WOLFSSL_MSG("Certificate Falcon key size error");
  5816. }
  5817. }
  5818. else if (ctx && !ctx->verifyNone) {
  5819. if (ctx->minFalconKeySz < 0 ||
  5820. keySz < (int)ctx->minFalconKeySz) {
  5821. ret = FALCON_KEY_SIZE_E;
  5822. WOLFSSL_MSG("Certificate Falcon key size error");
  5823. }
  5824. }
  5825. break;
  5826. #endif /* HAVE_FALCON */
  5827. #if defined(HAVE_DILITHIUM)
  5828. case DILITHIUM_LEVEL2k:
  5829. case DILITHIUM_LEVEL3k:
  5830. case DILITHIUM_LEVEL5k:
  5831. case DILITHIUM_AES_LEVEL2k:
  5832. case DILITHIUM_AES_LEVEL3k:
  5833. case DILITHIUM_AES_LEVEL5k:
  5834. /* Dilithium is fixed key size */
  5835. keySz = DILITHIUM_MAX_KEY_SIZE;
  5836. if (ssl && !ssl->options.verifyNone) {
  5837. if (ssl->options.minDilithiumKeySz < 0 ||
  5838. keySz < (int)ssl->options.minDilithiumKeySz) {
  5839. ret = DILITHIUM_KEY_SIZE_E;
  5840. WOLFSSL_MSG("Certificate Dilithium key size error");
  5841. }
  5842. }
  5843. else if (ctx && !ctx->verifyNone) {
  5844. if (ctx->minDilithiumKeySz < 0 ||
  5845. keySz < (int)ctx->minDilithiumKeySz) {
  5846. ret = DILITHIUM_KEY_SIZE_E;
  5847. WOLFSSL_MSG("Certificate Dilithium key size error");
  5848. }
  5849. }
  5850. break;
  5851. #endif /* HAVE_DILITHIUM */
  5852. #endif /* HAVE_PQC */
  5853. default:
  5854. WOLFSSL_MSG("No key size check done on certificate");
  5855. break; /* do no check if not a case for the key */
  5856. }
  5857. #ifdef WOLF_PRIVATE_KEY_ID
  5858. if (ssl != NULL && ssl->buffers.keyType == 0) {
  5859. ssl->buffers.keyType = keyType;
  5860. ssl->buffers.keySz = keySz;
  5861. }
  5862. else if (ctx != NULL && ctx->privateKeyType == 0) {
  5863. ctx->privateKeyType = keyType;
  5864. ctx->privateKeySz = keySz;
  5865. }
  5866. #endif
  5867. FreeDecodedCert(cert);
  5868. #ifdef WOLFSSL_SMALL_STACK
  5869. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5870. #endif
  5871. if (ret != 0) {
  5872. done = 1;
  5873. }
  5874. }
  5875. if (done == 1) {
  5876. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  5877. !defined(WOLFSSL_NO_CLIENT_AUTH))
  5878. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  5879. /* Call to over-ride status */
  5880. if ((ctx != NULL) && (ctx->cm != NULL) &&
  5881. (ctx->cm->verifyCallback != NULL)) {
  5882. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  5883. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  5884. }
  5885. }
  5886. #endif /* NO_WOLFSSL_CM_VERIFY */
  5887. return ret;
  5888. }
  5889. if (ssl && resetSuites) {
  5890. word16 havePSK = 0;
  5891. word16 haveRSA = 0;
  5892. #ifndef NO_PSK
  5893. if (ssl->options.havePSK) {
  5894. havePSK = 1;
  5895. }
  5896. #endif
  5897. #ifndef NO_RSA
  5898. haveRSA = 1;
  5899. #endif
  5900. keySz = ssl->buffers.keySz;
  5901. /* let's reset suites */
  5902. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  5903. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  5904. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  5905. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5906. ssl->options.haveAnon, TRUE, ssl->options.side);
  5907. }
  5908. return WOLFSSL_SUCCESS;
  5909. }
  5910. /* CA PEM file for verification, may have multiple/chain certs to process */
  5911. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5912. long sz, int format, int type, WOLFSSL* ssl, int verify)
  5913. {
  5914. long used = 0;
  5915. int ret = 0;
  5916. int gotOne = 0;
  5917. WOLFSSL_MSG("Processing CA PEM file");
  5918. while (used < sz) {
  5919. long consumed = 0;
  5920. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  5921. &consumed, 0, verify);
  5922. if (ret < 0) {
  5923. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  5924. DerBuffer* der = NULL;
  5925. EncryptedInfo info;
  5926. WOLFSSL_MSG("Trying a CRL");
  5927. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  5928. NULL) == 0) {
  5929. WOLFSSL_MSG(" Processed a CRL");
  5930. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  5931. der->length, WOLFSSL_FILETYPE_ASN1);
  5932. FreeDer(&der);
  5933. used += info.consumed;
  5934. continue;
  5935. }
  5936. #endif
  5937. if (consumed > 0) { /* Made progress in file */
  5938. WOLFSSL_ERROR(ret);
  5939. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  5940. WOLFSSL_MSG("Search for other certs in file");
  5941. }
  5942. else {
  5943. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  5944. WOLFSSL_MSG("Do not continue search for other certs in file");
  5945. break;
  5946. }
  5947. }
  5948. else {
  5949. WOLFSSL_MSG(" Processed a CA");
  5950. gotOne = 1;
  5951. }
  5952. used += consumed;
  5953. }
  5954. if (gotOne) {
  5955. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  5956. return WOLFSSL_SUCCESS;
  5957. }
  5958. return ret;
  5959. }
  5960. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  5961. {
  5962. #ifndef NO_WOLFSSL_CLIENT
  5963. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  5964. return wolfSSLv3_client_method();
  5965. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  5966. return wolfTLSv1_client_method();
  5967. #elif !defined(NO_OLD_TLS)
  5968. return wolfTLSv1_1_client_method();
  5969. #elif !defined(WOLFSSL_NO_TLS12)
  5970. return wolfTLSv1_2_client_method();
  5971. #elif defined(WOLFSSL_TLS13)
  5972. return wolfTLSv1_3_client_method();
  5973. #else
  5974. return NULL;
  5975. #endif
  5976. #elif !defined(NO_WOLFSSL_SERVER)
  5977. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  5978. return wolfSSLv3_server_method();
  5979. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  5980. return wolfTLSv1_server_method();
  5981. #elif !defined(NO_OLD_TLS)
  5982. return wolfTLSv1_1_server_method();
  5983. #elif !defined(WOLFSSL_NO_TLS12)
  5984. return wolfTLSv1_2_server_method();
  5985. #elif defined(WOLFSSL_TLS13)
  5986. return wolfTLSv1_3_server_method();
  5987. #else
  5988. return NULL;
  5989. #endif
  5990. #else
  5991. return NULL;
  5992. #endif
  5993. }
  5994. /* like load verify locations, 1 for success, < 0 for error */
  5995. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  5996. const unsigned char* in, long sz, int format)
  5997. {
  5998. int ret = WOLFSSL_FATAL_ERROR;
  5999. WOLFSSL_CTX* tmp;
  6000. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  6001. if (cm == NULL) {
  6002. WOLFSSL_MSG("No CertManager error");
  6003. return ret;
  6004. }
  6005. tmp = wolfSSL_CTX_new(cm_pick_method());
  6006. if (tmp == NULL) {
  6007. WOLFSSL_MSG("CTX new failed");
  6008. return ret;
  6009. }
  6010. /* for tmp use */
  6011. wolfSSL_CertManagerFree(tmp->cm);
  6012. tmp->cm = cm;
  6013. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  6014. /* don't loose our good one */
  6015. tmp->cm = NULL;
  6016. wolfSSL_CTX_free(tmp);
  6017. return ret;
  6018. }
  6019. #ifdef HAVE_CRL
  6020. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  6021. const unsigned char* buff, long sz, int type)
  6022. {
  6023. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  6024. if (cm == NULL)
  6025. return BAD_FUNC_ARG;
  6026. if (cm->crl == NULL) {
  6027. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  6028. WOLFSSL_MSG("Enable CRL failed");
  6029. return WOLFSSL_FATAL_ERROR;
  6030. }
  6031. }
  6032. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  6033. }
  6034. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  6035. {
  6036. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  6037. if (cm == NULL)
  6038. return BAD_FUNC_ARG;
  6039. if (cm->crl != NULL){
  6040. FreeCRL(cm->crl, 1);
  6041. cm->crl = NULL;
  6042. }
  6043. return WOLFSSL_SUCCESS;
  6044. }
  6045. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  6046. long sz, int type)
  6047. {
  6048. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  6049. if (ctx == NULL)
  6050. return BAD_FUNC_ARG;
  6051. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  6052. }
  6053. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  6054. long sz, int type)
  6055. {
  6056. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  6057. if (ssl == NULL || ssl->ctx == NULL)
  6058. return BAD_FUNC_ARG;
  6059. return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type);
  6060. }
  6061. #endif /* HAVE_CRL */
  6062. /* turn on CRL if off and compiled in, set options */
  6063. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  6064. {
  6065. int ret = WOLFSSL_SUCCESS;
  6066. (void)options;
  6067. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  6068. if (cm == NULL)
  6069. return BAD_FUNC_ARG;
  6070. #ifdef HAVE_CRL
  6071. if (cm->crl == NULL) {
  6072. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  6073. DYNAMIC_TYPE_CRL);
  6074. if (cm->crl == NULL)
  6075. return MEMORY_E;
  6076. if (InitCRL(cm->crl, cm) != 0) {
  6077. WOLFSSL_MSG("Init CRL failed");
  6078. FreeCRL(cm->crl, 1);
  6079. cm->crl = NULL;
  6080. return WOLFSSL_FAILURE;
  6081. }
  6082. #if defined(HAVE_CRL_IO) && defined(USE_WOLFSSL_IO)
  6083. cm->crl->crlIOCb = EmbedCrlLookup;
  6084. #endif
  6085. }
  6086. cm->crlEnabled = 1;
  6087. if (options & WOLFSSL_CRL_CHECKALL)
  6088. cm->crlCheckAll = 1;
  6089. #else
  6090. ret = NOT_COMPILED_IN;
  6091. #endif
  6092. return ret;
  6093. }
  6094. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  6095. {
  6096. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  6097. if (cm == NULL)
  6098. return BAD_FUNC_ARG;
  6099. cm->crlEnabled = 0;
  6100. return WOLFSSL_SUCCESS;
  6101. }
  6102. #ifndef NO_WOLFSSL_CM_VERIFY
  6103. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  6104. {
  6105. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  6106. if (cm == NULL)
  6107. return;
  6108. cm->verifyCallback = vc;
  6109. }
  6110. #endif /* NO_WOLFSSL_CM_VERIFY */
  6111. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  6112. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6113. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  6114. long sz, int format, int err_val)
  6115. {
  6116. int ret = 0;
  6117. DerBuffer* der = NULL;
  6118. #ifdef WOLFSSL_SMALL_STACK
  6119. DecodedCert* cert;
  6120. #else
  6121. DecodedCert cert[1];
  6122. #endif
  6123. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  6124. #ifdef WOLFSSL_SMALL_STACK
  6125. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  6126. DYNAMIC_TYPE_DCERT);
  6127. if (cert == NULL)
  6128. return MEMORY_E;
  6129. #endif
  6130. if (format == WOLFSSL_FILETYPE_PEM) {
  6131. #ifdef WOLFSSL_PEM_TO_DER
  6132. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  6133. if (ret != 0) {
  6134. FreeDer(&der);
  6135. #ifdef WOLFSSL_SMALL_STACK
  6136. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6137. #endif
  6138. return ret;
  6139. }
  6140. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  6141. #else
  6142. ret = NOT_COMPILED_IN;
  6143. #endif
  6144. }
  6145. else {
  6146. InitDecodedCert(cert, buff, (word32)sz, cm->heap);
  6147. }
  6148. if (ret == 0)
  6149. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  6150. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  6151. /* ret needs to be self-singer error for Qt compat */
  6152. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  6153. ret = ASN_SELF_SIGNED_E;
  6154. #endif
  6155. #ifdef HAVE_CRL
  6156. if (ret == 0 && cm->crlEnabled)
  6157. ret = CheckCertCRL(cm->crl, cert);
  6158. #endif
  6159. #ifndef NO_WOLFSSL_CM_VERIFY
  6160. /* if verify callback has been set */
  6161. if (cm->verifyCallback) {
  6162. buffer certBuf;
  6163. #ifdef WOLFSSL_SMALL_STACK
  6164. ProcPeerCertArgs* args;
  6165. args = (ProcPeerCertArgs*)XMALLOC(
  6166. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6167. if (args == NULL) {
  6168. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6169. return MEMORY_E;
  6170. }
  6171. #else
  6172. ProcPeerCertArgs args[1];
  6173. #endif
  6174. certBuf.buffer = (byte*)buff;
  6175. certBuf.length = (unsigned int)sz;
  6176. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  6177. args->totalCerts = 1;
  6178. args->certs = &certBuf;
  6179. args->dCert = cert;
  6180. args->dCertInit = 1;
  6181. if (err_val != 0) {
  6182. ret = err_val;
  6183. }
  6184. ret = DoVerifyCallback(cm, NULL, ret, args);
  6185. #ifdef WOLFSSL_SMALL_STACK
  6186. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6187. #endif
  6188. }
  6189. #else
  6190. (void)err_val;
  6191. #endif
  6192. FreeDecodedCert(cert);
  6193. FreeDer(&der);
  6194. #ifdef WOLFSSL_SMALL_STACK
  6195. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6196. #endif
  6197. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6198. }
  6199. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6200. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  6201. long sz, int format)
  6202. {
  6203. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  6204. }
  6205. #endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
  6206. /* turn on OCSP if off and compiled in, set options */
  6207. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  6208. {
  6209. int ret = WOLFSSL_SUCCESS;
  6210. (void)options;
  6211. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  6212. if (cm == NULL)
  6213. return BAD_FUNC_ARG;
  6214. #ifdef HAVE_OCSP
  6215. if (cm->ocsp == NULL) {
  6216. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  6217. DYNAMIC_TYPE_OCSP);
  6218. if (cm->ocsp == NULL)
  6219. return MEMORY_E;
  6220. if (InitOCSP(cm->ocsp, cm) != 0) {
  6221. WOLFSSL_MSG("Init OCSP failed");
  6222. FreeOCSP(cm->ocsp, 1);
  6223. cm->ocsp = NULL;
  6224. return WOLFSSL_FAILURE;
  6225. }
  6226. }
  6227. cm->ocspEnabled = 1;
  6228. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  6229. cm->ocspUseOverrideURL = 1;
  6230. if (options & WOLFSSL_OCSP_NO_NONCE)
  6231. cm->ocspSendNonce = 0;
  6232. else
  6233. cm->ocspSendNonce = 1;
  6234. if (options & WOLFSSL_OCSP_CHECKALL)
  6235. cm->ocspCheckAll = 1;
  6236. #ifndef WOLFSSL_USER_IO
  6237. cm->ocspIOCb = EmbedOcspLookup;
  6238. cm->ocspRespFreeCb = EmbedOcspRespFree;
  6239. cm->ocspIOCtx = cm->heap;
  6240. #endif /* WOLFSSL_USER_IO */
  6241. #else
  6242. ret = NOT_COMPILED_IN;
  6243. #endif
  6244. return ret;
  6245. }
  6246. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  6247. {
  6248. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  6249. if (cm == NULL)
  6250. return BAD_FUNC_ARG;
  6251. cm->ocspEnabled = 0;
  6252. return WOLFSSL_SUCCESS;
  6253. }
  6254. /* turn on OCSP Stapling if off and compiled in, set options */
  6255. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  6256. {
  6257. int ret = WOLFSSL_SUCCESS;
  6258. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  6259. if (cm == NULL)
  6260. return BAD_FUNC_ARG;
  6261. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6262. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6263. #ifndef NO_WOLFSSL_SERVER
  6264. if (cm->ocsp_stapling == NULL) {
  6265. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  6266. cm->heap, DYNAMIC_TYPE_OCSP);
  6267. if (cm->ocsp_stapling == NULL)
  6268. return MEMORY_E;
  6269. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  6270. WOLFSSL_MSG("Init OCSP failed");
  6271. FreeOCSP(cm->ocsp_stapling, 1);
  6272. cm->ocsp_stapling = NULL;
  6273. return WOLFSSL_FAILURE;
  6274. }
  6275. }
  6276. #ifndef WOLFSSL_USER_IO
  6277. cm->ocspIOCb = EmbedOcspLookup;
  6278. cm->ocspRespFreeCb = EmbedOcspRespFree;
  6279. cm->ocspIOCtx = cm->heap;
  6280. #endif /* WOLFSSL_USER_IO */
  6281. #endif /* NO_WOLFSSL_SERVER */
  6282. cm->ocspStaplingEnabled = 1;
  6283. #else
  6284. ret = NOT_COMPILED_IN;
  6285. #endif
  6286. return ret;
  6287. }
  6288. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  6289. {
  6290. int ret = WOLFSSL_SUCCESS;
  6291. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  6292. if (cm == NULL)
  6293. return BAD_FUNC_ARG;
  6294. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6295. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6296. cm->ocspStaplingEnabled = 0;
  6297. #else
  6298. ret = NOT_COMPILED_IN;
  6299. #endif
  6300. return ret;
  6301. }
  6302. /* require OCSP stapling response */
  6303. int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  6304. {
  6305. int ret;
  6306. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
  6307. if (cm == NULL)
  6308. return BAD_FUNC_ARG;
  6309. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6310. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6311. #ifndef NO_WOLFSSL_CLIENT
  6312. cm->ocspMustStaple = 1;
  6313. #endif
  6314. ret = WOLFSSL_SUCCESS;
  6315. #else
  6316. ret = NOT_COMPILED_IN;
  6317. #endif
  6318. return ret;
  6319. }
  6320. int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  6321. {
  6322. int ret;
  6323. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
  6324. if (cm == NULL)
  6325. return BAD_FUNC_ARG;
  6326. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6327. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6328. #ifndef NO_WOLFSSL_CLIENT
  6329. cm->ocspMustStaple = 0;
  6330. #endif
  6331. ret = WOLFSSL_SUCCESS;
  6332. #else
  6333. ret = NOT_COMPILED_IN;
  6334. #endif
  6335. return ret;
  6336. }
  6337. #ifdef HAVE_OCSP
  6338. /* check CRL if enabled, WOLFSSL_SUCCESS */
  6339. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  6340. {
  6341. int ret;
  6342. #ifdef WOLFSSL_SMALL_STACK
  6343. DecodedCert* cert = NULL;
  6344. #else
  6345. DecodedCert cert[1];
  6346. #endif
  6347. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  6348. if (cm == NULL)
  6349. return BAD_FUNC_ARG;
  6350. if (cm->ocspEnabled == 0)
  6351. return WOLFSSL_SUCCESS;
  6352. #ifdef WOLFSSL_SMALL_STACK
  6353. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
  6354. if (cert == NULL)
  6355. return MEMORY_E;
  6356. #endif
  6357. InitDecodedCert(cert, der, sz, NULL);
  6358. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  6359. WOLFSSL_MSG("ParseCert failed");
  6360. }
  6361. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  6362. WOLFSSL_MSG("CheckCertOCSP failed");
  6363. }
  6364. FreeDecodedCert(cert);
  6365. #ifdef WOLFSSL_SMALL_STACK
  6366. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  6367. #endif
  6368. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6369. }
  6370. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  6371. byte *response, int responseSz, buffer *responseBuffer,
  6372. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  6373. {
  6374. int ret;
  6375. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSPResponse");
  6376. if (cm == NULL || response == NULL)
  6377. return BAD_FUNC_ARG;
  6378. if (cm->ocspEnabled == 0)
  6379. return WOLFSSL_SUCCESS;
  6380. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  6381. entry, ocspRequest);
  6382. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6383. }
  6384. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  6385. const char* url)
  6386. {
  6387. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  6388. if (cm == NULL)
  6389. return BAD_FUNC_ARG;
  6390. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  6391. if (url != NULL) {
  6392. int urlSz = (int)XSTRLEN(url) + 1;
  6393. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  6394. if (cm->ocspOverrideURL != NULL) {
  6395. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  6396. }
  6397. else
  6398. return MEMORY_E;
  6399. }
  6400. else
  6401. cm->ocspOverrideURL = NULL;
  6402. return WOLFSSL_SUCCESS;
  6403. }
  6404. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  6405. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6406. {
  6407. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  6408. if (cm == NULL)
  6409. return BAD_FUNC_ARG;
  6410. cm->ocspIOCb = ioCb;
  6411. cm->ocspRespFreeCb = respFreeCb;
  6412. cm->ocspIOCtx = ioCbCtx;
  6413. return WOLFSSL_SUCCESS;
  6414. }
  6415. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  6416. {
  6417. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  6418. if (ssl)
  6419. return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options);
  6420. else
  6421. return BAD_FUNC_ARG;
  6422. }
  6423. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  6424. {
  6425. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  6426. if (ssl)
  6427. return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl));
  6428. else
  6429. return BAD_FUNC_ARG;
  6430. }
  6431. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  6432. {
  6433. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  6434. if (ssl)
  6435. return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl));
  6436. else
  6437. return BAD_FUNC_ARG;
  6438. }
  6439. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  6440. {
  6441. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  6442. if (ssl)
  6443. return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl));
  6444. else
  6445. return BAD_FUNC_ARG;
  6446. }
  6447. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  6448. {
  6449. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6450. if (ssl)
  6451. return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url);
  6452. else
  6453. return BAD_FUNC_ARG;
  6454. }
  6455. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  6456. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6457. {
  6458. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  6459. if (ssl) {
  6460. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  6461. return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl),
  6462. ioCb, respFreeCb, NULL);
  6463. }
  6464. else
  6465. return BAD_FUNC_ARG;
  6466. }
  6467. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  6468. {
  6469. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  6470. if (ctx)
  6471. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  6472. else
  6473. return BAD_FUNC_ARG;
  6474. }
  6475. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  6476. {
  6477. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  6478. if (ctx)
  6479. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  6480. else
  6481. return BAD_FUNC_ARG;
  6482. }
  6483. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  6484. {
  6485. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6486. if (ctx)
  6487. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  6488. else
  6489. return BAD_FUNC_ARG;
  6490. }
  6491. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  6492. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6493. {
  6494. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  6495. if (ctx)
  6496. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  6497. respFreeCb, ioCbCtx);
  6498. else
  6499. return BAD_FUNC_ARG;
  6500. }
  6501. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6502. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6503. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  6504. {
  6505. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  6506. if (ctx)
  6507. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  6508. else
  6509. return BAD_FUNC_ARG;
  6510. }
  6511. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  6512. {
  6513. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  6514. if (ctx)
  6515. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  6516. else
  6517. return BAD_FUNC_ARG;
  6518. }
  6519. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6520. {
  6521. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  6522. if (ctx)
  6523. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  6524. else
  6525. return BAD_FUNC_ARG;
  6526. }
  6527. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6528. {
  6529. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  6530. if (ctx)
  6531. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  6532. else
  6533. return BAD_FUNC_ARG;
  6534. }
  6535. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  6536. #endif /* HAVE_OCSP */
  6537. /* macro to get verify settings for AddCA */
  6538. #define GET_VERIFY_SETTING_CTX(ctx) \
  6539. ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY)
  6540. #define GET_VERIFY_SETTING_SSL(ssl) \
  6541. ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY)
  6542. #ifndef NO_FILESYSTEM
  6543. /* process a file with name fname into ctx of format and type
  6544. userChain specifies a user certificate chain to pass during handshake */
  6545. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  6546. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  6547. {
  6548. #ifdef WOLFSSL_SMALL_STACK
  6549. byte staticBuffer[1]; /* force heap usage */
  6550. #else
  6551. byte staticBuffer[FILE_BUFFER_SIZE];
  6552. #endif
  6553. byte* myBuffer = staticBuffer;
  6554. int dynamic = 0;
  6555. int ret;
  6556. long sz = 0;
  6557. XFILE file;
  6558. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  6559. #ifndef NO_CODING
  6560. const char* header = NULL;
  6561. const char* footer = NULL;
  6562. #endif
  6563. (void)crl;
  6564. (void)heapHint;
  6565. if (fname == NULL) return WOLFSSL_BAD_FILE;
  6566. file = XFOPEN(fname, "rb");
  6567. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6568. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  6569. XFCLOSE(file);
  6570. return WOLFSSL_BAD_FILE;
  6571. }
  6572. sz = XFTELL(file);
  6573. XREWIND(file);
  6574. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6575. WOLFSSL_MSG("ProcessFile file size error");
  6576. XFCLOSE(file);
  6577. return WOLFSSL_BAD_FILE;
  6578. }
  6579. if (sz > (long)sizeof(staticBuffer)) {
  6580. WOLFSSL_MSG("Getting dynamic buffer");
  6581. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  6582. if (myBuffer == NULL) {
  6583. XFCLOSE(file);
  6584. return WOLFSSL_BAD_FILE;
  6585. }
  6586. dynamic = 1;
  6587. }
  6588. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6589. ret = WOLFSSL_BAD_FILE;
  6590. else {
  6591. /* Try to detect type by parsing cert header and footer */
  6592. if (type == DETECT_CERT_TYPE) {
  6593. #ifndef NO_CODING
  6594. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  6595. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6596. type = CA_TYPE;
  6597. }
  6598. #ifdef HAVE_CRL
  6599. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  6600. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6601. type = CRL_TYPE;
  6602. }
  6603. #endif
  6604. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  6605. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6606. type = CERT_TYPE;
  6607. }
  6608. else
  6609. #endif
  6610. {
  6611. WOLFSSL_MSG("Failed to detect certificate type");
  6612. if (dynamic)
  6613. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6614. XFCLOSE(file);
  6615. return WOLFSSL_BAD_CERTTYPE;
  6616. }
  6617. }
  6618. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  6619. && format == WOLFSSL_FILETYPE_PEM) {
  6620. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  6621. verify);
  6622. }
  6623. #ifdef HAVE_CRL
  6624. else if (type == CRL_TYPE)
  6625. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  6626. #endif
  6627. else
  6628. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  6629. userChain, verify);
  6630. }
  6631. XFCLOSE(file);
  6632. if (dynamic)
  6633. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6634. return ret;
  6635. }
  6636. /* loads file then loads each file in path, no c_rehash */
  6637. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  6638. const char* path, word32 flags)
  6639. {
  6640. int ret = WOLFSSL_SUCCESS;
  6641. #ifndef NO_WOLFSSL_DIR
  6642. int fileRet;
  6643. int successCount = 0;
  6644. int failCount = 0;
  6645. #endif
  6646. int verify;
  6647. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  6648. if (ctx == NULL || (file == NULL && path == NULL)) {
  6649. return WOLFSSL_FAILURE;
  6650. }
  6651. verify = GET_VERIFY_SETTING_CTX(ctx);
  6652. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  6653. verify = VERIFY_SKIP_DATE;
  6654. if (file) {
  6655. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  6656. NULL, verify);
  6657. #ifndef NO_WOLFSSL_DIR
  6658. if (ret == WOLFSSL_SUCCESS)
  6659. successCount++;
  6660. #endif
  6661. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  6662. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  6663. if (ret != WOLFSSL_SUCCESS) {
  6664. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error");
  6665. }
  6666. #endif
  6667. }
  6668. if (ret == WOLFSSL_SUCCESS && path) {
  6669. #ifndef NO_WOLFSSL_DIR
  6670. char* name = NULL;
  6671. #ifdef WOLFSSL_SMALL_STACK
  6672. ReadDirCtx* readCtx;
  6673. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  6674. DYNAMIC_TYPE_DIRCTX);
  6675. if (readCtx == NULL)
  6676. return MEMORY_E;
  6677. #else
  6678. ReadDirCtx readCtx[1];
  6679. #endif
  6680. /* try to load each regular file in path */
  6681. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  6682. while (fileRet == 0 && name) {
  6683. WOLFSSL_MSG(name); /* log file name */
  6684. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  6685. NULL, 0, NULL, verify);
  6686. if (ret != WOLFSSL_SUCCESS) {
  6687. /* handle flags for ignoring errors, skipping expired certs or
  6688. by PEM certificate header error */
  6689. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  6690. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  6691. (ret == ASN_NO_PEM_HEADER))) {
  6692. /* Do not fail here if a certificate fails to load,
  6693. continue to next file */
  6694. unsigned long err;
  6695. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  6696. #if defined(WOLFSSL_QT)
  6697. ret = WOLFSSL_SUCCESS;
  6698. #endif
  6699. }
  6700. else {
  6701. WOLFSSL_ERROR(ret);
  6702. WOLFSSL_MSG("Load CA file failed, continuing");
  6703. failCount++;
  6704. }
  6705. }
  6706. else {
  6707. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  6708. ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM);
  6709. if (ret != WOLFSSL_SUCCESS) {
  6710. WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. Ignoring"
  6711. "this error.");
  6712. }
  6713. #endif
  6714. successCount++;
  6715. }
  6716. fileRet = wc_ReadDirNext(readCtx, path, &name);
  6717. }
  6718. wc_ReadDirClose(readCtx);
  6719. /* pass directory read failure to response code */
  6720. if (fileRet != WC_READDIR_NOFILE) {
  6721. ret = fileRet;
  6722. #if defined(WOLFSSL_QT)
  6723. if (ret == BAD_PATH_ERROR &&
  6724. flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) {
  6725. /* QSslSocket always loads certs in system folder
  6726. * when it is initialized.
  6727. * Compliant with OpenSSL when flag sets.
  6728. */
  6729. ret = WOLFSSL_SUCCESS;
  6730. }
  6731. else {
  6732. /* qssl socket wants to know errors. */
  6733. WOLFSSL_ERROR(ret);
  6734. }
  6735. #endif
  6736. }
  6737. /* report failure if no files were loaded or there were failures */
  6738. else if (successCount == 0 || failCount > 0) {
  6739. /* use existing error code if exists */
  6740. #if defined(WOLFSSL_QT)
  6741. /* compliant with OpenSSL when flag sets*/
  6742. if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE))
  6743. #endif
  6744. {
  6745. ret = WOLFSSL_FAILURE;
  6746. }
  6747. }
  6748. else {
  6749. ret = WOLFSSL_SUCCESS;
  6750. }
  6751. #ifdef WOLFSSL_SMALL_STACK
  6752. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  6753. #endif
  6754. #else
  6755. ret = NOT_COMPILED_IN;
  6756. (void)flags;
  6757. #endif
  6758. }
  6759. return ret;
  6760. }
  6761. WOLFSSL_ABI
  6762. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  6763. const char* path)
  6764. {
  6765. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  6766. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  6767. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  6768. }
  6769. #ifdef WOLFSSL_TRUST_PEER_CERT
  6770. /* Used to specify a peer cert to match when connecting
  6771. ctx : the ctx structure to load in peer cert
  6772. file: the string name of cert file
  6773. type: type of format such as PEM/DER
  6774. */
  6775. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  6776. {
  6777. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  6778. if (ctx == NULL || file == NULL) {
  6779. return WOLFSSL_FAILURE;
  6780. }
  6781. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  6782. GET_VERIFY_SETTING_CTX(ctx));
  6783. }
  6784. int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int type)
  6785. {
  6786. WOLFSSL_ENTER("wolfSSL_trust_peer_cert");
  6787. if (ssl == NULL || file == NULL) {
  6788. return WOLFSSL_FAILURE;
  6789. }
  6790. return ProcessFile(NULL, file, type, TRUSTED_PEER_TYPE, ssl, 0, NULL,
  6791. GET_VERIFY_SETTING_SSL(ssl));
  6792. }
  6793. #endif /* WOLFSSL_TRUST_PEER_CERT */
  6794. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  6795. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6796. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  6797. int format)
  6798. {
  6799. int ret = WOLFSSL_FATAL_ERROR;
  6800. #ifdef WOLFSSL_SMALL_STACK
  6801. byte staticBuffer[1]; /* force heap usage */
  6802. #else
  6803. byte staticBuffer[FILE_BUFFER_SIZE];
  6804. #endif
  6805. byte* myBuffer = staticBuffer;
  6806. int dynamic = 0;
  6807. long sz = 0;
  6808. XFILE file = XFOPEN(fname, "rb");
  6809. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  6810. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6811. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  6812. XFCLOSE(file);
  6813. return WOLFSSL_BAD_FILE;
  6814. }
  6815. sz = XFTELL(file);
  6816. XREWIND(file);
  6817. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6818. WOLFSSL_MSG("CertManagerVerify file size error");
  6819. XFCLOSE(file);
  6820. return WOLFSSL_BAD_FILE;
  6821. }
  6822. if (sz > (long)sizeof(staticBuffer)) {
  6823. WOLFSSL_MSG("Getting dynamic buffer");
  6824. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  6825. if (myBuffer == NULL) {
  6826. XFCLOSE(file);
  6827. return WOLFSSL_BAD_FILE;
  6828. }
  6829. dynamic = 1;
  6830. }
  6831. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6832. ret = WOLFSSL_BAD_FILE;
  6833. else
  6834. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  6835. XFCLOSE(file);
  6836. if (dynamic)
  6837. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  6838. return ret;
  6839. }
  6840. #endif
  6841. /* like load verify locations, 1 for success, < 0 for error */
  6842. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  6843. const char* path)
  6844. {
  6845. int ret = WOLFSSL_FATAL_ERROR;
  6846. WOLFSSL_CTX* tmp;
  6847. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  6848. if (cm == NULL) {
  6849. WOLFSSL_MSG("No CertManager error");
  6850. return ret;
  6851. }
  6852. tmp = wolfSSL_CTX_new(cm_pick_method());
  6853. if (tmp == NULL) {
  6854. WOLFSSL_MSG("CTX new failed");
  6855. return ret;
  6856. }
  6857. /* for tmp use */
  6858. wolfSSL_CertManagerFree(tmp->cm);
  6859. tmp->cm = cm;
  6860. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  6861. /* don't lose our good one */
  6862. tmp->cm = NULL;
  6863. wolfSSL_CTX_free(tmp);
  6864. return ret;
  6865. }
  6866. #endif /* NO_FILESYSTEM */
  6867. #ifdef HAVE_CRL
  6868. /* check CRL if enabled, WOLFSSL_SUCCESS */
  6869. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  6870. {
  6871. int ret = 0;
  6872. #ifdef WOLFSSL_SMALL_STACK
  6873. DecodedCert* cert = NULL;
  6874. #else
  6875. DecodedCert cert[1];
  6876. #endif
  6877. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  6878. if (cm == NULL)
  6879. return BAD_FUNC_ARG;
  6880. if (cm->crlEnabled == 0)
  6881. return WOLFSSL_SUCCESS;
  6882. #ifdef WOLFSSL_SMALL_STACK
  6883. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  6884. if (cert == NULL)
  6885. return MEMORY_E;
  6886. #endif
  6887. InitDecodedCert(cert, der, sz, NULL);
  6888. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  6889. WOLFSSL_MSG("ParseCert failed");
  6890. }
  6891. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  6892. WOLFSSL_MSG("CheckCertCRL failed");
  6893. }
  6894. FreeDecodedCert(cert);
  6895. #ifdef WOLFSSL_SMALL_STACK
  6896. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  6897. #endif
  6898. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6899. }
  6900. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  6901. {
  6902. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  6903. if (cm == NULL)
  6904. return BAD_FUNC_ARG;
  6905. cm->cbMissingCRL = cb;
  6906. return WOLFSSL_SUCCESS;
  6907. }
  6908. #ifdef HAVE_CRL_IO
  6909. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  6910. {
  6911. if (cm == NULL)
  6912. return BAD_FUNC_ARG;
  6913. cm->crl->crlIOCb = cb;
  6914. return WOLFSSL_SUCCESS;
  6915. }
  6916. #endif
  6917. #ifndef NO_FILESYSTEM
  6918. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  6919. int type, int monitor)
  6920. {
  6921. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  6922. if (cm == NULL)
  6923. return BAD_FUNC_ARG;
  6924. if (cm->crl == NULL) {
  6925. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  6926. WOLFSSL_MSG("Enable CRL failed");
  6927. return WOLFSSL_FATAL_ERROR;
  6928. }
  6929. }
  6930. return LoadCRL(cm->crl, path, type, monitor);
  6931. }
  6932. int wolfSSL_CertManagerLoadCRLFile(WOLFSSL_CERT_MANAGER* cm, const char* file,
  6933. int type)
  6934. {
  6935. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLFile");
  6936. if (cm == NULL || file == NULL)
  6937. return BAD_FUNC_ARG;
  6938. if (cm->crl == NULL) {
  6939. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  6940. WOLFSSL_MSG("Enable CRL failed");
  6941. return WOLFSSL_FATAL_ERROR;
  6942. }
  6943. }
  6944. return ProcessFile(NULL, file, type, CRL_TYPE, NULL, 0, cm->crl,
  6945. VERIFY);
  6946. }
  6947. #endif
  6948. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  6949. {
  6950. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  6951. if (ssl)
  6952. return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options);
  6953. else
  6954. return BAD_FUNC_ARG;
  6955. }
  6956. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  6957. {
  6958. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  6959. if (ssl)
  6960. return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl));
  6961. else
  6962. return BAD_FUNC_ARG;
  6963. }
  6964. #ifndef NO_FILESYSTEM
  6965. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  6966. {
  6967. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  6968. if (ssl)
  6969. return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor);
  6970. else
  6971. return BAD_FUNC_ARG;
  6972. }
  6973. int wolfSSL_LoadCRLFile(WOLFSSL* ssl, const char* file, int type)
  6974. {
  6975. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  6976. if (ssl)
  6977. return wolfSSL_CertManagerLoadCRLFile(SSL_CM(ssl), file, type);
  6978. else
  6979. return BAD_FUNC_ARG;
  6980. }
  6981. #endif
  6982. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  6983. {
  6984. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  6985. if (ssl)
  6986. return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb);
  6987. else
  6988. return BAD_FUNC_ARG;
  6989. }
  6990. #ifdef HAVE_CRL_IO
  6991. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  6992. {
  6993. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  6994. if (ssl)
  6995. return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb);
  6996. else
  6997. return BAD_FUNC_ARG;
  6998. }
  6999. #endif
  7000. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  7001. {
  7002. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  7003. if (ctx)
  7004. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  7005. else
  7006. return BAD_FUNC_ARG;
  7007. }
  7008. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  7009. {
  7010. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  7011. if (ctx)
  7012. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  7013. else
  7014. return BAD_FUNC_ARG;
  7015. }
  7016. #ifndef NO_FILESYSTEM
  7017. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  7018. int type, int monitor)
  7019. {
  7020. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7021. if (ctx)
  7022. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  7023. else
  7024. return BAD_FUNC_ARG;
  7025. }
  7026. int wolfSSL_CTX_LoadCRLFile(WOLFSSL_CTX* ctx, const char* file,
  7027. int type)
  7028. {
  7029. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  7030. if (ctx)
  7031. return wolfSSL_CertManagerLoadCRLFile(ctx->cm, file, type);
  7032. else
  7033. return BAD_FUNC_ARG;
  7034. }
  7035. #endif
  7036. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  7037. {
  7038. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  7039. if (ctx)
  7040. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  7041. else
  7042. return BAD_FUNC_ARG;
  7043. }
  7044. #ifdef HAVE_CRL_IO
  7045. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  7046. {
  7047. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  7048. if (ctx)
  7049. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  7050. else
  7051. return BAD_FUNC_ARG;
  7052. }
  7053. #endif
  7054. #endif /* HAVE_CRL */
  7055. #ifndef NO_FILESYSTEM
  7056. #ifdef WOLFSSL_DER_LOAD
  7057. /* Add format parameter to allow DER load of CA files */
  7058. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  7059. int format)
  7060. {
  7061. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  7062. if (ctx == NULL || file == NULL)
  7063. return WOLFSSL_FAILURE;
  7064. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  7065. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7066. return WOLFSSL_SUCCESS;
  7067. }
  7068. return WOLFSSL_FAILURE;
  7069. }
  7070. #endif /* WOLFSSL_DER_LOAD */
  7071. WOLFSSL_ABI
  7072. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  7073. int format)
  7074. {
  7075. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  7076. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  7077. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7078. return WOLFSSL_SUCCESS;
  7079. }
  7080. return WOLFSSL_FAILURE;
  7081. }
  7082. WOLFSSL_ABI
  7083. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  7084. int format)
  7085. {
  7086. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  7087. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  7088. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7089. return WOLFSSL_SUCCESS;
  7090. }
  7091. return WOLFSSL_FAILURE;
  7092. }
  7093. #endif /* NO_FILESYSTEM */
  7094. /* Sets the max chain depth when verifying a certificate chain. Default depth
  7095. * is set to MAX_CHAIN_DEPTH.
  7096. *
  7097. * ctx WOLFSSL_CTX structure to set depth in
  7098. * depth max depth
  7099. */
  7100. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  7101. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  7102. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  7103. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  7104. return;
  7105. }
  7106. ctx->verifyDepth = (byte)depth;
  7107. }
  7108. /* get cert chaining depth using ssl struct */
  7109. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  7110. {
  7111. if(ssl == NULL) {
  7112. return BAD_FUNC_ARG;
  7113. }
  7114. #ifndef OPENSSL_EXTRA
  7115. return MAX_CHAIN_DEPTH;
  7116. #else
  7117. return ssl->options.verifyDepth;
  7118. #endif
  7119. }
  7120. /* get cert chaining depth using ctx struct */
  7121. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  7122. {
  7123. if (ctx == NULL) {
  7124. return BAD_FUNC_ARG;
  7125. }
  7126. #ifndef OPENSSL_EXTRA
  7127. return MAX_CHAIN_DEPTH;
  7128. #else
  7129. return ctx->verifyDepth;
  7130. #endif
  7131. }
  7132. #ifndef NO_FILESYSTEM
  7133. WOLFSSL_ABI
  7134. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  7135. {
  7136. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7137. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  7138. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  7139. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7140. return WOLFSSL_SUCCESS;
  7141. }
  7142. return WOLFSSL_FAILURE;
  7143. }
  7144. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  7145. const char* file, int format)
  7146. {
  7147. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  7148. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  7149. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  7150. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  7151. return WOLFSSL_SUCCESS;
  7152. }
  7153. return WOLFSSL_FAILURE;
  7154. }
  7155. #ifndef NO_DH
  7156. /* server Diffie-Hellman parameters */
  7157. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  7158. const char* fname, int format)
  7159. {
  7160. #ifdef WOLFSSL_SMALL_STACK
  7161. byte staticBuffer[1]; /* force heap usage */
  7162. #else
  7163. byte staticBuffer[FILE_BUFFER_SIZE];
  7164. #endif
  7165. byte* myBuffer = staticBuffer;
  7166. int dynamic = 0;
  7167. int ret;
  7168. long sz = 0;
  7169. XFILE file;
  7170. if (ctx == NULL || fname == NULL)
  7171. return BAD_FUNC_ARG;
  7172. file = XFOPEN(fname, "rb");
  7173. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  7174. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  7175. XFCLOSE(file);
  7176. return WOLFSSL_BAD_FILE;
  7177. }
  7178. sz = XFTELL(file);
  7179. XREWIND(file);
  7180. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  7181. WOLFSSL_MSG("SetTmpDH file size error");
  7182. XFCLOSE(file);
  7183. return WOLFSSL_BAD_FILE;
  7184. }
  7185. if (sz > (long)sizeof(staticBuffer)) {
  7186. WOLFSSL_MSG("Getting dynamic buffer");
  7187. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  7188. if (myBuffer == NULL) {
  7189. XFCLOSE(file);
  7190. return WOLFSSL_BAD_FILE;
  7191. }
  7192. dynamic = 1;
  7193. }
  7194. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  7195. ret = WOLFSSL_BAD_FILE;
  7196. else {
  7197. if (ssl)
  7198. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  7199. else
  7200. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  7201. }
  7202. XFCLOSE(file);
  7203. if (dynamic)
  7204. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  7205. return ret;
  7206. }
  7207. /* server Diffie-Hellman parameters */
  7208. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  7209. {
  7210. if (ssl == NULL)
  7211. return BAD_FUNC_ARG;
  7212. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  7213. }
  7214. /* server Diffie-Hellman parameters */
  7215. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  7216. {
  7217. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  7218. }
  7219. #endif /* NO_DH */
  7220. #endif /* NO_FILESYSTEM */
  7221. #ifndef NO_CHECK_PRIVATE_KEY
  7222. /* Check private against public in certificate for match
  7223. *
  7224. * Returns WOLFSSL_SUCCESS on good private key
  7225. * WOLFSSL_FAILURE if mismatched */
  7226. static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap,
  7227. int devId, int isKeyLabel, int isKeyId)
  7228. {
  7229. #ifdef WOLFSSL_SMALL_STACK
  7230. DecodedCert* der = NULL;
  7231. #else
  7232. DecodedCert der[1];
  7233. #endif
  7234. word32 size;
  7235. byte* buff;
  7236. int ret = WOLFSSL_FAILURE;
  7237. WOLFSSL_ENTER("check_cert_key");
  7238. if (cert == NULL || key == NULL) {
  7239. return WOLFSSL_FAILURE;
  7240. }
  7241. #ifdef WOLFSSL_SMALL_STACK
  7242. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  7243. if (der == NULL)
  7244. return MEMORY_E;
  7245. #endif
  7246. size = cert->length;
  7247. buff = cert->buffer;
  7248. InitDecodedCert(der, buff, size, heap);
  7249. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  7250. FreeDecodedCert(der);
  7251. #ifdef WOLFSSL_SMALL_STACK
  7252. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7253. #endif
  7254. return WOLFSSL_FAILURE;
  7255. }
  7256. size = key->length;
  7257. buff = key->buffer;
  7258. #ifdef WOLF_PRIVATE_KEY_ID
  7259. if (devId != INVALID_DEVID) {
  7260. int type = 0;
  7261. void *pkey = NULL;
  7262. #ifndef NO_RSA
  7263. if (der->keyOID == RSAk) {
  7264. type = DYNAMIC_TYPE_RSA;
  7265. }
  7266. #ifdef WC_RSA_PSS
  7267. if (der->keyOID == RSAPSSk) {
  7268. type = DYNAMIC_TYPE_RSA;
  7269. }
  7270. #endif
  7271. #endif
  7272. #ifdef HAVE_ECC
  7273. if (der->keyOID == ECDSAk) {
  7274. type = DYNAMIC_TYPE_ECC;
  7275. }
  7276. #endif
  7277. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  7278. isKeyLabel, isKeyId, heap, devId);
  7279. #ifdef WOLF_CRYPTO_CB
  7280. if (ret == 0) {
  7281. #ifndef NO_RSA
  7282. if (der->keyOID == RSAk
  7283. #ifdef WC_RSA_PSS
  7284. || der->keyOID == RSAPSSk
  7285. #endif
  7286. ) {
  7287. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey,
  7288. der->publicKey, der->pubKeySize);
  7289. }
  7290. #endif
  7291. #ifdef HAVE_ECC
  7292. if (der->keyOID == ECDSAk) {
  7293. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey,
  7294. der->publicKey, der->pubKeySize);
  7295. }
  7296. #endif
  7297. }
  7298. #else
  7299. /* devId was set, don't check, for now */
  7300. /* TODO: Add callback for private key check? */
  7301. #endif
  7302. if (pkey != NULL) {
  7303. #ifndef NO_RSA
  7304. if (der->keyOID == RSAk
  7305. #ifdef WC_RSA_PSS
  7306. || der->keyOID == RSAPSSk
  7307. #endif
  7308. ) {
  7309. wc_FreeRsaKey((RsaKey*)pkey);
  7310. }
  7311. #endif
  7312. #ifdef HAVE_ECC
  7313. if (der->keyOID == ECDSAk) {
  7314. wc_ecc_free((ecc_key*)pkey);
  7315. }
  7316. #endif
  7317. XFREE(pkey, heap, type);
  7318. }
  7319. if (ret != CRYPTOCB_UNAVAILABLE) {
  7320. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7321. }
  7322. }
  7323. else {
  7324. /* fall through if unavailable */
  7325. ret = CRYPTOCB_UNAVAILABLE;
  7326. }
  7327. if (ret == CRYPTOCB_UNAVAILABLE)
  7328. #endif /* WOLF_PRIVATE_KEY_ID */
  7329. {
  7330. ret = wc_CheckPrivateKeyCert(buff, size, der);
  7331. ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  7332. }
  7333. FreeDecodedCert(der);
  7334. #ifdef WOLFSSL_SMALL_STACK
  7335. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  7336. #endif
  7337. (void)devId;
  7338. (void)isKeyLabel;
  7339. (void)isKeyId;
  7340. return ret;
  7341. }
  7342. /* Check private against public in certificate for match
  7343. *
  7344. * ctx WOLFSSL_CTX structure to check private key in
  7345. *
  7346. * Returns WOLFSSL_SUCCESS on good private key
  7347. * WOLFSSL_FAILURE if mismatched. */
  7348. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  7349. {
  7350. if (ctx == NULL) {
  7351. return WOLFSSL_FAILURE;
  7352. }
  7353. return check_cert_key(ctx->certificate, ctx->privateKey, ctx->heap,
  7354. ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId);
  7355. }
  7356. #endif /* !NO_CHECK_PRIVATE_KEY */
  7357. #ifdef OPENSSL_ALL
  7358. /**
  7359. * Return the private key of the WOLFSSL_CTX struct
  7360. * @return WOLFSSL_EVP_PKEY* The caller doesn *NOT*` free the returned object.
  7361. */
  7362. WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx)
  7363. {
  7364. const unsigned char *key;
  7365. int type;
  7366. WOLFSSL_ENTER("wolfSSL_CTX_get0_privatekey");
  7367. if (ctx == NULL || ctx->privateKey == NULL ||
  7368. ctx->privateKey->buffer == NULL) {
  7369. WOLFSSL_MSG("Bad parameter or key not set");
  7370. return NULL;
  7371. }
  7372. switch (ctx->privateKeyType) {
  7373. #ifndef NO_RSA
  7374. case rsa_sa_algo:
  7375. type = EVP_PKEY_RSA;
  7376. break;
  7377. #endif
  7378. #ifdef HAVE_ECC
  7379. case ecc_dsa_sa_algo:
  7380. type = EVP_PKEY_EC;
  7381. break;
  7382. #endif
  7383. default:
  7384. /* Other key types not supported either as ssl private keys
  7385. * or in the EVP layer */
  7386. WOLFSSL_MSG("Unsupported key type");
  7387. return NULL;
  7388. }
  7389. key = ctx->privateKey->buffer;
  7390. if (ctx->privateKeyPKey != NULL)
  7391. return ctx->privateKeyPKey;
  7392. else
  7393. return wolfSSL_d2i_PrivateKey(type,
  7394. (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key,
  7395. (long)ctx->privateKey->length);
  7396. }
  7397. #endif
  7398. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7399. static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out,
  7400. const unsigned char** in, long inSz, int priv)
  7401. {
  7402. WOLFSSL_EVP_PKEY* pkey = NULL;
  7403. const unsigned char* mem;
  7404. long memSz = inSz;
  7405. WOLFSSL_ENTER("d2iGenericKey");
  7406. if (in == NULL || *in == NULL || inSz < 0) {
  7407. WOLFSSL_MSG("Bad argument");
  7408. return NULL;
  7409. }
  7410. mem = *in;
  7411. #if !defined(NO_RSA)
  7412. {
  7413. word32 keyIdx = 0;
  7414. int isRsaKey;
  7415. #ifdef WOLFSSL_SMALL_STACK
  7416. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  7417. if (rsa == NULL)
  7418. return NULL;
  7419. #else
  7420. RsaKey rsa[1];
  7421. #endif
  7422. XMEMSET(rsa, 0, sizeof(RsaKey));
  7423. /* test if RSA key */
  7424. if (priv)
  7425. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7426. wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7427. else
  7428. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7429. wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7430. wc_FreeRsaKey(rsa);
  7431. #ifdef WOLFSSL_SMALL_STACK
  7432. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  7433. #endif
  7434. if (isRsaKey) {
  7435. pkey = wolfSSL_EVP_PKEY_new();
  7436. if (pkey != NULL) {
  7437. pkey->pkey_sz = keyIdx;
  7438. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7439. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7440. DYNAMIC_TYPE_PUBLIC_KEY);
  7441. if (pkey->pkey.ptr == NULL) {
  7442. wolfSSL_EVP_PKEY_free(pkey);
  7443. return NULL;
  7444. }
  7445. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7446. pkey->type = EVP_PKEY_RSA;
  7447. if (out != NULL) {
  7448. *out = pkey;
  7449. }
  7450. pkey->ownRsa = 1;
  7451. pkey->rsa = wolfSSL_RSA_new();
  7452. if (pkey->rsa == NULL) {
  7453. wolfSSL_EVP_PKEY_free(pkey);
  7454. return NULL;
  7455. }
  7456. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  7457. (const unsigned char*)pkey->pkey.ptr,
  7458. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7459. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7460. wolfSSL_EVP_PKEY_free(pkey);
  7461. return NULL;
  7462. }
  7463. return pkey;
  7464. }
  7465. else {
  7466. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  7467. }
  7468. }
  7469. }
  7470. #endif /* NO_RSA */
  7471. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  7472. {
  7473. word32 keyIdx = 0;
  7474. int isEccKey;
  7475. #ifdef WOLFSSL_SMALL_STACK
  7476. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  7477. if (ecc == NULL)
  7478. return NULL;
  7479. #else
  7480. ecc_key ecc[1];
  7481. #endif
  7482. XMEMSET(ecc, 0, sizeof(ecc_key));
  7483. if (priv)
  7484. isEccKey = wc_ecc_init(ecc) == 0 &&
  7485. wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7486. else
  7487. isEccKey = wc_ecc_init(ecc) == 0 &&
  7488. wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7489. wc_ecc_free(ecc);
  7490. #ifdef WOLFSSL_SMALL_STACK
  7491. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  7492. #endif
  7493. if (isEccKey) {
  7494. pkey = wolfSSL_EVP_PKEY_new();
  7495. if (pkey != NULL) {
  7496. pkey->pkey_sz = keyIdx;
  7497. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  7498. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7499. DYNAMIC_TYPE_PUBLIC_KEY);
  7500. if (pkey->pkey.ptr == NULL) {
  7501. wolfSSL_EVP_PKEY_free(pkey);
  7502. return NULL;
  7503. }
  7504. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7505. pkey->type = EVP_PKEY_EC;
  7506. if (out != NULL) {
  7507. *out = pkey;
  7508. }
  7509. pkey->ownEcc = 1;
  7510. pkey->ecc = wolfSSL_EC_KEY_new();
  7511. if (pkey->ecc == NULL) {
  7512. wolfSSL_EVP_PKEY_free(pkey);
  7513. return NULL;
  7514. }
  7515. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  7516. (const unsigned char*)pkey->pkey.ptr,
  7517. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7518. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7519. wolfSSL_EVP_PKEY_free(pkey);
  7520. return NULL;
  7521. }
  7522. return pkey;
  7523. }
  7524. else {
  7525. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  7526. }
  7527. }
  7528. }
  7529. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  7530. #if !defined(NO_DSA)
  7531. {
  7532. word32 keyIdx = 0;
  7533. int isDsaKey;
  7534. #ifdef WOLFSSL_SMALL_STACK
  7535. DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  7536. if (dsa == NULL)
  7537. return NULL;
  7538. #else
  7539. DsaKey dsa[1];
  7540. #endif
  7541. XMEMSET(dsa, 0, sizeof(DsaKey));
  7542. if (priv)
  7543. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7544. wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7545. else
  7546. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7547. wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7548. wc_FreeDsaKey(dsa);
  7549. #ifdef WOLFSSL_SMALL_STACK
  7550. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  7551. #endif
  7552. /* test if DSA key */
  7553. if (isDsaKey) {
  7554. pkey = wolfSSL_EVP_PKEY_new();
  7555. if (pkey != NULL) {
  7556. pkey->pkey_sz = keyIdx;
  7557. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7558. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7559. DYNAMIC_TYPE_PUBLIC_KEY);
  7560. if (pkey->pkey.ptr == NULL) {
  7561. wolfSSL_EVP_PKEY_free(pkey);
  7562. return NULL;
  7563. }
  7564. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7565. pkey->type = EVP_PKEY_DSA;
  7566. if (out != NULL) {
  7567. *out = pkey;
  7568. }
  7569. pkey->ownDsa = 1;
  7570. pkey->dsa = wolfSSL_DSA_new();
  7571. if (pkey->dsa == NULL) {
  7572. wolfSSL_EVP_PKEY_free(pkey);
  7573. return NULL;
  7574. }
  7575. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  7576. (const unsigned char*)pkey->pkey.ptr,
  7577. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7578. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7579. wolfSSL_EVP_PKEY_free(pkey);
  7580. return NULL;
  7581. }
  7582. return pkey;
  7583. }
  7584. else {
  7585. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  7586. }
  7587. }
  7588. }
  7589. #endif /* NO_DSA */
  7590. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  7591. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7592. (HAVE_FIPS_VERSION > 2))
  7593. {
  7594. int isDhKey;
  7595. word32 keyIdx = 0;
  7596. #ifdef WOLFSSL_SMALL_STACK
  7597. DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  7598. if (dh == NULL)
  7599. return NULL;
  7600. #else
  7601. DhKey dh[1];
  7602. #endif
  7603. XMEMSET(dh, 0, sizeof(DhKey));
  7604. isDhKey = wc_InitDhKey(dh) == 0 &&
  7605. wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0;
  7606. wc_FreeDhKey(dh);
  7607. #ifdef WOLFSSL_SMALL_STACK
  7608. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  7609. #endif
  7610. /* test if DH key */
  7611. if (isDhKey) {
  7612. pkey = wolfSSL_EVP_PKEY_new();
  7613. if (pkey != NULL) {
  7614. pkey->pkey_sz = (int)memSz;
  7615. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7616. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7617. DYNAMIC_TYPE_PUBLIC_KEY);
  7618. if (pkey->pkey.ptr == NULL) {
  7619. wolfSSL_EVP_PKEY_free(pkey);
  7620. return NULL;
  7621. }
  7622. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7623. pkey->type = EVP_PKEY_DH;
  7624. if (out != NULL) {
  7625. *out = pkey;
  7626. }
  7627. pkey->ownDh = 1;
  7628. pkey->dh = wolfSSL_DH_new();
  7629. if (pkey->dh == NULL) {
  7630. wolfSSL_EVP_PKEY_free(pkey);
  7631. return NULL;
  7632. }
  7633. if (wolfSSL_DH_LoadDer(pkey->dh,
  7634. (const unsigned char*)pkey->pkey.ptr,
  7635. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  7636. wolfSSL_EVP_PKEY_free(pkey);
  7637. return NULL;
  7638. }
  7639. return pkey;
  7640. }
  7641. else {
  7642. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  7643. }
  7644. }
  7645. }
  7646. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7647. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  7648. #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
  7649. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7650. (HAVE_FIPS_VERSION > 2))
  7651. {
  7652. word32 keyIdx = 0;
  7653. DhKey* key = NULL;
  7654. int ret;
  7655. int elements;
  7656. #ifdef WOLFSSL_SMALL_STACK
  7657. DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  7658. if (dh == NULL)
  7659. return NULL;
  7660. #else
  7661. DhKey dh[1];
  7662. #endif
  7663. XMEMSET(dh, 0, sizeof(DhKey));
  7664. /* test if DH-public key */
  7665. if (wc_InitDhKey(dh) != 0)
  7666. return NULL;
  7667. ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz);
  7668. wc_FreeDhKey(dh);
  7669. #ifdef WOLFSSL_SMALL_STACK
  7670. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  7671. #endif
  7672. if (ret == 0) {
  7673. pkey = wolfSSL_EVP_PKEY_new();
  7674. if (pkey != NULL) {
  7675. pkey->type = EVP_PKEY_DH;
  7676. pkey->pkey_sz = (int)memSz;
  7677. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7678. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7679. DYNAMIC_TYPE_PUBLIC_KEY);
  7680. if (pkey->pkey.ptr == NULL) {
  7681. wolfSSL_EVP_PKEY_free(pkey);
  7682. return NULL;
  7683. }
  7684. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7685. if (out != NULL) {
  7686. *out = pkey;
  7687. }
  7688. pkey->ownDh = 1;
  7689. pkey->dh = wolfSSL_DH_new();
  7690. if (pkey->dh == NULL) {
  7691. wolfSSL_EVP_PKEY_free(pkey);
  7692. return NULL;
  7693. }
  7694. key = (DhKey*)pkey->dh->internal;
  7695. keyIdx = 0;
  7696. if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0)
  7697. {
  7698. elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | ELEMENT_PUB;
  7699. if (priv)
  7700. elements |= ELEMENT_PRV;
  7701. if(SetDhExternal_ex(pkey->dh, elements)
  7702. == WOLFSSL_SUCCESS ) {
  7703. return pkey;
  7704. }
  7705. }
  7706. else {
  7707. wolfSSL_EVP_PKEY_free(pkey);
  7708. return NULL;
  7709. }
  7710. }
  7711. }
  7712. }
  7713. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7714. #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */
  7715. #ifdef HAVE_PQC
  7716. #ifdef HAVE_FALCON
  7717. {
  7718. int isFalcon = 0;
  7719. #ifdef WOLFSSL_SMALL_STACK
  7720. falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL,
  7721. DYNAMIC_TYPE_FALCON);
  7722. if (falcon == NULL) {
  7723. return NULL;
  7724. }
  7725. #else
  7726. falcon_key falcon[1];
  7727. #endif
  7728. if (wc_falcon_init(falcon) == 0) {
  7729. /* test if Falcon key */
  7730. if (priv) {
  7731. /* Try level 1 */
  7732. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  7733. wc_falcon_import_private_only(mem, (word32)memSz,
  7734. falcon) == 0;
  7735. if (!isFalcon) {
  7736. /* Try level 5 */
  7737. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  7738. wc_falcon_import_private_only(mem, (word32)memSz,
  7739. falcon) == 0;
  7740. }
  7741. } else {
  7742. /* Try level 1 */
  7743. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  7744. wc_falcon_import_public(mem, (word32)memSz, falcon)
  7745. == 0;
  7746. if (!isFalcon) {
  7747. /* Try level 5 */
  7748. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  7749. wc_falcon_import_public(mem, (word32)memSz,
  7750. falcon) == 0;
  7751. }
  7752. }
  7753. wc_falcon_free(falcon);
  7754. }
  7755. #ifdef WOLFSSL_SMALL_STACK
  7756. XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON);
  7757. #endif
  7758. if (isFalcon) {
  7759. /* Create a fake Falcon EVP_PKEY. In the future, we might integrate
  7760. * Falcon into the compatibility layer. */
  7761. pkey = wolfSSL_EVP_PKEY_new();
  7762. if (pkey == NULL) {
  7763. WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error");
  7764. return NULL;
  7765. }
  7766. pkey->type = EVP_PKEY_FALCON;
  7767. pkey->pkey.ptr = NULL;
  7768. pkey->pkey_sz = 0;
  7769. return pkey;
  7770. }
  7771. }
  7772. #endif /* HAVE_FALCON */
  7773. #ifdef HAVE_DILITHIUM
  7774. {
  7775. int isDilithium = 0;
  7776. #ifdef WOLFSSL_SMALL_STACK
  7777. dilithium_key *dilithium = (dilithium_key *)
  7778. XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM);
  7779. if (dilithium == NULL) {
  7780. return NULL;
  7781. }
  7782. #else
  7783. dilithium_key dilithium[1];
  7784. #endif
  7785. if (wc_dilithium_init(dilithium) == 0) {
  7786. /* Test if Dilithium key. Try all levels for both SHAKE and AES */
  7787. if (priv) {
  7788. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  7789. SHAKE_VARIANT) == 0 &&
  7790. wc_dilithium_import_private_only(mem,
  7791. (word32)memSz, dilithium) == 0;
  7792. if (!isDilithium) {
  7793. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  7794. SHAKE_VARIANT) == 0 &&
  7795. wc_dilithium_import_private_only(mem,
  7796. (word32)memSz, dilithium) == 0;
  7797. }
  7798. if (!isDilithium) {
  7799. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  7800. SHAKE_VARIANT) == 0 &&
  7801. wc_dilithium_import_private_only(mem,
  7802. (word32)memSz, dilithium) == 0;
  7803. }
  7804. if (!isDilithium) {
  7805. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  7806. AES_VARIANT) == 0 &&
  7807. wc_dilithium_import_private_only(mem,
  7808. (word32)memSz, dilithium) == 0;
  7809. }
  7810. if (!isDilithium) {
  7811. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  7812. AES_VARIANT) == 0 &&
  7813. wc_dilithium_import_private_only(mem,
  7814. (word32)memSz, dilithium) == 0;
  7815. }
  7816. if (!isDilithium) {
  7817. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  7818. AES_VARIANT) == 0 &&
  7819. wc_dilithium_import_private_only(mem,
  7820. (word32)memSz, dilithium) == 0;
  7821. }
  7822. } else {
  7823. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  7824. SHAKE_VARIANT) == 0 &&
  7825. wc_dilithium_import_public(mem, (word32)memSz,
  7826. dilithium) == 0;
  7827. if (!isDilithium) {
  7828. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  7829. SHAKE_VARIANT) == 0 &&
  7830. wc_dilithium_import_public(mem, (word32)memSz,
  7831. dilithium) == 0;
  7832. }
  7833. if (!isDilithium) {
  7834. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  7835. SHAKE_VARIANT) == 0 &&
  7836. wc_dilithium_import_public(mem, (word32)memSz,
  7837. dilithium) == 0;
  7838. }
  7839. if (!isDilithium) {
  7840. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 2,
  7841. AES_VARIANT) == 0 &&
  7842. wc_dilithium_import_public(mem, (word32)memSz,
  7843. dilithium) == 0;
  7844. }
  7845. if (!isDilithium) {
  7846. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 3,
  7847. AES_VARIANT) == 0 &&
  7848. wc_dilithium_import_public(mem, (word32)memSz,
  7849. dilithium) == 0;
  7850. }
  7851. if (!isDilithium) {
  7852. isDilithium = wc_dilithium_set_level_and_sym(dilithium, 5,
  7853. AES_VARIANT) == 0 &&
  7854. wc_dilithium_import_public(mem, (word32)memSz,
  7855. dilithium) == 0;
  7856. }
  7857. }
  7858. wc_dilithium_free(dilithium);
  7859. }
  7860. #ifdef WOLFSSL_SMALL_STACK
  7861. XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM);
  7862. #endif
  7863. if (isDilithium) {
  7864. /* Create a fake Dilithium EVP_PKEY. In the future, we might
  7865. * integrate Dilithium into the compatibility layer. */
  7866. pkey = wolfSSL_EVP_PKEY_new();
  7867. if (pkey == NULL) {
  7868. WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error");
  7869. return NULL;
  7870. }
  7871. pkey->type = EVP_PKEY_DILITHIUM;
  7872. pkey->pkey.ptr = NULL;
  7873. pkey->pkey_sz = 0;
  7874. return pkey;
  7875. }
  7876. }
  7877. #endif /* HAVE_DILITHIUM */
  7878. #endif /* HAVE_PQC */
  7879. if (pkey == NULL) {
  7880. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  7881. }
  7882. return pkey;
  7883. }
  7884. #endif /* OPENSSL_EXTRA || WPA_SMALL */
  7885. #ifdef OPENSSL_EXTRA
  7886. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY(
  7887. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen)
  7888. {
  7889. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  7890. #ifdef WOLFSSL_PEM_TO_DER
  7891. int ret;
  7892. DerBuffer* der = NULL;
  7893. if (keyBuf == NULL || *keyBuf == NULL || keyLen <= 0) {
  7894. WOLFSSL_MSG("Bad key PEM/DER args");
  7895. return NULL;
  7896. }
  7897. ret = PemToDer(*keyBuf, keyLen, PRIVATEKEY_TYPE, &der, NULL, NULL, NULL);
  7898. if (ret < 0) {
  7899. WOLFSSL_MSG("Not PEM format");
  7900. ret = AllocDer(&der, (word32)keyLen, PRIVATEKEY_TYPE, NULL);
  7901. if (ret == 0) {
  7902. XMEMCPY(der->buffer, *keyBuf, keyLen);
  7903. }
  7904. }
  7905. if (ret == 0) {
  7906. /* Verify this is PKCS8 Key */
  7907. word32 inOutIdx = 0;
  7908. word32 algId;
  7909. ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId);
  7910. if (ret >= 0) {
  7911. ret = 0; /* good DER */
  7912. }
  7913. }
  7914. if (ret == 0) {
  7915. pkcs8 = wolfSSL_EVP_PKEY_new();
  7916. if (pkcs8 == NULL)
  7917. ret = MEMORY_E;
  7918. }
  7919. if (ret == 0) {
  7920. pkcs8->pkey.ptr = (char*)XMALLOC(der->length, NULL,
  7921. DYNAMIC_TYPE_PUBLIC_KEY);
  7922. if (pkcs8->pkey.ptr == NULL)
  7923. ret = MEMORY_E;
  7924. }
  7925. if (ret == 0) {
  7926. XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length);
  7927. pkcs8->pkey_sz = der->length;
  7928. }
  7929. FreeDer(&der);
  7930. if (ret != 0) {
  7931. wolfSSL_EVP_PKEY_free(pkcs8);
  7932. pkcs8 = NULL;
  7933. }
  7934. if (pkey != NULL) {
  7935. *pkey = pkcs8;
  7936. }
  7937. #else
  7938. (void)bio;
  7939. (void)pkey;
  7940. #endif /* WOLFSSL_PEM_TO_DER */
  7941. return pkcs8;
  7942. }
  7943. #ifndef NO_BIO
  7944. /* put SSL type in extra for now, not very common */
  7945. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  7946. *
  7947. * bio input bio to read DER from
  7948. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  7949. * structure.
  7950. *
  7951. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  7952. * case.
  7953. */
  7954. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  7955. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  7956. {
  7957. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  7958. #ifdef WOLFSSL_PEM_TO_DER
  7959. unsigned char* mem = NULL;
  7960. int memSz;
  7961. WOLFSSL_ENTER("wolfSSL_d2i_PKCS8_PKEY_bio");
  7962. if (bio == NULL) {
  7963. return NULL;
  7964. }
  7965. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  7966. return NULL;
  7967. }
  7968. pkcs8 = wolfSSL_d2i_PKCS8_PKEY(pkey, (const unsigned char**)&mem, memSz);
  7969. #else
  7970. (void)bio;
  7971. (void)pkey;
  7972. #endif /* WOLFSSL_PEM_TO_DER */
  7973. return pkcs8;
  7974. }
  7975. /* expecting DER format public key
  7976. *
  7977. * bio input bio to read DER from
  7978. * out If not NULL then this pointer will be overwritten with a new
  7979. * WOLFSSL_EVP_PKEY pointer
  7980. *
  7981. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  7982. */
  7983. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  7984. WOLFSSL_EVP_PKEY** out)
  7985. {
  7986. unsigned char* mem;
  7987. long memSz;
  7988. WOLFSSL_EVP_PKEY* pkey = NULL;
  7989. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  7990. if (bio == NULL) {
  7991. return NULL;
  7992. }
  7993. (void)out;
  7994. memSz = wolfSSL_BIO_get_len(bio);
  7995. if (memSz <= 0) {
  7996. return NULL;
  7997. }
  7998. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7999. if (mem == NULL) {
  8000. return NULL;
  8001. }
  8002. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  8003. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  8004. if (out != NULL && pkey != NULL) {
  8005. *out = pkey;
  8006. }
  8007. }
  8008. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8009. return pkey;
  8010. }
  8011. #endif /* !NO_BIO */
  8012. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  8013. *
  8014. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  8015. * in DER buffer to convert
  8016. * inSz size of in buffer
  8017. *
  8018. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  8019. * on fail
  8020. */
  8021. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  8022. const unsigned char** in, long inSz)
  8023. {
  8024. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  8025. return d2iGenericKey(out, in, inSz, 0);
  8026. }
  8027. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  8028. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  8029. {
  8030. unsigned char* pt;
  8031. int sz;
  8032. word16 pkcs8HeaderSz;
  8033. if (!key || !key->pkey_sz)
  8034. return WOLFSSL_FATAL_ERROR;
  8035. /* return the key without PKCS8 for compatibility */
  8036. /* if pkcs8HeaderSz is invalid, use 0 and return all of pkey */
  8037. pkcs8HeaderSz = 0;
  8038. if (key->pkey_sz > key->pkcs8HeaderSz)
  8039. pkcs8HeaderSz = key->pkcs8HeaderSz;
  8040. sz = key->pkey_sz - pkcs8HeaderSz;
  8041. if (der) {
  8042. pt = (unsigned char*)key->pkey.ptr;
  8043. if (*der) {
  8044. /* since this function signature has no size value passed in it is
  8045. * assumed that the user has allocated a large enough buffer */
  8046. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8047. *der += sz;
  8048. }
  8049. else {
  8050. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  8051. if (*der == NULL) {
  8052. return WOLFSSL_FATAL_ERROR;
  8053. }
  8054. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  8055. }
  8056. }
  8057. return sz;
  8058. }
  8059. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  8060. {
  8061. return wolfSSL_EVP_PKEY_get_der(key, der);
  8062. }
  8063. static WOLFSSL_EVP_PKEY* _d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8064. const unsigned char **in, long inSz, int priv)
  8065. {
  8066. int ret = 0;
  8067. word32 idx = 0, algId;
  8068. word16 pkcs8HeaderSz = 0;
  8069. WOLFSSL_EVP_PKEY* local;
  8070. int opt;
  8071. (void)opt;
  8072. if (in == NULL || inSz < 0) {
  8073. WOLFSSL_MSG("Bad argument");
  8074. return NULL;
  8075. }
  8076. if (priv == 1) {
  8077. /* Check if input buffer has PKCS8 header. In the case that it does not
  8078. * have a PKCS8 header then do not error out. */
  8079. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx,
  8080. (word32)inSz, &algId)) > 0) {
  8081. WOLFSSL_MSG("Found PKCS8 header");
  8082. pkcs8HeaderSz = (word16)idx;
  8083. if ((type == EVP_PKEY_RSA && algId != RSAk
  8084. #ifdef WC_RSA_PSS
  8085. && algId != RSAPSSk
  8086. #endif
  8087. ) ||
  8088. (type == EVP_PKEY_EC && algId != ECDSAk) ||
  8089. (type == EVP_PKEY_DSA && algId != DSAk) ||
  8090. (type == EVP_PKEY_DH && algId != DHk)) {
  8091. WOLFSSL_MSG("PKCS8 does not match EVP key type");
  8092. return NULL;
  8093. }
  8094. (void)idx; /* not used */
  8095. }
  8096. else {
  8097. if (ret != ASN_PARSE_E) {
  8098. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 "
  8099. "header");
  8100. return NULL;
  8101. }
  8102. }
  8103. }
  8104. if (out != NULL && *out != NULL) {
  8105. wolfSSL_EVP_PKEY_free(*out);
  8106. *out = NULL;
  8107. }
  8108. local = wolfSSL_EVP_PKEY_new();
  8109. if (local == NULL) {
  8110. return NULL;
  8111. }
  8112. local->type = type;
  8113. local->pkey_sz = (int)inSz;
  8114. local->pkcs8HeaderSz = pkcs8HeaderSz;
  8115. local->pkey.ptr = (char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  8116. if (local->pkey.ptr == NULL) {
  8117. wolfSSL_EVP_PKEY_free(local);
  8118. local = NULL;
  8119. return NULL;
  8120. }
  8121. else {
  8122. XMEMCPY(local->pkey.ptr, *in, inSz);
  8123. }
  8124. switch (type) {
  8125. #ifndef NO_RSA
  8126. case EVP_PKEY_RSA:
  8127. local->ownRsa = 1;
  8128. local->rsa = wolfSSL_RSA_new();
  8129. if (local->rsa == NULL) {
  8130. wolfSSL_EVP_PKEY_free(local);
  8131. return NULL;
  8132. }
  8133. opt = priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC;
  8134. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  8135. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8136. opt) != WOLFSSL_SUCCESS) {
  8137. wolfSSL_EVP_PKEY_free(local);
  8138. return NULL;
  8139. }
  8140. break;
  8141. #endif /* NO_RSA */
  8142. #ifdef HAVE_ECC
  8143. case EVP_PKEY_EC:
  8144. local->ownEcc = 1;
  8145. local->ecc = wolfSSL_EC_KEY_new();
  8146. if (local->ecc == NULL) {
  8147. wolfSSL_EVP_PKEY_free(local);
  8148. return NULL;
  8149. }
  8150. opt = priv ? WOLFSSL_EC_KEY_LOAD_PRIVATE :
  8151. WOLFSSL_EC_KEY_LOAD_PUBLIC;
  8152. if (wolfSSL_EC_KEY_LoadDer_ex(local->ecc,
  8153. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8154. opt)
  8155. != WOLFSSL_SUCCESS) {
  8156. wolfSSL_EVP_PKEY_free(local);
  8157. return NULL;
  8158. }
  8159. break;
  8160. #endif /* HAVE_ECC */
  8161. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  8162. #ifndef NO_DSA
  8163. case EVP_PKEY_DSA:
  8164. local->ownDsa = 1;
  8165. local->dsa = wolfSSL_DSA_new();
  8166. if (local->dsa == NULL) {
  8167. wolfSSL_EVP_PKEY_free(local);
  8168. return NULL;
  8169. }
  8170. opt = priv ? WOLFSSL_DSA_LOAD_PRIVATE : WOLFSSL_DSA_LOAD_PUBLIC;
  8171. if (wolfSSL_DSA_LoadDer_ex(local->dsa,
  8172. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  8173. opt)
  8174. != WOLFSSL_SUCCESS) {
  8175. wolfSSL_EVP_PKEY_free(local);
  8176. return NULL;
  8177. }
  8178. break;
  8179. #endif /* NO_DSA */
  8180. #ifndef NO_DH
  8181. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  8182. case EVP_PKEY_DH:
  8183. local->ownDh = 1;
  8184. local->dh = wolfSSL_DH_new();
  8185. if (local->dh == NULL) {
  8186. wolfSSL_EVP_PKEY_free(local);
  8187. return NULL;
  8188. }
  8189. if (wolfSSL_DH_LoadDer(local->dh,
  8190. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  8191. != WOLFSSL_SUCCESS) {
  8192. wolfSSL_EVP_PKEY_free(local);
  8193. return NULL;
  8194. }
  8195. break;
  8196. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  8197. #endif /* HAVE_DH */
  8198. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  8199. default:
  8200. WOLFSSL_MSG("Unsupported key type");
  8201. wolfSSL_EVP_PKEY_free(local);
  8202. return NULL;
  8203. }
  8204. /* advance pointer with success */
  8205. if (local != NULL) {
  8206. if (local->pkey_sz <= (int)inSz) {
  8207. *in += local->pkey_sz;
  8208. }
  8209. if (out != NULL) {
  8210. *out = local;
  8211. }
  8212. }
  8213. return local;
  8214. }
  8215. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  8216. const unsigned char **in, long inSz)
  8217. {
  8218. WOLFSSL_ENTER("wolfSSL_d2i_PublicKey");
  8219. return _d2i_PublicKey(type, out, in, inSz, 0);
  8220. }
  8221. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  8222. *
  8223. * type type of key
  8224. * out newly created WOLFSSL_EVP_PKEY structure
  8225. * in pointer to input key DER
  8226. * inSz size of in buffer
  8227. *
  8228. * On success a non null pointer is returned and the pointer in is advanced the
  8229. * same number of bytes read.
  8230. */
  8231. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  8232. const unsigned char **in, long inSz)
  8233. {
  8234. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  8235. return _d2i_PublicKey(type, out, in, inSz, 1);
  8236. }
  8237. #ifdef WOLF_PRIVATE_KEY_ID
  8238. /* Create an EVP structure for use with crypto callbacks */
  8239. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_id(int type, WOLFSSL_EVP_PKEY** out,
  8240. void* heap, int devId)
  8241. {
  8242. WOLFSSL_EVP_PKEY* local;
  8243. if (out != NULL && *out != NULL) {
  8244. wolfSSL_EVP_PKEY_free(*out);
  8245. *out = NULL;
  8246. }
  8247. local = wolfSSL_EVP_PKEY_new_ex(heap);
  8248. if (local == NULL) {
  8249. return NULL;
  8250. }
  8251. local->type = type;
  8252. local->pkey_sz = 0;
  8253. local->pkcs8HeaderSz = 0;
  8254. switch (type) {
  8255. #ifndef NO_RSA
  8256. case EVP_PKEY_RSA:
  8257. {
  8258. RsaKey* key;
  8259. local->ownRsa = 1;
  8260. local->rsa = wolfSSL_RSA_new_ex(heap, devId);
  8261. if (local->rsa == NULL) {
  8262. wolfSSL_EVP_PKEY_free(local);
  8263. return NULL;
  8264. }
  8265. key = (RsaKey*)local->rsa->internal;
  8266. #ifdef WOLF_CRYPTO_CB
  8267. key->devId = devId;
  8268. #endif
  8269. (void)key;
  8270. local->rsa->inSet = 1;
  8271. break;
  8272. }
  8273. #endif /* !NO_RSA */
  8274. #ifdef HAVE_ECC
  8275. case EVP_PKEY_EC:
  8276. {
  8277. ecc_key* key;
  8278. local->ownEcc = 1;
  8279. local->ecc = wolfSSL_EC_KEY_new_ex(heap, devId);
  8280. if (local->ecc == NULL) {
  8281. wolfSSL_EVP_PKEY_free(local);
  8282. return NULL;
  8283. }
  8284. key = (ecc_key*)local->ecc->internal;
  8285. #ifdef WOLF_CRYPTO_CB
  8286. key->devId = devId;
  8287. #endif
  8288. key->type = ECC_PRIVATEKEY;
  8289. /* key is required to have a key size / curve set, although
  8290. * actual one used is determined by devId callback function */
  8291. wc_ecc_set_curve(key, ECDHE_SIZE, ECC_CURVE_DEF);
  8292. local->ecc->inSet = 1;
  8293. break;
  8294. }
  8295. #endif /* HAVE_ECC */
  8296. default:
  8297. WOLFSSL_MSG("Unsupported private key id type");
  8298. wolfSSL_EVP_PKEY_free(local);
  8299. return NULL;
  8300. }
  8301. if (local != NULL && out != NULL) {
  8302. *out = local;
  8303. }
  8304. return local;
  8305. }
  8306. #endif /* WOLF_PRIVATE_KEY_ID */
  8307. #ifndef NO_CERTS // NOLINT(readability-redundant-preprocessor)
  8308. #ifndef NO_CHECK_PRIVATE_KEY
  8309. /* Check private against public in certificate for match
  8310. *
  8311. * ssl WOLFSSL structure to check private key in
  8312. *
  8313. * Returns WOLFSSL_SUCCESS on good private key
  8314. * WOLFSSL_FAILURE if mismatched. */
  8315. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  8316. {
  8317. if (ssl == NULL) {
  8318. return WOLFSSL_FAILURE;
  8319. }
  8320. return check_cert_key(ssl->buffers.certificate, ssl->buffers.key, ssl->heap,
  8321. ssl->buffers.keyDevId, ssl->buffers.keyLabel, ssl->buffers.keyId);
  8322. }
  8323. #endif /* !NO_CHECK_PRIVATE_KEY */
  8324. #if defined(OPENSSL_ALL)
  8325. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  8326. int val)
  8327. {
  8328. int bytes_cnt, bit;
  8329. byte* temp;
  8330. if (!str || (val != 0 && val != 1) || pos < 0) {
  8331. return WOLFSSL_FAILURE;
  8332. }
  8333. bytes_cnt = pos/8;
  8334. bit = 1<<(7-(pos%8));
  8335. if (bytes_cnt+1 > str->length) {
  8336. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  8337. DYNAMIC_TYPE_OPENSSL))) {
  8338. return WOLFSSL_FAILURE;
  8339. }
  8340. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  8341. str->data = temp;
  8342. str->length = bytes_cnt+1;
  8343. }
  8344. str->data[bytes_cnt] &= ~bit;
  8345. str->data[bytes_cnt] |= val ? bit : 0;
  8346. return WOLFSSL_SUCCESS;
  8347. }
  8348. #endif /* OPENSSL_ALL */
  8349. #endif /* !NO_CERTS */
  8350. #endif /* OPENSSL_EXTRA */
  8351. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8352. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  8353. {
  8354. WOLFSSL_ASN1_BIT_STRING* str;
  8355. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  8356. NULL, DYNAMIC_TYPE_OPENSSL);
  8357. if (str) {
  8358. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  8359. }
  8360. return str;
  8361. }
  8362. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  8363. {
  8364. if (str) {
  8365. if (str->data) {
  8366. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  8367. str->data = NULL;
  8368. }
  8369. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  8370. }
  8371. }
  8372. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  8373. {
  8374. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  8375. return WOLFSSL_FAILURE;
  8376. }
  8377. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  8378. }
  8379. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8380. #ifdef OPENSSL_EXTRA
  8381. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8382. {
  8383. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8384. if (ssl == NULL || pkey == NULL ) {
  8385. return WOLFSSL_FAILURE;
  8386. }
  8387. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8388. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8389. }
  8390. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8391. long derSz)
  8392. {
  8393. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8394. if (ssl == NULL || der == NULL ) {
  8395. return WOLFSSL_FAILURE;
  8396. }
  8397. (void)pri; /* type of private key */
  8398. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8399. }
  8400. /******************************************************************************
  8401. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8402. *
  8403. * RETURNS:
  8404. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8405. */
  8406. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8407. unsigned char* der, long derSz)
  8408. {
  8409. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8410. if (ctx == NULL || der == NULL ) {
  8411. return WOLFSSL_FAILURE;
  8412. }
  8413. (void)pri; /* type of private key */
  8414. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8415. }
  8416. #ifndef NO_RSA
  8417. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8418. {
  8419. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8420. if (ssl == NULL || der == NULL ) {
  8421. return WOLFSSL_FAILURE;
  8422. }
  8423. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8424. }
  8425. #endif
  8426. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8427. {
  8428. long idx;
  8429. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8430. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8431. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8432. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8433. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8434. return WOLFSSL_SUCCESS;
  8435. }
  8436. }
  8437. (void)idx;
  8438. return WOLFSSL_FAILURE;
  8439. }
  8440. #endif /* OPENSSL_EXTRA */
  8441. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8442. int derSz)
  8443. {
  8444. long idx;
  8445. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8446. if (der != NULL && ssl != NULL) {
  8447. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8448. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8449. return WOLFSSL_SUCCESS;
  8450. }
  8451. }
  8452. (void)idx;
  8453. return WOLFSSL_FAILURE;
  8454. }
  8455. #ifndef NO_FILESYSTEM
  8456. WOLFSSL_ABI
  8457. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8458. {
  8459. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8460. if (ssl == NULL) {
  8461. return BAD_FUNC_ARG;
  8462. }
  8463. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8464. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8465. return WOLFSSL_SUCCESS;
  8466. }
  8467. return WOLFSSL_FAILURE;
  8468. }
  8469. WOLFSSL_ABI
  8470. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8471. {
  8472. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8473. if (ssl == NULL) {
  8474. return BAD_FUNC_ARG;
  8475. }
  8476. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8477. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8478. return WOLFSSL_SUCCESS;
  8479. }
  8480. return WOLFSSL_FAILURE;
  8481. }
  8482. WOLFSSL_ABI
  8483. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8484. {
  8485. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8486. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8487. if (ssl == NULL) {
  8488. return BAD_FUNC_ARG;
  8489. }
  8490. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8491. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8492. return WOLFSSL_SUCCESS;
  8493. }
  8494. return WOLFSSL_FAILURE;
  8495. }
  8496. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8497. int format)
  8498. {
  8499. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8500. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8501. if (ssl == NULL) {
  8502. return BAD_FUNC_ARG;
  8503. }
  8504. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8505. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8506. return WOLFSSL_SUCCESS;
  8507. }
  8508. return WOLFSSL_FAILURE;
  8509. }
  8510. #endif /* !NO_FILESYSTEM */
  8511. #ifdef HAVE_ECC
  8512. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8513. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8514. {
  8515. if (ctx == NULL)
  8516. return BAD_FUNC_ARG;
  8517. /* if 0 then get from loaded private key */
  8518. if (sz == 0) {
  8519. /* applies only to ECDSA */
  8520. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8521. return WOLFSSL_SUCCESS;
  8522. if (ctx->privateKeySz == 0) {
  8523. WOLFSSL_MSG("Must set private key/cert first");
  8524. return BAD_FUNC_ARG;
  8525. }
  8526. sz = (word16)ctx->privateKeySz;
  8527. }
  8528. /* check size */
  8529. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8530. return BAD_FUNC_ARG;
  8531. ctx->eccTempKeySz = sz;
  8532. return WOLFSSL_SUCCESS;
  8533. }
  8534. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8535. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8536. {
  8537. if (ssl == NULL)
  8538. return BAD_FUNC_ARG;
  8539. /* check size */
  8540. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8541. return BAD_FUNC_ARG;
  8542. ssl->eccTempKeySz = sz;
  8543. return WOLFSSL_SUCCESS;
  8544. }
  8545. #endif /* HAVE_ECC */
  8546. #ifdef OPENSSL_EXTRA
  8547. #ifndef NO_FILESYSTEM
  8548. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8549. int format)
  8550. {
  8551. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8552. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8553. }
  8554. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8555. {
  8556. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  8557. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  8558. }
  8559. #endif /* NO_FILESYSTEM */
  8560. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  8561. * of master secret.
  8562. *
  8563. * ses : a session from completed TLS/SSL handshake
  8564. * out : buffer to hold copy of master secret
  8565. * outSz : size of out buffer
  8566. * returns : number of bytes copied into out buffer on success
  8567. * less then or equal to 0 is considered a failure case
  8568. */
  8569. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  8570. unsigned char* out, int outSz)
  8571. {
  8572. int size;
  8573. ses = ClientSessionToSession(ses);
  8574. if (outSz == 0) {
  8575. return SECRET_LEN;
  8576. }
  8577. if (ses == NULL || out == NULL || outSz < 0) {
  8578. return 0;
  8579. }
  8580. if (outSz > SECRET_LEN) {
  8581. size = SECRET_LEN;
  8582. }
  8583. else {
  8584. size = outSz;
  8585. }
  8586. XMEMCPY(out, ses->masterSecret, size);
  8587. return size;
  8588. }
  8589. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  8590. {
  8591. (void)ses;
  8592. return SECRET_LEN;
  8593. }
  8594. #ifdef WOLFSSL_EARLY_DATA
  8595. unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session)
  8596. {
  8597. return session->maxEarlyDataSz;
  8598. }
  8599. #endif /* WOLFSSL_EARLY_DATA */
  8600. #endif /* OPENSSL_EXTRA */
  8601. typedef struct {
  8602. byte verifyPeer:1;
  8603. byte verifyNone:1;
  8604. byte failNoCert:1;
  8605. byte failNoCertxPSK:1;
  8606. byte verifyPostHandshake:1;
  8607. } SetVerifyOptions;
  8608. static SetVerifyOptions ModeToVerifyOptions(int mode)
  8609. {
  8610. SetVerifyOptions opts;
  8611. XMEMSET(&opts, 0, sizeof(SetVerifyOptions));
  8612. if (mode != WOLFSSL_VERIFY_DEFAULT) {
  8613. opts.verifyNone = (mode == WOLFSSL_VERIFY_NONE);
  8614. if (!opts.verifyNone) {
  8615. opts.verifyPeer =
  8616. (mode & WOLFSSL_VERIFY_PEER) != 0;
  8617. opts.failNoCertxPSK =
  8618. (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) != 0;
  8619. opts.failNoCert =
  8620. (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) != 0;
  8621. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8622. opts.verifyPostHandshake =
  8623. (mode & WOLFSSL_VERIFY_POST_HANDSHAKE) != 0;
  8624. #endif
  8625. }
  8626. }
  8627. return opts;
  8628. }
  8629. WOLFSSL_ABI
  8630. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  8631. {
  8632. SetVerifyOptions opts;
  8633. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  8634. if (ctx == NULL)
  8635. return;
  8636. opts = ModeToVerifyOptions(mode);
  8637. ctx->verifyNone = opts.verifyNone;
  8638. ctx->verifyPeer = opts.verifyPeer;
  8639. ctx->failNoCert = opts.failNoCert;
  8640. ctx->failNoCertxPSK = opts.failNoCertxPSK;
  8641. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8642. ctx->verifyPostHandshake = opts.verifyPostHandshake;
  8643. #endif
  8644. ctx->verifyCallback = vc;
  8645. }
  8646. #ifdef OPENSSL_ALL
  8647. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  8648. CertVerifyCallback cb, void* arg)
  8649. {
  8650. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  8651. if (ctx == NULL)
  8652. return;
  8653. ctx->verifyCertCb = cb;
  8654. ctx->verifyCertCbArg = arg;
  8655. }
  8656. #endif
  8657. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  8658. {
  8659. SetVerifyOptions opts;
  8660. WOLFSSL_ENTER("wolfSSL_set_verify");
  8661. if (ssl == NULL)
  8662. return;
  8663. opts = ModeToVerifyOptions(mode);
  8664. ssl->options.verifyNone = opts.verifyNone;
  8665. ssl->options.verifyPeer = opts.verifyPeer;
  8666. ssl->options.failNoCert = opts.failNoCert;
  8667. ssl->options.failNoCertxPSK = opts.failNoCertxPSK;
  8668. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8669. ssl->options.verifyPostHandshake = opts.verifyPostHandshake;
  8670. #endif
  8671. ssl->verifyCallback = vc;
  8672. }
  8673. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  8674. {
  8675. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  8676. if (ssl == NULL)
  8677. return;
  8678. #ifdef OPENSSL_ALL
  8679. ssl->verifyCallbackResult = v;
  8680. #else
  8681. (void)v;
  8682. WOLFSSL_STUB("wolfSSL_set_verify_result");
  8683. #endif
  8684. }
  8685. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  8686. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8687. /* For TLS v1.3 send handshake messages after handshake completes. */
  8688. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  8689. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  8690. {
  8691. int ret = wolfSSL_request_certificate(ssl);
  8692. if (ret != WOLFSSL_SUCCESS) {
  8693. if (!IsAtLeastTLSv1_3(ssl->version)) {
  8694. /* specific error of wrong version expected */
  8695. WOLFSSL_ERROR(UNSUPPORTED_PROTO_VERSION);
  8696. }
  8697. else {
  8698. WOLFSSL_ERROR(ret); /* log the error in the error queue */
  8699. }
  8700. }
  8701. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8702. }
  8703. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  8704. {
  8705. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  8706. if (ret == 0) {
  8707. ctx->postHandshakeAuth = (val != 0);
  8708. }
  8709. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8710. }
  8711. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  8712. {
  8713. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  8714. if (ret == 0) {
  8715. ssl->options.postHandshakeAuth = (val != 0);
  8716. }
  8717. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  8718. }
  8719. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  8720. /* store user ctx for verify callback */
  8721. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  8722. {
  8723. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  8724. if (ssl)
  8725. ssl->verifyCbCtx = ctx;
  8726. }
  8727. /* store user ctx for verify callback */
  8728. void wolfSSL_CTX_SetCertCbCtx(WOLFSSL_CTX* ctx, void* userCtx)
  8729. {
  8730. WOLFSSL_ENTER("wolfSSL_CTX_SetCertCbCtx");
  8731. if (ctx)
  8732. ctx->verifyCbCtx = userCtx;
  8733. }
  8734. /* store context CA Cache addition callback */
  8735. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  8736. {
  8737. if (ctx && ctx->cm)
  8738. ctx->cm->caCacheCallback = cb;
  8739. }
  8740. #if defined(PERSIST_CERT_CACHE)
  8741. #if !defined(NO_FILESYSTEM)
  8742. /* Persist cert cache to file */
  8743. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8744. {
  8745. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  8746. if (ctx == NULL || fname == NULL)
  8747. return BAD_FUNC_ARG;
  8748. return CM_SaveCertCache(ctx->cm, fname);
  8749. }
  8750. /* Persist cert cache from file */
  8751. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8752. {
  8753. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  8754. if (ctx == NULL || fname == NULL)
  8755. return BAD_FUNC_ARG;
  8756. return CM_RestoreCertCache(ctx->cm, fname);
  8757. }
  8758. #endif /* NO_FILESYSTEM */
  8759. /* Persist cert cache to memory */
  8760. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  8761. int sz, int* used)
  8762. {
  8763. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  8764. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  8765. return BAD_FUNC_ARG;
  8766. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  8767. }
  8768. /* Restore cert cache from memory */
  8769. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  8770. {
  8771. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  8772. if (ctx == NULL || mem == NULL || sz <= 0)
  8773. return BAD_FUNC_ARG;
  8774. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  8775. }
  8776. /* get how big the the cert cache save buffer needs to be */
  8777. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  8778. {
  8779. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  8780. if (ctx == NULL)
  8781. return BAD_FUNC_ARG;
  8782. return CM_GetCertCacheMemSize(ctx->cm);
  8783. }
  8784. #endif /* PERSIST_CERT_CACHE */
  8785. #endif /* !NO_CERTS */
  8786. #ifndef NO_SESSION_CACHE
  8787. WOLFSSL_ABI
  8788. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  8789. {
  8790. WOLFSSL_ENTER("SSL_get_session");
  8791. if (ssl) {
  8792. #ifdef NO_SESSION_CACHE_REF
  8793. return ssl->session;
  8794. #else
  8795. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8796. /* On the client side we want to return a persistant reference for
  8797. * backwards compatibility. */
  8798. #ifndef NO_CLIENT_CACHE
  8799. if (ssl->clientSession) {
  8800. return (WOLFSSL_SESSION*)ssl->clientSession;
  8801. }
  8802. else {
  8803. /* Try to add a ClientCache entry to associate with the current
  8804. * session. Ignore any session cache options. */
  8805. int err;
  8806. const byte* id = ssl->session->sessionID;
  8807. byte idSz = ssl->session->sessionIDSz;
  8808. if (ssl->session->haveAltSessionID) {
  8809. id = ssl->session->altSessionID;
  8810. idSz = ID_LEN;
  8811. }
  8812. err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz,
  8813. NULL, ssl->session->side,
  8814. #ifdef HAVE_SESSION_TICKET
  8815. ssl->session->ticketLen > 0,
  8816. #else
  8817. 0,
  8818. #endif
  8819. &ssl->clientSession);
  8820. if (err == 0) {
  8821. return (WOLFSSL_SESSION*)ssl->clientSession;
  8822. }
  8823. }
  8824. #endif
  8825. }
  8826. else {
  8827. return ssl->session;
  8828. }
  8829. #endif
  8830. }
  8831. return NULL;
  8832. }
  8833. /* The get1 version requires caller to call SSL_SESSION_free */
  8834. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  8835. {
  8836. WOLFSSL_SESSION* sess = NULL;
  8837. WOLFSSL_ENTER("SSL_get1_session");
  8838. if (ssl != NULL) {
  8839. sess = ssl->session;
  8840. if (sess != NULL) {
  8841. /* increase reference count if allocated session */
  8842. if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) {
  8843. if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS)
  8844. sess = NULL;
  8845. }
  8846. }
  8847. }
  8848. return sess;
  8849. }
  8850. /*
  8851. * Sets the session object to use when establishing a TLS/SSL session using
  8852. * the ssl object. Therefore, this function must be called before
  8853. * wolfSSL_connect. The session object to use can be obtained in a previous
  8854. * TLS/SSL connection using wolfSSL_get_session.
  8855. *
  8856. * This function rejects the session if it has been expired when this function
  8857. * is called. Note that this expiration check is wolfSSL specific and differs
  8858. * from OpenSSL return code behavior.
  8859. *
  8860. * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully
  8861. * setting the session, WOLFSSL_FAILURE on failure due to the session cache
  8862. * being disabled, or the session has expired.
  8863. *
  8864. * To match OpenSSL return code behavior when session is expired, define
  8865. * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return
  8866. * WOLFSSL_SUCCESS even when the session is expired and rejected.
  8867. */
  8868. WOLFSSL_ABI
  8869. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  8870. {
  8871. WOLFSSL_ENTER("SSL_set_session");
  8872. if (session)
  8873. return wolfSSL_SetSession(ssl, session);
  8874. return WOLFSSL_FAILURE;
  8875. }
  8876. #ifndef NO_CLIENT_CACHE
  8877. /* Associate client session with serverID, find existing or store for saving
  8878. if newSession flag on, don't reuse existing session
  8879. WOLFSSL_SUCCESS on ok */
  8880. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  8881. {
  8882. WOLFSSL_SESSION* session = NULL;
  8883. WOLFSSL_ENTER("wolfSSL_SetServerID");
  8884. if (ssl == NULL || id == NULL || len <= 0)
  8885. return BAD_FUNC_ARG;
  8886. if (newSession == 0) {
  8887. session = wolfSSL_GetSessionClient(ssl, id, len);
  8888. if (session) {
  8889. if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  8890. #ifdef HAVE_EXT_CACHE
  8891. wolfSSL_FreeSession(ssl->ctx, session);
  8892. #endif
  8893. WOLFSSL_MSG("wolfSSL_SetSession failed");
  8894. session = NULL;
  8895. }
  8896. }
  8897. }
  8898. if (session == NULL) {
  8899. WOLFSSL_MSG("Valid ServerID not cached already");
  8900. ssl->session->idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  8901. XMEMCPY(ssl->session->serverID, id, ssl->session->idLen);
  8902. }
  8903. #ifdef HAVE_EXT_CACHE
  8904. else {
  8905. wolfSSL_FreeSession(ssl->ctx, session);
  8906. }
  8907. #endif
  8908. return WOLFSSL_SUCCESS;
  8909. }
  8910. #endif /* !NO_CLIENT_CACHE */
  8911. #if defined(PERSIST_SESSION_CACHE)
  8912. /* for persistence, if changes to layout need to increment and modify
  8913. save_session_cache() and restore_session_cache and memory versions too */
  8914. #define WOLFSSL_CACHE_VERSION 2
  8915. /* Session Cache Header information */
  8916. typedef struct {
  8917. int version; /* cache layout version id */
  8918. int rows; /* session rows */
  8919. int columns; /* session columns */
  8920. int sessionSz; /* sizeof WOLFSSL_SESSION */
  8921. } cache_header_t;
  8922. /* current persistence layout is:
  8923. 1) cache_header_t
  8924. 2) SessionCache
  8925. 3) ClientCache
  8926. update WOLFSSL_CACHE_VERSION if change layout for the following
  8927. PERSISTENT_SESSION_CACHE functions
  8928. */
  8929. /* get how big the the session cache save buffer needs to be */
  8930. int wolfSSL_get_session_cache_memsize(void)
  8931. {
  8932. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  8933. #ifndef NO_CLIENT_CACHE
  8934. sz += (int)(sizeof(ClientCache));
  8935. #endif
  8936. return sz;
  8937. }
  8938. /* Persist session cache to memory */
  8939. int wolfSSL_memsave_session_cache(void* mem, int sz)
  8940. {
  8941. int i;
  8942. cache_header_t cache_header;
  8943. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8944. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  8945. if (sz < wolfSSL_get_session_cache_memsize()) {
  8946. WOLFSSL_MSG("Memory buffer too small");
  8947. return BUFFER_E;
  8948. }
  8949. cache_header.version = WOLFSSL_CACHE_VERSION;
  8950. cache_header.rows = SESSION_ROWS;
  8951. cache_header.columns = SESSIONS_PER_ROW;
  8952. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  8953. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  8954. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  8955. if (wc_LockMutex(&session_mutex) != 0) {
  8956. WOLFSSL_MSG("Session cache mutex lock failed");
  8957. return BAD_MUTEX_E;
  8958. }
  8959. #endif
  8960. for (i = 0; i < cache_header.rows; ++i) {
  8961. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  8962. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  8963. WOLFSSL_MSG("Session row cache mutex lock failed");
  8964. return BAD_MUTEX_E;
  8965. }
  8966. #endif
  8967. XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW);
  8968. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  8969. SESSION_ROW_UNLOCK(&SessionCache[i]);
  8970. #endif
  8971. }
  8972. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  8973. wc_UnLockMutex(&session_mutex);
  8974. #endif
  8975. #ifndef NO_CLIENT_CACHE
  8976. if (wc_LockMutex(&clisession_mutex) != 0) {
  8977. WOLFSSL_MSG("Client cache mutex lock failed");
  8978. return BAD_MUTEX_E;
  8979. }
  8980. XMEMCPY(row, ClientCache, sizeof(ClientCache));
  8981. wc_UnLockMutex(&clisession_mutex);
  8982. #endif
  8983. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  8984. return WOLFSSL_SUCCESS;
  8985. }
  8986. /* Restore the persistent session cache from memory */
  8987. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  8988. {
  8989. int i;
  8990. cache_header_t cache_header;
  8991. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8992. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  8993. if (sz < wolfSSL_get_session_cache_memsize()) {
  8994. WOLFSSL_MSG("Memory buffer too small");
  8995. return BUFFER_E;
  8996. }
  8997. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  8998. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  8999. cache_header.rows != SESSION_ROWS ||
  9000. cache_header.columns != SESSIONS_PER_ROW ||
  9001. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9002. WOLFSSL_MSG("Session cache header match failed");
  9003. return CACHE_MATCH_ERROR;
  9004. }
  9005. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9006. if (wc_LockMutex(&session_mutex) != 0) {
  9007. WOLFSSL_MSG("Session cache mutex lock failed");
  9008. return BAD_MUTEX_E;
  9009. }
  9010. #endif
  9011. for (i = 0; i < cache_header.rows; ++i) {
  9012. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9013. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9014. WOLFSSL_MSG("Session row cache mutex lock failed");
  9015. return BAD_MUTEX_E;
  9016. }
  9017. #endif
  9018. XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW);
  9019. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9020. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9021. #endif
  9022. }
  9023. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9024. wc_UnLockMutex(&session_mutex);
  9025. #endif
  9026. #ifndef NO_CLIENT_CACHE
  9027. if (wc_LockMutex(&clisession_mutex) != 0) {
  9028. WOLFSSL_MSG("Client cache mutex lock failed");
  9029. return BAD_MUTEX_E;
  9030. }
  9031. XMEMCPY(ClientCache, row, sizeof(ClientCache));
  9032. wc_UnLockMutex(&clisession_mutex);
  9033. #endif
  9034. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9035. return WOLFSSL_SUCCESS;
  9036. }
  9037. #if !defined(NO_FILESYSTEM)
  9038. /* Persist session cache to file */
  9039. /* doesn't use memsave because of additional memory use */
  9040. int wolfSSL_save_session_cache(const char *fname)
  9041. {
  9042. XFILE file;
  9043. int ret;
  9044. int rc = WOLFSSL_SUCCESS;
  9045. int i;
  9046. cache_header_t cache_header;
  9047. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9048. file = XFOPEN(fname, "w+b");
  9049. if (file == XBADFILE) {
  9050. WOLFSSL_MSG("Couldn't open session cache save file");
  9051. return WOLFSSL_BAD_FILE;
  9052. }
  9053. cache_header.version = WOLFSSL_CACHE_VERSION;
  9054. cache_header.rows = SESSION_ROWS;
  9055. cache_header.columns = SESSIONS_PER_ROW;
  9056. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9057. /* cache header */
  9058. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9059. if (ret != 1) {
  9060. WOLFSSL_MSG("Session cache header file write failed");
  9061. XFCLOSE(file);
  9062. return FWRITE_ERROR;
  9063. }
  9064. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9065. if (wc_LockMutex(&session_mutex) != 0) {
  9066. WOLFSSL_MSG("Session cache mutex lock failed");
  9067. XFCLOSE(file);
  9068. return BAD_MUTEX_E;
  9069. }
  9070. #endif
  9071. /* session cache */
  9072. for (i = 0; i < cache_header.rows; ++i) {
  9073. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9074. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9075. WOLFSSL_MSG("Session row cache mutex lock failed");
  9076. XFCLOSE(file);
  9077. return BAD_MUTEX_E;
  9078. }
  9079. #endif
  9080. ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9081. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9082. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9083. #endif
  9084. if (ret != 1) {
  9085. WOLFSSL_MSG("Session cache member file write failed");
  9086. rc = FWRITE_ERROR;
  9087. break;
  9088. }
  9089. }
  9090. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9091. wc_UnLockMutex(&session_mutex);
  9092. #endif
  9093. #ifndef NO_CLIENT_CACHE
  9094. /* client cache */
  9095. if (wc_LockMutex(&clisession_mutex) != 0) {
  9096. WOLFSSL_MSG("Client cache mutex lock failed");
  9097. XFCLOSE(file);
  9098. return BAD_MUTEX_E;
  9099. }
  9100. ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file);
  9101. if (ret != 1) {
  9102. WOLFSSL_MSG("Client cache member file write failed");
  9103. rc = FWRITE_ERROR;
  9104. }
  9105. wc_UnLockMutex(&clisession_mutex);
  9106. #endif /* !NO_CLIENT_CACHE */
  9107. XFCLOSE(file);
  9108. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9109. return rc;
  9110. }
  9111. /* Restore the persistent session cache from file */
  9112. /* doesn't use memstore because of additional memory use */
  9113. int wolfSSL_restore_session_cache(const char *fname)
  9114. {
  9115. XFILE file;
  9116. int rc = WOLFSSL_SUCCESS;
  9117. int ret;
  9118. int i;
  9119. cache_header_t cache_header;
  9120. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9121. file = XFOPEN(fname, "rb");
  9122. if (file == XBADFILE) {
  9123. WOLFSSL_MSG("Couldn't open session cache save file");
  9124. return WOLFSSL_BAD_FILE;
  9125. }
  9126. /* cache header */
  9127. ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file);
  9128. if (ret != 1) {
  9129. WOLFSSL_MSG("Session cache header file read failed");
  9130. XFCLOSE(file);
  9131. return FREAD_ERROR;
  9132. }
  9133. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9134. cache_header.rows != SESSION_ROWS ||
  9135. cache_header.columns != SESSIONS_PER_ROW ||
  9136. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9137. WOLFSSL_MSG("Session cache header match failed");
  9138. XFCLOSE(file);
  9139. return CACHE_MATCH_ERROR;
  9140. }
  9141. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9142. if (wc_LockMutex(&session_mutex) != 0) {
  9143. WOLFSSL_MSG("Session cache mutex lock failed");
  9144. XFCLOSE(file);
  9145. return BAD_MUTEX_E;
  9146. }
  9147. #endif
  9148. /* session cache */
  9149. for (i = 0; i < cache_header.rows; ++i) {
  9150. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9151. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  9152. WOLFSSL_MSG("Session row cache mutex lock failed");
  9153. XFCLOSE(file);
  9154. return BAD_MUTEX_E;
  9155. }
  9156. #endif
  9157. ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  9158. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  9159. SESSION_ROW_UNLOCK(&SessionCache[i]);
  9160. #endif
  9161. if (ret != 1) {
  9162. WOLFSSL_MSG("Session cache member file read failed");
  9163. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9164. rc = FREAD_ERROR;
  9165. break;
  9166. }
  9167. }
  9168. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  9169. wc_UnLockMutex(&session_mutex);
  9170. #endif
  9171. #ifndef NO_CLIENT_CACHE
  9172. /* client cache */
  9173. if (wc_LockMutex(&clisession_mutex) != 0) {
  9174. WOLFSSL_MSG("Client cache mutex lock failed");
  9175. XFCLOSE(file);
  9176. return BAD_MUTEX_E;
  9177. }
  9178. ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file);
  9179. if (ret != 1) {
  9180. WOLFSSL_MSG("Client cache member file read failed");
  9181. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9182. rc = FREAD_ERROR;
  9183. }
  9184. wc_UnLockMutex(&clisession_mutex);
  9185. #endif /* !NO_CLIENT_CACHE */
  9186. XFCLOSE(file);
  9187. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9188. return rc;
  9189. }
  9190. #endif /* !NO_FILESYSTEM */
  9191. #endif /* PERSIST_SESSION_CACHE */
  9192. #endif /* NO_SESSION_CACHE */
  9193. void wolfSSL_load_error_strings(void)
  9194. {
  9195. /* compatibility only */
  9196. }
  9197. int wolfSSL_library_init(void)
  9198. {
  9199. WOLFSSL_ENTER("SSL_library_init");
  9200. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9201. return WOLFSSL_SUCCESS;
  9202. else
  9203. return WOLFSSL_FATAL_ERROR;
  9204. }
  9205. #ifdef HAVE_SECRET_CALLBACK
  9206. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9207. {
  9208. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9209. if (ssl == NULL)
  9210. return WOLFSSL_FATAL_ERROR;
  9211. ssl->sessionSecretCb = cb;
  9212. ssl->sessionSecretCtx = ctx;
  9213. if (cb != NULL) {
  9214. /* If using a pre-set key, assume session resumption. */
  9215. ssl->session->sessionIDSz = 0;
  9216. ssl->options.resuming = 1;
  9217. }
  9218. return WOLFSSL_SUCCESS;
  9219. }
  9220. #endif
  9221. #ifndef NO_SESSION_CACHE
  9222. /* on by default if built in but allow user to turn off */
  9223. WOLFSSL_ABI
  9224. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9225. {
  9226. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  9227. if (ctx == NULL)
  9228. return WOLFSSL_FAILURE;
  9229. if (mode == WOLFSSL_SESS_CACHE_OFF)
  9230. ctx->sessionCacheOff = 1;
  9231. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  9232. ctx->sessionCacheFlushOff = 1;
  9233. #ifdef HAVE_EXT_CACHE
  9234. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  9235. ctx->internalCacheOff = 1;
  9236. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0)
  9237. ctx->internalCacheLookupOff = 1;
  9238. #endif
  9239. return WOLFSSL_SUCCESS;
  9240. }
  9241. #endif /* NO_SESSION_CACHE */
  9242. #if !defined(NO_CERTS)
  9243. #if defined(PERSIST_CERT_CACHE)
  9244. #define WOLFSSL_CACHE_CERT_VERSION 1
  9245. typedef struct {
  9246. int version; /* cache cert layout version id */
  9247. int rows; /* hash table rows, CA_TABLE_SIZE */
  9248. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  9249. int signerSz; /* sizeof Signer object */
  9250. } CertCacheHeader;
  9251. /* current cert persistence layout is:
  9252. 1) CertCacheHeader
  9253. 2) caTable
  9254. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  9255. PERSIST_CERT_CACHE functions
  9256. */
  9257. /* Return memory needed to persist this signer, have lock */
  9258. static WC_INLINE int GetSignerMemory(Signer* signer)
  9259. {
  9260. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  9261. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9262. #if !defined(NO_SKID)
  9263. sz += (int)sizeof(signer->subjectKeyIdHash);
  9264. #endif
  9265. /* add dynamic bytes needed */
  9266. sz += signer->pubKeySize;
  9267. sz += signer->nameLen;
  9268. return sz;
  9269. }
  9270. /* Return memory needed to persist this row, have lock */
  9271. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  9272. {
  9273. int sz = 0;
  9274. while (row) {
  9275. sz += GetSignerMemory(row);
  9276. row = row->next;
  9277. }
  9278. return sz;
  9279. }
  9280. /* get the size of persist cert cache, have lock */
  9281. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9282. {
  9283. int sz;
  9284. int i;
  9285. sz = sizeof(CertCacheHeader);
  9286. for (i = 0; i < CA_TABLE_SIZE; i++)
  9287. sz += GetCertCacheRowMemory(cm->caTable[i]);
  9288. return sz;
  9289. }
  9290. /* Store cert cache header columns with number of items per list, have lock */
  9291. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  9292. {
  9293. int i;
  9294. Signer* row;
  9295. for (i = 0; i < CA_TABLE_SIZE; i++) {
  9296. int count = 0;
  9297. row = cm->caTable[i];
  9298. while (row) {
  9299. ++count;
  9300. row = row->next;
  9301. }
  9302. columns[i] = count;
  9303. }
  9304. }
  9305. /* Restore whole cert row from memory, have lock, return bytes consumed,
  9306. < 0 on error, have lock */
  9307. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  9308. int row, int listSz, const byte* end)
  9309. {
  9310. int idx = 0;
  9311. if (listSz < 0) {
  9312. WOLFSSL_MSG("Row header corrupted, negative value");
  9313. return PARSE_ERROR;
  9314. }
  9315. while (listSz) {
  9316. Signer* signer;
  9317. byte* publicKey;
  9318. byte* start = current + idx; /* for end checks on this signer */
  9319. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  9320. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9321. #ifndef NO_SKID
  9322. minSz += (int)sizeof(signer->subjectKeyIdHash);
  9323. #endif
  9324. if (start + minSz > end) {
  9325. WOLFSSL_MSG("Would overread restore buffer");
  9326. return BUFFER_E;
  9327. }
  9328. signer = MakeSigner(cm->heap);
  9329. if (signer == NULL)
  9330. return MEMORY_E;
  9331. /* pubKeySize */
  9332. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  9333. idx += (int)sizeof(signer->pubKeySize);
  9334. /* keyOID */
  9335. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  9336. idx += (int)sizeof(signer->keyOID);
  9337. /* publicKey */
  9338. if (start + minSz + signer->pubKeySize > end) {
  9339. WOLFSSL_MSG("Would overread restore buffer");
  9340. FreeSigner(signer, cm->heap);
  9341. return BUFFER_E;
  9342. }
  9343. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  9344. DYNAMIC_TYPE_KEY);
  9345. if (publicKey == NULL) {
  9346. FreeSigner(signer, cm->heap);
  9347. return MEMORY_E;
  9348. }
  9349. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  9350. signer->publicKey = publicKey;
  9351. idx += signer->pubKeySize;
  9352. /* nameLen */
  9353. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  9354. idx += (int)sizeof(signer->nameLen);
  9355. /* name */
  9356. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  9357. WOLFSSL_MSG("Would overread restore buffer");
  9358. FreeSigner(signer, cm->heap);
  9359. return BUFFER_E;
  9360. }
  9361. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  9362. DYNAMIC_TYPE_SUBJECT_CN);
  9363. if (signer->name == NULL) {
  9364. FreeSigner(signer, cm->heap);
  9365. return MEMORY_E;
  9366. }
  9367. XMEMCPY(signer->name, current + idx, signer->nameLen);
  9368. idx += signer->nameLen;
  9369. /* subjectNameHash */
  9370. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  9371. idx += SIGNER_DIGEST_SIZE;
  9372. #ifndef NO_SKID
  9373. /* subjectKeyIdHash */
  9374. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  9375. idx += SIGNER_DIGEST_SIZE;
  9376. #endif
  9377. signer->next = cm->caTable[row];
  9378. cm->caTable[row] = signer;
  9379. --listSz;
  9380. }
  9381. return idx;
  9382. }
  9383. /* Store whole cert row into memory, have lock, return bytes added */
  9384. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  9385. {
  9386. int added = 0;
  9387. Signer* list = cm->caTable[row];
  9388. while (list) {
  9389. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  9390. added += (int)sizeof(list->pubKeySize);
  9391. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  9392. added += (int)sizeof(list->keyOID);
  9393. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  9394. added += list->pubKeySize;
  9395. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  9396. added += (int)sizeof(list->nameLen);
  9397. XMEMCPY(current + added, list->name, list->nameLen);
  9398. added += list->nameLen;
  9399. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  9400. added += SIGNER_DIGEST_SIZE;
  9401. #ifndef NO_SKID
  9402. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  9403. added += SIGNER_DIGEST_SIZE;
  9404. #endif
  9405. list = list->next;
  9406. }
  9407. return added;
  9408. }
  9409. /* Persist cert cache to memory, have lock */
  9410. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  9411. void* mem, int sz)
  9412. {
  9413. int realSz;
  9414. int ret = WOLFSSL_SUCCESS;
  9415. int i;
  9416. WOLFSSL_ENTER("DoMemSaveCertCache");
  9417. realSz = GetCertCacheMemSize(cm);
  9418. if (realSz > sz) {
  9419. WOLFSSL_MSG("Mem output buffer too small");
  9420. ret = BUFFER_E;
  9421. }
  9422. else {
  9423. byte* current;
  9424. CertCacheHeader hdr;
  9425. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  9426. hdr.rows = CA_TABLE_SIZE;
  9427. SetCertHeaderColumns(cm, hdr.columns);
  9428. hdr.signerSz = (int)sizeof(Signer);
  9429. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  9430. current = (byte*)mem + sizeof(CertCacheHeader);
  9431. for (i = 0; i < CA_TABLE_SIZE; ++i)
  9432. current += StoreCertRow(cm, current, i);
  9433. }
  9434. return ret;
  9435. }
  9436. #if !defined(NO_FILESYSTEM)
  9437. /* Persist cert cache to file */
  9438. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9439. {
  9440. XFILE file;
  9441. int rc = WOLFSSL_SUCCESS;
  9442. int memSz;
  9443. byte* mem;
  9444. WOLFSSL_ENTER("CM_SaveCertCache");
  9445. file = XFOPEN(fname, "w+b");
  9446. if (file == XBADFILE) {
  9447. WOLFSSL_MSG("Couldn't open cert cache save file");
  9448. return WOLFSSL_BAD_FILE;
  9449. }
  9450. if (wc_LockMutex(&cm->caLock) != 0) {
  9451. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9452. XFCLOSE(file);
  9453. return BAD_MUTEX_E;
  9454. }
  9455. memSz = GetCertCacheMemSize(cm);
  9456. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9457. if (mem == NULL) {
  9458. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9459. rc = MEMORY_E;
  9460. } else {
  9461. rc = DoMemSaveCertCache(cm, mem, memSz);
  9462. if (rc == WOLFSSL_SUCCESS) {
  9463. int ret = (int)XFWRITE(mem, memSz, 1, file);
  9464. if (ret != 1) {
  9465. WOLFSSL_MSG("Cert cache file write failed");
  9466. rc = FWRITE_ERROR;
  9467. }
  9468. }
  9469. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9470. }
  9471. wc_UnLockMutex(&cm->caLock);
  9472. XFCLOSE(file);
  9473. return rc;
  9474. }
  9475. /* Restore cert cache from file */
  9476. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9477. {
  9478. XFILE file;
  9479. int rc = WOLFSSL_SUCCESS;
  9480. int ret;
  9481. int memSz;
  9482. byte* mem;
  9483. WOLFSSL_ENTER("CM_RestoreCertCache");
  9484. file = XFOPEN(fname, "rb");
  9485. if (file == XBADFILE) {
  9486. WOLFSSL_MSG("Couldn't open cert cache save file");
  9487. return WOLFSSL_BAD_FILE;
  9488. }
  9489. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  9490. XFCLOSE(file);
  9491. return WOLFSSL_BAD_FILE;
  9492. }
  9493. memSz = (int)XFTELL(file);
  9494. XREWIND(file);
  9495. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  9496. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  9497. XFCLOSE(file);
  9498. return WOLFSSL_BAD_FILE;
  9499. }
  9500. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9501. if (mem == NULL) {
  9502. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9503. XFCLOSE(file);
  9504. return MEMORY_E;
  9505. }
  9506. ret = (int)XFREAD(mem, memSz, 1, file);
  9507. if (ret != 1) {
  9508. WOLFSSL_MSG("Cert file read error");
  9509. rc = FREAD_ERROR;
  9510. } else {
  9511. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9512. if (rc != WOLFSSL_SUCCESS) {
  9513. WOLFSSL_MSG("Mem restore cert cache failed");
  9514. }
  9515. }
  9516. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9517. XFCLOSE(file);
  9518. return rc;
  9519. }
  9520. #endif /* NO_FILESYSTEM */
  9521. /* Persist cert cache to memory */
  9522. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9523. {
  9524. int ret = WOLFSSL_SUCCESS;
  9525. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9526. if (wc_LockMutex(&cm->caLock) != 0) {
  9527. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9528. return BAD_MUTEX_E;
  9529. }
  9530. ret = DoMemSaveCertCache(cm, mem, sz);
  9531. if (ret == WOLFSSL_SUCCESS)
  9532. *used = GetCertCacheMemSize(cm);
  9533. wc_UnLockMutex(&cm->caLock);
  9534. return ret;
  9535. }
  9536. /* Restore cert cache from memory */
  9537. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9538. {
  9539. int ret = WOLFSSL_SUCCESS;
  9540. int i;
  9541. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9542. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9543. byte* end = (byte*)mem + sz; /* don't go over */
  9544. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9545. if (current > end) {
  9546. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9547. return BUFFER_E;
  9548. }
  9549. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9550. hdr->rows != CA_TABLE_SIZE ||
  9551. hdr->signerSz != (int)sizeof(Signer)) {
  9552. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9553. return CACHE_MATCH_ERROR;
  9554. }
  9555. if (wc_LockMutex(&cm->caLock) != 0) {
  9556. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9557. return BAD_MUTEX_E;
  9558. }
  9559. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9560. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9561. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9562. if (added < 0) {
  9563. WOLFSSL_MSG("RestoreCertRow error");
  9564. ret = added;
  9565. break;
  9566. }
  9567. current += added;
  9568. }
  9569. wc_UnLockMutex(&cm->caLock);
  9570. return ret;
  9571. }
  9572. /* get how big the the cert cache save buffer needs to be */
  9573. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9574. {
  9575. int sz;
  9576. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9577. if (wc_LockMutex(&cm->caLock) != 0) {
  9578. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9579. return BAD_MUTEX_E;
  9580. }
  9581. sz = GetCertCacheMemSize(cm);
  9582. wc_UnLockMutex(&cm->caLock);
  9583. return sz;
  9584. }
  9585. #endif /* PERSIST_CERT_CACHE */
  9586. #endif /* NO_CERTS */
  9587. #ifdef OPENSSL_EXTRA
  9588. /*
  9589. * build enabled cipher list w/ TLS13 or w/o TLS13 suites
  9590. * @param ctx a pointer to WOLFSSL_CTX structure
  9591. * @param suites currently enabled suites
  9592. * @param onlytlsv13suites flag whether correcting w/ TLS13 suites
  9593. * or w/o TLS13 suties
  9594. * @param list suites list that user wants to update
  9595. * @return suites list on success, otherwise NULL
  9596. */
  9597. static char* buildEnabledCipherList(WOLFSSL_CTX* ctx, Suites* suites,
  9598. int tls13Only, const char* list)
  9599. {
  9600. word32 idx = 0;
  9601. word32 listsz = 0;
  9602. word32 len = 0;
  9603. word32 ianasz = 0;
  9604. const char* enabledcs = NULL;
  9605. char* locallist = NULL;
  9606. char* head = NULL;
  9607. byte cipherSuite0;
  9608. byte cipherSuite;
  9609. /* sanity check */
  9610. if (ctx == NULL || suites == NULL || list == NULL)
  9611. return NULL;
  9612. if (!suites->setSuites)
  9613. return NULL;
  9614. listsz = (word32)XSTRLEN(list);
  9615. /* calculate necessary buffer length */
  9616. for(idx = 0; idx < suites->suiteSz; idx++) {
  9617. cipherSuite0 = suites->suites[idx];
  9618. cipherSuite = suites->suites[++idx];
  9619. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  9620. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9621. }
  9622. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  9623. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9624. }
  9625. else
  9626. continue;
  9627. if (XSTRCMP(enabledcs, "None") != 0) {
  9628. len += (word32)XSTRLEN(enabledcs) + 2;
  9629. }
  9630. }
  9631. len += listsz + 2;
  9632. /* build string */
  9633. if (len > (listsz + 2)) {
  9634. locallist = (char*)XMALLOC(len, ctx->heap,
  9635. DYNAMIC_TYPE_TMP_BUFFER);
  9636. /* sanity check */
  9637. if (!locallist)
  9638. return NULL;
  9639. XMEMSET(locallist, 0, len);
  9640. head = locallist;
  9641. if (!tls13Only)
  9642. {
  9643. /* always tls13 suites in the head position */
  9644. XSTRNCPY(locallist, list, len);
  9645. locallist += listsz;
  9646. *locallist++ = ':';
  9647. *locallist = 0;
  9648. len -= listsz + 1;
  9649. }
  9650. for(idx = 0; idx < suites->suiteSz; idx++) {
  9651. cipherSuite0 = suites->suites[idx];
  9652. cipherSuite = suites->suites[++idx];
  9653. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  9654. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9655. }
  9656. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  9657. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  9658. }
  9659. else
  9660. continue;
  9661. ianasz = (int)XSTRLEN(enabledcs);
  9662. if (ianasz + 1 < len) {
  9663. XSTRNCPY(locallist, enabledcs, len);
  9664. locallist += ianasz;
  9665. *locallist++ = ':';
  9666. *locallist = 0;
  9667. len -= ianasz + 1;
  9668. }
  9669. else{
  9670. XFREE(locallist, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9671. return NULL;
  9672. }
  9673. }
  9674. if (tls13Only) {
  9675. XSTRNCPY(locallist, list, len);
  9676. locallist += listsz;
  9677. *locallist = 0;
  9678. }
  9679. return head;
  9680. }
  9681. else
  9682. return NULL;
  9683. }
  9684. /*
  9685. * check if the list has TLS13 and pre-TLS13 suites
  9686. * @param list cipher suite list that user want to set
  9687. * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2
  9688. */
  9689. static int CheckcipherList(const char* list)
  9690. {
  9691. int ret;
  9692. int findTLSv13Suites = 0;
  9693. int findbeforeSuites = 0;
  9694. byte cipherSuite0;
  9695. byte cipherSuite1;
  9696. int flags;
  9697. char* next = (char*)list;
  9698. do {
  9699. char* current = next;
  9700. char name[MAX_SUITE_NAME + 1];
  9701. word32 length = MAX_SUITE_NAME;
  9702. word32 current_length;
  9703. next = XSTRSTR(next, ":");
  9704. current_length = (!next) ? (word32)XSTRLEN(current)
  9705. : (word32)(next - current);
  9706. if (current_length < length) {
  9707. length = current_length;
  9708. }
  9709. XMEMCPY(name, current, length);
  9710. name[length] = 0;
  9711. ret = wolfSSL_get_cipher_suite_from_name(name, &cipherSuite0,
  9712. &cipherSuite1, &flags);
  9713. if (ret == 0) {
  9714. if (cipherSuite0 == TLS13_BYTE) {
  9715. /* TLSv13 suite */
  9716. findTLSv13Suites = 1;
  9717. break;
  9718. }
  9719. else {
  9720. findbeforeSuites = 1;
  9721. break;
  9722. }
  9723. }
  9724. if (findTLSv13Suites == 1 && findbeforeSuites == 1) {
  9725. /* list has mixed suites */
  9726. return 0;
  9727. }
  9728. } while (next++); /* ++ needed to skip ':' */
  9729. if (findTLSv13Suites == 0 && findbeforeSuites == 1) {
  9730. return 1;/* only before TLSv13 suites */
  9731. }
  9732. else if (findTLSv13Suites == 1 && findbeforeSuites == 0) {
  9733. return 2;/* only TLSv13 suties */
  9734. }
  9735. else {
  9736. return 0;/* handle as mixed */
  9737. }
  9738. }
  9739. /* parse some bulk lists like !eNULL / !aNULL
  9740. *
  9741. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9742. */
  9743. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9744. const char* list)
  9745. {
  9746. int ret = 0;
  9747. int listattribute = 0;
  9748. char* buildcipherList = NULL;
  9749. int tls13Only = 0;
  9750. if (suites == NULL || list == NULL) {
  9751. WOLFSSL_MSG("NULL argument");
  9752. return WOLFSSL_FAILURE;
  9753. }
  9754. listattribute = CheckcipherList(list);
  9755. if (listattribute == 0) {
  9756. /* list has mixed(pre-TLSv13 and TLSv13) suites
  9757. * update cipher suites the same as before
  9758. */
  9759. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9760. WOLFSSL_FAILURE;
  9761. }
  9762. else if (listattribute == 1) {
  9763. /* list has only pre-TLSv13 suites.
  9764. * Only update before TLSv13 suites.
  9765. */
  9766. tls13Only = 1;
  9767. }
  9768. else if (listattribute == 2) {
  9769. /* list has only TLSv13 suites. Only update TLv13 suites
  9770. * simulate set_ciphersuites() compatibility layer API
  9771. */
  9772. tls13Only = 0;
  9773. }
  9774. buildcipherList = buildEnabledCipherList(ctx, ctx->suites,
  9775. tls13Only, list);
  9776. if (buildcipherList) {
  9777. ret = SetCipherList(ctx, suites, buildcipherList);
  9778. XFREE(buildcipherList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9779. }
  9780. else {
  9781. ret = SetCipherList(ctx, suites, list);
  9782. }
  9783. return ret;
  9784. }
  9785. #endif
  9786. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  9787. {
  9788. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  9789. if (ctx == NULL)
  9790. return WOLFSSL_FAILURE;
  9791. /* alloc/init on demand only */
  9792. if (ctx->suites == NULL) {
  9793. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  9794. DYNAMIC_TYPE_SUITES);
  9795. if (ctx->suites == NULL) {
  9796. WOLFSSL_MSG("Memory alloc for Suites failed");
  9797. return WOLFSSL_FAILURE;
  9798. }
  9799. XMEMSET(ctx->suites, 0, sizeof(Suites));
  9800. }
  9801. #ifdef OPENSSL_EXTRA
  9802. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  9803. #else
  9804. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9805. #endif
  9806. }
  9807. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  9808. {
  9809. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  9810. #ifdef SINGLE_THREADED
  9811. if (ssl->ctx->suites == ssl->suites) {
  9812. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  9813. DYNAMIC_TYPE_SUITES);
  9814. if (ssl->suites == NULL) {
  9815. WOLFSSL_MSG("Suites Memory error");
  9816. return MEMORY_E;
  9817. }
  9818. *ssl->suites = *ssl->ctx->suites;
  9819. ssl->options.ownSuites = 1;
  9820. }
  9821. #endif
  9822. #ifdef OPENSSL_EXTRA
  9823. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  9824. #else
  9825. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9826. #endif
  9827. }
  9828. #ifdef HAVE_KEYING_MATERIAL
  9829. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  9830. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  9831. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  9832. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  9833. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  9834. static const struct ForbiddenLabels {
  9835. const char* label;
  9836. size_t labelLen;
  9837. } forbiddenLabels[] = {
  9838. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  9839. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  9840. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  9841. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  9842. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  9843. {NULL, 0},
  9844. };
  9845. /**
  9846. * Implement RFC 5705
  9847. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  9848. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  9849. */
  9850. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  9851. unsigned char *out, size_t outLen,
  9852. const char *label, size_t labelLen,
  9853. const unsigned char *context, size_t contextLen,
  9854. int use_context)
  9855. {
  9856. byte* seed = NULL;
  9857. word32 seedLen;
  9858. const struct ForbiddenLabels* fl;
  9859. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  9860. if (ssl == NULL || out == NULL || label == NULL ||
  9861. (use_context && contextLen && context == NULL)) {
  9862. WOLFSSL_MSG("Bad argument");
  9863. return WOLFSSL_FAILURE;
  9864. }
  9865. /* clientRandom + serverRandom
  9866. * OR
  9867. * clientRandom + serverRandom + ctx len encoding + ctx */
  9868. seedLen = !use_context ? (word32)SEED_LEN :
  9869. (word32)SEED_LEN + 2 + (word32)contextLen;
  9870. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  9871. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  9872. "data. Call wolfSSL_KeepArrays before attempting to "
  9873. "export keyid material.");
  9874. return WOLFSSL_FAILURE;
  9875. }
  9876. /* check forbidden labels */
  9877. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  9878. if (labelLen >= fl->labelLen &&
  9879. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  9880. WOLFSSL_MSG("Forbidden label");
  9881. return WOLFSSL_FAILURE;
  9882. }
  9883. }
  9884. #ifdef WOLFSSL_TLS13
  9885. if (IsAtLeastTLSv1_3(ssl->version)) {
  9886. /* Path for TLS 1.3 */
  9887. if (!use_context) {
  9888. contextLen = 0;
  9889. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  9890. }
  9891. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  9892. context, contextLen) != 0) {
  9893. WOLFSSL_MSG("Tls13_Exporter error");
  9894. return WOLFSSL_FAILURE;
  9895. }
  9896. return WOLFSSL_SUCCESS;
  9897. }
  9898. #endif
  9899. /* Path for <=TLS 1.2 */
  9900. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9901. if (seed == NULL) {
  9902. WOLFSSL_MSG("malloc error");
  9903. return WOLFSSL_FAILURE;
  9904. }
  9905. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  9906. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  9907. if (use_context) {
  9908. /* Encode len in big endian */
  9909. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  9910. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  9911. if (contextLen) {
  9912. /* 0 length context is allowed */
  9913. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  9914. }
  9915. }
  9916. PRIVATE_KEY_UNLOCK();
  9917. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  9918. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  9919. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  9920. WOLFSSL_MSG("wc_PRF_TLS error");
  9921. PRIVATE_KEY_LOCK();
  9922. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9923. return WOLFSSL_FAILURE;
  9924. }
  9925. PRIVATE_KEY_LOCK();
  9926. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9927. return WOLFSSL_SUCCESS;
  9928. }
  9929. #endif /* HAVE_KEYING_MATERIAL */
  9930. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  9931. {
  9932. int useNb = 0;
  9933. if (ssl == NULL)
  9934. return WOLFSSL_FAILURE;
  9935. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  9936. if (ssl->options.dtls) {
  9937. #ifdef WOLFSSL_DTLS
  9938. useNb = ssl->options.dtlsUseNonblock;
  9939. #endif
  9940. }
  9941. else {
  9942. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  9943. "DEPRECATED for non-DTLS use.");
  9944. }
  9945. return useNb;
  9946. }
  9947. #ifndef WOLFSSL_LEANPSK
  9948. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  9949. {
  9950. (void)nonblock;
  9951. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  9952. if (ssl == NULL)
  9953. return;
  9954. if (ssl->options.dtls) {
  9955. #ifdef WOLFSSL_DTLS
  9956. ssl->options.dtlsUseNonblock = (nonblock != 0);
  9957. #endif
  9958. }
  9959. else {
  9960. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  9961. "DEPRECATED for non-DTLS use.");
  9962. }
  9963. }
  9964. #ifdef WOLFSSL_DTLS
  9965. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  9966. {
  9967. int timeout = 0;
  9968. if (ssl)
  9969. timeout = ssl->dtls_timeout;
  9970. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  9971. return timeout;
  9972. }
  9973. #ifdef WOLFSSL_DTLS13
  9974. /*
  9975. * This API returns 1 when the user should set a short timeout for receiving
  9976. * data. It is recommended that it is at most 1/4 the value returned by
  9977. * wolfSSL_dtls_get_current_timeout().
  9978. */
  9979. int wolfSSL_dtls13_use_quick_timeout(WOLFSSL* ssl)
  9980. {
  9981. return ssl->dtls13FastTimeout;
  9982. }
  9983. /*
  9984. * When this is set, a DTLS 1.3 connection will send acks immediately when a
  9985. * disruption is detected to shortcut timeouts. This results in potentially
  9986. * more traffic but may make the handshake quicker.
  9987. */
  9988. void wolfSSL_dtls13_set_send_more_acks(WOLFSSL* ssl, int value)
  9989. {
  9990. if (ssl != NULL)
  9991. ssl->options.dtls13SendMoreAcks = !!value;
  9992. }
  9993. #endif /* WOLFSSL_DTLS13 */
  9994. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  9995. {
  9996. if (ssl && timeleft) {
  9997. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  9998. timeleft->tv_sec = ssl->dtls_timeout;
  9999. }
  10000. return 0;
  10001. }
  10002. #ifndef NO_WOLFSSL_STUB
  10003. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10004. {
  10005. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10006. (void)ssl;
  10007. return 0;
  10008. }
  10009. #endif
  10010. #ifndef NO_WOLFSSL_STUB
  10011. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10012. {
  10013. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10014. (void)ssl;
  10015. (void)duration_ms;
  10016. }
  10017. #endif
  10018. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10019. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10020. {
  10021. if (ssl == NULL || timeout < 0)
  10022. return BAD_FUNC_ARG;
  10023. if (timeout > ssl->dtls_timeout_max) {
  10024. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10025. return BAD_FUNC_ARG;
  10026. }
  10027. ssl->dtls_timeout_init = timeout;
  10028. ssl->dtls_timeout = timeout;
  10029. return WOLFSSL_SUCCESS;
  10030. }
  10031. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10032. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10033. {
  10034. if (ssl == NULL || timeout < 0)
  10035. return BAD_FUNC_ARG;
  10036. if (timeout < ssl->dtls_timeout_init) {
  10037. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10038. return BAD_FUNC_ARG;
  10039. }
  10040. ssl->dtls_timeout_max = timeout;
  10041. return WOLFSSL_SUCCESS;
  10042. }
  10043. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10044. {
  10045. int result = WOLFSSL_SUCCESS;
  10046. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  10047. if (ssl == NULL)
  10048. return WOLFSSL_FATAL_ERROR;
  10049. #ifdef WOLFSSL_DTLS13
  10050. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  10051. result = Dtls13RtxTimeout(ssl);
  10052. if (result < 0) {
  10053. if (result == WANT_WRITE)
  10054. ssl->dtls13SendingAckOrRtx = 1;
  10055. ssl->error = result;
  10056. WOLFSSL_ERROR(result);
  10057. return WOLFSSL_FATAL_ERROR;
  10058. }
  10059. return WOLFSSL_SUCCESS;
  10060. }
  10061. #endif /* WOLFSSL_DTLS13 */
  10062. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  10063. if (DtlsMsgPoolTimeout(ssl) < 0){
  10064. ssl->error = SOCKET_ERROR_E;
  10065. WOLFSSL_ERROR(ssl->error);
  10066. result = WOLFSSL_FATAL_ERROR;
  10067. }
  10068. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  10069. ssl->error = result;
  10070. WOLFSSL_ERROR(result);
  10071. result = WOLFSSL_FATAL_ERROR;
  10072. }
  10073. else {
  10074. /* Reset return value to success */
  10075. result = WOLFSSL_SUCCESS;
  10076. }
  10077. }
  10078. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  10079. return result;
  10080. }
  10081. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10082. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10083. {
  10084. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  10085. if (ssl == NULL)
  10086. return WOLFSSL_FATAL_ERROR;
  10087. if (!ssl->options.handShakeDone) {
  10088. int result = DtlsMsgPoolSend(ssl, 0);
  10089. if (result < 0) {
  10090. ssl->error = result;
  10091. WOLFSSL_ERROR(result);
  10092. return WOLFSSL_FATAL_ERROR;
  10093. }
  10094. }
  10095. return 0;
  10096. }
  10097. #endif /* DTLS */
  10098. #endif /* LEANPSK */
  10099. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10100. /* Not an SSL function, return 0 for success, error code otherwise */
  10101. /* Prereq: ssl's RNG needs to be initialized. */
  10102. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10103. const byte* secret, word32 secretSz)
  10104. {
  10105. int ret = 0;
  10106. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10107. if (ssl == NULL) {
  10108. WOLFSSL_MSG("need a SSL object");
  10109. return BAD_FUNC_ARG;
  10110. }
  10111. if (secret != NULL && secretSz == 0) {
  10112. WOLFSSL_MSG("can't have a new secret without a size");
  10113. return BAD_FUNC_ARG;
  10114. }
  10115. /* If secretSz is 0, use the default size. */
  10116. if (secretSz == 0)
  10117. secretSz = COOKIE_SECRET_SZ;
  10118. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10119. byte* newSecret;
  10120. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10121. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10122. ssl->buffers.dtlsCookieSecret.length);
  10123. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10124. ssl->heap, DYNAMIC_TYPE_NONE);
  10125. }
  10126. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10127. if (newSecret == NULL) {
  10128. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10129. ssl->buffers.dtlsCookieSecret.length = 0;
  10130. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10131. return MEMORY_ERROR;
  10132. }
  10133. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10134. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10135. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10136. wc_MemZero_Add("wolfSSL_DTLS_SetCookieSecret secret",
  10137. ssl->buffers.dtlsCookieSecret.buffer,
  10138. ssl->buffers.dtlsCookieSecret.length);
  10139. #endif
  10140. }
  10141. /* If the supplied secret is NULL, randomly generate a new secret. */
  10142. if (secret == NULL) {
  10143. ret = wc_RNG_GenerateBlock(ssl->rng,
  10144. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10145. }
  10146. else
  10147. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10148. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10149. return ret;
  10150. }
  10151. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10152. /* EITHER SIDE METHODS */
  10153. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10154. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10155. {
  10156. return wolfSSLv23_method_ex(NULL);
  10157. }
  10158. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10159. {
  10160. WOLFSSL_METHOD* m = NULL;
  10161. WOLFSSL_ENTER("SSLv23_method");
  10162. #if !defined(NO_WOLFSSL_CLIENT)
  10163. m = wolfSSLv23_client_method_ex(heap);
  10164. #elif !defined(NO_WOLFSSL_SERVER)
  10165. m = wolfSSLv23_server_method_ex(heap);
  10166. #else
  10167. (void)heap;
  10168. #endif
  10169. if (m != NULL) {
  10170. m->side = WOLFSSL_NEITHER_END;
  10171. }
  10172. return m;
  10173. }
  10174. #ifdef WOLFSSL_ALLOW_SSLV3
  10175. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10176. {
  10177. return wolfSSLv3_method_ex(NULL);
  10178. }
  10179. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10180. {
  10181. WOLFSSL_METHOD* m = NULL;
  10182. WOLFSSL_ENTER("SSLv3_method");
  10183. #if !defined(NO_WOLFSSL_CLIENT)
  10184. m = wolfSSLv3_client_method_ex(heap);
  10185. #elif !defined(NO_WOLFSSL_SERVER)
  10186. m = wolfSSLv3_server_method_ex(heap);
  10187. #endif
  10188. if (m != NULL) {
  10189. m->side = WOLFSSL_NEITHER_END;
  10190. }
  10191. return m;
  10192. }
  10193. #endif
  10194. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10195. /* client only parts */
  10196. #ifndef NO_WOLFSSL_CLIENT
  10197. #ifdef OPENSSL_EXTRA
  10198. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10199. {
  10200. WOLFSSL_STUB("wolfSSLv2_client_method");
  10201. return NULL;
  10202. }
  10203. #endif
  10204. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10205. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10206. {
  10207. return wolfSSLv3_client_method_ex(NULL);
  10208. }
  10209. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10210. {
  10211. WOLFSSL_METHOD* method =
  10212. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10213. heap, DYNAMIC_TYPE_METHOD);
  10214. (void)heap;
  10215. WOLFSSL_ENTER("SSLv3_client_method_ex");
  10216. if (method)
  10217. InitSSL_Method(method, MakeSSLv3());
  10218. return method;
  10219. }
  10220. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10221. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10222. {
  10223. return wolfSSLv23_client_method_ex(NULL);
  10224. }
  10225. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10226. {
  10227. WOLFSSL_METHOD* method =
  10228. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10229. heap, DYNAMIC_TYPE_METHOD);
  10230. (void)heap;
  10231. WOLFSSL_ENTER("SSLv23_client_method_ex");
  10232. if (method) {
  10233. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10234. #if defined(WOLFSSL_TLS13)
  10235. InitSSL_Method(method, MakeTLSv1_3());
  10236. #elif !defined(WOLFSSL_NO_TLS12)
  10237. InitSSL_Method(method, MakeTLSv1_2());
  10238. #elif !defined(NO_OLD_TLS)
  10239. InitSSL_Method(method, MakeTLSv1_1());
  10240. #endif
  10241. #else
  10242. #ifndef NO_OLD_TLS
  10243. InitSSL_Method(method, MakeTLSv1_1());
  10244. #endif
  10245. #endif
  10246. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10247. method->downgrade = 1;
  10248. #endif
  10249. }
  10250. return method;
  10251. }
  10252. /* please see note at top of README if you get an error from connect */
  10253. WOLFSSL_ABI
  10254. int wolfSSL_connect(WOLFSSL* ssl)
  10255. {
  10256. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10257. int neededState;
  10258. byte advanceState;
  10259. #endif
  10260. int ret = 0;
  10261. (void)ret;
  10262. WOLFSSL_ENTER("SSL_connect()");
  10263. #ifdef HAVE_ERRNO_H
  10264. errno = 0;
  10265. #endif
  10266. if (ssl == NULL)
  10267. return BAD_FUNC_ARG;
  10268. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10269. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10270. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10271. if (ssl->error != WOLFSSL_SUCCESS) {
  10272. WOLFSSL_ERROR(ssl->error);
  10273. return WOLFSSL_FATAL_ERROR;
  10274. }
  10275. ssl->error = 0; /* expected to be zero here */
  10276. }
  10277. #ifdef OPENSSL_EXTRA
  10278. if (ssl->CBIS != NULL) {
  10279. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10280. ssl->cbmode = SSL_CB_WRITE;
  10281. }
  10282. #endif
  10283. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10284. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10285. return wolfSSL_connect_TLSv13(ssl);
  10286. #else
  10287. #ifdef WOLFSSL_TLS13
  10288. if (ssl->options.tls1_3)
  10289. return wolfSSL_connect_TLSv13(ssl);
  10290. #endif
  10291. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10292. if ((ssl->ConnectFilter != NULL) &&
  10293. (ssl->options.connectState == CONNECT_BEGIN)) {
  10294. wolfSSL_netfilter_decision_t res;
  10295. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  10296. WOLFSSL_SUCCESS) &&
  10297. (res == WOLFSSL_NETFILTER_REJECT)) {
  10298. ssl->error = SOCKET_FILTERED_E;
  10299. WOLFSSL_ERROR(ssl->error);
  10300. return WOLFSSL_FATAL_ERROR;
  10301. }
  10302. }
  10303. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10304. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10305. ssl->error = SIDE_ERROR;
  10306. WOLFSSL_ERROR(ssl->error);
  10307. return WOLFSSL_FATAL_ERROR;
  10308. }
  10309. #ifdef WOLFSSL_DTLS
  10310. if (ssl->version.major == DTLS_MAJOR) {
  10311. ssl->options.dtls = 1;
  10312. ssl->options.tls = 1;
  10313. ssl->options.tls1_1 = 1;
  10314. }
  10315. #endif
  10316. /* fragOffset is non-zero when sending fragments. On the last
  10317. * fragment, fragOffset is zero again, and the state can be
  10318. * advanced. */
  10319. advanceState = ssl->fragOffset == 0 &&
  10320. (ssl->options.connectState == CONNECT_BEGIN ||
  10321. ssl->options.connectState == HELLO_AGAIN ||
  10322. (ssl->options.connectState >= FIRST_REPLY_DONE &&
  10323. ssl->options.connectState <= FIRST_REPLY_FOURTH));
  10324. ;
  10325. #ifdef WOLFSSL_DTLS13
  10326. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
  10327. advanceState = advanceState && !ssl->dtls13SendingAckOrRtx;
  10328. #endif /* WOLFSSL_DTLS13 */
  10329. if (ssl->buffers.outputBuffer.length > 0
  10330. #ifdef WOLFSSL_ASYNC_CRYPT
  10331. /* do not send buffered or advance state if last error was an
  10332. async pending operation */
  10333. && ssl->error != WC_PENDING_E
  10334. #endif
  10335. ) {
  10336. ret = SendBuffered(ssl);
  10337. if (ret == 0) {
  10338. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  10339. if (advanceState) {
  10340. ssl->options.connectState++;
  10341. WOLFSSL_MSG("connect state: "
  10342. "Advanced from last buffered fragment send");
  10343. #ifdef WOLFSSL_ASYNC_IO
  10344. /* Cleanup async */
  10345. FreeAsyncCtx(ssl, 0);
  10346. #endif
  10347. }
  10348. }
  10349. else {
  10350. WOLFSSL_MSG("connect state: "
  10351. "Not advanced, more fragments to send");
  10352. }
  10353. }
  10354. else {
  10355. ssl->error = ret;
  10356. WOLFSSL_ERROR(ssl->error);
  10357. return WOLFSSL_FATAL_ERROR;
  10358. }
  10359. }
  10360. ret = RetrySendAlert(ssl);
  10361. if (ret != 0) {
  10362. ssl->error = ret;
  10363. WOLFSSL_ERROR(ssl->error);
  10364. return WOLFSSL_FATAL_ERROR;
  10365. }
  10366. switch (ssl->options.connectState) {
  10367. case CONNECT_BEGIN :
  10368. /* always send client hello first */
  10369. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10370. WOLFSSL_ERROR(ssl->error);
  10371. return WOLFSSL_FATAL_ERROR;
  10372. }
  10373. ssl->options.connectState = CLIENT_HELLO_SENT;
  10374. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10375. FALL_THROUGH;
  10376. case CLIENT_HELLO_SENT :
  10377. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10378. SERVER_HELLODONE_COMPLETE;
  10379. #ifdef WOLFSSL_DTLS
  10380. /* In DTLS, when resuming, we can go straight to FINISHED,
  10381. * or do a cookie exchange and then skip to FINISHED, assume
  10382. * we need the cookie exchange first. */
  10383. if (IsDtlsNotSctpMode(ssl))
  10384. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10385. #endif
  10386. /* get response */
  10387. while (ssl->options.serverState < neededState) {
  10388. #ifdef WOLFSSL_TLS13
  10389. if (ssl->options.tls1_3)
  10390. return wolfSSL_connect_TLSv13(ssl);
  10391. #endif
  10392. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10393. WOLFSSL_ERROR(ssl->error);
  10394. return WOLFSSL_FATAL_ERROR;
  10395. }
  10396. /* if resumption failed, reset needed state */
  10397. else if (neededState == SERVER_FINISHED_COMPLETE)
  10398. if (!ssl->options.resuming) {
  10399. #ifdef WOLFSSL_DTLS
  10400. if (IsDtlsNotSctpMode(ssl))
  10401. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10402. else
  10403. #endif
  10404. neededState = SERVER_HELLODONE_COMPLETE;
  10405. }
  10406. #ifdef WOLFSSL_DTLS13
  10407. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)
  10408. && ssl->dtls13Rtx.sendAcks == 1) {
  10409. ssl->dtls13Rtx.sendAcks = 0;
  10410. /* we aren't negotiated the version yet, so we aren't sure
  10411. * the other end can speak v1.3. On the other side we have
  10412. * received a unified records, assuming that the
  10413. * ServerHello got lost, we will send an empty ACK. In case
  10414. * the server is a DTLS with version less than 1.3, it
  10415. * should just ignore the message */
  10416. if ((ssl->error = SendDtls13Ack(ssl)) < 0) {
  10417. if (ssl->error == WANT_WRITE)
  10418. ssl->dtls13SendingAckOrRtx = 1;
  10419. WOLFSSL_ERROR(ssl->error);
  10420. return WOLFSSL_FATAL_ERROR;
  10421. }
  10422. }
  10423. #endif /* WOLFSSL_DTLS13 */
  10424. }
  10425. ssl->options.connectState = HELLO_AGAIN;
  10426. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10427. FALL_THROUGH;
  10428. case HELLO_AGAIN :
  10429. if (ssl->options.certOnly)
  10430. return WOLFSSL_SUCCESS;
  10431. #ifdef WOLFSSL_TLS13
  10432. if (ssl->options.tls1_3)
  10433. return wolfSSL_connect_TLSv13(ssl);
  10434. #endif
  10435. #ifdef WOLFSSL_DTLS
  10436. if (ssl->options.serverState ==
  10437. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10438. if (IsDtlsNotSctpMode(ssl)) {
  10439. /* re-init hashes, exclude first hello and verify request */
  10440. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10441. WOLFSSL_ERROR(ssl->error);
  10442. return WOLFSSL_FATAL_ERROR;
  10443. }
  10444. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10445. WOLFSSL_ERROR(ssl->error);
  10446. return WOLFSSL_FATAL_ERROR;
  10447. }
  10448. }
  10449. }
  10450. #endif
  10451. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10452. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10453. FALL_THROUGH;
  10454. case HELLO_AGAIN_REPLY :
  10455. #ifdef WOLFSSL_DTLS
  10456. if (IsDtlsNotSctpMode(ssl)) {
  10457. neededState = ssl->options.resuming ?
  10458. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10459. /* get response */
  10460. while (ssl->options.serverState < neededState) {
  10461. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10462. WOLFSSL_ERROR(ssl->error);
  10463. return WOLFSSL_FATAL_ERROR;
  10464. }
  10465. /* if resumption failed, reset needed state */
  10466. if (neededState == SERVER_FINISHED_COMPLETE) {
  10467. if (!ssl->options.resuming)
  10468. neededState = SERVER_HELLODONE_COMPLETE;
  10469. }
  10470. }
  10471. }
  10472. #endif
  10473. ssl->options.connectState = FIRST_REPLY_DONE;
  10474. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10475. FALL_THROUGH;
  10476. case FIRST_REPLY_DONE :
  10477. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10478. #ifdef WOLFSSL_TLS13
  10479. if (ssl->options.tls1_3)
  10480. return wolfSSL_connect_TLSv13(ssl);
  10481. #endif
  10482. if (ssl->options.sendVerify) {
  10483. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10484. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10485. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10486. #endif
  10487. WOLFSSL_ERROR(ssl->error);
  10488. return WOLFSSL_FATAL_ERROR;
  10489. }
  10490. WOLFSSL_MSG("sent: certificate");
  10491. }
  10492. #endif
  10493. ssl->options.connectState = FIRST_REPLY_FIRST;
  10494. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10495. FALL_THROUGH;
  10496. case FIRST_REPLY_FIRST :
  10497. #ifdef WOLFSSL_TLS13
  10498. if (ssl->options.tls1_3)
  10499. return wolfSSL_connect_TLSv13(ssl);
  10500. #endif
  10501. if (!ssl->options.resuming) {
  10502. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10503. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10504. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10505. #endif
  10506. WOLFSSL_ERROR(ssl->error);
  10507. return WOLFSSL_FATAL_ERROR;
  10508. }
  10509. WOLFSSL_MSG("sent: client key exchange");
  10510. }
  10511. ssl->options.connectState = FIRST_REPLY_SECOND;
  10512. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  10513. FALL_THROUGH;
  10514. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  10515. case FIRST_REPLY_SECOND :
  10516. /* CLIENT: Fail-safe for Server Authentication. */
  10517. if (!ssl->options.peerAuthGood) {
  10518. WOLFSSL_MSG("Server authentication did not happen");
  10519. ssl->error = NO_PEER_VERIFY;
  10520. return WOLFSSL_FATAL_ERROR;
  10521. }
  10522. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10523. if (ssl->options.sendVerify) {
  10524. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  10525. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10526. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10527. #endif
  10528. WOLFSSL_ERROR(ssl->error);
  10529. return WOLFSSL_FATAL_ERROR;
  10530. }
  10531. WOLFSSL_MSG("sent: certificate verify");
  10532. }
  10533. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  10534. ssl->options.connectState = FIRST_REPLY_THIRD;
  10535. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  10536. FALL_THROUGH;
  10537. case FIRST_REPLY_THIRD :
  10538. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10539. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10540. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10541. #endif
  10542. WOLFSSL_ERROR(ssl->error);
  10543. return WOLFSSL_FATAL_ERROR;
  10544. }
  10545. WOLFSSL_MSG("sent: change cipher spec");
  10546. ssl->options.connectState = FIRST_REPLY_FOURTH;
  10547. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  10548. FALL_THROUGH;
  10549. case FIRST_REPLY_FOURTH :
  10550. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10551. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  10552. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  10553. #endif
  10554. WOLFSSL_ERROR(ssl->error);
  10555. return WOLFSSL_FATAL_ERROR;
  10556. }
  10557. WOLFSSL_MSG("sent: finished");
  10558. ssl->options.connectState = FINISHED_DONE;
  10559. WOLFSSL_MSG("connect state: FINISHED_DONE");
  10560. FALL_THROUGH;
  10561. #ifdef WOLFSSL_DTLS13
  10562. case WAIT_FINISHED_ACK:
  10563. ssl->options.connectState = FINISHED_DONE;
  10564. FALL_THROUGH;
  10565. #endif /* WOLFSSL_DTLS13 */
  10566. case FINISHED_DONE :
  10567. /* get response */
  10568. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  10569. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10570. WOLFSSL_ERROR(ssl->error);
  10571. return WOLFSSL_FATAL_ERROR;
  10572. }
  10573. ssl->options.connectState = SECOND_REPLY_DONE;
  10574. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  10575. FALL_THROUGH;
  10576. case SECOND_REPLY_DONE:
  10577. #ifndef NO_HANDSHAKE_DONE_CB
  10578. if (ssl->hsDoneCb) {
  10579. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10580. if (cbret < 0) {
  10581. ssl->error = cbret;
  10582. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10583. return WOLFSSL_FATAL_ERROR;
  10584. }
  10585. }
  10586. #endif /* NO_HANDSHAKE_DONE_CB */
  10587. if (!ssl->options.dtls) {
  10588. if (!ssl->options.keepResources) {
  10589. FreeHandshakeResources(ssl);
  10590. }
  10591. }
  10592. #ifdef WOLFSSL_DTLS
  10593. else {
  10594. ssl->options.dtlsHsRetain = 1;
  10595. }
  10596. #endif /* WOLFSSL_DTLS */
  10597. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10598. /* This may be necessary in async so that we don't try to
  10599. * renegotiate again */
  10600. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10601. ssl->secure_renegotiation->startScr = 0;
  10602. }
  10603. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10604. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  10605. /* Free the remaining async context if not using it for crypto */
  10606. FreeAsyncCtx(ssl, 1);
  10607. #endif
  10608. ssl->error = 0; /* clear the error */
  10609. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  10610. return WOLFSSL_SUCCESS;
  10611. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10612. default:
  10613. WOLFSSL_MSG("Unknown connect state ERROR");
  10614. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  10615. }
  10616. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  10617. }
  10618. #endif /* NO_WOLFSSL_CLIENT */
  10619. /* server only parts */
  10620. #ifndef NO_WOLFSSL_SERVER
  10621. #ifdef OPENSSL_EXTRA
  10622. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  10623. {
  10624. WOLFSSL_STUB("wolfSSLv2_server_method");
  10625. return 0;
  10626. }
  10627. #endif
  10628. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10629. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  10630. {
  10631. return wolfSSLv3_server_method_ex(NULL);
  10632. }
  10633. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  10634. {
  10635. WOLFSSL_METHOD* method =
  10636. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10637. heap, DYNAMIC_TYPE_METHOD);
  10638. (void)heap;
  10639. WOLFSSL_ENTER("SSLv3_server_method_ex");
  10640. if (method) {
  10641. InitSSL_Method(method, MakeSSLv3());
  10642. method->side = WOLFSSL_SERVER_END;
  10643. }
  10644. return method;
  10645. }
  10646. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10647. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10648. {
  10649. return wolfSSLv23_server_method_ex(NULL);
  10650. }
  10651. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10652. {
  10653. WOLFSSL_METHOD* method =
  10654. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10655. heap, DYNAMIC_TYPE_METHOD);
  10656. (void)heap;
  10657. WOLFSSL_ENTER("SSLv23_server_method_ex");
  10658. if (method) {
  10659. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10660. #ifdef WOLFSSL_TLS13
  10661. InitSSL_Method(method, MakeTLSv1_3());
  10662. #elif !defined(WOLFSSL_NO_TLS12)
  10663. InitSSL_Method(method, MakeTLSv1_2());
  10664. #elif !defined(NO_OLD_TLS)
  10665. InitSSL_Method(method, MakeTLSv1_1());
  10666. #endif
  10667. #else
  10668. #ifndef NO_OLD_TLS
  10669. InitSSL_Method(method, MakeTLSv1_1());
  10670. #else
  10671. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10672. #endif
  10673. #endif
  10674. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10675. method->downgrade = 1;
  10676. #endif
  10677. method->side = WOLFSSL_SERVER_END;
  10678. }
  10679. return method;
  10680. }
  10681. WOLFSSL_ABI
  10682. int wolfSSL_accept(WOLFSSL* ssl)
  10683. {
  10684. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10685. word16 havePSK = 0;
  10686. word16 haveAnon = 0;
  10687. word16 haveMcast = 0;
  10688. #endif
  10689. int ret = 0;
  10690. (void)ret;
  10691. if (ssl == NULL)
  10692. return WOLFSSL_FATAL_ERROR;
  10693. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10694. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10695. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  10696. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  10697. if (ssl->error != WOLFSSL_SUCCESS) {
  10698. WOLFSSL_ERROR(ssl->error);
  10699. return WOLFSSL_FATAL_ERROR;
  10700. }
  10701. ssl->error = 0; /* expected to be zero here */
  10702. }
  10703. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10704. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10705. return wolfSSL_accept_TLSv13(ssl);
  10706. #else
  10707. #ifdef WOLFSSL_TLS13
  10708. if (ssl->options.tls1_3)
  10709. return wolfSSL_accept_TLSv13(ssl);
  10710. #endif
  10711. WOLFSSL_ENTER("SSL_accept()");
  10712. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  10713. if ((ssl->AcceptFilter != NULL) &&
  10714. ((ssl->options.acceptState == ACCEPT_BEGIN)
  10715. #ifdef HAVE_SECURE_RENEGOTIATION
  10716. || (ssl->options.acceptState == ACCEPT_BEGIN_RENEG)
  10717. #endif
  10718. ))
  10719. {
  10720. wolfSSL_netfilter_decision_t res;
  10721. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  10722. WOLFSSL_SUCCESS) &&
  10723. (res == WOLFSSL_NETFILTER_REJECT)) {
  10724. ssl->error = SOCKET_FILTERED_E;
  10725. WOLFSSL_ERROR(ssl->error);
  10726. return WOLFSSL_FATAL_ERROR;
  10727. }
  10728. }
  10729. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  10730. #ifdef HAVE_ERRNO_H
  10731. errno = 0;
  10732. #endif
  10733. #ifndef NO_PSK
  10734. havePSK = ssl->options.havePSK;
  10735. #endif
  10736. (void)havePSK;
  10737. #ifdef HAVE_ANON
  10738. haveAnon = ssl->options.haveAnon;
  10739. #endif
  10740. (void)haveAnon;
  10741. #ifdef WOLFSSL_MULTICAST
  10742. haveMcast = ssl->options.haveMcast;
  10743. #endif
  10744. (void)haveMcast;
  10745. if (ssl->options.side != WOLFSSL_SERVER_END) {
  10746. ssl->error = SIDE_ERROR;
  10747. WOLFSSL_ERROR(ssl->error);
  10748. return WOLFSSL_FATAL_ERROR;
  10749. }
  10750. #ifndef NO_CERTS
  10751. /* in case used set_accept_state after init */
  10752. if (!havePSK && !haveAnon && !haveMcast) {
  10753. #ifdef OPENSSL_EXTRA
  10754. if (ssl->ctx->certSetupCb != NULL) {
  10755. WOLFSSL_MSG("CertSetupCb set. server cert and "
  10756. "key not checked");
  10757. }
  10758. else
  10759. #endif
  10760. {
  10761. if (!ssl->buffers.certificate ||
  10762. !ssl->buffers.certificate->buffer) {
  10763. WOLFSSL_MSG("accept error: server cert required");
  10764. ssl->error = NO_PRIVATE_KEY;
  10765. WOLFSSL_ERROR(ssl->error);
  10766. return WOLFSSL_FATAL_ERROR;
  10767. }
  10768. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  10769. /* allow no private key if using existing key */
  10770. #ifdef WOLF_PRIVATE_KEY_ID
  10771. if (ssl->devId != INVALID_DEVID
  10772. #ifdef HAVE_PK_CALLBACKS
  10773. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  10774. #endif
  10775. ) {
  10776. WOLFSSL_MSG("Allowing no server private key "
  10777. "(external)");
  10778. }
  10779. else
  10780. #endif
  10781. {
  10782. WOLFSSL_MSG("accept error: server key required");
  10783. ssl->error = NO_PRIVATE_KEY;
  10784. WOLFSSL_ERROR(ssl->error);
  10785. return WOLFSSL_FATAL_ERROR;
  10786. }
  10787. }
  10788. }
  10789. }
  10790. #endif
  10791. #ifdef WOLFSSL_DTLS
  10792. if (ssl->version.major == DTLS_MAJOR) {
  10793. ssl->options.dtls = 1;
  10794. ssl->options.tls = 1;
  10795. ssl->options.tls1_1 = 1;
  10796. }
  10797. #endif
  10798. if (ssl->buffers.outputBuffer.length > 0
  10799. #ifdef WOLFSSL_ASYNC_CRYPT
  10800. /* do not send buffered or advance state if last error was an
  10801. async pending operation */
  10802. && ssl->error != WC_PENDING_E
  10803. #endif
  10804. ) {
  10805. ret = SendBuffered(ssl);
  10806. if (ret == 0) {
  10807. /* fragOffset is non-zero when sending fragments. On the last
  10808. * fragment, fragOffset is zero again, and the state can be
  10809. * advanced. */
  10810. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  10811. if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE ||
  10812. ssl->options.acceptState == SERVER_HELLO_SENT ||
  10813. ssl->options.acceptState == CERT_SENT ||
  10814. ssl->options.acceptState == CERT_STATUS_SENT ||
  10815. ssl->options.acceptState == KEY_EXCHANGE_SENT ||
  10816. ssl->options.acceptState == CERT_REQ_SENT ||
  10817. ssl->options.acceptState == ACCEPT_SECOND_REPLY_DONE ||
  10818. ssl->options.acceptState == TICKET_SENT ||
  10819. ssl->options.acceptState == CHANGE_CIPHER_SENT) {
  10820. ssl->options.acceptState++;
  10821. WOLFSSL_MSG("accept state: "
  10822. "Advanced from last buffered fragment send");
  10823. #ifdef WOLFSSL_ASYNC_IO
  10824. /* Cleanup async */
  10825. FreeAsyncCtx(ssl, 0);
  10826. #endif
  10827. }
  10828. }
  10829. else {
  10830. WOLFSSL_MSG("accept state: "
  10831. "Not advanced, more fragments to send");
  10832. }
  10833. }
  10834. else {
  10835. ssl->error = ret;
  10836. WOLFSSL_ERROR(ssl->error);
  10837. return WOLFSSL_FATAL_ERROR;
  10838. }
  10839. }
  10840. ret = RetrySendAlert(ssl);
  10841. if (ret != 0) {
  10842. ssl->error = ret;
  10843. WOLFSSL_ERROR(ssl->error);
  10844. return WOLFSSL_FATAL_ERROR;
  10845. }
  10846. switch (ssl->options.acceptState) {
  10847. case ACCEPT_BEGIN :
  10848. #ifdef HAVE_SECURE_RENEGOTIATION
  10849. case ACCEPT_BEGIN_RENEG:
  10850. #endif
  10851. /* get response */
  10852. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  10853. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10854. WOLFSSL_ERROR(ssl->error);
  10855. return WOLFSSL_FATAL_ERROR;
  10856. }
  10857. #ifdef WOLFSSL_TLS13
  10858. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  10859. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  10860. FALL_THROUGH;
  10861. case ACCEPT_CLIENT_HELLO_DONE :
  10862. if (ssl->options.tls1_3) {
  10863. return wolfSSL_accept_TLSv13(ssl);
  10864. }
  10865. #endif
  10866. #ifdef WOLFSSL_DTLS
  10867. if (ssl->chGoodCb != NULL && !IsSCR(ssl)) {
  10868. int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
  10869. if (cbret < 0) {
  10870. ssl->error = cbret;
  10871. WOLFSSL_MSG("ClientHello Good Cb don't continue error");
  10872. return WOLFSSL_FATAL_ERROR;
  10873. }
  10874. }
  10875. #endif
  10876. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  10877. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  10878. FALL_THROUGH;
  10879. case ACCEPT_FIRST_REPLY_DONE :
  10880. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  10881. WOLFSSL_ERROR(ssl->error);
  10882. return WOLFSSL_FATAL_ERROR;
  10883. }
  10884. ssl->options.acceptState = SERVER_HELLO_SENT;
  10885. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  10886. FALL_THROUGH;
  10887. case SERVER_HELLO_SENT :
  10888. #ifdef WOLFSSL_TLS13
  10889. if (ssl->options.tls1_3) {
  10890. return wolfSSL_accept_TLSv13(ssl);
  10891. }
  10892. #endif
  10893. #ifndef NO_CERTS
  10894. if (!ssl->options.resuming)
  10895. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10896. WOLFSSL_ERROR(ssl->error);
  10897. return WOLFSSL_FATAL_ERROR;
  10898. }
  10899. #endif
  10900. ssl->options.acceptState = CERT_SENT;
  10901. WOLFSSL_MSG("accept state CERT_SENT");
  10902. FALL_THROUGH;
  10903. case CERT_SENT :
  10904. #ifndef NO_CERTS
  10905. if (!ssl->options.resuming)
  10906. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  10907. WOLFSSL_ERROR(ssl->error);
  10908. return WOLFSSL_FATAL_ERROR;
  10909. }
  10910. #endif
  10911. ssl->options.acceptState = CERT_STATUS_SENT;
  10912. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  10913. FALL_THROUGH;
  10914. case CERT_STATUS_SENT :
  10915. #ifdef WOLFSSL_TLS13
  10916. if (ssl->options.tls1_3) {
  10917. return wolfSSL_accept_TLSv13(ssl);
  10918. }
  10919. #endif
  10920. if (!ssl->options.resuming)
  10921. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  10922. WOLFSSL_ERROR(ssl->error);
  10923. return WOLFSSL_FATAL_ERROR;
  10924. }
  10925. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  10926. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  10927. FALL_THROUGH;
  10928. case KEY_EXCHANGE_SENT :
  10929. #ifndef NO_CERTS
  10930. if (!ssl->options.resuming) {
  10931. if (ssl->options.verifyPeer) {
  10932. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  10933. WOLFSSL_ERROR(ssl->error);
  10934. return WOLFSSL_FATAL_ERROR;
  10935. }
  10936. }
  10937. else {
  10938. /* SERVER: Peer auth good if not verifying client. */
  10939. ssl->options.peerAuthGood = 1;
  10940. }
  10941. }
  10942. #endif
  10943. ssl->options.acceptState = CERT_REQ_SENT;
  10944. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  10945. FALL_THROUGH;
  10946. case CERT_REQ_SENT :
  10947. if (!ssl->options.resuming)
  10948. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  10949. WOLFSSL_ERROR(ssl->error);
  10950. return WOLFSSL_FATAL_ERROR;
  10951. }
  10952. ssl->options.acceptState = SERVER_HELLO_DONE;
  10953. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  10954. FALL_THROUGH;
  10955. case SERVER_HELLO_DONE :
  10956. if (!ssl->options.resuming) {
  10957. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10958. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10959. WOLFSSL_ERROR(ssl->error);
  10960. return WOLFSSL_FATAL_ERROR;
  10961. }
  10962. }
  10963. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  10964. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  10965. FALL_THROUGH;
  10966. case ACCEPT_SECOND_REPLY_DONE :
  10967. #ifndef NO_CERTS
  10968. /* SERVER: When not resuming and verifying peer but no certificate
  10969. * received and not failing when not received then peer auth good.
  10970. */
  10971. if (!ssl->options.resuming && ssl->options.verifyPeer &&
  10972. !ssl->options.havePeerCert && !ssl->options.failNoCert) {
  10973. ssl->options.peerAuthGood = 1;
  10974. }
  10975. #endif /* !NO_CERTS */
  10976. #ifdef WOLFSSL_NO_CLIENT_AUTH
  10977. if (!ssl->options.resuming) {
  10978. ssl->options.peerAuthGood = 1;
  10979. }
  10980. #endif
  10981. #ifdef HAVE_SESSION_TICKET
  10982. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  10983. if ( (ssl->error = SendTicket(ssl)) != 0) {
  10984. WOLFSSL_ERROR(ssl->error);
  10985. return WOLFSSL_FATAL_ERROR;
  10986. }
  10987. }
  10988. #endif /* HAVE_SESSION_TICKET */
  10989. ssl->options.acceptState = TICKET_SENT;
  10990. WOLFSSL_MSG("accept state TICKET_SENT");
  10991. FALL_THROUGH;
  10992. case TICKET_SENT:
  10993. /* SERVER: Fail-safe for CLient Authentication. */
  10994. if (!ssl->options.peerAuthGood) {
  10995. WOLFSSL_MSG("Client authentication did not happen");
  10996. return WOLFSSL_FATAL_ERROR;
  10997. }
  10998. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10999. WOLFSSL_ERROR(ssl->error);
  11000. return WOLFSSL_FATAL_ERROR;
  11001. }
  11002. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  11003. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  11004. FALL_THROUGH;
  11005. case CHANGE_CIPHER_SENT :
  11006. if ( (ssl->error = SendFinished(ssl)) != 0) {
  11007. WOLFSSL_ERROR(ssl->error);
  11008. return WOLFSSL_FATAL_ERROR;
  11009. }
  11010. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  11011. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  11012. FALL_THROUGH;
  11013. case ACCEPT_FINISHED_DONE :
  11014. if (ssl->options.resuming) {
  11015. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  11016. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  11017. WOLFSSL_ERROR(ssl->error);
  11018. return WOLFSSL_FATAL_ERROR;
  11019. }
  11020. }
  11021. }
  11022. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  11023. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  11024. FALL_THROUGH;
  11025. case ACCEPT_THIRD_REPLY_DONE :
  11026. #ifndef NO_HANDSHAKE_DONE_CB
  11027. if (ssl->hsDoneCb) {
  11028. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11029. if (cbret < 0) {
  11030. ssl->error = cbret;
  11031. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11032. return WOLFSSL_FATAL_ERROR;
  11033. }
  11034. }
  11035. #endif /* NO_HANDSHAKE_DONE_CB */
  11036. if (!ssl->options.dtls) {
  11037. if (!ssl->options.keepResources) {
  11038. FreeHandshakeResources(ssl);
  11039. }
  11040. }
  11041. #ifdef WOLFSSL_DTLS
  11042. else {
  11043. ssl->options.dtlsHsRetain = 1;
  11044. }
  11045. #endif /* WOLFSSL_DTLS */
  11046. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11047. /* This may be necessary in async so that we don't try to
  11048. * renegotiate again */
  11049. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11050. ssl->secure_renegotiation->startScr = 0;
  11051. }
  11052. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11053. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11054. /* Free the remaining async context if not using it for crypto */
  11055. FreeAsyncCtx(ssl, 1);
  11056. #endif
  11057. #if defined(WOLFSSL_SESSION_EXPORT) && defined(WOLFSSL_DTLS)
  11058. if (ssl->dtls_export) {
  11059. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  11060. WOLFSSL_MSG("Export DTLS session error");
  11061. WOLFSSL_ERROR(ssl->error);
  11062. return WOLFSSL_FATAL_ERROR;
  11063. }
  11064. }
  11065. #endif
  11066. ssl->error = 0; /* clear the error */
  11067. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  11068. return WOLFSSL_SUCCESS;
  11069. default :
  11070. WOLFSSL_MSG("Unknown accept state ERROR");
  11071. return WOLFSSL_FATAL_ERROR;
  11072. }
  11073. #endif /* !WOLFSSL_NO_TLS12 */
  11074. }
  11075. #endif /* NO_WOLFSSL_SERVER */
  11076. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  11077. int wolfDTLS_SetChGoodCb(WOLFSSL* ssl, ClientHelloGoodCb cb, void* user_ctx)
  11078. {
  11079. WOLFSSL_ENTER("wolfDTLS_SetChGoodCb");
  11080. if (ssl == NULL)
  11081. return BAD_FUNC_ARG;
  11082. ssl->chGoodCb = cb;
  11083. ssl->chGoodCtx = user_ctx;
  11084. return WOLFSSL_SUCCESS;
  11085. }
  11086. #endif
  11087. #ifndef NO_HANDSHAKE_DONE_CB
  11088. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  11089. {
  11090. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  11091. if (ssl == NULL)
  11092. return BAD_FUNC_ARG;
  11093. ssl->hsDoneCb = cb;
  11094. ssl->hsDoneCtx = user_ctx;
  11095. return WOLFSSL_SUCCESS;
  11096. }
  11097. #endif /* NO_HANDSHAKE_DONE_CB */
  11098. WOLFSSL_ABI
  11099. int wolfSSL_Cleanup(void)
  11100. {
  11101. int ret = WOLFSSL_SUCCESS; /* Only the first error will be returned */
  11102. int release = 0;
  11103. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  11104. int i;
  11105. #endif
  11106. WOLFSSL_ENTER("wolfSSL_Cleanup");
  11107. if (initRefCount == 0)
  11108. return ret; /* possibly no init yet, but not failure either way */
  11109. if ((count_mutex_valid == 1) && (wc_LockMutex(&count_mutex) != 0)) {
  11110. WOLFSSL_MSG("Bad Lock Mutex count");
  11111. ret = BAD_MUTEX_E;
  11112. }
  11113. release = initRefCount-- == 1;
  11114. if (initRefCount < 0)
  11115. initRefCount = 0;
  11116. if (count_mutex_valid == 1) {
  11117. wc_UnLockMutex(&count_mutex);
  11118. }
  11119. if (!release)
  11120. return ret;
  11121. #ifdef OPENSSL_EXTRA
  11122. if (bn_one) {
  11123. wolfSSL_BN_free(bn_one);
  11124. bn_one = NULL;
  11125. }
  11126. #endif
  11127. #ifndef NO_SESSION_CACHE
  11128. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  11129. for (i = 0; i < SESSION_ROWS; ++i) {
  11130. if ((SessionCache[i].mutex_valid == 1) &&
  11131. (wc_FreeMutex(&SessionCache[i].row_mutex) != 0)) {
  11132. if (ret == WOLFSSL_SUCCESS)
  11133. ret = BAD_MUTEX_E;
  11134. }
  11135. SessionCache[i].mutex_valid = 0;
  11136. }
  11137. #else
  11138. if ((session_mutex_valid == 1) && (wc_FreeMutex(&session_mutex) != 0)) {
  11139. if (ret == WOLFSSL_SUCCESS)
  11140. ret = BAD_MUTEX_E;
  11141. }
  11142. session_mutex_valid = 0;
  11143. #endif
  11144. #ifndef NO_CLIENT_CACHE
  11145. if ((clisession_mutex_valid == 1) &&
  11146. (wc_FreeMutex(&clisession_mutex) != 0)) {
  11147. if (ret == WOLFSSL_SUCCESS)
  11148. ret = BAD_MUTEX_E;
  11149. }
  11150. clisession_mutex_valid = 0;
  11151. #endif
  11152. #endif /* !NO_SESSION_CACHE */
  11153. if ((count_mutex_valid == 1) && (wc_FreeMutex(&count_mutex) != 0)) {
  11154. if (ret == WOLFSSL_SUCCESS)
  11155. ret = BAD_MUTEX_E;
  11156. }
  11157. count_mutex_valid = 0;
  11158. #ifdef OPENSSL_EXTRA
  11159. wolfSSL_RAND_Cleanup();
  11160. #endif
  11161. if (wolfCrypt_Cleanup() != 0) {
  11162. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11163. if (ret == WOLFSSL_SUCCESS)
  11164. ret = WC_CLEANUP_E;
  11165. }
  11166. #if FIPS_VERSION_GE(5,1)
  11167. if (wolfCrypt_SetPrivateKeyReadEnable_fips(0, WC_KEYTYPE_ALL) < 0) {
  11168. if (ret == WOLFSSL_SUCCESS)
  11169. ret = WC_CLEANUP_E;
  11170. }
  11171. #endif
  11172. #ifdef HAVE_GLOBAL_RNG
  11173. if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) {
  11174. if (ret == WOLFSSL_SUCCESS)
  11175. ret = BAD_MUTEX_E;
  11176. }
  11177. globalRNGMutex_valid = 0;
  11178. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  11179. wolfSSL_FIPS_drbg_free(gDrbgDefCtx);
  11180. gDrbgDefCtx = NULL;
  11181. #endif
  11182. #endif
  11183. return ret;
  11184. }
  11185. #ifndef NO_SESSION_CACHE
  11186. /* some session IDs aren't random after all, let's make them random */
  11187. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  11188. {
  11189. byte digest[WC_MAX_DIGEST_SIZE];
  11190. #ifndef NO_MD5
  11191. *error = wc_Md5Hash(sessionID, len, digest);
  11192. #elif !defined(NO_SHA)
  11193. *error = wc_ShaHash(sessionID, len, digest);
  11194. #elif !defined(NO_SHA256)
  11195. *error = wc_Sha256Hash(sessionID, len, digest);
  11196. #else
  11197. #error "We need a digest to hash the session IDs"
  11198. #endif
  11199. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  11200. }
  11201. WOLFSSL_ABI
  11202. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11203. {
  11204. /* static table now, no flushing needed */
  11205. (void)ctx;
  11206. (void)tm;
  11207. }
  11208. /* set ssl session timeout in seconds */
  11209. WOLFSSL_ABI
  11210. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11211. {
  11212. if (ssl == NULL)
  11213. return BAD_FUNC_ARG;
  11214. if (to == 0)
  11215. to = WOLFSSL_SESSION_TIMEOUT;
  11216. ssl->timeout = to;
  11217. return WOLFSSL_SUCCESS;
  11218. }
  11219. /**
  11220. * Sets ctx session timeout in seconds.
  11221. * The timeout value set here should be reflected in the
  11222. * "session ticket lifetime hint" if this API works in the openssl compat-layer.
  11223. * Therefore wolfSSL_CTX_set_TicketHint is called internally.
  11224. * Arguments:
  11225. * - ctx WOLFSSL_CTX object which the timeout is set to
  11226. * - to timeout value in second
  11227. * Returns:
  11228. * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure.
  11229. * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value
  11230. * on success, BAD_FUNC_ARG on failure.
  11231. */
  11232. WOLFSSL_ABI
  11233. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11234. {
  11235. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11236. word32 prev_timeout = 0;
  11237. #endif
  11238. int ret = WOLFSSL_SUCCESS;
  11239. (void)ret;
  11240. if (ctx == NULL)
  11241. ret = BAD_FUNC_ARG;
  11242. if (ret == WOLFSSL_SUCCESS) {
  11243. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11244. prev_timeout = ctx->timeout;
  11245. #endif
  11246. if (to == 0) {
  11247. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  11248. }
  11249. else {
  11250. ctx->timeout = to;
  11251. }
  11252. }
  11253. #if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \
  11254. !defined(NO_WOLFSSL_SERVER)
  11255. if (ret == WOLFSSL_SUCCESS) {
  11256. if (to == 0) {
  11257. ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT);
  11258. }
  11259. else {
  11260. ret = wolfSSL_CTX_set_TicketHint(ctx, to);
  11261. }
  11262. }
  11263. #endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */
  11264. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11265. if (ret == WOLFSSL_SUCCESS) {
  11266. return prev_timeout;
  11267. }
  11268. else {
  11269. return ret;
  11270. }
  11271. #else
  11272. return ret;
  11273. #endif /* WOLFSSL_ERROR_CODE_OPENSSL */
  11274. }
  11275. #ifndef NO_CLIENT_CACHE
  11276. /* Get Session from Client cache based on id/len, return NULL on failure */
  11277. WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11278. {
  11279. WOLFSSL_SESSION* ret = NULL;
  11280. word32 row;
  11281. int idx;
  11282. int count;
  11283. int error = 0;
  11284. ClientSession* clSess;
  11285. WOLFSSL_ENTER("GetSessionClient");
  11286. if (ssl->ctx->sessionCacheOff) {
  11287. WOLFSSL_MSG("Session Cache off");
  11288. return NULL;
  11289. }
  11290. if (ssl->options.side == WOLFSSL_SERVER_END)
  11291. return NULL;
  11292. len = min(SERVER_ID_LEN, (word32)len);
  11293. #ifdef HAVE_EXT_CACHE
  11294. if (ssl->ctx->get_sess_cb != NULL) {
  11295. int copy = 0;
  11296. WOLFSSL_MSG("Calling external session cache");
  11297. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  11298. if (ret != NULL) {
  11299. WOLFSSL_MSG("Session found in external cache");
  11300. return ret;
  11301. }
  11302. WOLFSSL_MSG("Session not found in external cache");
  11303. }
  11304. if (ssl->ctx->internalCacheLookupOff) {
  11305. WOLFSSL_MSG("Internal cache turned off");
  11306. return NULL;
  11307. }
  11308. #endif
  11309. row = HashSession(id, len, &error) % CLIENT_SESSION_ROWS;
  11310. if (error != 0) {
  11311. WOLFSSL_MSG("Hash session failed");
  11312. return NULL;
  11313. }
  11314. if (wc_LockMutex(&clisession_mutex) != 0) {
  11315. WOLFSSL_MSG("Client cache mutex lock failed");
  11316. return NULL;
  11317. }
  11318. /* start from most recently used */
  11319. count = min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW);
  11320. idx = ClientCache[row].nextIdx - 1;
  11321. if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) {
  11322. idx = CLIENT_SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11323. }
  11324. clSess = ClientCache[row].Clients;
  11325. for (; count > 0; --count) {
  11326. WOLFSSL_SESSION* current;
  11327. SessionRow* sessRow;
  11328. if (clSess[idx].serverRow >= SESSION_ROWS) {
  11329. WOLFSSL_MSG("Client cache serverRow invalid");
  11330. break;
  11331. }
  11332. /* lock row */
  11333. sessRow = &SessionCache[clSess[idx].serverRow];
  11334. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11335. WOLFSSL_MSG("Session cache row lock failure");
  11336. break;
  11337. }
  11338. current = &sessRow->Sessions[clSess[idx].serverIdx];
  11339. if (XMEMCMP(current->serverID, id, len) == 0) {
  11340. WOLFSSL_MSG("Found a serverid match for client");
  11341. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11342. WOLFSSL_MSG("Session valid");
  11343. ret = current;
  11344. SESSION_ROW_UNLOCK(sessRow);
  11345. break;
  11346. } else {
  11347. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11348. }
  11349. } else {
  11350. WOLFSSL_MSG("ServerID not a match from client table");
  11351. }
  11352. SESSION_ROW_UNLOCK(sessRow);
  11353. idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1;
  11354. }
  11355. wc_UnLockMutex(&clisession_mutex);
  11356. return ret;
  11357. }
  11358. #endif /* !NO_CLIENT_CACHE */
  11359. static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session)
  11360. {
  11361. (void)session;
  11362. return ssl->options.sessionCacheOff
  11363. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET)
  11364. && session->ticketLen == 0
  11365. #endif
  11366. #ifdef OPENSSL_EXTRA
  11367. && ssl->options.side != WOLFSSL_CLIENT_END
  11368. #endif
  11369. ;
  11370. }
  11371. int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
  11372. {
  11373. WOLFSSL_SESSION* sess = NULL;
  11374. const byte* id = NULL;
  11375. word32 row;
  11376. int idx;
  11377. int count;
  11378. int error = 0;
  11379. SessionRow* sessRow;
  11380. #ifdef HAVE_SESSION_TICKET
  11381. #ifndef WOLFSSL_SMALL_STACK
  11382. byte tmpTicket[PREALLOC_SESSION_TICKET_LEN];
  11383. #else
  11384. byte* tmpTicket = NULL;
  11385. #endif
  11386. byte tmpBufSet = 0;
  11387. #endif
  11388. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11389. WOLFSSL_X509* peer = NULL;
  11390. #endif
  11391. byte bogusID[ID_LEN];
  11392. byte bogusIDSz = 0;
  11393. WOLFSSL_ENTER("wolfSSL_GetSessionFromCache");
  11394. if (output == NULL) {
  11395. WOLFSSL_MSG("NULL output");
  11396. return WOLFSSL_FAILURE;
  11397. }
  11398. if (SslSessionCacheOff(ssl, ssl->session))
  11399. return WOLFSSL_FAILURE;
  11400. if (ssl->options.haveSessionId == 0)
  11401. return WOLFSSL_FAILURE;
  11402. #ifdef HAVE_SESSION_TICKET
  11403. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11404. return WOLFSSL_FAILURE;
  11405. #endif
  11406. XMEMSET(bogusID, 0, sizeof(bogusID));
  11407. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  11408. id = ssl->arrays->sessionID;
  11409. else if (ssl->session->haveAltSessionID) {
  11410. id = ssl->session->altSessionID;
  11411. /* We want to restore the bogus ID for TLS compatibility */
  11412. if (output == ssl->session) {
  11413. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  11414. bogusIDSz = ssl->session->sessionIDSz;
  11415. }
  11416. }
  11417. else
  11418. id = ssl->session->sessionID;
  11419. #ifdef HAVE_EXT_CACHE
  11420. if (ssl->ctx->get_sess_cb != NULL) {
  11421. int copy = 0;
  11422. /* Attempt to retrieve the session from the external cache. */
  11423. WOLFSSL_MSG("Calling external session cache");
  11424. sess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  11425. if (sess != NULL) {
  11426. WOLFSSL_MSG("Session found in external cache");
  11427. error = wolfSSL_DupSession(sess, output, 0);
  11428. #ifdef HAVE_EX_DATA
  11429. output->ownExData = 0; /* Session cache owns external data */
  11430. #endif
  11431. /* If copy not set then free immediately */
  11432. if (!copy)
  11433. wolfSSL_FreeSession(ssl->ctx, sess);
  11434. /* We want to restore the bogus ID for TLS compatibility */
  11435. if (ssl->session->haveAltSessionID &&
  11436. output == ssl->session) {
  11437. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  11438. ssl->session->sessionIDSz = bogusIDSz;
  11439. }
  11440. return error;
  11441. }
  11442. WOLFSSL_MSG("Session not found in external cache");
  11443. }
  11444. if (ssl->ctx->internalCacheLookupOff) {
  11445. WOLFSSL_MSG("Internal cache lookup turned off");
  11446. return WOLFSSL_FAILURE;
  11447. }
  11448. #endif
  11449. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  11450. if (error != 0) {
  11451. WOLFSSL_MSG("Hash session failed");
  11452. return WOLFSSL_FAILURE;
  11453. }
  11454. #ifdef HAVE_SESSION_TICKET
  11455. if (output->ticket == NULL ||
  11456. output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) {
  11457. #ifdef WOLFSSL_SMALL_STACK
  11458. tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap,
  11459. DYNAMIC_TYPE_TMP_BUFFER);
  11460. if (tmpTicket == NULL) {
  11461. WOLFSSL_MSG("tmpTicket malloc failed");
  11462. return WOLFSSL_FAILURE;
  11463. }
  11464. #endif
  11465. if (output->ticketLenAlloc)
  11466. XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  11467. output->ticket = tmpTicket;
  11468. output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN;
  11469. output->ticketLen = 0;
  11470. tmpBufSet = 1;
  11471. }
  11472. #endif
  11473. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11474. if (output->peer != NULL) {
  11475. wolfSSL_X509_free(output->peer);
  11476. output->peer = NULL;
  11477. }
  11478. #endif
  11479. /* lock row */
  11480. sessRow = &SessionCache[row];
  11481. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11482. WOLFSSL_MSG("Session cache row lock failure");
  11483. #ifdef HAVE_SESSION_TICKET
  11484. if (tmpBufSet) {
  11485. output->ticket = output->_staticTicket;
  11486. output->ticketLenAlloc = 0;
  11487. }
  11488. #ifdef WOLFSSL_SMALL_STACK
  11489. if (tmpTicket != NULL)
  11490. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11491. #endif
  11492. #endif
  11493. return WOLFSSL_FAILURE;
  11494. }
  11495. /* start from most recently used */
  11496. count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW);
  11497. idx = sessRow->nextIdx - 1;
  11498. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  11499. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11500. }
  11501. for (; count > 0; --count) {
  11502. WOLFSSL_SESSION* current;
  11503. current = &sessRow->Sessions[idx];
  11504. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0 &&
  11505. current->side == ssl->options.side) {
  11506. WOLFSSL_MSG("Found a session match");
  11507. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11508. WOLFSSL_MSG("Session valid");
  11509. sess = current;
  11510. } else {
  11511. WOLFSSL_MSG("Session timed out");
  11512. }
  11513. break; /* no more sessionIDs whether valid or not that match */
  11514. } else {
  11515. WOLFSSL_MSG("SessionID not a match at this idx");
  11516. }
  11517. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  11518. }
  11519. if (sess != NULL) {
  11520. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11521. /* We don't want the peer member. We will free it at the end. */
  11522. if (sess->peer != NULL) {
  11523. peer = sess->peer;
  11524. sess->peer = NULL;
  11525. }
  11526. #endif
  11527. error = wolfSSL_DupSession(sess, output, 1);
  11528. #ifdef HAVE_EX_DATA
  11529. output->ownExData = 0; /* Session cache owns external data */
  11530. #endif
  11531. }
  11532. else {
  11533. error = WOLFSSL_FAILURE;
  11534. }
  11535. SESSION_ROW_UNLOCK(sessRow);
  11536. /* We want to restore the bogus ID for TLS compatibility */
  11537. if (ssl->session->haveAltSessionID &&
  11538. output == ssl->session) {
  11539. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  11540. ssl->session->sessionIDSz = bogusIDSz;
  11541. }
  11542. #ifdef HAVE_SESSION_TICKET
  11543. if (tmpBufSet) {
  11544. if (error == WOLFSSL_SUCCESS) {
  11545. if (output->ticketLen > SESSION_TICKET_LEN) {
  11546. output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap,
  11547. DYNAMIC_TYPE_SESSION_TICK);
  11548. if (output->ticket == NULL) {
  11549. error = WOLFSSL_FAILURE;
  11550. output->ticket = output->_staticTicket;
  11551. output->ticketLenAlloc = 0;
  11552. output->ticketLen = 0;
  11553. }
  11554. }
  11555. else {
  11556. output->ticket = output->_staticTicket;
  11557. output->ticketLenAlloc = 0;
  11558. }
  11559. }
  11560. else {
  11561. output->ticket = output->_staticTicket;
  11562. output->ticketLenAlloc = 0;
  11563. output->ticketLen = 0;
  11564. }
  11565. if (error == WOLFSSL_SUCCESS) {
  11566. XMEMCPY(output->ticket, tmpTicket, output->ticketLen);
  11567. }
  11568. }
  11569. #ifdef WOLFSSL_SMALL_STACK
  11570. if (tmpTicket != NULL)
  11571. XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11572. #endif
  11573. #endif
  11574. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11575. if (peer != NULL) {
  11576. wolfSSL_X509_free(peer);
  11577. }
  11578. #endif
  11579. return error;
  11580. }
  11581. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  11582. byte restoreSessionCerts)
  11583. {
  11584. WOLFSSL_SESSION* ret = NULL;
  11585. (void)restoreSessionCerts; /* Kept for compatibility */
  11586. if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) {
  11587. ret = ssl->session;
  11588. }
  11589. else {
  11590. WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session");
  11591. }
  11592. if (ret != NULL && masterSecret != NULL)
  11593. XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN);
  11594. return ret;
  11595. }
  11596. int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  11597. {
  11598. SessionRow* sessRow = NULL;
  11599. int ret = WOLFSSL_SUCCESS;
  11600. session = ClientSessionToSession(session);
  11601. if (ssl == NULL || session == NULL) {
  11602. return WOLFSSL_FAILURE;
  11603. }
  11604. if (session->type == WOLFSSL_SESSION_TYPE_CACHE) {
  11605. if (session->cacheRow < SESSION_ROWS) {
  11606. sessRow = &SessionCache[session->cacheRow];
  11607. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11608. WOLFSSL_MSG("Session row lock failed");
  11609. return WOLFSSL_FAILURE;
  11610. }
  11611. }
  11612. }
  11613. if (ret == WOLFSSL_SUCCESS && SslSessionCacheOff(ssl, session)) {
  11614. WOLFSSL_MSG("Session cache off");
  11615. ret = WOLFSSL_FAILURE;
  11616. }
  11617. if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END &&
  11618. (byte)ssl->options.side != session->side) {
  11619. WOLFSSL_MSG("Setting session for wrong role");
  11620. ret = WOLFSSL_FAILURE;
  11621. }
  11622. if (ret == WOLFSSL_SUCCESS &&
  11623. wolfSSL_DupSession(session, ssl->session, 0) != WOLFSSL_SUCCESS) {
  11624. WOLFSSL_MSG("Session duplicate failed");
  11625. ret = WOLFSSL_FAILURE;
  11626. }
  11627. /* Let's copy over the altSessionID for local cache purposes */
  11628. if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID) {
  11629. ssl->session->haveAltSessionID = 1;
  11630. XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN);
  11631. }
  11632. if (sessRow != NULL) {
  11633. SESSION_ROW_UNLOCK(sessRow);
  11634. sessRow = NULL;
  11635. }
  11636. /* Note: the `session` variable cannot be used below, since the row is
  11637. * un-locked */
  11638. if (ret != WOLFSSL_SUCCESS)
  11639. return ret;
  11640. #ifdef OPENSSL_EXTRA
  11641. /* check for application context id */
  11642. if (ssl->sessionCtxSz > 0) {
  11643. if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, ssl->sessionCtxSz)) {
  11644. /* context id did not match! */
  11645. WOLFSSL_MSG("Session context did not match");
  11646. return WOLFSSL_FAILURE;
  11647. }
  11648. }
  11649. #endif /* OPENSSL_EXTRA */
  11650. if (LowResTimer() < (ssl->session->bornOn + ssl->session->timeout)) {
  11651. ssl->options.resuming = 1;
  11652. ssl->options.haveEMS = ssl->session->haveEMS;
  11653. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11654. defined(HAVE_SESSION_TICKET))
  11655. ssl->version = ssl->session->version;
  11656. if (IsAtLeastTLSv1_3(ssl->version))
  11657. ssl->options.tls1_3 = 1;
  11658. #endif
  11659. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11660. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11661. ssl->options.cipherSuite0 = ssl->session->cipherSuite0;
  11662. ssl->options.cipherSuite = ssl->session->cipherSuite;
  11663. #endif
  11664. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11665. ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet;
  11666. #endif
  11667. ret = WOLFSSL_SUCCESS;
  11668. }
  11669. else {
  11670. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
  11671. WOLFSSL_MSG("Session is expired but return success for \
  11672. OpenSSL compatibility");
  11673. ret = WOLFSSL_SUCCESS;
  11674. #else
  11675. ret = WOLFSSL_FAILURE; /* session timed out */
  11676. #endif /* OPENSSL_EXTRA && WOLFSSL_ERROR_CODE_OPENSSL */
  11677. }
  11678. return ret;
  11679. }
  11680. #ifdef WOLFSSL_SESSION_STATS
  11681. static int get_locked_session_stats(word32* active, word32* total,
  11682. word32* peak);
  11683. #endif
  11684. #ifndef NO_CLIENT_CACHE
  11685. ClientSession* AddSessionToClientCache(int side, int row, int idx, byte* serverID,
  11686. word16 idLen, const byte* sessionID,
  11687. word16 useTicket)
  11688. {
  11689. int error = -1;
  11690. word32 clientRow = 0, clientIdx = 0, sessionIDHash = 0;
  11691. (void)useTicket;
  11692. if (side == WOLFSSL_CLIENT_END
  11693. && row != INVALID_SESSION_ROW
  11694. && (idLen
  11695. #ifdef HAVE_SESSION_TICKET
  11696. || useTicket == 1
  11697. #endif
  11698. || serverID != NULL
  11699. )) {
  11700. WOLFSSL_MSG("Trying to add client cache entry");
  11701. if (idLen) {
  11702. clientRow = HashSession(serverID,
  11703. idLen, &error) % CLIENT_SESSION_ROWS;
  11704. }
  11705. else if (serverID != NULL) {
  11706. clientRow = HashSession(sessionID,
  11707. ID_LEN, &error) % CLIENT_SESSION_ROWS;
  11708. }
  11709. else {
  11710. error = -1;
  11711. }
  11712. if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) {
  11713. clientIdx = ClientCache[clientRow].nextIdx;
  11714. if (clientIdx < CLIENT_SESSIONS_PER_ROW) {
  11715. ClientCache[clientRow].Clients[clientIdx].serverRow =
  11716. (word16)row;
  11717. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  11718. (word16)idx;
  11719. if (sessionID != NULL) {
  11720. sessionIDHash = HashSession(sessionID, ID_LEN, &error);
  11721. if (error == 0) {
  11722. ClientCache[clientRow].Clients[clientIdx].sessionIDHash
  11723. = sessionIDHash;
  11724. }
  11725. }
  11726. }
  11727. else {
  11728. error = -1;
  11729. ClientCache[clientRow].nextIdx = 0; /* reset index as saftey */
  11730. WOLFSSL_MSG("Invalid client cache index! "
  11731. "Possible corrupted memory");
  11732. }
  11733. if (error == 0) {
  11734. WOLFSSL_MSG("Adding client cache entry");
  11735. if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW)
  11736. ClientCache[clientRow].totalCount++;
  11737. ClientCache[clientRow].nextIdx++;
  11738. ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW;
  11739. }
  11740. wc_UnLockMutex(&clisession_mutex);
  11741. }
  11742. else {
  11743. WOLFSSL_MSG("Hash session or lock failed");
  11744. error = -1;
  11745. }
  11746. }
  11747. else {
  11748. WOLFSSL_MSG("Skipping client cache");
  11749. }
  11750. if (error == 0)
  11751. return &ClientCache[clientRow].Clients[clientIdx];
  11752. else
  11753. return NULL;
  11754. }
  11755. #endif
  11756. /**
  11757. * For backwards compatibility, this API needs to be used in *ALL* functions
  11758. * that access the WOLFSSL_SESSION members directly.
  11759. *
  11760. * This API checks if the passed in session is actually a ClientSession object
  11761. * and returns the matching session cache object. Otherwise just return the
  11762. * input. ClientSession objects only occur in the ClientCache. They are not
  11763. * allocated anywhere else.
  11764. */
  11765. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  11766. {
  11767. WOLFSSL_ENTER("ClientSessionToSession");
  11768. #ifdef NO_SESSION_CACHE_REF
  11769. return (WOLFSSL_SESSION*)session;
  11770. #else
  11771. #ifndef NO_CLIENT_CACHE
  11772. if (session == NULL)
  11773. return NULL;
  11774. /* Check if session points into ClientCache */
  11775. if ((byte*)session >= (byte*)ClientCache &&
  11776. /* Cast to byte* to make pointer arithmetic work per byte */
  11777. (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) {
  11778. ClientSession* clientSession = (ClientSession*)session;
  11779. SessionRow* sessRow = NULL;
  11780. WOLFSSL_SESSION* cacheSession = NULL;
  11781. word32 sessionIDHash = 0;
  11782. int error = 0;
  11783. session = NULL; /* Default to NULL for failure case */
  11784. if (wc_LockMutex(&clisession_mutex) != 0) {
  11785. WOLFSSL_MSG("Client cache mutex lock failed");
  11786. return NULL;
  11787. }
  11788. if (clientSession->serverRow >= SESSION_ROWS ||
  11789. clientSession->serverIdx >= SESSIONS_PER_ROW) {
  11790. WOLFSSL_MSG("Client cache serverRow or serverIdx invalid");
  11791. error = -1;
  11792. }
  11793. if (error == 0) {
  11794. /* Lock row */
  11795. sessRow = &SessionCache[clientSession->serverRow];
  11796. error = SESSION_ROW_LOCK(sessRow);
  11797. if (error != 0) {
  11798. WOLFSSL_MSG("Session cache row lock failure");
  11799. sessRow = NULL;
  11800. }
  11801. }
  11802. if (error == 0) {
  11803. cacheSession = &sessRow->Sessions[clientSession->serverIdx];
  11804. if (cacheSession->sessionIDSz == 0) {
  11805. cacheSession = NULL;
  11806. WOLFSSL_MSG("Session cache entry not set");
  11807. error = -1;
  11808. }
  11809. }
  11810. if (error == 0) {
  11811. /* Calculate the hash of the session ID */
  11812. sessionIDHash = HashSession(cacheSession->sessionID, ID_LEN,
  11813. &error);
  11814. }
  11815. if (error == 0) {
  11816. /* Check the session ID hash matches */
  11817. error = clientSession->sessionIDHash != sessionIDHash;
  11818. }
  11819. if (error == 0) {
  11820. /* Hashes match */
  11821. session = cacheSession;
  11822. WOLFSSL_MSG("Found session cache matching client session object");
  11823. }
  11824. if (sessRow != NULL) {
  11825. SESSION_ROW_UNLOCK(sessRow);
  11826. }
  11827. wc_UnLockMutex(&clisession_mutex);
  11828. return (WOLFSSL_SESSION*)session;
  11829. }
  11830. else {
  11831. /* Plain WOLFSSL_SESSION object */
  11832. return (WOLFSSL_SESSION*)session;
  11833. }
  11834. #else
  11835. return (WOLFSSL_SESSION*)session;
  11836. #endif
  11837. #endif
  11838. }
  11839. int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession,
  11840. const byte* id, byte idSz, int* sessionIndex, int side,
  11841. word16 useTicket, ClientSession** clientCacheEntry)
  11842. {
  11843. WOLFSSL_SESSION* cacheSession = NULL;
  11844. SessionRow* sessRow = NULL;
  11845. word32 idx = 0;
  11846. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11847. WOLFSSL_X509* peer = NULL;
  11848. #endif
  11849. #ifdef HAVE_SESSION_TICKET
  11850. byte* cacheTicBuff = NULL;
  11851. byte ticBuffUsed = 0;
  11852. byte* ticBuff = NULL;
  11853. int ticLen = 0;
  11854. #endif
  11855. int ret = 0;
  11856. int row;
  11857. int i;
  11858. int overwrite = 0;
  11859. (void)ctx;
  11860. (void)sessionIndex;
  11861. (void)useTicket;
  11862. (void)clientCacheEntry;
  11863. if (idSz == 0) {
  11864. WOLFSSL_MSG("AddSessionToCache idSz == 0");
  11865. return BAD_FUNC_ARG;
  11866. }
  11867. addSession = ClientSessionToSession(addSession);
  11868. if (addSession == NULL) {
  11869. WOLFSSL_MSG("AddSessionToCache is NULL");
  11870. return MEMORY_E;
  11871. }
  11872. /* Find a position for the new session in cache and use that */
  11873. #ifdef HAVE_SESSION_TICKET
  11874. ticLen = addSession->ticketLen;
  11875. /* Alloc Memory here to avoid syscalls during lock */
  11876. if (ticLen > SESSION_TICKET_LEN) {
  11877. ticBuff = (byte*)XMALLOC(ticLen, NULL,
  11878. DYNAMIC_TYPE_SESSION_TICK);
  11879. if (ticBuff == NULL) {
  11880. return MEMORY_E;
  11881. }
  11882. }
  11883. #endif
  11884. /* Use the session object in the cache for external cache if required */
  11885. row = (int)(HashSession(id, ID_LEN, &ret) % SESSION_ROWS);
  11886. if (ret != 0) {
  11887. WOLFSSL_MSG("Hash session failed");
  11888. #ifdef HAVE_SESSION_TICKET
  11889. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  11890. #endif
  11891. return ret;
  11892. }
  11893. sessRow = &SessionCache[row];
  11894. if (SESSION_ROW_LOCK(sessRow) != 0) {
  11895. #ifdef HAVE_SESSION_TICKET
  11896. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  11897. #endif
  11898. WOLFSSL_MSG("Session row lock failed");
  11899. return BAD_MUTEX_E;
  11900. }
  11901. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  11902. if (XMEMCMP(id,
  11903. sessRow->Sessions[i].sessionID, ID_LEN) == 0 &&
  11904. sessRow->Sessions[i].side == side) {
  11905. WOLFSSL_MSG("Session already exists. Overwriting.");
  11906. overwrite = 1;
  11907. idx = i;
  11908. break;
  11909. }
  11910. }
  11911. if (!overwrite)
  11912. idx = sessRow->nextIdx;
  11913. #ifdef SESSION_INDEX
  11914. if (sessionIndex != NULL)
  11915. *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  11916. #endif
  11917. cacheSession = &sessRow->Sessions[idx];
  11918. #ifdef HAVE_EX_DATA
  11919. if (cacheSession->rem_sess_cb && cacheSession->ownExData) {
  11920. cacheSession->rem_sess_cb(NULL, cacheSession);
  11921. /* Make sure not to call remove functions again */
  11922. cacheSession->ownExData = 0;
  11923. cacheSession->rem_sess_cb = NULL;
  11924. }
  11925. #endif
  11926. cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE;
  11927. cacheSession->cacheRow = row;
  11928. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11929. /* Save the peer field to free after unlocking the row */
  11930. if (cacheSession->peer != NULL)
  11931. peer = cacheSession->peer;
  11932. cacheSession->peer = NULL;
  11933. #endif
  11934. #ifdef HAVE_SESSION_TICKET
  11935. /* If we can re-use the existing buffer in cacheSession then we won't touch
  11936. * ticBuff at all making it a very cheap malloc/free. The page on a modern
  11937. * OS will most likely not even be allocated to the process. */
  11938. if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) {
  11939. cacheTicBuff = cacheSession->ticket;
  11940. ticBuffUsed = 1;
  11941. cacheSession->ticket = ticBuff;
  11942. cacheSession->ticketLenAlloc = (word16) ticLen;
  11943. }
  11944. #endif
  11945. #ifdef SESSION_CERTS
  11946. if (overwrite &&
  11947. addSession->chain.count == 0 &&
  11948. cacheSession->chain.count > 0) {
  11949. /* Copy in the certs from the session */
  11950. addSession->chain.count = cacheSession->chain.count;
  11951. XMEMCPY(addSession->chain.certs, cacheSession->chain.certs,
  11952. sizeof(x509_buffer) * cacheSession->chain.count);
  11953. }
  11954. #endif /* SESSION_CERTS */
  11955. cacheSession->heap = NULL;
  11956. /* Copy data into the cache object */
  11957. ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE;
  11958. if (ret == 0) {
  11959. /* Increment the totalCount and the nextIdx */
  11960. if (sessRow->totalCount < SESSIONS_PER_ROW)
  11961. sessRow->totalCount++;
  11962. sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW;
  11963. if (id != addSession->sessionID) {
  11964. /* ssl->session->sessionID may contain the bogus ID or we want the
  11965. * ID from the arrays object */
  11966. XMEMCPY(cacheSession->sessionID, id, ID_LEN);
  11967. cacheSession->sessionIDSz = ID_LEN;
  11968. }
  11969. #ifdef HAVE_EX_DATA
  11970. if (ctx->rem_sess_cb != NULL) {
  11971. addSession->ownExData = 0;
  11972. cacheSession->ownExData = 1;
  11973. cacheSession->rem_sess_cb = ctx->rem_sess_cb;
  11974. }
  11975. #endif
  11976. }
  11977. #ifdef HAVE_SESSION_TICKET
  11978. else if (ticBuffUsed) {
  11979. /* Error occured. Need to clean up the ticket buffer. */
  11980. cacheSession->ticket = cacheSession->_staticTicket;
  11981. cacheSession->ticketLenAlloc = 0;
  11982. cacheSession->ticketLen = 0;
  11983. }
  11984. #endif
  11985. SESSION_ROW_UNLOCK(sessRow);
  11986. cacheSession = NULL; /* Can't access after unlocked */
  11987. #ifndef NO_CLIENT_CACHE
  11988. if (ret == 0 && clientCacheEntry != NULL) {
  11989. ClientSession* clientCache = AddSessionToClientCache(side, row, idx,
  11990. addSession->serverID, addSession->idLen, id, useTicket);
  11991. if (clientCache != NULL)
  11992. *clientCacheEntry = clientCache;
  11993. }
  11994. #endif
  11995. #ifdef HAVE_SESSION_TICKET
  11996. if (ticBuff != NULL && !ticBuffUsed)
  11997. XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  11998. if (cacheTicBuff != NULL)
  11999. XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK);
  12000. #endif
  12001. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12002. if (peer != NULL) {
  12003. wolfSSL_X509_free(peer);
  12004. peer = NULL; /* Make sure not use after this point */
  12005. }
  12006. #endif
  12007. return ret;
  12008. }
  12009. #ifndef NO_CLIENT_CACHE
  12010. #endif
  12011. void AddSession(WOLFSSL* ssl)
  12012. {
  12013. int error = 0;
  12014. const byte* id = NULL;
  12015. byte idSz = 0;
  12016. WOLFSSL_SESSION* session = ssl->session;
  12017. #ifdef HAVE_EXT_CACHE
  12018. int cbRet = 0;
  12019. #endif
  12020. (void)error;
  12021. WOLFSSL_ENTER("AddSession");
  12022. if (SslSessionCacheOff(ssl, session)) {
  12023. WOLFSSL_MSG("Cache off");
  12024. return;
  12025. }
  12026. if (ssl->options.haveSessionId == 0) {
  12027. WOLFSSL_MSG("Don't have session id");
  12028. return;
  12029. }
  12030. #if defined(HAVE_SESSION_TICKET) && !defined(OPENSSL_EXTRA)
  12031. /* For the compat layer generate a session object to use */
  12032. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) {
  12033. WOLFSSL_MSG("Using tickets instead of cache");
  12034. return;
  12035. }
  12036. #endif
  12037. if (session->haveAltSessionID) {
  12038. id = session->altSessionID;
  12039. idSz = ID_LEN;
  12040. }
  12041. else {
  12042. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  12043. /* Make sure the session ID is available when the user calls any
  12044. * get_session API */
  12045. XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN);
  12046. session->sessionIDSz = ssl->arrays->sessionIDSz;
  12047. }
  12048. id = session->sessionID;
  12049. idSz = session->sessionIDSz;
  12050. }
  12051. session->timeout = ssl->timeout;
  12052. session->side = (byte)ssl->options.side;
  12053. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL)
  12054. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  12055. session->haveEMS = ssl->options.haveEMS;
  12056. #ifdef OPENSSL_EXTRA
  12057. /* If using compatibility layer then check for and copy over session context
  12058. * id. */
  12059. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  12060. XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  12061. session->sessionCtxSz = ssl->sessionCtxSz;
  12062. }
  12063. #endif
  12064. session->timeout = ssl->timeout;
  12065. session->bornOn = LowResTimer();
  12066. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  12067. defined(HAVE_SESSION_TICKET))
  12068. session->version = ssl->version;
  12069. #endif
  12070. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  12071. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12072. session->cipherSuite0 = ssl->options.cipherSuite0;
  12073. session->cipherSuite = ssl->options.cipherSuite;
  12074. #endif
  12075. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12076. session->peerVerifyRet = (byte)ssl->peerVerifyRet;
  12077. #endif
  12078. /* Do this last so that if it fails, the rest of the session is setup. Do
  12079. * this only for the client because if the server doesn't have an ID at
  12080. * this point, it won't on resumption. */
  12081. if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12082. WC_RNG* rng = NULL;
  12083. if (ssl->rng != NULL)
  12084. rng = ssl->rng;
  12085. #if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA)
  12086. else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) {
  12087. rng = &globalRNG;
  12088. }
  12089. #endif
  12090. if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID,
  12091. ID_LEN) != 0)
  12092. return;
  12093. ssl->session->haveAltSessionID = 1;
  12094. id = ssl->session->altSessionID;
  12095. idSz = ID_LEN;
  12096. }
  12097. /* Setup done */
  12098. if (ssl->options.side == WOLFSSL_SERVER_END /* No point in adding a
  12099. * client session */
  12100. #ifdef HAVE_EXT_CACHE
  12101. && !ssl->options.internalCacheOff
  12102. #endif
  12103. )
  12104. {
  12105. /* Try to add the session to cache. Its ok if we don't succeed. */
  12106. (void)AddSessionToCache(ssl->ctx, session, id, idSz,
  12107. #ifdef SESSION_INDEX
  12108. &ssl->sessionIndex,
  12109. #else
  12110. NULL,
  12111. #endif
  12112. ssl->options.side,
  12113. #ifdef HAVE_SESSION_TICKET
  12114. ssl->options.useTicket,
  12115. #else
  12116. 0,
  12117. #endif
  12118. NULL
  12119. );
  12120. }
  12121. #ifdef HAVE_EXT_CACHE
  12122. if (error == 0 && ssl->ctx->new_sess_cb != NULL) {
  12123. wolfSSL_SESSION_up_ref(session);
  12124. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  12125. if (cbRet == 0)
  12126. wolfSSL_FreeSession(ssl->ctx, session);
  12127. }
  12128. #endif
  12129. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  12130. if (error == 0) {
  12131. word32 active = 0;
  12132. error = get_locked_session_stats(&active, NULL, NULL);
  12133. if (error == WOLFSSL_SUCCESS) {
  12134. error = 0; /* back to this function ok */
  12135. if (PeakSessions < active) {
  12136. PeakSessions = active;
  12137. }
  12138. }
  12139. }
  12140. #endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */
  12141. (void)error;
  12142. }
  12143. #ifdef SESSION_INDEX
  12144. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  12145. {
  12146. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  12147. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  12148. return ssl->sessionIndex;
  12149. }
  12150. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  12151. {
  12152. int row, col, result = WOLFSSL_FAILURE;
  12153. SessionRow* sessRow;
  12154. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  12155. session = ClientSessionToSession(session);
  12156. row = idx >> SESSIDX_ROW_SHIFT;
  12157. col = idx & SESSIDX_IDX_MASK;
  12158. if (session == NULL ||
  12159. row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) {
  12160. return WOLFSSL_FAILURE;
  12161. }
  12162. sessRow = &SessionCache[row];
  12163. if (SESSION_ROW_LOCK(sessRow) != 0) {
  12164. return BAD_MUTEX_E;
  12165. }
  12166. XMEMCPY(session, &sessRow->Sessions[col], sizeof(WOLFSSL_SESSION));
  12167. result = WOLFSSL_SUCCESS;
  12168. SESSION_ROW_UNLOCK(sessRow);
  12169. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  12170. return result;
  12171. }
  12172. #endif /* SESSION_INDEX */
  12173. #if defined(SESSION_CERTS)
  12174. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  12175. {
  12176. WOLFSSL_X509_CHAIN* chain = NULL;
  12177. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12178. session = ClientSessionToSession(session);
  12179. if (session)
  12180. chain = &session->chain;
  12181. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  12182. return chain;
  12183. }
  12184. #ifdef OPENSSL_EXTRA
  12185. /* gets the peer certificate associated with the session passed in
  12186. * returns null on failure, the caller should not free the returned pointer */
  12187. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  12188. {
  12189. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  12190. session = ClientSessionToSession(session);
  12191. if (session) {
  12192. int count;
  12193. count = wolfSSL_get_chain_count(&session->chain);
  12194. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  12195. WOLFSSL_MSG("bad count found");
  12196. return NULL;
  12197. }
  12198. if (session->peer == NULL) {
  12199. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  12200. }
  12201. return session->peer;
  12202. }
  12203. WOLFSSL_MSG("No session passed in");
  12204. return NULL;
  12205. }
  12206. #endif /* OPENSSL_EXTRA */
  12207. #endif /* SESSION_INDEX && SESSION_CERTS */
  12208. #ifdef WOLFSSL_SESSION_STATS
  12209. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  12210. {
  12211. int result = WOLFSSL_SUCCESS;
  12212. int i;
  12213. int count;
  12214. int idx;
  12215. word32 now = 0;
  12216. word32 seen = 0;
  12217. word32 ticks = LowResTimer();
  12218. WOLFSSL_ENTER("get_locked_session_stats");
  12219. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12220. wc_LockMutex(&session_mutex);
  12221. #endif
  12222. for (i = 0; i < SESSION_ROWS; i++) {
  12223. SessionRow* row = &SessionCache[i];
  12224. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12225. if (SESSION_ROW_LOCK(row) != 0) {
  12226. WOLFSSL_MSG("Session row cache mutex lock failed");
  12227. return BAD_MUTEX_E;
  12228. }
  12229. #endif
  12230. seen += row->totalCount;
  12231. if (active == NULL) {
  12232. SESSION_ROW_UNLOCK(row);
  12233. continue;
  12234. }
  12235. count = min((word32)row->totalCount, SESSIONS_PER_ROW);
  12236. idx = row->nextIdx - 1;
  12237. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  12238. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  12239. }
  12240. for (; count > 0; --count) {
  12241. /* if not expired then good */
  12242. if (ticks < (row->Sessions[idx].bornOn +
  12243. row->Sessions[idx].timeout) ) {
  12244. now++;
  12245. }
  12246. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  12247. }
  12248. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12249. SESSION_ROW_UNLOCK(row);
  12250. #endif
  12251. }
  12252. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  12253. wc_UnLockMutex(&session_mutex);
  12254. #endif
  12255. if (active) {
  12256. *active = now;
  12257. }
  12258. if (total) {
  12259. *total = seen;
  12260. }
  12261. #ifdef WOLFSSL_PEAK_SESSIONS
  12262. if (peak) {
  12263. *peak = PeakSessions;
  12264. }
  12265. #else
  12266. (void)peak;
  12267. #endif
  12268. WOLFSSL_LEAVE("get_locked_session_stats", result);
  12269. return result;
  12270. }
  12271. /* return WOLFSSL_SUCCESS on ok */
  12272. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  12273. word32* maxSessions)
  12274. {
  12275. int result = WOLFSSL_SUCCESS;
  12276. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  12277. if (maxSessions) {
  12278. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  12279. if (active == NULL && total == NULL && peak == NULL)
  12280. return result; /* we're done */
  12281. }
  12282. /* user must provide at least one query value */
  12283. if (active == NULL && total == NULL && peak == NULL) {
  12284. return BAD_FUNC_ARG;
  12285. }
  12286. result = get_locked_session_stats(active, total, peak);
  12287. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  12288. return result;
  12289. }
  12290. #endif /* WOLFSSL_SESSION_STATS */
  12291. #ifdef PRINT_SESSION_STATS
  12292. /* WOLFSSL_SUCCESS on ok */
  12293. int wolfSSL_PrintSessionStats(void)
  12294. {
  12295. word32 totalSessionsSeen = 0;
  12296. word32 totalSessionsNow = 0;
  12297. word32 peak = 0;
  12298. word32 maxSessions = 0;
  12299. int i;
  12300. int ret;
  12301. double E; /* expected freq */
  12302. double chiSquare = 0;
  12303. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  12304. &peak, &maxSessions);
  12305. if (ret != WOLFSSL_SUCCESS)
  12306. return ret;
  12307. printf("Total Sessions Seen = %u\n", totalSessionsSeen);
  12308. printf("Total Sessions Now = %u\n", totalSessionsNow);
  12309. #ifdef WOLFSSL_PEAK_SESSIONS
  12310. printf("Peak Sessions = %u\n", peak);
  12311. #endif
  12312. printf("Max Sessions = %u\n", maxSessions);
  12313. E = (double)totalSessionsSeen / SESSION_ROWS;
  12314. for (i = 0; i < SESSION_ROWS; i++) {
  12315. double diff = SessionCache[i].totalCount - E;
  12316. diff *= diff; /* square */
  12317. diff /= E; /* normalize */
  12318. chiSquare += diff;
  12319. }
  12320. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  12321. SESSION_ROWS - 1);
  12322. #if (SESSION_ROWS == 11)
  12323. printf(" .05 p value = 18.3, chi-square should be less\n");
  12324. #elif (SESSION_ROWS == 211)
  12325. printf(".05 p value = 244.8, chi-square should be less\n");
  12326. #elif (SESSION_ROWS == 5981)
  12327. printf(".05 p value = 6161.0, chi-square should be less\n");
  12328. #elif (SESSION_ROWS == 3)
  12329. printf(".05 p value = 6.0, chi-square should be less\n");
  12330. #elif (SESSION_ROWS == 2861)
  12331. printf(".05 p value = 2985.5, chi-square should be less\n");
  12332. #endif
  12333. printf("\n");
  12334. return ret;
  12335. }
  12336. #endif /* SESSION_STATS */
  12337. #else /* NO_SESSION_CACHE */
  12338. WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session)
  12339. {
  12340. return (WOLFSSL_SESSION*)session;
  12341. }
  12342. /* No session cache version */
  12343. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12344. byte restoreSessionCerts)
  12345. {
  12346. (void)ssl;
  12347. (void)masterSecret;
  12348. (void)restoreSessionCerts;
  12349. return NULL;
  12350. }
  12351. #endif /* NO_SESSION_CACHE */
  12352. /* call before SSL_connect, if verifying will add name check to
  12353. date check and signature check */
  12354. WOLFSSL_ABI
  12355. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  12356. {
  12357. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  12358. if (ssl == NULL || dn == NULL) {
  12359. WOLFSSL_MSG("Bad function argument: NULL");
  12360. return WOLFSSL_FAILURE;
  12361. }
  12362. if (ssl->buffers.domainName.buffer)
  12363. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  12364. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  12365. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  12366. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  12367. if (ssl->buffers.domainName.buffer) {
  12368. unsigned char* domainName = ssl->buffers.domainName.buffer;
  12369. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  12370. domainName[ssl->buffers.domainName.length] = '\0';
  12371. return WOLFSSL_SUCCESS;
  12372. }
  12373. else {
  12374. ssl->error = MEMORY_ERROR;
  12375. return WOLFSSL_FAILURE;
  12376. }
  12377. }
  12378. /* turn on wolfSSL zlib compression
  12379. returns WOLFSSL_SUCCESS for success, else error (not built in)
  12380. */
  12381. int wolfSSL_set_compression(WOLFSSL* ssl)
  12382. {
  12383. WOLFSSL_ENTER("wolfSSL_set_compression");
  12384. (void)ssl;
  12385. #ifdef HAVE_LIBZ
  12386. ssl->options.usingCompression = 1;
  12387. return WOLFSSL_SUCCESS;
  12388. #else
  12389. return NOT_COMPILED_IN;
  12390. #endif
  12391. }
  12392. #ifndef USE_WINDOWS_API
  12393. #ifndef NO_WRITEV
  12394. /* simulate writev semantics, doesn't actually do block at a time though
  12395. because of SSL_write behavior and because front adds may be small */
  12396. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  12397. {
  12398. #ifdef WOLFSSL_SMALL_STACK
  12399. byte staticBuffer[1]; /* force heap usage */
  12400. #else
  12401. byte staticBuffer[FILE_BUFFER_SIZE];
  12402. #endif
  12403. byte* myBuffer = staticBuffer;
  12404. int dynamic = 0;
  12405. int sending = 0;
  12406. int idx = 0;
  12407. int i;
  12408. int ret;
  12409. WOLFSSL_ENTER("wolfSSL_writev");
  12410. for (i = 0; i < iovcnt; i++)
  12411. sending += (int)iov[i].iov_len;
  12412. if (sending > (int)sizeof(staticBuffer)) {
  12413. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  12414. DYNAMIC_TYPE_WRITEV);
  12415. if (!myBuffer)
  12416. return MEMORY_ERROR;
  12417. dynamic = 1;
  12418. }
  12419. for (i = 0; i < iovcnt; i++) {
  12420. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  12421. idx += (int)iov[i].iov_len;
  12422. }
  12423. /* myBuffer may not be initialized fully, but the span up to the
  12424. * sending length will be.
  12425. */
  12426. PRAGMA_GCC_DIAG_PUSH;
  12427. PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
  12428. ret = wolfSSL_write(ssl, myBuffer, sending);
  12429. PRAGMA_GCC_DIAG_POP;
  12430. if (dynamic)
  12431. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  12432. return ret;
  12433. }
  12434. #endif
  12435. #endif
  12436. #ifdef WOLFSSL_CALLBACKS
  12437. typedef struct itimerval Itimerval;
  12438. /* don't keep calling simple functions while setting up timer and signals
  12439. if no inlining these are the next best */
  12440. #define AddTimes(a, b, c) \
  12441. do { \
  12442. c.tv_sec = a.tv_sec + b.tv_sec; \
  12443. c.tv_usec = a.tv_usec + b.tv_usec; \
  12444. if (c.tv_usec >= 1000000) { \
  12445. c.tv_sec++; \
  12446. c.tv_usec -= 1000000; \
  12447. } \
  12448. } while (0)
  12449. #define SubtractTimes(a, b, c) \
  12450. do { \
  12451. c.tv_sec = a.tv_sec - b.tv_sec; \
  12452. c.tv_usec = a.tv_usec - b.tv_usec; \
  12453. if (c.tv_usec < 0) { \
  12454. c.tv_sec--; \
  12455. c.tv_usec += 1000000; \
  12456. } \
  12457. } while (0)
  12458. #define CmpTimes(a, b, cmp) \
  12459. ((a.tv_sec == b.tv_sec) ? \
  12460. (a.tv_usec cmp b.tv_usec) : \
  12461. (a.tv_sec cmp b.tv_sec)) \
  12462. /* do nothing handler */
  12463. static void myHandler(int signo)
  12464. {
  12465. (void)signo;
  12466. return;
  12467. }
  12468. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12469. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12470. {
  12471. int ret = WOLFSSL_FATAL_ERROR;
  12472. int oldTimerOn = 0; /* was timer already on */
  12473. WOLFSSL_TIMEVAL startTime;
  12474. WOLFSSL_TIMEVAL endTime;
  12475. WOLFSSL_TIMEVAL totalTime;
  12476. Itimerval myTimeout;
  12477. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  12478. struct sigaction act, oact;
  12479. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  12480. if (hsCb) {
  12481. ssl->hsInfoOn = 1;
  12482. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  12483. }
  12484. if (toCb) {
  12485. ssl->toInfoOn = 1;
  12486. InitTimeoutInfo(&ssl->timeoutInfo);
  12487. if (gettimeofday(&startTime, 0) < 0)
  12488. ERR_OUT(GETTIME_ERROR);
  12489. /* use setitimer to simulate getitimer, init 0 myTimeout */
  12490. myTimeout.it_interval.tv_sec = 0;
  12491. myTimeout.it_interval.tv_usec = 0;
  12492. myTimeout.it_value.tv_sec = 0;
  12493. myTimeout.it_value.tv_usec = 0;
  12494. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  12495. ERR_OUT(SETITIMER_ERROR);
  12496. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  12497. oldTimerOn = 1;
  12498. /* is old timer going to expire before ours */
  12499. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  12500. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  12501. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  12502. }
  12503. }
  12504. myTimeout.it_value.tv_sec = timeout.tv_sec;
  12505. myTimeout.it_value.tv_usec = timeout.tv_usec;
  12506. /* set up signal handler, don't restart socket send/recv */
  12507. act.sa_handler = myHandler;
  12508. sigemptyset(&act.sa_mask);
  12509. act.sa_flags = 0;
  12510. #ifdef SA_INTERRUPT
  12511. act.sa_flags |= SA_INTERRUPT;
  12512. #endif
  12513. if (sigaction(SIGALRM, &act, &oact) < 0)
  12514. ERR_OUT(SIGACT_ERROR);
  12515. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  12516. ERR_OUT(SETITIMER_ERROR);
  12517. }
  12518. /* do main work */
  12519. #ifndef NO_WOLFSSL_CLIENT
  12520. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12521. ret = wolfSSL_connect(ssl);
  12522. #endif
  12523. #ifndef NO_WOLFSSL_SERVER
  12524. if (ssl->options.side == WOLFSSL_SERVER_END)
  12525. ret = wolfSSL_accept(ssl);
  12526. #endif
  12527. /* do callbacks */
  12528. if (toCb) {
  12529. if (oldTimerOn) {
  12530. gettimeofday(&endTime, 0);
  12531. SubtractTimes(endTime, startTime, totalTime);
  12532. /* adjust old timer for elapsed time */
  12533. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  12534. SubtractTimes(oldTimeout.it_value, totalTime,
  12535. oldTimeout.it_value);
  12536. else {
  12537. /* reset value to interval, may be off */
  12538. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  12539. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  12540. }
  12541. /* keep iter the same whether there or not */
  12542. }
  12543. /* restore old handler */
  12544. if (sigaction(SIGALRM, &oact, 0) < 0)
  12545. ret = SIGACT_ERROR; /* more pressing error, stomp */
  12546. else
  12547. /* use old settings which may turn off (expired or not there) */
  12548. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  12549. ret = SETITIMER_ERROR;
  12550. /* if we had a timeout call callback */
  12551. if (ssl->timeoutInfo.timeoutName[0]) {
  12552. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  12553. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  12554. (toCb)(&ssl->timeoutInfo);
  12555. }
  12556. /* clean up */
  12557. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  12558. ssl->toInfoOn = 0;
  12559. }
  12560. if (hsCb) {
  12561. FinishHandShakeInfo(&ssl->handShakeInfo);
  12562. (hsCb)(&ssl->handShakeInfo);
  12563. ssl->hsInfoOn = 0;
  12564. }
  12565. return ret;
  12566. }
  12567. #ifndef NO_WOLFSSL_CLIENT
  12568. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12569. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12570. {
  12571. WOLFSSL_ENTER("wolfSSL_connect_ex");
  12572. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12573. }
  12574. #endif
  12575. #ifndef NO_WOLFSSL_SERVER
  12576. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12577. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12578. {
  12579. WOLFSSL_ENTER("wolfSSL_accept_ex");
  12580. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12581. }
  12582. #endif
  12583. #endif /* WOLFSSL_CALLBACKS */
  12584. #ifndef NO_PSK
  12585. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  12586. wc_psk_client_callback cb)
  12587. {
  12588. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  12589. if (ctx == NULL)
  12590. return;
  12591. ctx->havePSK = 1;
  12592. ctx->client_psk_cb = cb;
  12593. }
  12594. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  12595. {
  12596. byte haveRSA = 1;
  12597. int keySz = 0;
  12598. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  12599. if (ssl == NULL)
  12600. return;
  12601. ssl->options.havePSK = 1;
  12602. ssl->options.client_psk_cb = cb;
  12603. #ifdef NO_RSA
  12604. haveRSA = 0;
  12605. #endif
  12606. #ifndef NO_CERTS
  12607. keySz = ssl->buffers.keySz;
  12608. #endif
  12609. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12610. ssl->options.haveDH, ssl->options.haveECDSAsig,
  12611. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  12612. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  12613. ssl->options.haveAnon, TRUE, ssl->options.side);
  12614. }
  12615. #ifdef OPENSSL_EXTRA
  12616. /**
  12617. * set call back function for psk session use
  12618. * @param ssl a pointer to WOLFSSL structure
  12619. * @param cb a function pointer to wc_psk_use_session_cb
  12620. * @return none
  12621. */
  12622. void wolfSSL_set_psk_use_session_callback(WOLFSSL* ssl,
  12623. wc_psk_use_session_cb_func cb)
  12624. {
  12625. WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback");
  12626. ssl->options.havePSK = 1;
  12627. ssl->options.session_psk_cb = cb;
  12628. WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS);
  12629. }
  12630. #endif
  12631. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  12632. wc_psk_server_callback cb)
  12633. {
  12634. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  12635. if (ctx == NULL)
  12636. return;
  12637. ctx->havePSK = 1;
  12638. ctx->server_psk_cb = cb;
  12639. }
  12640. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  12641. {
  12642. byte haveRSA = 1;
  12643. int keySz = 0;
  12644. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  12645. if (ssl == NULL)
  12646. return;
  12647. ssl->options.havePSK = 1;
  12648. ssl->options.server_psk_cb = cb;
  12649. #ifdef NO_RSA
  12650. haveRSA = 0;
  12651. #endif
  12652. #ifndef NO_CERTS
  12653. keySz = ssl->buffers.keySz;
  12654. #endif
  12655. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12656. ssl->options.haveDH, ssl->options.haveECDSAsig,
  12657. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  12658. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  12659. ssl->options.haveAnon, TRUE, ssl->options.side);
  12660. }
  12661. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  12662. {
  12663. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  12664. if (ssl == NULL || ssl->arrays == NULL)
  12665. return NULL;
  12666. return ssl->arrays->server_hint;
  12667. }
  12668. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  12669. {
  12670. WOLFSSL_ENTER("SSL_get_psk_identity");
  12671. if (ssl == NULL || ssl->arrays == NULL)
  12672. return NULL;
  12673. return ssl->arrays->client_identity;
  12674. }
  12675. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  12676. {
  12677. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  12678. if (hint == 0)
  12679. ctx->server_hint[0] = '\0';
  12680. else {
  12681. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  12682. #ifdef WOLFSSL_QT
  12683. ctx->havePSK=1;
  12684. #endif
  12685. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  12686. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  12687. }
  12688. return WOLFSSL_SUCCESS;
  12689. }
  12690. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  12691. {
  12692. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  12693. if (ssl == NULL || ssl->arrays == NULL)
  12694. return WOLFSSL_FAILURE;
  12695. if (hint == 0)
  12696. ssl->arrays->server_hint[0] = 0;
  12697. else {
  12698. XSTRNCPY(ssl->arrays->server_hint, hint,
  12699. sizeof(ssl->arrays->server_hint)-1);
  12700. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  12701. }
  12702. return WOLFSSL_SUCCESS;
  12703. }
  12704. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  12705. {
  12706. return ssl ? ssl->options.psk_ctx : NULL;
  12707. }
  12708. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  12709. {
  12710. return ctx ? ctx->psk_ctx : NULL;
  12711. }
  12712. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  12713. {
  12714. if (ssl == NULL)
  12715. return WOLFSSL_FAILURE;
  12716. ssl->options.psk_ctx = psk_ctx;
  12717. return WOLFSSL_SUCCESS;
  12718. }
  12719. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  12720. {
  12721. if (ctx == NULL)
  12722. return WOLFSSL_FAILURE;
  12723. ctx->psk_ctx = psk_ctx;
  12724. return WOLFSSL_SUCCESS;
  12725. }
  12726. #endif /* NO_PSK */
  12727. #ifdef HAVE_ANON
  12728. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  12729. {
  12730. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  12731. if (ctx == NULL)
  12732. return WOLFSSL_FAILURE;
  12733. ctx->haveAnon = 1;
  12734. return WOLFSSL_SUCCESS;
  12735. }
  12736. #endif /* HAVE_ANON */
  12737. #ifndef NO_CERTS
  12738. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  12739. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  12740. const unsigned char* in,
  12741. long sz, int format, int userChain,
  12742. word32 flags)
  12743. {
  12744. int verify;
  12745. int ret = WOLFSSL_FAILURE;
  12746. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  12747. verify = GET_VERIFY_SETTING_CTX(ctx);
  12748. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  12749. verify = VERIFY_SKIP_DATE;
  12750. if (format == WOLFSSL_FILETYPE_PEM)
  12751. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  12752. verify);
  12753. else
  12754. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  12755. userChain, verify);
  12756. #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS)
  12757. if (ret == WOLFSSL_SUCCESS)
  12758. ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format);
  12759. #endif
  12760. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  12761. return ret;
  12762. }
  12763. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  12764. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  12765. const unsigned char* in,
  12766. long sz, int format)
  12767. {
  12768. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  12769. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12770. }
  12771. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  12772. const unsigned char* in,
  12773. long sz, int format)
  12774. {
  12775. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  12776. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12777. }
  12778. #ifdef WOLFSSL_TRUST_PEER_CERT
  12779. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  12780. const unsigned char* in,
  12781. long sz, int format)
  12782. {
  12783. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  12784. /* sanity check on arguments */
  12785. if (sz < 0 || in == NULL || ctx == NULL) {
  12786. return BAD_FUNC_ARG;
  12787. }
  12788. if (format == WOLFSSL_FILETYPE_PEM)
  12789. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  12790. NULL, GET_VERIFY_SETTING_CTX(ctx));
  12791. else
  12792. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  12793. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  12794. }
  12795. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12796. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  12797. const unsigned char* in, long sz, int format)
  12798. {
  12799. int ret = WOLFSSL_FAILURE;
  12800. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  12801. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  12802. GET_VERIFY_SETTING_CTX(ctx));
  12803. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  12804. return ret;
  12805. }
  12806. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  12807. const unsigned char* in, long sz, int format)
  12808. {
  12809. int ret = WOLFSSL_FAILURE;
  12810. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  12811. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  12812. 0, GET_VERIFY_SETTING_CTX(ctx));
  12813. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  12814. return ret;
  12815. }
  12816. #ifdef WOLF_PRIVATE_KEY_ID
  12817. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12818. long sz, int devId, long keySz)
  12819. {
  12820. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  12821. if (ret == WOLFSSL_SUCCESS)
  12822. ctx->privateKeySz = (word32)keySz;
  12823. return ret;
  12824. }
  12825. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12826. long sz, int devId)
  12827. {
  12828. int ret = WOLFSSL_FAILURE;
  12829. FreeDer(&ctx->privateKey);
  12830. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12831. ctx->heap) == 0) {
  12832. XMEMCPY(ctx->privateKey->buffer, id, sz);
  12833. ctx->privateKeyId = 1;
  12834. if (devId != INVALID_DEVID)
  12835. ctx->privateKeyDevId = devId;
  12836. else
  12837. ctx->privateKeyDevId = ctx->devId;
  12838. ret = WOLFSSL_SUCCESS;
  12839. }
  12840. return ret;
  12841. }
  12842. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  12843. int devId)
  12844. {
  12845. int ret = WOLFSSL_FAILURE;
  12846. word32 sz = (word32)XSTRLEN(label) + 1;
  12847. FreeDer(&ctx->privateKey);
  12848. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12849. ctx->heap) == 0) {
  12850. XMEMCPY(ctx->privateKey->buffer, label, sz);
  12851. ctx->privateKeyLabel = 1;
  12852. if (devId != INVALID_DEVID)
  12853. ctx->privateKeyDevId = devId;
  12854. else
  12855. ctx->privateKeyDevId = ctx->devId;
  12856. ret = WOLFSSL_SUCCESS;
  12857. }
  12858. return ret;
  12859. }
  12860. #endif /* WOLF_PRIVATE_KEY_ID */
  12861. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  12862. const unsigned char* in, long sz, int format)
  12863. {
  12864. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  12865. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  12866. GET_VERIFY_SETTING_CTX(ctx));
  12867. }
  12868. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  12869. const unsigned char* in, long sz)
  12870. {
  12871. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  12872. WOLFSSL_FILETYPE_PEM);
  12873. }
  12874. #ifndef NO_DH
  12875. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  12876. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  12877. const unsigned char* buf,
  12878. long sz, int format)
  12879. {
  12880. DerBuffer* der = NULL;
  12881. int ret = 0;
  12882. word32 pSz = MAX_DH_SIZE;
  12883. word32 gSz = MAX_DH_SIZE;
  12884. #ifdef WOLFSSL_SMALL_STACK
  12885. byte* p = NULL;
  12886. byte* g = NULL;
  12887. #else
  12888. byte p[MAX_DH_SIZE];
  12889. byte g[MAX_DH_SIZE];
  12890. #endif
  12891. if (ctx == NULL || buf == NULL)
  12892. return BAD_FUNC_ARG;
  12893. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  12894. if (ret != 0) {
  12895. return ret;
  12896. }
  12897. der->buffer = (byte*)buf;
  12898. der->length = (word32)sz;
  12899. #ifdef WOLFSSL_SMALL_STACK
  12900. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12901. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12902. if (p == NULL || g == NULL) {
  12903. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12904. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12905. return MEMORY_E;
  12906. }
  12907. #endif
  12908. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  12909. ret = WOLFSSL_BAD_FILETYPE;
  12910. else {
  12911. if (format == WOLFSSL_FILETYPE_PEM) {
  12912. #ifdef WOLFSSL_PEM_TO_DER
  12913. FreeDer(&der);
  12914. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  12915. NULL, NULL);
  12916. if (ret < 0) {
  12917. /* Also try X9.42 format */
  12918. ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap,
  12919. NULL, NULL);
  12920. }
  12921. #ifdef WOLFSSL_WPAS
  12922. #ifndef NO_DSA
  12923. if (ret < 0) {
  12924. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  12925. NULL, NULL);
  12926. }
  12927. #endif
  12928. #endif /* WOLFSSL_WPAS */
  12929. #else
  12930. ret = NOT_COMPILED_IN;
  12931. #endif /* WOLFSSL_PEM_TO_DER */
  12932. }
  12933. if (ret == 0) {
  12934. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  12935. ret = WOLFSSL_BAD_FILETYPE;
  12936. else if (ssl)
  12937. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  12938. else
  12939. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  12940. }
  12941. }
  12942. FreeDer(&der);
  12943. #ifdef WOLFSSL_SMALL_STACK
  12944. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12945. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12946. #endif
  12947. return ret;
  12948. }
  12949. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12950. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  12951. int format)
  12952. {
  12953. if (ssl == NULL)
  12954. return BAD_FUNC_ARG;
  12955. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  12956. }
  12957. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12958. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  12959. long sz, int format)
  12960. {
  12961. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  12962. }
  12963. #endif /* NO_DH */
  12964. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  12965. const unsigned char* in, long sz, int format)
  12966. {
  12967. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  12968. if (ssl == NULL)
  12969. return BAD_FUNC_ARG;
  12970. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  12971. GET_VERIFY_SETTING_SSL(ssl));
  12972. }
  12973. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  12974. const unsigned char* in, long sz, int format)
  12975. {
  12976. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  12977. if (ssl == NULL)
  12978. return BAD_FUNC_ARG;
  12979. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  12980. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  12981. }
  12982. #ifdef WOLF_PRIVATE_KEY_ID
  12983. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  12984. long sz, int devId, long keySz)
  12985. {
  12986. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  12987. if (ret == WOLFSSL_SUCCESS)
  12988. ssl->buffers.keySz = (word32)keySz;
  12989. return ret;
  12990. }
  12991. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  12992. long sz, int devId)
  12993. {
  12994. int ret = WOLFSSL_FAILURE;
  12995. if (ssl->buffers.weOwnKey)
  12996. FreeDer(&ssl->buffers.key);
  12997. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  12998. ssl->heap) == 0) {
  12999. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  13000. ssl->buffers.weOwnKey = 1;
  13001. ssl->buffers.keyId = 1;
  13002. if (devId != INVALID_DEVID)
  13003. ssl->buffers.keyDevId = devId;
  13004. else
  13005. ssl->buffers.keyDevId = ssl->devId;
  13006. ret = WOLFSSL_SUCCESS;
  13007. }
  13008. return ret;
  13009. }
  13010. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  13011. {
  13012. int ret = WOLFSSL_FAILURE;
  13013. word32 sz = (word32)XSTRLEN(label) + 1;
  13014. if (ssl->buffers.weOwnKey)
  13015. FreeDer(&ssl->buffers.key);
  13016. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  13017. ssl->heap) == 0) {
  13018. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  13019. ssl->buffers.weOwnKey = 1;
  13020. ssl->buffers.keyLabel = 1;
  13021. if (devId != INVALID_DEVID)
  13022. ssl->buffers.keyDevId = devId;
  13023. else
  13024. ssl->buffers.keyDevId = ssl->devId;
  13025. ret = WOLFSSL_SUCCESS;
  13026. }
  13027. return ret;
  13028. }
  13029. #endif /* WOLF_PRIVATE_KEY_ID */
  13030. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  13031. const unsigned char* in, long sz, int format)
  13032. {
  13033. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  13034. if (ssl == NULL)
  13035. return BAD_FUNC_ARG;
  13036. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  13037. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  13038. }
  13039. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  13040. const unsigned char* in, long sz)
  13041. {
  13042. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  13043. WOLFSSL_FILETYPE_PEM);
  13044. }
  13045. /* unload any certs or keys that SSL owns, leave CTX as is
  13046. WOLFSSL_SUCCESS on ok */
  13047. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  13048. {
  13049. if (ssl == NULL) {
  13050. WOLFSSL_MSG("Null function arg");
  13051. return BAD_FUNC_ARG;
  13052. }
  13053. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  13054. WOLFSSL_MSG("Unloading cert");
  13055. FreeDer(&ssl->buffers.certificate);
  13056. #ifdef KEEP_OUR_CERT
  13057. wolfSSL_X509_free(ssl->ourCert);
  13058. ssl->ourCert = NULL;
  13059. #endif
  13060. ssl->buffers.weOwnCert = 0;
  13061. }
  13062. if (ssl->buffers.weOwnCertChain) {
  13063. WOLFSSL_MSG("Unloading cert chain");
  13064. FreeDer(&ssl->buffers.certChain);
  13065. ssl->buffers.weOwnCertChain = 0;
  13066. }
  13067. if (ssl->buffers.weOwnKey) {
  13068. WOLFSSL_MSG("Unloading key");
  13069. ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length);
  13070. FreeDer(&ssl->buffers.key);
  13071. ssl->buffers.weOwnKey = 0;
  13072. }
  13073. return WOLFSSL_SUCCESS;
  13074. }
  13075. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  13076. {
  13077. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  13078. if (ctx == NULL)
  13079. return BAD_FUNC_ARG;
  13080. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  13081. }
  13082. #ifdef WOLFSSL_TRUST_PEER_CERT
  13083. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  13084. {
  13085. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13086. if (ctx == NULL)
  13087. return BAD_FUNC_ARG;
  13088. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  13089. }
  13090. #ifdef WOLFSSL_LOCAL_X509_STORE
  13091. int wolfSSL_Unload_trust_peers(WOLFSSL* ssl)
  13092. {
  13093. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  13094. if (ssl == NULL)
  13095. return BAD_FUNC_ARG;
  13096. return wolfSSL_CertManagerUnload_trust_peers(SSL_CM(ssl));
  13097. }
  13098. #endif /* WOLFSSL_LOCAL_X509_STORE */
  13099. #endif /* WOLFSSL_TRUST_PEER_CERT */
  13100. /* old NO_FILESYSTEM end */
  13101. #endif /* !NO_CERTS */
  13102. #ifdef OPENSSL_EXTRA
  13103. int wolfSSL_add_all_algorithms(void)
  13104. {
  13105. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  13106. if (initRefCount != 0 || wolfSSL_Init() == WOLFSSL_SUCCESS)
  13107. return WOLFSSL_SUCCESS;
  13108. else
  13109. return WOLFSSL_FATAL_ERROR;
  13110. }
  13111. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  13112. {
  13113. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  13114. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  13115. return WOLFSSL_FATAL_ERROR;
  13116. return WOLFSSL_SUCCESS;
  13117. }
  13118. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  13119. {
  13120. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  13121. /* This function is currently the same as
  13122. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  13123. the use of a wolfssl.cnf type configuration file and is only used for
  13124. OpenSSL compatability. */
  13125. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  13126. return WOLFSSL_FATAL_ERROR;
  13127. }
  13128. return WOLFSSL_SUCCESS;
  13129. }
  13130. /* returns previous set cache size which stays constant */
  13131. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  13132. {
  13133. /* cache size fixed at compile time in wolfSSL */
  13134. (void)ctx;
  13135. (void)sz;
  13136. WOLFSSL_MSG("session cache is set at compile time");
  13137. #ifndef NO_SESSION_CACHE
  13138. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  13139. #else
  13140. return 0;
  13141. #endif
  13142. }
  13143. #endif
  13144. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13145. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  13146. {
  13147. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  13148. if (mode)
  13149. ctx->quietShutdown = 1;
  13150. }
  13151. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  13152. {
  13153. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  13154. if (mode)
  13155. ssl->options.quietShutdown = 1;
  13156. }
  13157. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13158. #ifdef OPENSSL_EXTRA
  13159. #ifndef NO_BIO
  13160. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  13161. {
  13162. WOLFSSL_ENTER("wolfSSL_set_bio");
  13163. if (ssl == NULL) {
  13164. WOLFSSL_MSG("Bad argument, ssl was NULL");
  13165. return;
  13166. }
  13167. /* free any existing WOLFSSL_BIOs in use but don't free those in
  13168. * a chain */
  13169. if (ssl->biord != NULL) {
  13170. if (ssl->biord != ssl->biowr) {
  13171. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  13172. wolfSSL_BIO_free(ssl->biowr);
  13173. ssl->biowr = NULL;
  13174. }
  13175. if (ssl->biord->prev != NULL)
  13176. wolfSSL_BIO_free(ssl->biord);
  13177. ssl->biord = NULL;
  13178. }
  13179. /* set flag obviously */
  13180. if (rd && !(rd->flags & WOLFSSL_BIO_FLAG_READ))
  13181. rd->flags |= WOLFSSL_BIO_FLAG_READ;
  13182. if (wr && !(wr->flags & WOLFSSL_BIO_FLAG_WRITE))
  13183. wr->flags |= WOLFSSL_BIO_FLAG_WRITE;
  13184. ssl->biord = rd;
  13185. ssl->biowr = wr;
  13186. /* set SSL to use BIO callbacks instead */
  13187. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  13188. ssl->CBIORecv = BioReceive;
  13189. }
  13190. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  13191. ssl->CBIOSend = BioSend;
  13192. }
  13193. /* User programs should always retry reading from these BIOs */
  13194. if (rd) {
  13195. /* User writes to rd */
  13196. BIO_set_retry_write(rd);
  13197. }
  13198. if (wr) {
  13199. /* User reads from wr */
  13200. BIO_set_retry_read(wr);
  13201. }
  13202. }
  13203. #endif /* !NO_BIO */
  13204. #endif /* OPENSSL_EXTRA */
  13205. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  13206. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  13207. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13208. {
  13209. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  13210. if (ctx != NULL) {
  13211. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  13212. ctx->ca_names = names;
  13213. }
  13214. }
  13215. void wolfSSL_set_client_CA_list(WOLFSSL* ssl,
  13216. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  13217. {
  13218. WOLFSSL_ENTER("wolfSSL_set_client_CA_list");
  13219. if (ssl != NULL) {
  13220. if (ssl->ca_names != ssl->ctx->ca_names)
  13221. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  13222. ssl->ca_names = names;
  13223. }
  13224. }
  13225. #ifdef OPENSSL_EXTRA
  13226. /* registers client cert callback, called during handshake if server
  13227. requests client auth but user has not loaded client cert/key */
  13228. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  13229. {
  13230. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  13231. if (ctx != NULL) {
  13232. ctx->CBClientCert = cb;
  13233. }
  13234. }
  13235. void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx,
  13236. CertSetupCallback cb, void *arg)
  13237. {
  13238. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_cb");
  13239. if (ctx == NULL)
  13240. return;
  13241. ctx->certSetupCb = cb;
  13242. ctx->certSetupCbArg = arg;
  13243. }
  13244. /**
  13245. * Internal wrapper for calling certSetupCb
  13246. * @param ssl The SSL/TLS Object
  13247. * @return 0 on success
  13248. */
  13249. int CertSetupCbWrapper(WOLFSSL* ssl)
  13250. {
  13251. int ret = 0;
  13252. if (ssl->ctx->certSetupCb != NULL) {
  13253. WOLFSSL_MSG("Calling user cert setup callback");
  13254. ret = ssl->ctx->certSetupCb(ssl, ssl->ctx->certSetupCbArg);
  13255. if (ret == 1) {
  13256. WOLFSSL_MSG("User cert callback returned success");
  13257. ret = 0;
  13258. }
  13259. else if (ret == 0) {
  13260. SendAlert(ssl, alert_fatal, internal_error);
  13261. ret = CLIENT_CERT_CB_ERROR;
  13262. }
  13263. else if (ret < 0) {
  13264. ret = WOLFSSL_ERROR_WANT_X509_LOOKUP;
  13265. }
  13266. else {
  13267. WOLFSSL_MSG("Unexpected user callback return");
  13268. ret = CLIENT_CERT_CB_ERROR;
  13269. }
  13270. }
  13271. return ret;
  13272. }
  13273. #endif /* OPENSSL_EXTRA */
  13274. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  13275. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  13276. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  13277. const WOLFSSL_CTX *ctx)
  13278. {
  13279. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  13280. if (ctx == NULL) {
  13281. WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list");
  13282. return NULL;
  13283. }
  13284. return ctx->ca_names;
  13285. }
  13286. /* returns the CA's set on server side or the CA's sent from server when
  13287. * on client side */
  13288. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  13289. const WOLFSSL* ssl)
  13290. {
  13291. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  13292. if (ssl == NULL) {
  13293. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  13294. return NULL;
  13295. }
  13296. return SSL_CA_NAMES(ssl);
  13297. }
  13298. #if !defined(NO_CERTS)
  13299. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  13300. {
  13301. WOLFSSL_X509_NAME *nameCopy = NULL;
  13302. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  13303. if (ctx == NULL || x509 == NULL){
  13304. WOLFSSL_MSG("Bad argument");
  13305. return WOLFSSL_FAILURE;
  13306. }
  13307. if (ctx->ca_names == NULL) {
  13308. ctx->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  13309. if (ctx->ca_names == NULL) {
  13310. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  13311. return WOLFSSL_FAILURE;
  13312. }
  13313. }
  13314. nameCopy = wolfSSL_X509_NAME_dup(wolfSSL_X509_get_subject_name(x509));
  13315. if (nameCopy == NULL) {
  13316. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  13317. return WOLFSSL_FAILURE;
  13318. }
  13319. if (wolfSSL_sk_X509_NAME_push(ctx->ca_names, nameCopy) != WOLFSSL_SUCCESS) {
  13320. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  13321. wolfSSL_X509_NAME_free(nameCopy);
  13322. return WOLFSSL_FAILURE;
  13323. }
  13324. return WOLFSSL_SUCCESS;
  13325. }
  13326. #endif
  13327. #ifndef NO_BIO
  13328. #if !defined(NO_RSA) && !defined(NO_CERTS)
  13329. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  13330. {
  13331. /* The webserver build is using this to load a CA into the server
  13332. * for client authentication as an option. Have this return NULL in
  13333. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  13334. * the function. */
  13335. #ifdef OPENSSL_EXTRA
  13336. WOLFSSL_STACK *list = NULL;
  13337. WOLFSSL_BIO* bio = NULL;
  13338. WOLFSSL_X509 *cert = NULL;
  13339. WOLFSSL_X509_NAME *nameCopy = NULL;
  13340. unsigned long err = WOLFSSL_FAILURE;
  13341. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  13342. bio = wolfSSL_BIO_new_file(fname, "rb");
  13343. if (bio == NULL) {
  13344. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  13345. goto cleanup;
  13346. }
  13347. list = wolfSSL_sk_X509_NAME_new(NULL);
  13348. if (list == NULL) {
  13349. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  13350. goto cleanup;
  13351. }
  13352. /* Read each certificate in the chain out of the file. */
  13353. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  13354. /* Need a persistent copy of the subject name. */
  13355. nameCopy = wolfSSL_X509_NAME_dup(
  13356. wolfSSL_X509_get_subject_name(cert));
  13357. if (nameCopy == NULL) {
  13358. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  13359. goto cleanup;
  13360. }
  13361. /*
  13362. * Original cert will be freed so make sure not to try to access
  13363. * it in the future.
  13364. */
  13365. nameCopy->x509 = NULL;
  13366. if (wolfSSL_sk_X509_NAME_push(list, nameCopy) !=
  13367. WOLFSSL_SUCCESS) {
  13368. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  13369. /* Do free in loop because nameCopy is now responsibility
  13370. * of list to free and adding jumps to cleanup after this
  13371. * might result in a double free. */
  13372. wolfSSL_X509_NAME_free(nameCopy);
  13373. goto cleanup;
  13374. }
  13375. wolfSSL_X509_free(cert);
  13376. cert = NULL;
  13377. }
  13378. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  13379. err = WOLFSSL_SUCCESS;
  13380. cleanup:
  13381. wolfSSL_X509_free(cert);
  13382. wolfSSL_BIO_free(bio);
  13383. if (err != WOLFSSL_SUCCESS) {
  13384. /* We failed so return NULL */
  13385. wolfSSL_sk_X509_NAME_pop_free(list, NULL);
  13386. list = NULL;
  13387. }
  13388. return list;
  13389. #else
  13390. (void)fname;
  13391. return NULL;
  13392. #endif
  13393. }
  13394. #endif
  13395. #endif /* !NO_BIO */
  13396. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
  13397. #ifdef OPENSSL_EXTRA
  13398. #ifndef NO_WOLFSSL_STUB
  13399. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  13400. {
  13401. /* TODO:, not needed in goahead */
  13402. (void)ctx;
  13403. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  13404. return SSL_NOT_IMPLEMENTED;
  13405. }
  13406. #endif
  13407. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  13408. && !defined(WC_NO_RNG)
  13409. static const byte srp_N[] = {
  13410. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  13411. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  13412. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  13413. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  13414. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  13415. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  13416. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  13417. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  13418. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  13419. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  13420. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  13421. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  13422. };
  13423. static const byte srp_g[] = {
  13424. 0x02
  13425. };
  13426. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  13427. {
  13428. int r = 0;
  13429. SrpSide srp_side = SRP_CLIENT_SIDE;
  13430. byte salt[SRP_SALT_SIZE];
  13431. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  13432. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  13433. return SSL_FAILURE;
  13434. if (ctx->method->side == WOLFSSL_SERVER_END){
  13435. srp_side = SRP_SERVER_SIDE;
  13436. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  13437. srp_side = SRP_CLIENT_SIDE;
  13438. } else {
  13439. WOLFSSL_MSG("Init CTX failed");
  13440. return SSL_FAILURE;
  13441. }
  13442. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  13443. WOLFSSL_MSG("Init SRP CTX failed");
  13444. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  13445. ctx->srp = NULL;
  13446. return SSL_FAILURE;
  13447. }
  13448. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  13449. (word32)XSTRLEN(username));
  13450. if (r < 0) {
  13451. WOLFSSL_MSG("fail to set srp username.");
  13452. return SSL_FAILURE;
  13453. }
  13454. /* if wolfSSL_CTX_set_srp_password has already been called, */
  13455. /* execute wc_SrpSetPassword here */
  13456. if (ctx->srp_password != NULL) {
  13457. WC_RNG rng;
  13458. if (wc_InitRng(&rng) < 0){
  13459. WOLFSSL_MSG("wc_InitRng failed");
  13460. return SSL_FAILURE;
  13461. }
  13462. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  13463. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  13464. wc_FreeRng(&rng);
  13465. if (r < 0) {
  13466. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  13467. return SSL_FAILURE;
  13468. }
  13469. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  13470. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  13471. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  13472. WOLFSSL_MSG("wc_SrpSetParam failed");
  13473. return SSL_FAILURE;
  13474. }
  13475. r = wc_SrpSetPassword(ctx->srp,
  13476. (const byte*)ctx->srp_password,
  13477. (word32)XSTRLEN((char *)ctx->srp_password));
  13478. if (r < 0) {
  13479. WOLFSSL_MSG("fail to set srp password.");
  13480. return SSL_FAILURE;
  13481. }
  13482. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  13483. ctx->srp_password = NULL;
  13484. }
  13485. return WOLFSSL_SUCCESS;
  13486. }
  13487. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  13488. {
  13489. int r;
  13490. byte salt[SRP_SALT_SIZE];
  13491. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  13492. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  13493. return SSL_FAILURE;
  13494. if (ctx->srp->user != NULL) {
  13495. WC_RNG rng;
  13496. if (wc_InitRng(&rng) < 0) {
  13497. WOLFSSL_MSG("wc_InitRng failed");
  13498. return SSL_FAILURE;
  13499. }
  13500. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  13501. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  13502. wc_FreeRng(&rng);
  13503. if (r < 0) {
  13504. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  13505. return SSL_FAILURE;
  13506. }
  13507. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  13508. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  13509. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  13510. WOLFSSL_MSG("wc_SrpSetParam failed");
  13511. wc_FreeRng(&rng);
  13512. return SSL_FAILURE;
  13513. }
  13514. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  13515. (word32)XSTRLEN(password));
  13516. if (r < 0) {
  13517. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  13518. wc_FreeRng(&rng);
  13519. return SSL_FAILURE;
  13520. }
  13521. if (ctx->srp_password != NULL){
  13522. XFREE(ctx->srp_password,NULL,
  13523. DYNAMIC_TYPE_SRP);
  13524. ctx->srp_password = NULL;
  13525. }
  13526. wc_FreeRng(&rng);
  13527. } else {
  13528. /* save password for wolfSSL_set_srp_username */
  13529. if (ctx->srp_password != NULL)
  13530. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  13531. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  13532. DYNAMIC_TYPE_SRP);
  13533. if (ctx->srp_password == NULL){
  13534. WOLFSSL_MSG("memory allocation error");
  13535. return SSL_FAILURE;
  13536. }
  13537. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  13538. }
  13539. return WOLFSSL_SUCCESS;
  13540. }
  13541. /**
  13542. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  13543. * that the requested strength is less than or equal to the size of the
  13544. * static modulus size.
  13545. * @param ctx Not used
  13546. * @param strength Minimum number of bits for the modulus
  13547. * @return 1 if strength is less than or equal to static modulus
  13548. * 0 if strength is greater than static modulus
  13549. */
  13550. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  13551. {
  13552. (void)ctx;
  13553. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  13554. if (strength > (int)(sizeof(srp_N)*8)) {
  13555. WOLFSSL_MSG("Bad Parameter");
  13556. return WOLFSSL_FAILURE;
  13557. }
  13558. return WOLFSSL_SUCCESS;
  13559. }
  13560. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  13561. {
  13562. if (ssl && ssl->ctx && ssl->ctx->srp) {
  13563. return (char*) ssl->ctx->srp->user;
  13564. }
  13565. return NULL;
  13566. }
  13567. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  13568. /* keyblock size in bytes or -1 */
  13569. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  13570. {
  13571. if (ssl == NULL)
  13572. return WOLFSSL_FATAL_ERROR;
  13573. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  13574. ssl->specs.hash_size);
  13575. }
  13576. #endif /* OPENSSL_EXTRA */
  13577. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13578. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  13579. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  13580. unsigned char** sr, unsigned int* srLen,
  13581. unsigned char** cr, unsigned int* crLen)
  13582. {
  13583. if (ssl == NULL || ssl->arrays == NULL)
  13584. return WOLFSSL_FATAL_ERROR;
  13585. *ms = ssl->arrays->masterSecret;
  13586. *sr = ssl->arrays->serverRandom;
  13587. *cr = ssl->arrays->clientRandom;
  13588. *msLen = SECRET_LEN;
  13589. *srLen = RAN_LEN;
  13590. *crLen = RAN_LEN;
  13591. return WOLFSSL_SUCCESS;
  13592. }
  13593. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  13594. {
  13595. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  13596. if (ssl == NULL)
  13597. return;
  13598. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13599. #ifdef HAVE_ECC
  13600. #ifdef WOLFSSL_SMALL_STACK
  13601. ecc_key* key = NULL;
  13602. #else
  13603. ecc_key key[1];
  13604. #endif
  13605. word32 idx = 0;
  13606. #ifdef WOLFSSL_SMALL_STACK
  13607. key = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  13608. DYNAMIC_TYPE_ECC);
  13609. if (key == NULL) {
  13610. WOLFSSL_MSG("Error allocating memory for ecc_key");
  13611. }
  13612. #endif
  13613. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  13614. if (wc_ecc_init(key) >= 0) {
  13615. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  13616. key, ssl->buffers.key->length) != 0) {
  13617. ssl->options.haveECDSAsig = 0;
  13618. ssl->options.haveECC = 0;
  13619. ssl->options.haveStaticECC = 0;
  13620. }
  13621. wc_ecc_free(key);
  13622. }
  13623. }
  13624. #ifdef WOLFSSL_SMALL_STACK
  13625. XFREE(key, ssl->heap, DYNAMIC_TYPE_ECC);
  13626. #endif
  13627. #endif
  13628. #ifndef NO_DH
  13629. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  13630. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  13631. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  13632. ssl->options.haveDH = 1;
  13633. }
  13634. #endif
  13635. }
  13636. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  13637. WOLFSSL_MSG("Error initializing server side");
  13638. }
  13639. }
  13640. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13641. /* return true if connection established */
  13642. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  13643. {
  13644. if (ssl == NULL)
  13645. return 0;
  13646. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  13647. return 1;
  13648. return 0;
  13649. }
  13650. #ifdef OPENSSL_EXTRA
  13651. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  13652. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  13653. {
  13654. /* wolfSSL verifies all these internally */
  13655. (void)ctx;
  13656. (void)f;
  13657. }
  13658. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  13659. {
  13660. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  13661. if(ssl==NULL) {
  13662. WOLFSSL_MSG("Shutdown not set. ssl is null");
  13663. return;
  13664. }
  13665. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  13666. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  13667. }
  13668. #endif
  13669. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  13670. {
  13671. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  13672. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  13673. if(ctx == NULL)
  13674. return BAD_FUNC_ARG;
  13675. return ctx->mask;
  13676. }
  13677. static long wolf_set_options(long old_op, long op);
  13678. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  13679. {
  13680. WOLFSSL_ENTER("SSL_CTX_set_options");
  13681. if (ctx == NULL)
  13682. return BAD_FUNC_ARG;
  13683. ctx->mask = wolf_set_options(ctx->mask, opt);
  13684. return ctx->mask;
  13685. }
  13686. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  13687. {
  13688. WOLFSSL_ENTER("SSL_CTX_clear_options");
  13689. if(ctx == NULL)
  13690. return BAD_FUNC_ARG;
  13691. ctx->mask &= ~opt;
  13692. return ctx->mask;
  13693. }
  13694. #ifdef OPENSSL_EXTRA
  13695. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  13696. {
  13697. WOLFSSL_ENTER("SSL_set_rfd");
  13698. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  13699. ssl->IOCB_ReadCtx = &ssl->rfd;
  13700. #ifdef WOLFSSL_DTLS
  13701. if (ssl->options.dtls) {
  13702. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  13703. ssl->buffers.dtlsCtx.rfd = rfd;
  13704. }
  13705. #endif
  13706. return WOLFSSL_SUCCESS;
  13707. }
  13708. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  13709. {
  13710. WOLFSSL_ENTER("SSL_set_wfd");
  13711. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  13712. ssl->IOCB_WriteCtx = &ssl->wfd;
  13713. return WOLFSSL_SUCCESS;
  13714. }
  13715. #endif /* OPENSSL_EXTRA */
  13716. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  13717. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  13718. /**
  13719. * Implemented in a similar way that ngx_ssl_ocsp_validate does it when
  13720. * SSL_get0_verified_chain is not available.
  13721. * @param ssl WOLFSSL object to extract certs from
  13722. * @return Stack of verified certs
  13723. */
  13724. WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
  13725. {
  13726. WOLF_STACK_OF(WOLFSSL_X509)* chain = NULL;
  13727. WOLFSSL_X509_STORE_CTX* storeCtx = NULL;
  13728. WOLFSSL_X509* peerCert = NULL;
  13729. WOLFSSL_ENTER("wolfSSL_get0_verified_chain");
  13730. if (ssl == NULL || ssl->ctx == NULL) {
  13731. WOLFSSL_MSG("Bad parameter");
  13732. return NULL;
  13733. }
  13734. peerCert = wolfSSL_get_peer_certificate((WOLFSSL*)ssl);
  13735. if (peerCert == NULL) {
  13736. WOLFSSL_MSG("wolfSSL_get_peer_certificate error");
  13737. return NULL;
  13738. }
  13739. /* wolfSSL_get_peer_certificate returns a copy. We want the internal
  13740. * member so that we don't have to worry about free'ing it. We call
  13741. * wolfSSL_get_peer_certificate so that we don't have to worry about
  13742. * setting up the internal pointer. */
  13743. wolfSSL_X509_free(peerCert);
  13744. peerCert = (WOLFSSL_X509*)&ssl->peerCert;
  13745. chain = wolfSSL_get_peer_cert_chain(ssl);
  13746. if (chain == NULL) {
  13747. WOLFSSL_MSG("wolfSSL_get_peer_cert_chain error");
  13748. return NULL;
  13749. }
  13750. storeCtx = wolfSSL_X509_STORE_CTX_new();
  13751. if (storeCtx == NULL) {
  13752. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_new error");
  13753. return NULL;
  13754. }
  13755. if (wolfSSL_X509_STORE_CTX_init(storeCtx, SSL_STORE(ssl),
  13756. peerCert, chain) != WOLFSSL_SUCCESS) {
  13757. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init error");
  13758. wolfSSL_X509_STORE_CTX_free(storeCtx);
  13759. return NULL;
  13760. }
  13761. if (wolfSSL_X509_verify_cert(storeCtx) <= 0) {
  13762. WOLFSSL_MSG("wolfSSL_X509_verify_cert error");
  13763. wolfSSL_X509_STORE_CTX_free(storeCtx);
  13764. return NULL;
  13765. }
  13766. wolfSSL_X509_STORE_CTX_free(storeCtx);
  13767. return chain;
  13768. }
  13769. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  13770. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  13771. {
  13772. if (ctx == NULL) {
  13773. return NULL;
  13774. }
  13775. if (ctx->x509_store_pt != NULL)
  13776. return ctx->x509_store_pt;
  13777. return &ctx->x509_store;
  13778. }
  13779. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  13780. {
  13781. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_store");
  13782. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  13783. return;
  13784. }
  13785. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  13786. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  13787. return;
  13788. }
  13789. /* free cert manager if have one */
  13790. if (ctx->cm != NULL) {
  13791. wolfSSL_CertManagerFree(ctx->cm);
  13792. }
  13793. ctx->cm = str->cm;
  13794. ctx->x509_store.cm = str->cm;
  13795. /* free existing store if it exists */
  13796. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  13797. ctx->x509_store.cache = str->cache;
  13798. ctx->x509_store_pt = str; /* take ownership of store and free it
  13799. with CTX free */
  13800. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has onwership
  13801. and free it with CTX free*/
  13802. }
  13803. int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  13804. {
  13805. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  13806. if (ssl == NULL || str == NULL) {
  13807. WOLFSSL_MSG("Bad parameter");
  13808. return WOLFSSL_FAILURE;
  13809. }
  13810. /* NO-OP when setting existing store */
  13811. if (str == SSL_STORE(ssl))
  13812. return WOLFSSL_SUCCESS;
  13813. /* free existing store if it exists */
  13814. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  13815. if (str == ssl->ctx->x509_store_pt)
  13816. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  13817. to using that instead */
  13818. else
  13819. ssl->x509_store_pt = str; /* take ownership of store and free it
  13820. with SSL free */
  13821. return WOLFSSL_SUCCESS;
  13822. }
  13823. int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  13824. {
  13825. WOLFSSL_ENTER("wolfSSL_set1_verify_cert_store");
  13826. if (ssl == NULL || str == NULL) {
  13827. WOLFSSL_MSG("Bad parameter");
  13828. return WOLFSSL_FAILURE;
  13829. }
  13830. /* NO-OP when setting existing store */
  13831. if (str == SSL_STORE(ssl))
  13832. return WOLFSSL_SUCCESS;
  13833. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  13834. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  13835. return WOLFSSL_FAILURE;
  13836. }
  13837. /* free existing store if it exists */
  13838. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  13839. if (str == ssl->ctx->x509_store_pt)
  13840. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  13841. to using that instead */
  13842. else
  13843. ssl->x509_store_pt = str; /* take ownership of store and free it
  13844. with SSL free */
  13845. return WOLFSSL_SUCCESS;
  13846. }
  13847. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  13848. #ifdef WOLFSSL_ENCRYPTED_KEYS
  13849. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  13850. void* userdata)
  13851. {
  13852. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  13853. if (ctx)
  13854. ctx->passwd_userdata = userdata;
  13855. }
  13856. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx, wc_pem_password_cb*
  13857. cb)
  13858. {
  13859. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  13860. if (ctx)
  13861. ctx->passwd_cb = cb;
  13862. }
  13863. wc_pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  13864. {
  13865. if (ctx == NULL || ctx->passwd_cb == NULL) {
  13866. return NULL;
  13867. }
  13868. return ctx->passwd_cb;
  13869. }
  13870. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  13871. {
  13872. if (ctx == NULL) {
  13873. return NULL;
  13874. }
  13875. return ctx->passwd_userdata;
  13876. }
  13877. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  13878. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  13879. int wolfSSL_num_locks(void)
  13880. {
  13881. return 0;
  13882. }
  13883. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  13884. {
  13885. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  13886. if (wc_SetMutexCb(f) != 0) {
  13887. WOLFSSL_MSG("Error when setting mutex call back");
  13888. }
  13889. }
  13890. typedef unsigned long (idCb)(void);
  13891. static idCb* inner_idCb = NULL;
  13892. unsigned long wolfSSL_thread_id(void)
  13893. {
  13894. if (inner_idCb != NULL) {
  13895. return inner_idCb();
  13896. }
  13897. else {
  13898. return 0;
  13899. }
  13900. }
  13901. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  13902. {
  13903. inner_idCb = f;
  13904. }
  13905. unsigned long wolfSSL_ERR_get_error(void)
  13906. {
  13907. int ret;
  13908. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  13909. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  13910. ret = wc_PullErrorNode(NULL, NULL, NULL);
  13911. if (ret < 0) {
  13912. if (ret == BAD_STATE_E) {
  13913. ret = 0; /* no errors in queue */
  13914. }
  13915. else {
  13916. WOLFSSL_MSG("Error with pulling error node!");
  13917. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  13918. ret = 0 - ret; /* return absolute value of error */
  13919. /* panic and try to clear out nodes */
  13920. wc_ClearErrorNodes();
  13921. }
  13922. }
  13923. else {
  13924. wc_RemoveErrorNode(0);
  13925. }
  13926. return ret;
  13927. #else
  13928. (void)ret;
  13929. return (unsigned long)(0 - NOT_COMPILED_IN);
  13930. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  13931. }
  13932. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  13933. #ifndef NO_BIO
  13934. /* print out and clear all errors */
  13935. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  13936. {
  13937. const char* file = NULL;
  13938. const char* reason = NULL;
  13939. int ret;
  13940. int line = 0;
  13941. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  13942. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  13943. if (bio == NULL) {
  13944. WOLFSSL_MSG("BIO passed in was null");
  13945. return;
  13946. }
  13947. do {
  13948. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  13949. if (ret >= 0) {
  13950. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  13951. if (XSNPRINTF(buf, sizeof(buf),
  13952. "error:%d:wolfSSL library:%s:%s:%d\n",
  13953. ret, r, file, line)
  13954. >= (int)sizeof(buf))
  13955. {
  13956. WOLFSSL_MSG("Buffer overrun formatting error message");
  13957. }
  13958. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  13959. wc_RemoveErrorNode(0);
  13960. }
  13961. } while (ret >= 0);
  13962. if (wolfSSL_BIO_write(bio, "", 1) != 1) {
  13963. WOLFSSL_MSG("Issue writing final string terminator");
  13964. }
  13965. }
  13966. #endif /* !NO_BIO */
  13967. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  13968. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  13969. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  13970. defined(HAVE_SECRET_CALLBACK)
  13971. #if !defined(NO_WOLFSSL_SERVER)
  13972. /* Return the amount of random bytes copied over or error case.
  13973. * ssl : ssl struct after handshake
  13974. * out : buffer to hold random bytes
  13975. * outSz : either 0 (return max buffer sz) or size of out buffer
  13976. */
  13977. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  13978. size_t outSz)
  13979. {
  13980. size_t size;
  13981. /* return max size of buffer */
  13982. if (outSz == 0) {
  13983. return RAN_LEN;
  13984. }
  13985. if (ssl == NULL || out == NULL) {
  13986. return 0;
  13987. }
  13988. if (ssl->arrays == NULL) {
  13989. WOLFSSL_MSG("Arrays struct not saved after handshake");
  13990. return 0;
  13991. }
  13992. if (outSz > RAN_LEN) {
  13993. size = RAN_LEN;
  13994. }
  13995. else {
  13996. size = outSz;
  13997. }
  13998. XMEMCPY(out, ssl->arrays->serverRandom, size);
  13999. return size;
  14000. }
  14001. #endif /* !NO_WOLFSSL_SERVER */
  14002. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  14003. #ifdef OPENSSL_EXTRA
  14004. #if !defined(NO_WOLFSSL_SERVER)
  14005. /* Used to get the peer ephemeral public key sent during the connection
  14006. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  14007. * before the ephemeral key is stored.
  14008. * return WOLFSSL_SUCCESS on success */
  14009. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  14010. {
  14011. WOLFSSL_EVP_PKEY* ret = NULL;
  14012. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  14013. if (ssl == NULL || pkey == NULL) {
  14014. WOLFSSL_MSG("Bad argument passed in");
  14015. return WOLFSSL_FAILURE;
  14016. }
  14017. #ifdef HAVE_ECC
  14018. if (ssl->peerEccKey != NULL) {
  14019. unsigned char* der;
  14020. const unsigned char* pt;
  14021. unsigned int derSz = 0;
  14022. int sz;
  14023. PRIVATE_KEY_UNLOCK();
  14024. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  14025. LENGTH_ONLY_E) {
  14026. WOLFSSL_MSG("get ecc der size failed");
  14027. PRIVATE_KEY_LOCK();
  14028. return WOLFSSL_FAILURE;
  14029. }
  14030. PRIVATE_KEY_LOCK();
  14031. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  14032. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  14033. if (der == NULL) {
  14034. WOLFSSL_MSG("Memory error");
  14035. return WOLFSSL_FAILURE;
  14036. }
  14037. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  14038. WOLFSSL_MSG("get ecc der failed");
  14039. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14040. return WOLFSSL_FAILURE;
  14041. }
  14042. pt = der; /* in case pointer gets advanced */
  14043. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  14044. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  14045. }
  14046. #endif
  14047. *pkey = ret;
  14048. #ifdef HAVE_ECC
  14049. if (ret != NULL)
  14050. return WOLFSSL_SUCCESS;
  14051. else
  14052. #endif
  14053. return WOLFSSL_FAILURE;
  14054. }
  14055. #endif /* !NO_WOLFSSL_SERVER */
  14056. /**
  14057. * This function checks if any compiled in protocol versions are
  14058. * left enabled after calls to set_min or set_max API.
  14059. * @param major The SSL/TLS major version
  14060. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14061. * protocol versions are left enabled.
  14062. */
  14063. static int CheckSslMethodVersion(byte major, unsigned long options)
  14064. {
  14065. int sanityConfirmed = 0;
  14066. (void)options;
  14067. switch (major) {
  14068. #ifndef NO_TLS
  14069. case SSLv3_MAJOR:
  14070. #ifdef WOLFSSL_ALLOW_SSLV3
  14071. if (!(options & WOLFSSL_OP_NO_SSLv3)) {
  14072. sanityConfirmed = 1;
  14073. }
  14074. #endif
  14075. #ifndef NO_OLD_TLS
  14076. if (!(options & WOLFSSL_OP_NO_TLSv1))
  14077. sanityConfirmed = 1;
  14078. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  14079. sanityConfirmed = 1;
  14080. #endif
  14081. #ifndef WOLFSSL_NO_TLS12
  14082. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  14083. sanityConfirmed = 1;
  14084. #endif
  14085. #ifdef WOLFSSL_TLS13
  14086. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  14087. sanityConfirmed = 1;
  14088. #endif
  14089. break;
  14090. #endif
  14091. #ifdef WOLFSSL_DTLS
  14092. case DTLS_MAJOR:
  14093. sanityConfirmed = 1;
  14094. break;
  14095. #endif
  14096. default:
  14097. WOLFSSL_MSG("Invalid major version");
  14098. return WOLFSSL_FAILURE;
  14099. }
  14100. if (!sanityConfirmed) {
  14101. WOLFSSL_MSG("All compiled in TLS versions disabled");
  14102. return WOLFSSL_FAILURE;
  14103. }
  14104. return WOLFSSL_SUCCESS;
  14105. }
  14106. /**
  14107. * protoVerTbl holds (D)TLS version numbers in ascending order.
  14108. * Except DTLS versions, the newer version is located in the latter part of
  14109. * the table. This table is referred by wolfSSL_CTX_set_min_proto_version and
  14110. * wolfSSL_CTX_set_max_proto_version.
  14111. */
  14112. static const int protoVerTbl[] = {
  14113. SSL3_VERSION,
  14114. TLS1_VERSION,
  14115. TLS1_1_VERSION,
  14116. TLS1_2_VERSION,
  14117. TLS1_3_VERSION,
  14118. DTLS1_VERSION,
  14119. DTLS1_2_VERSION
  14120. };
  14121. /* number of protocol versions listed in protoVerTbl */
  14122. #define NUMBER_OF_PROTOCOLS (sizeof(protoVerTbl)/sizeof(int))
  14123. /**
  14124. * wolfSSL_CTX_set_min_proto_version attempts to set the minimum protocol
  14125. * version to use by SSL objects created from this WOLFSSL_CTX.
  14126. * This API guarantees that a version of SSL/TLS lower than specified
  14127. * here will not be allowed. If the version specified is not compiled in
  14128. * then this API sets the lowest compiled in protocol version.
  14129. * This API also accept 0 as version, to set the minimum version automatically.
  14130. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  14131. * are enabled.
  14132. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  14133. * @param version Any of the following
  14134. * * 0
  14135. * * SSL3_VERSION
  14136. * * TLS1_VERSION
  14137. * * TLS1_1_VERSION
  14138. * * TLS1_2_VERSION
  14139. * * TLS1_3_VERSION
  14140. * * DTLS1_VERSION
  14141. * * DTLS1_2_VERSION
  14142. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14143. * protocol versions are left enabled.
  14144. */
  14145. static int Set_CTX_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14146. {
  14147. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version_ex");
  14148. if (ctx == NULL) {
  14149. return WOLFSSL_FAILURE;
  14150. }
  14151. switch (version) {
  14152. #ifndef NO_TLS
  14153. case SSL3_VERSION:
  14154. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  14155. ctx->minDowngrade = SSLv3_MINOR;
  14156. break;
  14157. #endif
  14158. case TLS1_VERSION:
  14159. #ifdef WOLFSSL_ALLOW_TLSV10
  14160. ctx->minDowngrade = TLSv1_MINOR;
  14161. break;
  14162. #endif
  14163. case TLS1_1_VERSION:
  14164. #ifndef NO_OLD_TLS
  14165. ctx->minDowngrade = TLSv1_1_MINOR;
  14166. break;
  14167. #endif
  14168. case TLS1_2_VERSION:
  14169. #ifndef WOLFSSL_NO_TLS12
  14170. ctx->minDowngrade = TLSv1_2_MINOR;
  14171. break;
  14172. #endif
  14173. case TLS1_3_VERSION:
  14174. #ifdef WOLFSSL_TLS13
  14175. ctx->minDowngrade = TLSv1_3_MINOR;
  14176. break;
  14177. #endif
  14178. #endif
  14179. #ifdef WOLFSSL_DTLS
  14180. case DTLS1_VERSION:
  14181. #ifndef NO_OLD_TLS
  14182. ctx->minDowngrade = DTLS_MINOR;
  14183. break;
  14184. #endif
  14185. case DTLS1_2_VERSION:
  14186. ctx->minDowngrade = DTLSv1_2_MINOR;
  14187. break;
  14188. #endif
  14189. default:
  14190. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14191. return WOLFSSL_FAILURE;
  14192. }
  14193. switch (version) {
  14194. #ifndef NO_TLS
  14195. case TLS1_3_VERSION:
  14196. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  14197. FALL_THROUGH;
  14198. case TLS1_2_VERSION:
  14199. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  14200. FALL_THROUGH;
  14201. case TLS1_1_VERSION:
  14202. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  14203. FALL_THROUGH;
  14204. case TLS1_VERSION:
  14205. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  14206. break;
  14207. case SSL3_VERSION:
  14208. case SSL2_VERSION:
  14209. /* Nothing to do here */
  14210. break;
  14211. #endif
  14212. #ifdef WOLFSSL_DTLS
  14213. case DTLS1_VERSION:
  14214. case DTLS1_2_VERSION:
  14215. break;
  14216. #endif
  14217. default:
  14218. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14219. return WOLFSSL_FAILURE;
  14220. }
  14221. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  14222. }
  14223. /* Sets the min protocol version allowed with WOLFSSL_CTX
  14224. * returns WOLFSSL_SUCCESS on success */
  14225. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  14226. {
  14227. int ret;
  14228. int proto = 0;
  14229. int maxProto = 0;
  14230. int i;
  14231. int idx = 0;
  14232. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  14233. if (ctx == NULL) {
  14234. return WOLFSSL_FAILURE;
  14235. }
  14236. if (version != 0) {
  14237. proto = version;
  14238. ctx->minProto = 0; /* turn min proto flag off */
  14239. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14240. if (protoVerTbl[i] == version) {
  14241. break;
  14242. }
  14243. }
  14244. }
  14245. else {
  14246. /* when 0 is specified as version, try to find out the min version */
  14247. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14248. ret = Set_CTX_min_proto_version(ctx, protoVerTbl[i]);
  14249. if (ret == WOLFSSL_SUCCESS) {
  14250. proto = protoVerTbl[i];
  14251. ctx->minProto = 1; /* turn min proto flag on */
  14252. break;
  14253. }
  14254. }
  14255. }
  14256. /* check case where max > min , if so then clear the NO_* options
  14257. * i is the index into the table for proto version used, see if the max
  14258. * proto version index found is smaller */
  14259. maxProto = wolfSSL_CTX_get_max_proto_version(ctx);
  14260. for (idx = 0; (unsigned)idx < NUMBER_OF_PROTOCOLS; idx++) {
  14261. if (protoVerTbl[idx] == maxProto) {
  14262. break;
  14263. }
  14264. }
  14265. if (idx < i) {
  14266. wolfSSL_CTX_clear_options(ctx, WOLFSSL_OP_NO_TLSv1 |
  14267. WOLFSSL_OP_NO_TLSv1_1 | WOLFSSL_OP_NO_TLSv1_2 |
  14268. WOLFSSL_OP_NO_TLSv1_3);
  14269. }
  14270. ret = Set_CTX_min_proto_version(ctx, proto);
  14271. return ret;
  14272. }
  14273. /**
  14274. * wolfSSL_CTX_set_max_proto_version attempts to set the maximum protocol
  14275. * version to use by SSL objects created from this WOLFSSL_CTX.
  14276. * This API guarantees that a version of SSL/TLS higher than specified
  14277. * here will not be allowed. If the version specified is not compiled in
  14278. * then this API sets the highest compiled in protocol version.
  14279. * This API also accept 0 as version, to set the maximum version automatically.
  14280. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  14281. * are enabled.
  14282. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  14283. * @param ver Any of the following
  14284. * * 0
  14285. * * SSL3_VERSION
  14286. * * TLS1_VERSION
  14287. * * TLS1_1_VERSION
  14288. * * TLS1_2_VERSION
  14289. * * TLS1_3_VERSION
  14290. * * DTLS1_VERSION
  14291. * * DTLS1_2_VERSION
  14292. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  14293. * protocol versions are left enabled.
  14294. */
  14295. static int Set_CTX_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  14296. {
  14297. WOLFSSL_ENTER("Set_CTX_max_proto_version");
  14298. if (!ctx || !ctx->method) {
  14299. WOLFSSL_MSG("Bad parameter");
  14300. return WOLFSSL_FAILURE;
  14301. }
  14302. switch (ver) {
  14303. case SSL2_VERSION:
  14304. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  14305. return WOLFSSL_FAILURE;
  14306. #ifndef NO_TLS
  14307. case SSL3_VERSION:
  14308. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  14309. FALL_THROUGH;
  14310. case TLS1_VERSION:
  14311. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  14312. FALL_THROUGH;
  14313. case TLS1_1_VERSION:
  14314. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  14315. FALL_THROUGH;
  14316. case TLS1_2_VERSION:
  14317. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  14318. FALL_THROUGH;
  14319. case TLS1_3_VERSION:
  14320. /* Nothing to do here */
  14321. break;
  14322. #endif
  14323. #ifdef WOLFSSL_DTLS
  14324. case DTLS1_VERSION:
  14325. case DTLS1_2_VERSION:
  14326. break;
  14327. #endif
  14328. default:
  14329. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14330. return WOLFSSL_FAILURE;
  14331. }
  14332. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  14333. }
  14334. /* Sets the max protocol version allowed with WOLFSSL_CTX
  14335. * returns WOLFSSL_SUCCESS on success */
  14336. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version)
  14337. {
  14338. int i;
  14339. int ret = WOLFSSL_FAILURE;
  14340. int minProto;
  14341. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  14342. if (ctx == NULL) {
  14343. return ret;
  14344. }
  14345. /* clear out flags and reset min protocol version */
  14346. minProto = wolfSSL_CTX_get_min_proto_version(ctx);
  14347. wolfSSL_CTX_clear_options(ctx,
  14348. WOLFSSL_OP_NO_TLSv1 | WOLFSSL_OP_NO_TLSv1_1 |
  14349. WOLFSSL_OP_NO_TLSv1_2 | WOLFSSL_OP_NO_TLSv1_3);
  14350. wolfSSL_CTX_set_min_proto_version(ctx, minProto);
  14351. if (version != 0) {
  14352. ctx->maxProto = 0; /* turn max proto flag off */
  14353. return Set_CTX_max_proto_version(ctx, version);
  14354. }
  14355. /* when 0 is specified as version, try to find out the min version from
  14356. * the bottom to top of the protoverTbl.
  14357. */
  14358. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  14359. ret = Set_CTX_max_proto_version(ctx, protoVerTbl[i]);
  14360. if (ret == WOLFSSL_SUCCESS) {
  14361. ctx->maxProto = 1; /* turn max proto flag on */
  14362. break;
  14363. }
  14364. }
  14365. return ret;
  14366. }
  14367. static int Set_SSL_min_proto_version(WOLFSSL* ssl, int ver)
  14368. {
  14369. WOLFSSL_ENTER("Set_SSL_min_proto_version");
  14370. if (ssl == NULL) {
  14371. return WOLFSSL_FAILURE;
  14372. }
  14373. switch (ver) {
  14374. #ifndef NO_TLS
  14375. case SSL3_VERSION:
  14376. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  14377. ssl->options.minDowngrade = SSLv3_MINOR;
  14378. break;
  14379. #endif
  14380. case TLS1_VERSION:
  14381. #ifdef WOLFSSL_ALLOW_TLSV10
  14382. ssl->options.minDowngrade = TLSv1_MINOR;
  14383. break;
  14384. #endif
  14385. case TLS1_1_VERSION:
  14386. #ifndef NO_OLD_TLS
  14387. ssl->options.minDowngrade = TLSv1_1_MINOR;
  14388. break;
  14389. #endif
  14390. case TLS1_2_VERSION:
  14391. #ifndef WOLFSSL_NO_TLS12
  14392. ssl->options.minDowngrade = TLSv1_2_MINOR;
  14393. break;
  14394. #endif
  14395. case TLS1_3_VERSION:
  14396. #ifdef WOLFSSL_TLS13
  14397. ssl->options.minDowngrade = TLSv1_3_MINOR;
  14398. break;
  14399. #endif
  14400. #endif
  14401. #ifdef WOLFSSL_DTLS
  14402. case DTLS1_VERSION:
  14403. #ifndef NO_OLD_TLS
  14404. ssl->options.minDowngrade = DTLS_MINOR;
  14405. break;
  14406. #endif
  14407. case DTLS1_2_VERSION:
  14408. ssl->options.minDowngrade = DTLSv1_2_MINOR;
  14409. break;
  14410. #endif
  14411. default:
  14412. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14413. return WOLFSSL_FAILURE;
  14414. }
  14415. switch (ver) {
  14416. #ifndef NO_TLS
  14417. case TLS1_3_VERSION:
  14418. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  14419. FALL_THROUGH;
  14420. case TLS1_2_VERSION:
  14421. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  14422. FALL_THROUGH;
  14423. case TLS1_1_VERSION:
  14424. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  14425. FALL_THROUGH;
  14426. case TLS1_VERSION:
  14427. ssl->options.mask |= WOLFSSL_OP_NO_SSLv3;
  14428. break;
  14429. case SSL3_VERSION:
  14430. case SSL2_VERSION:
  14431. /* Nothing to do here */
  14432. break;
  14433. #endif
  14434. #ifdef WOLFSSL_DTLS
  14435. case DTLS1_VERSION:
  14436. case DTLS1_2_VERSION:
  14437. break;
  14438. #endif
  14439. default:
  14440. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14441. return WOLFSSL_FAILURE;
  14442. }
  14443. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  14444. }
  14445. int wolfSSL_set_min_proto_version(WOLFSSL* ssl, int version)
  14446. {
  14447. int i;
  14448. int ret = WOLFSSL_FAILURE;;
  14449. WOLFSSL_ENTER("wolfSSL_set_min_proto_version");
  14450. if (ssl == NULL) {
  14451. return WOLFSSL_FAILURE;
  14452. }
  14453. if (version != 0) {
  14454. return Set_SSL_min_proto_version(ssl, version);
  14455. }
  14456. /* when 0 is specified as version, try to find out the min version */
  14457. for (i= 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  14458. ret = Set_SSL_min_proto_version(ssl, protoVerTbl[i]);
  14459. if (ret == WOLFSSL_SUCCESS)
  14460. break;
  14461. }
  14462. return ret;
  14463. }
  14464. static int Set_SSL_max_proto_version(WOLFSSL* ssl, int ver)
  14465. {
  14466. WOLFSSL_ENTER("Set_SSL_max_proto_version");
  14467. if (!ssl) {
  14468. WOLFSSL_MSG("Bad parameter");
  14469. return WOLFSSL_FAILURE;
  14470. }
  14471. switch (ver) {
  14472. case SSL2_VERSION:
  14473. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  14474. return WOLFSSL_FAILURE;
  14475. #ifndef NO_TLS
  14476. case SSL3_VERSION:
  14477. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  14478. FALL_THROUGH;
  14479. case TLS1_VERSION:
  14480. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  14481. FALL_THROUGH;
  14482. case TLS1_1_VERSION:
  14483. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  14484. FALL_THROUGH;
  14485. case TLS1_2_VERSION:
  14486. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3;
  14487. FALL_THROUGH;
  14488. case TLS1_3_VERSION:
  14489. /* Nothing to do here */
  14490. break;
  14491. #endif
  14492. #ifdef WOLFSSL_DTLS
  14493. case DTLS1_VERSION:
  14494. case DTLS1_2_VERSION:
  14495. break;
  14496. #endif
  14497. default:
  14498. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  14499. return WOLFSSL_FAILURE;
  14500. }
  14501. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  14502. }
  14503. int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version)
  14504. {
  14505. int i;
  14506. int ret = WOLFSSL_FAILURE;;
  14507. WOLFSSL_ENTER("wolfSSL_set_max_proto_version");
  14508. if (ssl == NULL) {
  14509. return WOLFSSL_FAILURE;
  14510. }
  14511. if (version != 0) {
  14512. return Set_SSL_max_proto_version(ssl, version);
  14513. }
  14514. /* when 0 is specified as version, try to find out the min version from
  14515. * the bottom to top of the protoverTbl.
  14516. */
  14517. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  14518. ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]);
  14519. if (ret == WOLFSSL_SUCCESS)
  14520. break;
  14521. }
  14522. return ret;
  14523. }
  14524. static int GetMinProtoVersion(int minDowngrade)
  14525. {
  14526. int ret;
  14527. switch (minDowngrade) {
  14528. #ifndef NO_OLD_TLS
  14529. #ifdef WOLFSSL_ALLOW_SSLV3
  14530. case SSLv3_MINOR:
  14531. ret = SSL3_VERSION;
  14532. break;
  14533. #endif
  14534. #ifdef WOLFSSL_ALLOW_TLSV10
  14535. case TLSv1_MINOR:
  14536. ret = TLS1_VERSION;
  14537. break;
  14538. #endif
  14539. case TLSv1_1_MINOR:
  14540. ret = TLS1_1_VERSION;
  14541. break;
  14542. #endif
  14543. #ifndef WOLFSSL_NO_TLS12
  14544. case TLSv1_2_MINOR:
  14545. ret = TLS1_2_VERSION;
  14546. break;
  14547. #endif
  14548. #ifdef WOLFSSL_TLS13
  14549. case TLSv1_3_MINOR:
  14550. ret = TLS1_3_VERSION;
  14551. break;
  14552. #endif
  14553. default:
  14554. ret = 0;
  14555. break;
  14556. }
  14557. return ret;
  14558. }
  14559. WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  14560. {
  14561. int ret = 0;
  14562. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  14563. if (ctx != NULL) {
  14564. if (ctx->minProto) {
  14565. ret = 0;
  14566. }
  14567. else {
  14568. ret = GetMinProtoVersion(ctx->minDowngrade);
  14569. }
  14570. }
  14571. else {
  14572. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  14573. }
  14574. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  14575. return ret;
  14576. }
  14577. /* returns the maximum allowed protocol version given the 'options' used
  14578. * returns WOLFSSL_FATAL_ERROR on no match */
  14579. static int GetMaxProtoVersion(long options)
  14580. {
  14581. #ifndef NO_TLS
  14582. #ifdef WOLFSSL_TLS13
  14583. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  14584. return TLS1_3_VERSION;
  14585. #endif
  14586. #ifndef WOLFSSL_NO_TLS12
  14587. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  14588. return TLS1_2_VERSION;
  14589. #endif
  14590. #ifndef NO_OLD_TLS
  14591. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  14592. return TLS1_1_VERSION;
  14593. #ifdef WOLFSSL_ALLOW_TLSV10
  14594. if (!(options & WOLFSSL_OP_NO_TLSv1))
  14595. return TLS1_VERSION;
  14596. #endif
  14597. #ifdef WOLFSSL_ALLOW_SSLV3
  14598. if (!(options & WOLFSSL_OP_NO_SSLv3))
  14599. return SSL3_VERSION;
  14600. #endif
  14601. #endif
  14602. #else
  14603. (void)options;
  14604. #endif /* NO_TLS */
  14605. return WOLFSSL_FATAL_ERROR;
  14606. }
  14607. /* returns the maximum protocol version for 'ctx' */
  14608. int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx)
  14609. {
  14610. int ret = 0;
  14611. long options = 0; /* default to nothing set */
  14612. WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version");
  14613. if (ctx != NULL) {
  14614. options = wolfSSL_CTX_get_options(ctx);
  14615. }
  14616. if ((ctx != NULL) && ctx->maxProto) {
  14617. ret = 0;
  14618. }
  14619. else {
  14620. ret = GetMaxProtoVersion(options);
  14621. }
  14622. WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret);
  14623. if (ret == WOLFSSL_FATAL_ERROR) {
  14624. WOLFSSL_MSG("Error getting max proto version");
  14625. ret = 0; /* setting ret to 0 to match compat return */
  14626. }
  14627. return ret;
  14628. }
  14629. #endif /* OPENSSL_EXTRA */
  14630. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  14631. defined(HAVE_SECRET_CALLBACK)
  14632. #if !defined(NO_WOLFSSL_CLIENT)
  14633. /* Return the amount of random bytes copied over or error case.
  14634. * ssl : ssl struct after handshake
  14635. * out : buffer to hold random bytes
  14636. * outSz : either 0 (return max buffer sz) or size of out buffer
  14637. */
  14638. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  14639. size_t outSz)
  14640. {
  14641. size_t size;
  14642. /* return max size of buffer */
  14643. if (outSz == 0) {
  14644. return RAN_LEN;
  14645. }
  14646. if (ssl == NULL || out == NULL) {
  14647. return 0;
  14648. }
  14649. if (ssl->arrays == NULL) {
  14650. WOLFSSL_MSG("Arrays struct not saved after handshake");
  14651. return 0;
  14652. }
  14653. if (outSz > RAN_LEN) {
  14654. size = RAN_LEN;
  14655. }
  14656. else {
  14657. size = outSz;
  14658. }
  14659. XMEMCPY(out, ssl->arrays->clientRandom, size);
  14660. return size;
  14661. }
  14662. #endif /* !NO_WOLFSSL_CLIENT */
  14663. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  14664. #ifdef OPENSSL_EXTRA
  14665. unsigned long wolfSSLeay(void)
  14666. {
  14667. return SSLEAY_VERSION_NUMBER;
  14668. }
  14669. unsigned long wolfSSL_OpenSSL_version_num(void)
  14670. {
  14671. return OPENSSL_VERSION_NUMBER;
  14672. }
  14673. const char* wolfSSLeay_version(int type)
  14674. {
  14675. (void)type;
  14676. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  14677. return wolfSSL_OpenSSL_version(type);
  14678. #else
  14679. return wolfSSL_OpenSSL_version();
  14680. #endif
  14681. }
  14682. #ifndef NO_MD5
  14683. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  14684. {
  14685. int ret;
  14686. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  14687. (void)sizeof(md5_test);
  14688. WOLFSSL_ENTER("MD5_Init");
  14689. ret = wc_InitMd5((wc_Md5*)md5);
  14690. /* return 1 on success, 0 otherwise */
  14691. if (ret == 0)
  14692. return 1;
  14693. return 0;
  14694. }
  14695. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  14696. unsigned long sz)
  14697. {
  14698. int ret;
  14699. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  14700. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  14701. /* return 1 on success, 0 otherwise */
  14702. if (ret == 0)
  14703. return 1;
  14704. return 0;
  14705. }
  14706. int wolfSSL_MD5_Final(byte* output, WOLFSSL_MD5_CTX* md5)
  14707. {
  14708. int ret;
  14709. WOLFSSL_ENTER("MD5_Final");
  14710. ret = wc_Md5Final((wc_Md5*)md5, output);
  14711. /* have to actually free the resources (if any) here, because the
  14712. * OpenSSL API doesn't include SHA*_Free().
  14713. */
  14714. wc_Md5Free((wc_Md5*)md5);
  14715. /* return 1 on success, 0 otherwise */
  14716. if (ret == 0)
  14717. return 1;
  14718. return 0;
  14719. }
  14720. /* Apply MD5 transformation to the data */
  14721. int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data)
  14722. {
  14723. int ret;
  14724. WOLFSSL_ENTER("MD5_Transform");
  14725. /* sanity check */
  14726. if (md5 == NULL || data == NULL) {
  14727. return 0;
  14728. }
  14729. #if defined(BIG_ENDIAN_ORDER)
  14730. {
  14731. ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE);
  14732. }
  14733. #endif
  14734. ret = wc_Md5Transform((wc_Md5*)md5, data);
  14735. /* return 1 on success, 0 otherwise */
  14736. if (ret == 0)
  14737. return 1;
  14738. else
  14739. return 0;
  14740. }
  14741. unsigned char *wolfSSL_MD5(const unsigned char* data, size_t len,
  14742. unsigned char* hash)
  14743. {
  14744. static unsigned char out[WC_MD5_DIGEST_SIZE];
  14745. WOLFSSL_ENTER("wolfSSL_MD5");
  14746. if (hash == NULL)
  14747. hash = out;
  14748. if (wc_Md5Hash(data, (word32)len, hash) != 0) {
  14749. WOLFSSL_MSG("wc_Md5Hash error");
  14750. return NULL;
  14751. }
  14752. return hash;
  14753. }
  14754. #endif /* !NO_MD5 */
  14755. #ifndef NO_SHA
  14756. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  14757. {
  14758. int ret;
  14759. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  14760. (void)sizeof(sha_test);
  14761. WOLFSSL_ENTER("SHA_Init");
  14762. ret = wc_InitSha((wc_Sha*)sha);
  14763. /* return 1 on success, 0 otherwise */
  14764. if (ret == 0)
  14765. return 1;
  14766. return 0;
  14767. }
  14768. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  14769. unsigned long sz)
  14770. {
  14771. int ret;
  14772. WOLFSSL_ENTER("SHA_Update");
  14773. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  14774. /* return 1 on success, 0 otherwise */
  14775. if (ret == 0)
  14776. return 1;
  14777. return 0;
  14778. }
  14779. int wolfSSL_SHA_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  14780. {
  14781. int ret;
  14782. WOLFSSL_ENTER("SHA_Final");
  14783. ret = wc_ShaFinal((wc_Sha*)sha, output);
  14784. /* have to actually free the resources (if any) here, because the
  14785. * OpenSSL API doesn't include SHA*_Free().
  14786. */
  14787. wc_ShaFree((wc_Sha*)sha);
  14788. /* return 1 on success, 0 otherwise */
  14789. if (ret == 0)
  14790. return 1;
  14791. return 0;
  14792. }
  14793. #if defined(OPENSSL_EXTRA)
  14794. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14795. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14796. /* Apply SHA1 transformation to the data */
  14797. int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha,
  14798. const unsigned char* data)
  14799. {
  14800. int ret;
  14801. WOLFSSL_ENTER("SHA_Transform");
  14802. /* sanity check */
  14803. if (sha == NULL || data == NULL) {
  14804. return 0;
  14805. }
  14806. #if defined(LITTLE_ENDIAN_ORDER)
  14807. {
  14808. ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE);
  14809. }
  14810. #endif
  14811. ret = wc_ShaTransform((wc_Sha*)sha, data);
  14812. /* return 1 on success, 0 otherwise */
  14813. if (ret == 0)
  14814. return 1;
  14815. else
  14816. return 0;
  14817. }
  14818. #endif
  14819. #endif
  14820. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  14821. {
  14822. WOLFSSL_ENTER("SHA1_Init");
  14823. return SHA_Init(sha);
  14824. }
  14825. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  14826. unsigned long sz)
  14827. {
  14828. WOLFSSL_ENTER("SHA1_Update");
  14829. return SHA_Update(sha, input, sz);
  14830. }
  14831. int wolfSSL_SHA1_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  14832. {
  14833. WOLFSSL_ENTER("SHA1_Final");
  14834. return SHA_Final(output, sha);
  14835. }
  14836. #if defined(OPENSSL_EXTRA)
  14837. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14838. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14839. /* Apply SHA1 transformation to the data */
  14840. int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha,
  14841. const unsigned char* data)
  14842. {
  14843. WOLFSSL_ENTER("SHA1_Transform");
  14844. return (wolfSSL_SHA_Transform(sha, data));
  14845. }
  14846. #endif
  14847. #endif
  14848. #endif /* !NO_SHA */
  14849. #ifdef WOLFSSL_SHA224
  14850. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  14851. {
  14852. int ret;
  14853. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  14854. (void)sizeof(sha_test);
  14855. WOLFSSL_ENTER("SHA224_Init");
  14856. ret = wc_InitSha224((wc_Sha224*)sha);
  14857. /* return 1 on success, 0 otherwise */
  14858. if (ret == 0)
  14859. return 1;
  14860. return 0;
  14861. }
  14862. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  14863. unsigned long sz)
  14864. {
  14865. int ret;
  14866. WOLFSSL_ENTER("SHA224_Update");
  14867. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  14868. /* return 1 on success, 0 otherwise */
  14869. if (ret == 0)
  14870. return 1;
  14871. return 0;
  14872. }
  14873. int wolfSSL_SHA224_Final(byte* output, WOLFSSL_SHA224_CTX* sha)
  14874. {
  14875. int ret;
  14876. WOLFSSL_ENTER("SHA224_Final");
  14877. ret = wc_Sha224Final((wc_Sha224*)sha, output);
  14878. /* have to actually free the resources (if any) here, because the
  14879. * OpenSSL API doesn't include SHA*_Free().
  14880. */
  14881. wc_Sha224Free((wc_Sha224*)sha);
  14882. /* return 1 on success, 0 otherwise */
  14883. if (ret == 0)
  14884. return 1;
  14885. return 0;
  14886. }
  14887. #endif /* WOLFSSL_SHA224 */
  14888. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  14889. {
  14890. int ret;
  14891. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  14892. (void)sizeof(sha_test);
  14893. WOLFSSL_ENTER("SHA256_Init");
  14894. ret = wc_InitSha256((wc_Sha256*)sha256);
  14895. /* return 1 on success, 0 otherwise */
  14896. if (ret == 0)
  14897. return 1;
  14898. return 0;
  14899. }
  14900. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  14901. unsigned long sz)
  14902. {
  14903. int ret;
  14904. WOLFSSL_ENTER("SHA256_Update");
  14905. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  14906. /* return 1 on success, 0 otherwise */
  14907. if (ret == 0)
  14908. return 1;
  14909. return 0;
  14910. }
  14911. int wolfSSL_SHA256_Final(byte* output, WOLFSSL_SHA256_CTX* sha)
  14912. {
  14913. int ret;
  14914. WOLFSSL_ENTER("SHA256_Final");
  14915. ret = wc_Sha256Final((wc_Sha256*)sha, output);
  14916. /* have to actually free the resources (if any) here, because the
  14917. * OpenSSL API doesn't include SHA*_Free().
  14918. */
  14919. wc_Sha256Free((wc_Sha256*)sha);
  14920. /* return 1 on success, 0 otherwise */
  14921. if (ret == 0)
  14922. return 1;
  14923. return 0;
  14924. }
  14925. #if defined(OPENSSL_EXTRA)
  14926. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14927. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \
  14928. !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH)
  14929. /* Apply SHA256 transformation to the data */
  14930. int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256,
  14931. const unsigned char* data)
  14932. {
  14933. int ret;
  14934. WOLFSSL_ENTER("SHA256_Transform");
  14935. /* sanity check */
  14936. if (sha256 == NULL || data == NULL) {
  14937. return 0;
  14938. }
  14939. #if defined(LITTLE_ENDIAN_ORDER)
  14940. {
  14941. ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE);
  14942. }
  14943. #endif
  14944. ret = wc_Sha256Transform((wc_Sha256*)sha256, data);
  14945. /* return 1 on success, 0 otherwise */
  14946. if (ret == 0)
  14947. return 1;
  14948. else
  14949. return 0;
  14950. }
  14951. #endif
  14952. #endif
  14953. #ifdef WOLFSSL_SHA384
  14954. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  14955. {
  14956. int ret;
  14957. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  14958. (void)sizeof(sha_test);
  14959. WOLFSSL_ENTER("SHA384_Init");
  14960. ret = wc_InitSha384((wc_Sha384*)sha);
  14961. /* return 1 on success, 0 otherwise */
  14962. if (ret == 0)
  14963. return 1;
  14964. return 0;
  14965. }
  14966. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  14967. unsigned long sz)
  14968. {
  14969. int ret;
  14970. WOLFSSL_ENTER("SHA384_Update");
  14971. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  14972. /* return 1 on success, 0 otherwise */
  14973. if (ret == 0)
  14974. return 1;
  14975. return 0;
  14976. }
  14977. int wolfSSL_SHA384_Final(byte* output, WOLFSSL_SHA384_CTX* sha)
  14978. {
  14979. int ret;
  14980. WOLFSSL_ENTER("SHA384_Final");
  14981. ret = wc_Sha384Final((wc_Sha384*)sha, output);
  14982. /* have to actually free the resources (if any) here, because the
  14983. * OpenSSL API doesn't include SHA*_Free().
  14984. */
  14985. wc_Sha384Free((wc_Sha384*)sha);
  14986. /* return 1 on success, 0 otherwise */
  14987. if (ret == 0)
  14988. return 1;
  14989. return 0;
  14990. }
  14991. #endif /* WOLFSSL_SHA384 */
  14992. #ifdef WOLFSSL_SHA512
  14993. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  14994. {
  14995. int ret;
  14996. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  14997. (void)sizeof(sha_test);
  14998. WOLFSSL_ENTER("SHA512_Init");
  14999. ret = wc_InitSha512((wc_Sha512*)sha);
  15000. /* return 1 on success, 0 otherwise */
  15001. if (ret == 0)
  15002. return 1;
  15003. return 0;
  15004. }
  15005. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  15006. unsigned long sz)
  15007. {
  15008. int ret;
  15009. WOLFSSL_ENTER("SHA512_Update");
  15010. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15011. /* return 1 on success, 0 otherwise */
  15012. if (ret == 0)
  15013. return 1;
  15014. return 0;
  15015. }
  15016. int wolfSSL_SHA512_Final(byte* output, WOLFSSL_SHA512_CTX* sha)
  15017. {
  15018. int ret;
  15019. WOLFSSL_ENTER("SHA512_Final");
  15020. ret = wc_Sha512Final((wc_Sha512*)sha, output);
  15021. /* have to actually free the resources (if any) here, because the
  15022. * OpenSSL API doesn't include SHA*_Free().
  15023. */
  15024. wc_Sha512Free((wc_Sha512*)sha);
  15025. /* return 1 on success, 0 otherwise */
  15026. if (ret == 0)
  15027. return 1;
  15028. return 0;
  15029. }
  15030. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15031. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15032. /* Apply SHA512 transformation to the data */
  15033. int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512,
  15034. const unsigned char* data)
  15035. {
  15036. int ret;
  15037. WOLFSSL_ENTER("SHA512_Transform");
  15038. /* sanity check */
  15039. if (sha512 == NULL || data == NULL) {
  15040. return WOLFSSL_FAILURE;
  15041. }
  15042. ret = wc_Sha512Transform((wc_Sha512*)sha512, data);
  15043. /* return 1 on success, 0 otherwise */
  15044. if (ret == 0)
  15045. return WOLFSSL_SUCCESS;
  15046. else
  15047. return WOLFSSL_FAILURE;
  15048. }
  15049. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15050. (HAVE_FIPS_VERSION > 2)) */
  15051. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  15052. #if !defined(WOLFSSL_NOSHA512_224)
  15053. int wolfSSL_SHA512_224_Init(WOLFSSL_SHA512_224_CTX* sha)
  15054. {
  15055. int ret;
  15056. WOLFSSL_ENTER("wolfSSL_SHA512_224_Init");
  15057. ret = wc_InitSha512_224((wc_Sha512*)sha);
  15058. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15059. if (ret == 0)
  15060. return WOLFSSL_SUCCESS;
  15061. return WOLFSSL_FAILURE;
  15062. }
  15063. int wolfSSL_SHA512_224_Update(WOLFSSL_SHA512_224_CTX* sha,
  15064. const void* input, unsigned long sz)
  15065. {
  15066. int ret;
  15067. WOLFSSL_ENTER("wolfSSL_SHA512_224_Update");
  15068. ret = wc_Sha512_224Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15069. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15070. if (ret == 0)
  15071. return WOLFSSL_SUCCESS;
  15072. return WOLFSSL_FAILURE;
  15073. }
  15074. int wolfSSL_SHA512_224_Final(byte* output, WOLFSSL_SHA512_224_CTX* sha)
  15075. {
  15076. int ret;
  15077. WOLFSSL_ENTER("wolfSSL_SHA512_224_Final");
  15078. ret = wc_Sha512_224Final((wc_Sha512*)sha, output);
  15079. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15080. if (ret == 0)
  15081. return WOLFSSL_SUCCESS;
  15082. return WOLFSSL_FAILURE;
  15083. }
  15084. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15085. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15086. /* Apply SHA512 transformation to the data */
  15087. int wolfSSL_SHA512_224_Transform(WOLFSSL_SHA512_CTX* sha512,
  15088. const unsigned char* data)
  15089. {
  15090. int ret;
  15091. WOLFSSL_ENTER("SHA512_224_Transform");
  15092. /* sanity check */
  15093. if (sha512 == NULL || data == NULL) {
  15094. return WOLFSSL_FAILURE;
  15095. }
  15096. ret = wc_Sha512_224Transform((wc_Sha512*)sha512, data);
  15097. /* return 1 on success, 0 otherwise */
  15098. if (ret == 0)
  15099. return WOLFSSL_SUCCESS;
  15100. else
  15101. return WOLFSSL_FAILURE;
  15102. }
  15103. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15104. (HAVE_FIPS_VERSION > 2)) */
  15105. #endif /* !WOLFSSL_NOSHA512_224 */
  15106. #if !defined(WOLFSSL_NOSHA512_256)
  15107. int wolfSSL_SHA512_256_Init(WOLFSSL_SHA512_256_CTX* sha)
  15108. {
  15109. int ret;
  15110. WOLFSSL_ENTER("wolfSSL_SHA512_256_Init");
  15111. ret = wc_InitSha512_256((wc_Sha512*)sha);
  15112. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15113. if (ret == 0)
  15114. return WOLFSSL_SUCCESS;
  15115. return WOLFSSL_FAILURE;
  15116. }
  15117. int wolfSSL_SHA512_256_Update(WOLFSSL_SHA512_256_CTX* sha,
  15118. const void* input, unsigned long sz)
  15119. {
  15120. int ret;
  15121. WOLFSSL_ENTER("wolfSSL_SHA512_256_Update");
  15122. ret = wc_Sha512_256Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  15123. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  15124. if (ret == 0)
  15125. return WOLFSSL_SUCCESS;
  15126. return WOLFSSL_FAILURE;
  15127. }
  15128. int wolfSSL_SHA512_256_Final(byte* output, WOLFSSL_SHA512_256_CTX* sha)
  15129. {
  15130. int ret;
  15131. WOLFSSL_ENTER("wolfSSL_SHA512_256_Final");
  15132. ret = wc_Sha512_256Final((wc_Sha512*)sha, output);
  15133. /* return WOLFSSL_SUCCESS on success, 0 otherwise */
  15134. if (ret == 0)
  15135. return WOLFSSL_SUCCESS;
  15136. return WOLFSSL_FAILURE;
  15137. }
  15138. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  15139. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  15140. /* Apply SHA512 transformation to the data */
  15141. int wolfSSL_SHA512_256_Transform(WOLFSSL_SHA512_CTX* sha512,
  15142. const unsigned char* data)
  15143. {
  15144. int ret;
  15145. WOLFSSL_ENTER("SHA512_256_Transform");
  15146. /* sanity check */
  15147. if (sha512 == NULL || data == NULL) {
  15148. return WOLFSSL_FAILURE;
  15149. }
  15150. ret = wc_Sha512_256Transform((wc_Sha512*)sha512, data);
  15151. /* return 1 on success, 0 otherwise */
  15152. if (ret == 0)
  15153. return WOLFSSL_SUCCESS;
  15154. else
  15155. return WOLFSSL_FAILURE;
  15156. }
  15157. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  15158. (HAVE_FIPS_VERSION > 2)) */
  15159. #endif /* !WOLFSSL_NOSHA512_256 */
  15160. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  15161. #endif /* WOLFSSL_SHA512 */
  15162. #ifdef WOLFSSL_SHA3
  15163. #ifndef WOLFSSL_NOSHA3_224
  15164. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  15165. {
  15166. int ret;
  15167. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15168. (void)sizeof(sha_test);
  15169. WOLFSSL_ENTER("SHA3_224_Init");
  15170. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15171. /* return 1 on success, 0 otherwise */
  15172. if (ret == 0)
  15173. return 1;
  15174. return 0;
  15175. }
  15176. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  15177. unsigned long sz)
  15178. {
  15179. int ret;
  15180. WOLFSSL_ENTER("SHA3_224_Update");
  15181. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15182. /* return 1 on success, 0 otherwise */
  15183. if (ret == 0)
  15184. return 1;
  15185. return 0;
  15186. }
  15187. int wolfSSL_SHA3_224_Final(byte* output, WOLFSSL_SHA3_224_CTX* sha)
  15188. {
  15189. int ret;
  15190. WOLFSSL_ENTER("SHA3_224_Final");
  15191. ret = wc_Sha3_224_Final((wc_Sha3*)sha, output);
  15192. /* have to actually free the resources (if any) here, because the
  15193. * OpenSSL API doesn't include SHA*_Free().
  15194. */
  15195. wc_Sha3_224_Free((wc_Sha3*)sha);
  15196. /* return 1 on success, 0 otherwise */
  15197. if (ret == 0)
  15198. return 1;
  15199. return 0;
  15200. }
  15201. #endif /* WOLFSSL_NOSHA3_224 */
  15202. #ifndef WOLFSSL_NOSHA3_256
  15203. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  15204. {
  15205. int ret;
  15206. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15207. (void)sizeof(sha_test);
  15208. WOLFSSL_ENTER("SHA3_256_Init");
  15209. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  15210. /* return 1 on success, 0 otherwise */
  15211. if (ret == 0)
  15212. return 1;
  15213. return 0;
  15214. }
  15215. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  15216. unsigned long sz)
  15217. {
  15218. int ret;
  15219. WOLFSSL_ENTER("SHA3_256_Update");
  15220. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15221. /* return 1 on success, 0 otherwise */
  15222. if (ret == 0)
  15223. return 1;
  15224. return 0;
  15225. }
  15226. int wolfSSL_SHA3_256_Final(byte* output, WOLFSSL_SHA3_256_CTX* sha)
  15227. {
  15228. int ret;
  15229. WOLFSSL_ENTER("SHA3_256_Final");
  15230. ret = wc_Sha3_256_Final((wc_Sha3*)sha, output);
  15231. /* have to actually free the resources (if any) here, because the
  15232. * OpenSSL API doesn't include SHA*_Free().
  15233. */
  15234. wc_Sha3_256_Free((wc_Sha3*)sha);
  15235. /* return 1 on success, 0 otherwise */
  15236. if (ret == 0)
  15237. return 1;
  15238. return 0;
  15239. }
  15240. #endif /* WOLFSSL_NOSHA3_256 */
  15241. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  15242. {
  15243. int ret;
  15244. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15245. (void)sizeof(sha_test);
  15246. WOLFSSL_ENTER("SHA3_384_Init");
  15247. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15248. /* return 1 on success, 0 otherwise */
  15249. if (ret == 0)
  15250. return 1;
  15251. return 0;
  15252. }
  15253. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  15254. unsigned long sz)
  15255. {
  15256. int ret;
  15257. WOLFSSL_ENTER("SHA3_384_Update");
  15258. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15259. /* return 1 on success, 0 otherwise */
  15260. if (ret == 0)
  15261. return 1;
  15262. return 0;
  15263. }
  15264. int wolfSSL_SHA3_384_Final(byte* output, WOLFSSL_SHA3_384_CTX* sha)
  15265. {
  15266. int ret;
  15267. WOLFSSL_ENTER("SHA3_384_Final");
  15268. ret = wc_Sha3_384_Final((wc_Sha3*)sha, output);
  15269. /* have to actually free the resources (if any) here, because the
  15270. * OpenSSL API doesn't include SHA*_Free().
  15271. */
  15272. wc_Sha3_384_Free((wc_Sha3*)sha);
  15273. /* return 1 on success, 0 otherwise */
  15274. if (ret == 0)
  15275. return 1;
  15276. return 0;
  15277. }
  15278. #ifndef WOLFSSL_NOSHA3_512
  15279. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  15280. {
  15281. int ret;
  15282. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  15283. (void)sizeof(sha_test);
  15284. WOLFSSL_ENTER("SHA3_512_Init");
  15285. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, INVALID_DEVID);
  15286. /* return 1 on success, 0 otherwise */
  15287. if (ret == 0)
  15288. return 1;
  15289. return 0;
  15290. }
  15291. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  15292. unsigned long sz)
  15293. {
  15294. int ret;
  15295. WOLFSSL_ENTER("SHA3_512_Update");
  15296. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  15297. /* return 1 on success, 0 otherwise */
  15298. if (ret == 0)
  15299. return 1;
  15300. return 0;
  15301. }
  15302. int wolfSSL_SHA3_512_Final(byte* output, WOLFSSL_SHA3_512_CTX* sha)
  15303. {
  15304. int ret;
  15305. WOLFSSL_ENTER("SHA3_512_Final");
  15306. ret = wc_Sha3_512_Final((wc_Sha3*)sha, output);
  15307. /* have to actually free the resources (if any) here, because the
  15308. * OpenSSL API doesn't include SHA*_Free().
  15309. */
  15310. wc_Sha3_512_Free((wc_Sha3*)sha);
  15311. /* return 1 on success, 0 otherwise */
  15312. if (ret == 0)
  15313. return 1;
  15314. return 0;
  15315. }
  15316. #endif /* WOLFSSL_NOSHA3_512 */
  15317. #endif /* WOLFSSL_SHA3 */
  15318. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  15319. int key_len, const unsigned char* d, int n,
  15320. unsigned char* md, unsigned int* md_len)
  15321. {
  15322. int type;
  15323. int mdlen;
  15324. unsigned char* ret = NULL;
  15325. #ifdef WOLFSSL_SMALL_STACK
  15326. Hmac* hmac = NULL;
  15327. #else
  15328. Hmac hmac[1];
  15329. #endif
  15330. void* heap = NULL;
  15331. WOLFSSL_ENTER("wolfSSL_HMAC");
  15332. if (!md) {
  15333. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  15334. return NULL; /* no static buffer support */
  15335. }
  15336. #ifndef NO_MD5
  15337. if (XSTRCMP(evp_md, "MD5") == 0) {
  15338. type = WC_MD5;
  15339. mdlen = WC_MD5_DIGEST_SIZE;
  15340. } else
  15341. #endif
  15342. #ifdef WOLFSSL_SHA224
  15343. if (XSTRCMP(evp_md, "SHA224") == 0) {
  15344. type = WC_SHA224;
  15345. mdlen = WC_SHA224_DIGEST_SIZE;
  15346. } else
  15347. #endif
  15348. #ifndef NO_SHA256
  15349. if (XSTRCMP(evp_md, "SHA256") == 0) {
  15350. type = WC_SHA256;
  15351. mdlen = WC_SHA256_DIGEST_SIZE;
  15352. } else
  15353. #endif
  15354. #ifdef WOLFSSL_SHA384
  15355. if (XSTRCMP(evp_md, "SHA384") == 0) {
  15356. type = WC_SHA384;
  15357. mdlen = WC_SHA384_DIGEST_SIZE;
  15358. } else
  15359. #endif
  15360. #ifdef WOLFSSL_SHA512
  15361. if (XSTRCMP(evp_md, "SHA512") == 0) {
  15362. type = WC_SHA512;
  15363. mdlen = WC_SHA512_DIGEST_SIZE;
  15364. } else
  15365. #endif
  15366. #ifdef WOLFSSL_SHA3
  15367. #ifndef WOLFSSL_NOSHA3_224
  15368. if (XSTRCMP(evp_md, "SHA3_224") == 0) {
  15369. type = WC_SHA3_224;
  15370. mdlen = WC_SHA3_224_DIGEST_SIZE;
  15371. } else
  15372. #endif
  15373. #ifndef WOLFSSL_NOSHA3_256
  15374. if (XSTRCMP(evp_md, "SHA3_256") == 0) {
  15375. type = WC_SHA3_256;
  15376. mdlen = WC_SHA3_256_DIGEST_SIZE;
  15377. } else
  15378. #endif
  15379. if (XSTRCMP(evp_md, "SHA3_384") == 0) {
  15380. type = WC_SHA3_384;
  15381. mdlen = WC_SHA3_384_DIGEST_SIZE;
  15382. } else
  15383. #ifndef WOLFSSL_NOSHA3_512
  15384. if (XSTRCMP(evp_md, "SHA3_512") == 0) {
  15385. type = WC_SHA3_512;
  15386. mdlen = WC_SHA3_512_DIGEST_SIZE;
  15387. } else
  15388. #endif
  15389. #endif
  15390. #ifndef NO_SHA
  15391. if (XSTRCMP(evp_md, "SHA") == 0) {
  15392. type = WC_SHA;
  15393. mdlen = WC_SHA_DIGEST_SIZE;
  15394. } else
  15395. #endif
  15396. {
  15397. return NULL;
  15398. }
  15399. #ifdef WOLFSSL_SMALL_STACK
  15400. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  15401. if (hmac == NULL)
  15402. return NULL;
  15403. #endif
  15404. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  15405. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  15406. if (wc_HmacUpdate(hmac, d, n) == 0) {
  15407. if (wc_HmacFinal(hmac, md) == 0) {
  15408. if (md_len)
  15409. *md_len = mdlen;
  15410. ret = md;
  15411. }
  15412. }
  15413. }
  15414. wc_HmacFree(hmac);
  15415. }
  15416. #ifdef WOLFSSL_SMALL_STACK
  15417. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  15418. #endif
  15419. (void)evp_md;
  15420. return ret;
  15421. }
  15422. #ifndef NO_DES3
  15423. /* 0 on ok */
  15424. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  15425. WOLFSSL_DES_key_schedule* schedule)
  15426. {
  15427. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  15428. if (key == NULL || schedule == NULL) {
  15429. WOLFSSL_MSG("Null argument passed in");
  15430. }
  15431. else {
  15432. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  15433. }
  15434. return 0;
  15435. }
  15436. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  15437. * return the last 4 bytes of cipher text */
  15438. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  15439. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  15440. WOLFSSL_const_DES_cblock* iv)
  15441. {
  15442. WOLFSSL_DES_LONG ret;
  15443. unsigned char* tmp;
  15444. unsigned char* data = (unsigned char*)in;
  15445. long dataSz = length;
  15446. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  15447. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  15448. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  15449. WOLFSSL_MSG("Bad argument passed in");
  15450. return 0;
  15451. }
  15452. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  15453. if (dataSz % DES_BLOCK_SIZE) {
  15454. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  15455. data = (unsigned char*)XMALLOC(dataSz, NULL,
  15456. DYNAMIC_TYPE_TMP_BUFFER);
  15457. if (data == NULL) {
  15458. WOLFSSL_MSG("Issue creating temporary buffer");
  15459. return 0;
  15460. }
  15461. dynamicFlag = 1; /* set to free buffer at end */
  15462. XMEMCPY(data, in, length);
  15463. XMEMSET(data + length, 0, dataSz - length); /* padding */
  15464. }
  15465. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15466. if (tmp == NULL) {
  15467. WOLFSSL_MSG("Issue creating temporary buffer");
  15468. if (dynamicFlag == 1) {
  15469. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15470. }
  15471. return 0;
  15472. }
  15473. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  15474. (WOLFSSL_DES_cblock*)iv, 1);
  15475. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  15476. DES_BLOCK_SIZE);
  15477. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  15478. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  15479. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  15480. (*((unsigned char*)out + 7) & 0xFF));
  15481. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15482. if (dynamicFlag == 1) {
  15483. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15484. }
  15485. return ret;
  15486. }
  15487. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  15488. unsigned char* output, long length,
  15489. WOLFSSL_DES_key_schedule* schedule,
  15490. WOLFSSL_DES_cblock* ivec, int enc)
  15491. {
  15492. Des myDes;
  15493. byte lastblock[DES_BLOCK_SIZE];
  15494. int lb_sz;
  15495. long blk;
  15496. WOLFSSL_ENTER("DES_cbc_encrypt");
  15497. /* OpenSSL compat, no ret */
  15498. if (wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec,
  15499. !enc) != 0) {
  15500. WOLFSSL_MSG("wc_Des_SetKey return error.");
  15501. return;
  15502. }
  15503. lb_sz = length%DES_BLOCK_SIZE;
  15504. blk = length/DES_BLOCK_SIZE;
  15505. if (enc == DES_ENCRYPT){
  15506. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  15507. if(lb_sz){
  15508. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  15509. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  15510. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  15511. lastblock, (word32)DES_BLOCK_SIZE);
  15512. }
  15513. }
  15514. else {
  15515. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  15516. if(lb_sz){
  15517. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  15518. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  15519. }
  15520. }
  15521. }
  15522. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  15523. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  15524. unsigned char* output, long sz,
  15525. WOLFSSL_DES_key_schedule* ks1,
  15526. WOLFSSL_DES_key_schedule* ks2,
  15527. WOLFSSL_DES_key_schedule* ks3,
  15528. WOLFSSL_DES_cblock* ivec, int enc)
  15529. {
  15530. int ret;
  15531. Des3 des;
  15532. byte key[24];/* EDE uses 24 size key */
  15533. byte lastblock[DES_BLOCK_SIZE];
  15534. int lb_sz;
  15535. long blk;
  15536. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  15537. XMEMSET(key, 0, sizeof(key));
  15538. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  15539. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  15540. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  15541. lb_sz = sz%DES_BLOCK_SIZE;
  15542. blk = sz/DES_BLOCK_SIZE;
  15543. /* OpenSSL compat, no ret */
  15544. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  15545. if (enc == DES_ENCRYPT) {
  15546. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  15547. DES_ENCRYPTION) == 0) {
  15548. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  15549. #if defined(WOLFSSL_ASYNC_CRYPT)
  15550. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15551. #endif
  15552. (void)ret; /* ignore return codes for processing */
  15553. if(lb_sz){
  15554. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  15555. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  15556. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  15557. lastblock, (word32)DES_BLOCK_SIZE);
  15558. #if defined(WOLFSSL_ASYNC_CRYPT)
  15559. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15560. #endif
  15561. (void)ret; /* ignore return codes for processing */
  15562. }
  15563. }
  15564. }
  15565. else {
  15566. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  15567. DES_DECRYPTION) == 0) {
  15568. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  15569. #if defined(WOLFSSL_ASYNC_CRYPT)
  15570. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15571. #endif
  15572. (void)ret; /* ignore return codes for processing */
  15573. if(lb_sz){
  15574. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  15575. #if defined(WOLFSSL_ASYNC_CRYPT)
  15576. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15577. #endif
  15578. (void)ret; /* ignore return codes for processing */
  15579. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  15580. }
  15581. }
  15582. }
  15583. wc_Des3Free(&des);
  15584. }
  15585. /* correctly sets ivec for next call */
  15586. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  15587. unsigned char* output, long length,
  15588. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  15589. int enc)
  15590. {
  15591. Des myDes;
  15592. byte lastblock[DES_BLOCK_SIZE];
  15593. int lb_sz;
  15594. long idx = length;
  15595. long blk;
  15596. WOLFSSL_ENTER("DES_ncbc_encrypt");
  15597. /* OpenSSL compat, no ret */
  15598. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  15599. (const byte*)ivec, !enc) != 0) {
  15600. WOLFSSL_MSG("wc_Des_SetKey return error.");
  15601. return;
  15602. }
  15603. lb_sz = length%DES_BLOCK_SIZE;
  15604. blk = length/DES_BLOCK_SIZE;
  15605. idx -= sizeof(DES_cblock);
  15606. if (lb_sz) {
  15607. idx += DES_BLOCK_SIZE - lb_sz;
  15608. }
  15609. if (enc == DES_ENCRYPT){
  15610. wc_Des_CbcEncrypt(&myDes, output, input,
  15611. (word32)blk * DES_BLOCK_SIZE);
  15612. if (lb_sz){
  15613. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  15614. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  15615. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  15616. lastblock, (word32)DES_BLOCK_SIZE);
  15617. }
  15618. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  15619. } else {
  15620. WOLFSSL_DES_cblock tmp;
  15621. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  15622. wc_Des_CbcDecrypt(&myDes, output, input,
  15623. (word32)blk * DES_BLOCK_SIZE);
  15624. if (lb_sz){
  15625. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  15626. (word32)DES_BLOCK_SIZE);
  15627. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  15628. }
  15629. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  15630. }
  15631. }
  15632. #endif /* NO_DES3 */
  15633. void wolfSSL_ERR_free_strings(void)
  15634. {
  15635. /* handled internally */
  15636. }
  15637. void wolfSSL_cleanup_all_ex_data(void)
  15638. {
  15639. /* nothing to do here */
  15640. }
  15641. #endif /* OPENSSL_EXTRA */
  15642. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  15643. void wolfSSL_ERR_clear_error(void)
  15644. {
  15645. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  15646. wc_ClearErrorNodes();
  15647. }
  15648. #endif
  15649. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15650. int wolfSSL_clear(WOLFSSL* ssl)
  15651. {
  15652. WOLFSSL_ENTER("wolfSSL_clear");
  15653. if (ssl == NULL) {
  15654. return WOLFSSL_FAILURE;
  15655. }
  15656. if (!ssl->options.handShakeDone) {
  15657. /* Only reset the session if we didn't complete a handshake */
  15658. wolfSSL_SESSION_free(ssl->session);
  15659. ssl->session = wolfSSL_NewSession(ssl->heap);
  15660. if (ssl->session == NULL) {
  15661. return WOLFSSL_FAILURE;
  15662. }
  15663. }
  15664. ssl->options.isClosed = 0;
  15665. ssl->options.connReset = 0;
  15666. ssl->options.sentNotify = 0;
  15667. ssl->options.closeNotify = 0;
  15668. ssl->options.sendVerify = 0;
  15669. ssl->options.serverState = NULL_STATE;
  15670. ssl->options.clientState = NULL_STATE;
  15671. ssl->options.connectState = CONNECT_BEGIN;
  15672. ssl->options.acceptState = ACCEPT_BEGIN;
  15673. ssl->options.handShakeState = NULL_STATE;
  15674. ssl->options.handShakeDone = 0;
  15675. ssl->options.processReply = 0; /* doProcessInit */
  15676. ssl->keys.encryptionOn = 0;
  15677. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  15678. if (ssl->hsHashes)
  15679. (void)InitHandshakeHashes(ssl);
  15680. #ifdef KEEP_PEER_CERT
  15681. FreeX509(&ssl->peerCert);
  15682. InitX509(&ssl->peerCert, 0, ssl->heap);
  15683. #endif
  15684. #ifdef WOLFSSL_QUIC
  15685. wolfSSL_quic_clear(ssl);
  15686. #endif
  15687. return WOLFSSL_SUCCESS;
  15688. }
  15689. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15690. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  15691. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  15692. {
  15693. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  15694. WOLFSSL_ENTER("SSL_CTX_set_mode");
  15695. switch(mode) {
  15696. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  15697. ctx->partialWrite = 1;
  15698. break;
  15699. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15700. case SSL_MODE_RELEASE_BUFFERS:
  15701. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  15702. break;
  15703. #endif
  15704. case SSL_MODE_AUTO_RETRY:
  15705. ctx->autoRetry = 1;
  15706. break;
  15707. default:
  15708. WOLFSSL_MSG("Mode Not Implemented");
  15709. }
  15710. /* SSL_MODE_AUTO_RETRY
  15711. * Should not return -1 with renegotiation on read/write */
  15712. return mode;
  15713. }
  15714. long wolfSSL_CTX_clear_mode(WOLFSSL_CTX* ctx, long mode)
  15715. {
  15716. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  15717. WOLFSSL_ENTER("SSL_CTX_set_mode");
  15718. switch(mode) {
  15719. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  15720. ctx->partialWrite = 0;
  15721. break;
  15722. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15723. case SSL_MODE_RELEASE_BUFFERS:
  15724. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  15725. break;
  15726. #endif
  15727. case SSL_MODE_AUTO_RETRY:
  15728. ctx->autoRetry = 0;
  15729. break;
  15730. default:
  15731. WOLFSSL_MSG("Mode Not Implemented");
  15732. }
  15733. /* SSL_MODE_AUTO_RETRY
  15734. * Should not return -1 with renegotiation on read/write */
  15735. return 0;
  15736. }
  15737. #endif
  15738. #ifdef OPENSSL_EXTRA
  15739. #ifndef NO_WOLFSSL_STUB
  15740. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  15741. {
  15742. /* TODO: */
  15743. (void)ssl;
  15744. WOLFSSL_STUB("SSL_get_mode");
  15745. return 0;
  15746. }
  15747. #endif
  15748. #ifndef NO_WOLFSSL_STUB
  15749. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  15750. {
  15751. /* TODO: */
  15752. (void)ctx;
  15753. WOLFSSL_STUB("SSL_CTX_get_mode");
  15754. return 0;
  15755. }
  15756. #endif
  15757. #ifndef NO_WOLFSSL_STUB
  15758. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  15759. {
  15760. /* TODO: maybe? */
  15761. (void)ctx;
  15762. (void)m;
  15763. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  15764. }
  15765. #endif
  15766. /* Storing app session context id, this value is inherited by WOLFSSL
  15767. * objects created from WOLFSSL_CTX. Any session that is imported with a
  15768. * different session context id will be rejected.
  15769. *
  15770. * ctx structure to set context in
  15771. * sid_ctx value of context to set
  15772. * sid_ctx_len length of sid_ctx buffer
  15773. *
  15774. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  15775. */
  15776. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  15777. const unsigned char* sid_ctx,
  15778. unsigned int sid_ctx_len)
  15779. {
  15780. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  15781. /* No application specific context needed for wolfSSL */
  15782. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  15783. return SSL_FAILURE;
  15784. }
  15785. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  15786. ctx->sessionCtxSz = (byte)sid_ctx_len;
  15787. return WOLFSSL_SUCCESS;
  15788. }
  15789. /* Storing app session context id. Any session that is imported with a
  15790. * different session context id will be rejected.
  15791. *
  15792. * ssl structure to set context in
  15793. * id value of context to set
  15794. * len length of sid_ctx buffer
  15795. *
  15796. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  15797. */
  15798. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  15799. unsigned int len)
  15800. {
  15801. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  15802. if (len > ID_LEN || ssl == NULL || id == NULL) {
  15803. return SSL_FAILURE;
  15804. }
  15805. XMEMCPY(ssl->sessionCtx, id, len);
  15806. ssl->sessionCtxSz = (byte)len;
  15807. return WOLFSSL_SUCCESS;
  15808. }
  15809. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  15810. {
  15811. (void)ctx;
  15812. #ifndef NO_SESSION_CACHE
  15813. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  15814. #else
  15815. return 0;
  15816. #endif
  15817. }
  15818. /* returns the unsigned error value and increments the pointer into the
  15819. * error queue.
  15820. *
  15821. * file pointer to file name
  15822. * line gets set to line number of error when not NULL
  15823. */
  15824. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  15825. {
  15826. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15827. int ret = wc_PullErrorNode(file, NULL, line);
  15828. if (ret < 0) {
  15829. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15830. WOLFSSL_MSG("Issue getting error node");
  15831. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  15832. ret = 0 - ret; /* return absolute value of error */
  15833. /* panic and try to clear out nodes */
  15834. wc_ClearErrorNodes();
  15835. }
  15836. return (unsigned long)ret;
  15837. #else
  15838. (void)file;
  15839. (void)line;
  15840. return 0;
  15841. #endif
  15842. }
  15843. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  15844. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  15845. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  15846. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  15847. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  15848. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  15849. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  15850. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  15851. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  15852. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  15853. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  15854. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  15855. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  15856. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  15857. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  15858. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  15859. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  15860. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  15861. /* switch with int mapped to function name for compatibility */
  15862. static const char* wolfSSL_ERR_sys_func(int fun)
  15863. {
  15864. switch (fun) {
  15865. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  15866. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  15867. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  15868. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  15869. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  15870. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  15871. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  15872. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  15873. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  15874. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  15875. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  15876. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  15877. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  15878. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  15879. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  15880. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  15881. default:
  15882. return "NULL";
  15883. }
  15884. }
  15885. #endif /* DEBUG_WOLFSSL */
  15886. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  15887. int line)
  15888. {
  15889. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  15890. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  15891. (void)fun;
  15892. (void)err;
  15893. (void)file;
  15894. (void)line;
  15895. WOLFSSL_MSG("Not compiled in debug mode");
  15896. #elif defined(OPENSSL_EXTRA) && \
  15897. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  15898. (void)fun;
  15899. (void)file;
  15900. (void)line;
  15901. WOLFSSL_ERROR(err);
  15902. #else
  15903. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  15904. file, NULL);
  15905. #endif
  15906. (void)lib;
  15907. }
  15908. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  15909. * more flexibility.
  15910. *
  15911. * file output pointer to file where error happened
  15912. * line output to line number of error
  15913. * data output data. Is a string if ERR_TXT_STRING flag is used
  15914. * flags output format of output
  15915. *
  15916. * Returns the error value or 0 if no errors are in the queue
  15917. */
  15918. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  15919. const char** data, int *flags)
  15920. {
  15921. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15922. int ret;
  15923. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  15924. if (flags != NULL)
  15925. *flags = ERR_TXT_STRING; /* Clear the flags */
  15926. ret = wc_PullErrorNode(file, data, line);
  15927. if (ret < 0) {
  15928. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15929. WOLFSSL_MSG("Error with pulling error node!");
  15930. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15931. ret = 0 - ret; /* return absolute value of error */
  15932. /* panic and try to clear out nodes */
  15933. wc_ClearErrorNodes();
  15934. }
  15935. return (unsigned long)ret;
  15936. #else
  15937. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  15938. WOLFSSL_MSG("Error queue turned off, can not get error line");
  15939. (void)file;
  15940. (void)line;
  15941. (void)data;
  15942. (void)flags;
  15943. return 0;
  15944. #endif
  15945. }
  15946. #endif /* OPENSSL_EXTRA */
  15947. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  15948. (defined(OPENSSL_EXTRA) && defined(SESSION_CERTS))
  15949. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  15950. *
  15951. * x509 WOLFSSL_X509 object to decode into.
  15952. * in X509 DER data.
  15953. * len Length of the X509 DER data.
  15954. * returns the new certificate on success, otherwise NULL.
  15955. */
  15956. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  15957. {
  15958. int ret;
  15959. #ifdef WOLFSSL_SMALL_STACK
  15960. DecodedCert* cert;
  15961. #else
  15962. DecodedCert cert[1];
  15963. #endif
  15964. if (x509 == NULL || in == NULL || len <= 0)
  15965. return BAD_FUNC_ARG;
  15966. #ifdef WOLFSSL_SMALL_STACK
  15967. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15968. DYNAMIC_TYPE_DCERT);
  15969. if (cert == NULL)
  15970. return MEMORY_E;
  15971. #endif
  15972. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  15973. */
  15974. InitDecodedCert(cert, (byte*)in, len, NULL);
  15975. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  15976. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  15977. if (x509->dynamicMemory != TRUE)
  15978. InitX509(x509, 0, NULL);
  15979. ret = CopyDecodedToX509(x509, cert);
  15980. FreeDecodedCert(cert);
  15981. }
  15982. #ifdef WOLFSSL_SMALL_STACK
  15983. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15984. #endif
  15985. return ret;
  15986. }
  15987. #endif /* (KEEP_PEER_CERT & SESSION_CERTS) || (OPENSSL_EXTRA & SESSION_CERTS) */
  15988. #ifdef KEEP_PEER_CERT
  15989. WOLFSSL_ABI
  15990. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  15991. {
  15992. WOLFSSL_X509* ret = NULL;
  15993. WOLFSSL_ENTER("SSL_get_peer_certificate");
  15994. if (ssl != NULL) {
  15995. if (ssl->peerCert.issuer.sz)
  15996. ret = wolfSSL_X509_dup(&ssl->peerCert);
  15997. #ifdef SESSION_CERTS
  15998. else if (ssl->session->chain.count > 0) {
  15999. if (DecodeToX509(&ssl->peerCert, ssl->session->chain.certs[0].buffer,
  16000. ssl->session->chain.certs[0].length) == 0) {
  16001. ret = wolfSSL_X509_dup(&ssl->peerCert);
  16002. }
  16003. }
  16004. #endif
  16005. }
  16006. WOLFSSL_LEAVE("SSL_get_peer_certificate", ret != NULL);
  16007. return ret;
  16008. }
  16009. #endif /* KEEP_PEER_CERT */
  16010. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16011. /* Return stack of peer certs.
  16012. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  16013. */
  16014. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  16015. {
  16016. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  16017. if (ssl == NULL)
  16018. return NULL;
  16019. /* Try to populate if NULL or empty */
  16020. if (ssl->peerCertChain == NULL ||
  16021. wolfSSL_sk_X509_num(ssl->peerCertChain) == 0)
  16022. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  16023. return ssl->peerCertChain;
  16024. }
  16025. #ifndef WOLFSSL_QT
  16026. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  16027. WOLFSSL_X509 *x);
  16028. /**
  16029. * Recursively push the issuer CA chain onto the stack
  16030. * @param cm The cert manager that is queried for the issuer
  16031. * @param x This cert's issuer will be queried in cm
  16032. * @param sk The issuer is pushed onto this stack
  16033. * @return WOLFSSL_SUCCESS on success
  16034. * WOLFSSL_FAILURE on no issuer found
  16035. * WOLFSSL_FATAL_ERROR on a fatal error
  16036. */
  16037. static int PushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  16038. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  16039. {
  16040. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  16041. int i;
  16042. int push = 1;
  16043. int ret = WOLFSSL_SUCCESS;
  16044. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  16045. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  16046. != WOLFSSL_SUCCESS)
  16047. break;
  16048. x = issuer[i];
  16049. }
  16050. if (i == 0) /* No further chain found */
  16051. return WOLFSSL_FAILURE;
  16052. i--;
  16053. for (; i >= 0; i--) {
  16054. if (push) {
  16055. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  16056. wolfSSL_X509_free(issuer[i]);
  16057. ret = WOLFSSL_FATAL_ERROR;
  16058. push = 0; /* Free the rest of the unpushed certs */
  16059. }
  16060. }
  16061. else {
  16062. wolfSSL_X509_free(issuer[i]);
  16063. }
  16064. }
  16065. return ret;
  16066. }
  16067. #endif /* !WOLFSSL_QT */
  16068. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  16069. based off of the ssl session chain. Attempts to place CA certificates
  16070. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  16071. NULL on failure */
  16072. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  16073. {
  16074. WOLFSSL_STACK* sk;
  16075. WOLFSSL_X509* x509;
  16076. int i = 0;
  16077. int ret;
  16078. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  16079. if ((ssl == NULL) || (ssl->session->chain.count == 0))
  16080. return NULL;
  16081. sk = wolfSSL_sk_X509_new();
  16082. i = ssl->session->chain.count-1;
  16083. for (; i >= 0; i--) {
  16084. x509 = wolfSSL_X509_new();
  16085. if (x509 == NULL) {
  16086. WOLFSSL_MSG("Error Creating X509");
  16087. wolfSSL_sk_X509_pop_free(sk, NULL);
  16088. return NULL;
  16089. }
  16090. ret = DecodeToX509(x509, ssl->session->chain.certs[i].buffer,
  16091. ssl->session->chain.certs[i].length);
  16092. #if !defined(WOLFSSL_QT)
  16093. if (ret == 0 && i == ssl->session->chain.count-1) {
  16094. /* On the last element in the chain try to add the CA chain
  16095. * first if we have one for this cert */
  16096. if (PushCAx509Chain(SSL_CM(ssl), x509, sk)
  16097. == WOLFSSL_FATAL_ERROR) {
  16098. ret = WOLFSSL_FATAL_ERROR;
  16099. }
  16100. }
  16101. #endif
  16102. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  16103. WOLFSSL_MSG("Error decoding cert");
  16104. wolfSSL_X509_free(x509);
  16105. wolfSSL_sk_X509_pop_free(sk, NULL);
  16106. return NULL;
  16107. }
  16108. }
  16109. if (sk == NULL) {
  16110. WOLFSSL_MSG("Null session chain");
  16111. }
  16112. #if defined(OPENSSL_ALL)
  16113. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  16114. /* to be compliant with openssl
  16115. first element is kept as peer cert on server side.*/
  16116. wolfSSL_sk_X509_shift(sk);
  16117. }
  16118. #endif
  16119. if (ssl->peerCertChain != NULL)
  16120. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  16121. /* This is Free'd when ssl is Free'd */
  16122. ssl->peerCertChain = sk;
  16123. return sk;
  16124. }
  16125. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  16126. #ifndef NO_CERTS
  16127. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16128. /* create a generic wolfSSL stack node
  16129. * returns a new WOLFSSL_STACK structure on success */
  16130. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16131. {
  16132. WOLFSSL_STACK* sk;
  16133. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16134. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16135. DYNAMIC_TYPE_OPENSSL);
  16136. if (sk != NULL) {
  16137. XMEMSET(sk, 0, sizeof(*sk));
  16138. sk->heap = heap;
  16139. }
  16140. return sk;
  16141. }
  16142. /* free's node but does not free internal data such as in->data.x509 */
  16143. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16144. {
  16145. if (in != NULL) {
  16146. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16147. }
  16148. }
  16149. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16150. * also handles internal "num" for number of nodes on stack
  16151. * return WOLFSSL_SUCCESS on success
  16152. */
  16153. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16154. {
  16155. if (stack == NULL || in == NULL) {
  16156. return WOLFSSL_FAILURE;
  16157. }
  16158. if (*stack == NULL) {
  16159. in->num = 1;
  16160. *stack = in;
  16161. return WOLFSSL_SUCCESS;
  16162. }
  16163. in->num = (*stack)->num + 1;
  16164. in->next = *stack;
  16165. *stack = in;
  16166. return WOLFSSL_SUCCESS;
  16167. }
  16168. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16169. static WC_INLINE int compare_WOLFSSL_CIPHER(
  16170. WOLFSSL_CIPHER *a,
  16171. WOLFSSL_CIPHER *b)
  16172. {
  16173. if ((a->cipherSuite0 == b->cipherSuite0) &&
  16174. (a->cipherSuite == b->cipherSuite) &&
  16175. (a->ssl == b->ssl) &&
  16176. (XMEMCMP(a->description, b->description, sizeof a->description) == 0) &&
  16177. (a->offset == b->offset) &&
  16178. (a->in_stack == b->in_stack) &&
  16179. (a->bits == b->bits))
  16180. return 0;
  16181. else
  16182. return -1;
  16183. }
  16184. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16185. /* return 1 on success 0 on fail */
  16186. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16187. {
  16188. WOLFSSL_STACK* node;
  16189. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16190. WOLFSSL_CIPHER ciph;
  16191. #endif
  16192. WOLFSSL_ENTER("wolfSSL_sk_push");
  16193. if (!sk) {
  16194. return WOLFSSL_FAILURE;
  16195. }
  16196. /* Check if empty data */
  16197. switch (sk->type) {
  16198. case STACK_TYPE_CIPHER:
  16199. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16200. /* check if entire struct is zero */
  16201. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16202. if (compare_WOLFSSL_CIPHER(&sk->data.cipher, &ciph) == 0) {
  16203. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16204. sk->num = 1;
  16205. if (sk->hash_fn) {
  16206. sk->hash = sk->hash_fn(&sk->data.cipher);
  16207. }
  16208. return WOLFSSL_SUCCESS;
  16209. }
  16210. break;
  16211. #endif
  16212. case STACK_TYPE_X509:
  16213. case STACK_TYPE_GEN_NAME:
  16214. case STACK_TYPE_BIO:
  16215. case STACK_TYPE_OBJ:
  16216. case STACK_TYPE_STRING:
  16217. case STACK_TYPE_ACCESS_DESCRIPTION:
  16218. case STACK_TYPE_X509_EXT:
  16219. case STACK_TYPE_X509_REQ_ATTR:
  16220. case STACK_TYPE_NULL:
  16221. case STACK_TYPE_X509_NAME:
  16222. case STACK_TYPE_X509_NAME_ENTRY:
  16223. case STACK_TYPE_CONF_VALUE:
  16224. case STACK_TYPE_X509_INFO:
  16225. case STACK_TYPE_BY_DIR_entry:
  16226. case STACK_TYPE_BY_DIR_hash:
  16227. case STACK_TYPE_X509_OBJ:
  16228. case STACK_TYPE_DIST_POINT:
  16229. case STACK_TYPE_X509_CRL:
  16230. default:
  16231. /* All other types are pointers */
  16232. if (!sk->data.generic) {
  16233. sk->data.generic = (void*)data;
  16234. sk->num = 1;
  16235. #ifdef OPENSSL_ALL
  16236. if (sk->hash_fn) {
  16237. sk->hash = sk->hash_fn(sk->data.generic);
  16238. }
  16239. #endif
  16240. return WOLFSSL_SUCCESS;
  16241. }
  16242. break;
  16243. }
  16244. /* stack already has value(s) create a new node and add more */
  16245. node = wolfSSL_sk_new_node(sk->heap);
  16246. if (!node) {
  16247. WOLFSSL_MSG("Memory error");
  16248. return WOLFSSL_FAILURE;
  16249. }
  16250. /* push new x509 onto head of stack */
  16251. node->next = sk->next;
  16252. node->type = sk->type;
  16253. sk->next = node;
  16254. sk->num += 1;
  16255. #ifdef OPENSSL_ALL
  16256. node->comp = sk->comp;
  16257. node->hash_fn = sk->hash_fn;
  16258. node->hash = sk->hash;
  16259. sk->hash = 0;
  16260. #endif
  16261. switch (sk->type) {
  16262. case STACK_TYPE_CIPHER:
  16263. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16264. node->data.cipher = sk->data.cipher;
  16265. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16266. if (sk->hash_fn) {
  16267. sk->hash = sk->hash_fn(&sk->data.cipher);
  16268. }
  16269. break;
  16270. #endif
  16271. case STACK_TYPE_X509:
  16272. case STACK_TYPE_GEN_NAME:
  16273. case STACK_TYPE_BIO:
  16274. case STACK_TYPE_OBJ:
  16275. case STACK_TYPE_STRING:
  16276. case STACK_TYPE_ACCESS_DESCRIPTION:
  16277. case STACK_TYPE_X509_EXT:
  16278. case STACK_TYPE_X509_REQ_ATTR:
  16279. case STACK_TYPE_NULL:
  16280. case STACK_TYPE_X509_NAME:
  16281. case STACK_TYPE_X509_NAME_ENTRY:
  16282. case STACK_TYPE_CONF_VALUE:
  16283. case STACK_TYPE_X509_INFO:
  16284. case STACK_TYPE_BY_DIR_entry:
  16285. case STACK_TYPE_BY_DIR_hash:
  16286. case STACK_TYPE_X509_OBJ:
  16287. case STACK_TYPE_DIST_POINT:
  16288. case STACK_TYPE_X509_CRL:
  16289. default:
  16290. /* All other types are pointers */
  16291. node->data.generic = sk->data.generic;
  16292. sk->data.generic = (void*)data;
  16293. #ifdef OPENSSL_ALL
  16294. if (sk->hash_fn) {
  16295. sk->hash = sk->hash_fn(sk->data.generic);
  16296. }
  16297. #endif
  16298. break;
  16299. }
  16300. return WOLFSSL_SUCCESS;
  16301. }
  16302. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16303. #ifdef OPENSSL_EXTRA
  16304. /* returns the node at index "idx", NULL if not found */
  16305. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16306. {
  16307. int i;
  16308. WOLFSSL_STACK* ret = NULL;
  16309. WOLFSSL_STACK* current;
  16310. current = sk;
  16311. for (i = 0; i <= idx && current != NULL; i++) {
  16312. if (i == idx) {
  16313. ret = current;
  16314. break;
  16315. }
  16316. current = current->next;
  16317. }
  16318. return ret;
  16319. }
  16320. #endif /* OPENSSL_EXTRA */
  16321. #ifdef OPENSSL_EXTRA
  16322. #if defined(OPENSSL_ALL)
  16323. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16324. {
  16325. unsigned long hash;
  16326. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16327. if (!sk || !data) {
  16328. WOLFSSL_MSG("Bad parameters");
  16329. return NULL;
  16330. }
  16331. if (!sk->hash_fn) {
  16332. WOLFSSL_MSG("No hash function defined");
  16333. return NULL;
  16334. }
  16335. hash = sk->hash_fn(data);
  16336. while (sk) {
  16337. /* Calc hash if not done so yet */
  16338. if (!sk->hash) {
  16339. switch (sk->type) {
  16340. case STACK_TYPE_CIPHER:
  16341. sk->hash = sk->hash_fn(&sk->data.cipher);
  16342. break;
  16343. case STACK_TYPE_X509:
  16344. case STACK_TYPE_GEN_NAME:
  16345. case STACK_TYPE_BIO:
  16346. case STACK_TYPE_OBJ:
  16347. case STACK_TYPE_STRING:
  16348. case STACK_TYPE_ACCESS_DESCRIPTION:
  16349. case STACK_TYPE_X509_EXT:
  16350. case STACK_TYPE_X509_REQ_ATTR:
  16351. case STACK_TYPE_NULL:
  16352. case STACK_TYPE_X509_NAME:
  16353. case STACK_TYPE_X509_NAME_ENTRY:
  16354. case STACK_TYPE_CONF_VALUE:
  16355. case STACK_TYPE_X509_INFO:
  16356. case STACK_TYPE_BY_DIR_entry:
  16357. case STACK_TYPE_BY_DIR_hash:
  16358. case STACK_TYPE_X509_OBJ:
  16359. case STACK_TYPE_DIST_POINT:
  16360. case STACK_TYPE_X509_CRL:
  16361. default:
  16362. sk->hash = sk->hash_fn(sk->data.generic);
  16363. break;
  16364. }
  16365. }
  16366. if (sk->hash == hash) {
  16367. switch (sk->type) {
  16368. case STACK_TYPE_CIPHER:
  16369. return &sk->data.cipher;
  16370. case STACK_TYPE_X509:
  16371. case STACK_TYPE_GEN_NAME:
  16372. case STACK_TYPE_BIO:
  16373. case STACK_TYPE_OBJ:
  16374. case STACK_TYPE_STRING:
  16375. case STACK_TYPE_ACCESS_DESCRIPTION:
  16376. case STACK_TYPE_X509_EXT:
  16377. case STACK_TYPE_X509_REQ_ATTR:
  16378. case STACK_TYPE_NULL:
  16379. case STACK_TYPE_X509_NAME:
  16380. case STACK_TYPE_X509_NAME_ENTRY:
  16381. case STACK_TYPE_CONF_VALUE:
  16382. case STACK_TYPE_X509_INFO:
  16383. case STACK_TYPE_BY_DIR_entry:
  16384. case STACK_TYPE_BY_DIR_hash:
  16385. case STACK_TYPE_X509_OBJ:
  16386. case STACK_TYPE_DIST_POINT:
  16387. case STACK_TYPE_X509_CRL:
  16388. default:
  16389. return sk->data.generic;
  16390. }
  16391. }
  16392. sk = sk->next;
  16393. }
  16394. return NULL;
  16395. }
  16396. #endif /* OPENSSL_ALL */
  16397. #endif /* OPENSSL_EXTRA */
  16398. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  16399. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  16400. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  16401. defined(KEEP_OUR_CERT)
  16402. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  16403. {
  16404. if (ssl == NULL) {
  16405. return NULL;
  16406. }
  16407. if (ssl->buffers.weOwnCert) {
  16408. if (ssl->ourCert == NULL) {
  16409. if (ssl->buffers.certificate == NULL) {
  16410. WOLFSSL_MSG("Certificate buffer not set!");
  16411. return NULL;
  16412. }
  16413. #ifndef WOLFSSL_X509_STORE_CERTS
  16414. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  16415. ssl->buffers.certificate->buffer,
  16416. ssl->buffers.certificate->length);
  16417. #endif
  16418. }
  16419. return ssl->ourCert;
  16420. }
  16421. else { /* if cert not owned get parent ctx cert or return null */
  16422. if (ssl->ctx) {
  16423. if (ssl->ctx->ourCert == NULL) {
  16424. if (ssl->ctx->certificate == NULL) {
  16425. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16426. return NULL;
  16427. }
  16428. #ifndef WOLFSSL_X509_STORE_CERTS
  16429. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16430. ssl->ctx->certificate->buffer,
  16431. ssl->ctx->certificate->length);
  16432. #endif
  16433. ssl->ctx->ownOurCert = 1;
  16434. }
  16435. return ssl->ctx->ourCert;
  16436. }
  16437. }
  16438. return NULL;
  16439. }
  16440. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  16441. {
  16442. if (ctx) {
  16443. if (ctx->ourCert == NULL) {
  16444. if (ctx->certificate == NULL) {
  16445. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  16446. return NULL;
  16447. }
  16448. #ifndef WOLFSSL_X509_STORE_CERTS
  16449. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  16450. ctx->certificate->buffer,
  16451. ctx->certificate->length);
  16452. #endif
  16453. ctx->ownOurCert = 1;
  16454. }
  16455. return ctx->ourCert;
  16456. }
  16457. return NULL;
  16458. }
  16459. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  16460. #endif /* NO_CERTS */
  16461. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  16462. defined(OPENSSL_EXTRA_X509_SMALL))
  16463. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  16464. {
  16465. if (obj == NULL) {
  16466. return;
  16467. }
  16468. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  16469. #ifdef WOLFSSL_DEBUG_OPENSSL
  16470. WOLFSSL_MSG("Freeing ASN1 data");
  16471. #endif
  16472. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  16473. obj->obj = NULL;
  16474. }
  16475. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16476. if (obj->pathlen != NULL) {
  16477. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  16478. obj->pathlen = NULL;
  16479. }
  16480. #endif
  16481. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  16482. #ifdef WOLFSSL_DEBUG_OPENSSL
  16483. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  16484. #endif
  16485. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  16486. }
  16487. }
  16488. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  16489. {
  16490. WOLFSSL_ASN1_OBJECT* obj;
  16491. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  16492. DYNAMIC_TYPE_ASN1);
  16493. if (obj == NULL) {
  16494. return NULL;
  16495. }
  16496. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  16497. obj->d.ia5 = &(obj->d.ia5_internal);
  16498. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16499. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  16500. #endif
  16501. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  16502. return obj;
  16503. }
  16504. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  16505. {
  16506. WOLFSSL_ASN1_OBJECT* dupl = NULL;
  16507. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  16508. if (!obj) {
  16509. WOLFSSL_MSG("Bad parameter");
  16510. return NULL;
  16511. }
  16512. dupl = wolfSSL_ASN1_OBJECT_new();
  16513. if (!dupl) {
  16514. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  16515. return NULL;
  16516. }
  16517. /* Copy data */
  16518. XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
  16519. dupl->type = obj->type;
  16520. dupl->grp = obj->grp;
  16521. dupl->nid = obj->nid;
  16522. dupl->objSz = obj->objSz;
  16523. if (obj->obj) {
  16524. dupl->obj = (const unsigned char*)XMALLOC(
  16525. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  16526. if (!dupl->obj) {
  16527. WOLFSSL_MSG("ASN1 obj malloc error");
  16528. wolfSSL_ASN1_OBJECT_free(dupl);
  16529. return NULL;
  16530. }
  16531. XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
  16532. dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  16533. }
  16534. return dupl;
  16535. }
  16536. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  16537. #ifndef NO_ASN
  16538. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16539. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  16540. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  16541. {
  16542. WOLFSSL_STACK* sk;
  16543. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  16544. sk = wolfSSL_sk_new_null();
  16545. if (sk == NULL)
  16546. return NULL;
  16547. sk->type = STACK_TYPE_OBJ;
  16548. return sk;
  16549. }
  16550. /* return 1 on success 0 on fail */
  16551. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  16552. WOLFSSL_ASN1_OBJECT* obj)
  16553. {
  16554. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  16555. if (sk == NULL || obj == NULL) {
  16556. return WOLFSSL_FAILURE;
  16557. }
  16558. return wolfSSL_sk_push(sk, obj);
  16559. }
  16560. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  16561. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  16562. {
  16563. WOLFSSL_STACK* node;
  16564. WOLFSSL_ASN1_OBJECT* obj;
  16565. if (sk == NULL) {
  16566. return NULL;
  16567. }
  16568. node = sk->next;
  16569. obj = sk->data.obj;
  16570. if (node != NULL) { /* update sk and remove node from stack */
  16571. sk->data.obj = node->data.obj;
  16572. sk->next = node->next;
  16573. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  16574. }
  16575. else { /* last obj in stack */
  16576. sk->data.obj = NULL;
  16577. }
  16578. if (sk->num > 0) {
  16579. sk->num -= 1;
  16580. }
  16581. return obj;
  16582. }
  16583. /* Free the structure for ASN1_OBJECT stack
  16584. *
  16585. * sk stack to free nodes in
  16586. */
  16587. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  16588. {
  16589. wolfSSL_sk_free(sk);
  16590. }
  16591. /* Free's all nodes in ASN1_OBJECT stack.
  16592. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  16593. * choosing the function to use when freeing an ASN1_OBJECT stack.
  16594. *
  16595. * sk stack to free nodes in
  16596. * f X509 free function
  16597. */
  16598. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  16599. void (*f) (WOLFSSL_ASN1_OBJECT*))
  16600. {
  16601. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  16602. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  16603. }
  16604. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16605. #endif /* !NO_ASN */
  16606. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  16607. #ifndef NO_ASN
  16608. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  16609. {
  16610. /*
  16611. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  16612. the converted data is allocated in a buffer in *out.
  16613. The length of out is returned or a negative error code.
  16614. The buffer *out should be free using OPENSSL_free().
  16615. */
  16616. unsigned char* buf;
  16617. unsigned char* inPtr;
  16618. int inLen;
  16619. if (!out || !in) {
  16620. return -1;
  16621. }
  16622. inPtr = wolfSSL_ASN1_STRING_data(in);
  16623. inLen = wolfSSL_ASN1_STRING_length(in);
  16624. if (!inPtr || inLen < 0) {
  16625. return -1;
  16626. }
  16627. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  16628. if (!buf) {
  16629. return -1;
  16630. }
  16631. XMEMCPY(buf, inPtr, inLen + 1);
  16632. *out = buf;
  16633. return inLen;
  16634. }
  16635. #endif /* !NO_ASN */
  16636. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  16637. #if defined(OPENSSL_EXTRA)
  16638. #ifndef NO_ASN
  16639. int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
  16640. {
  16641. char *idx;
  16642. char *copy;
  16643. WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
  16644. if (!s) {
  16645. WOLFSSL_MSG("Bad parameter");
  16646. return WOLFSSL_FAILURE;
  16647. }
  16648. if (s->type != V_ASN1_UNIVERSALSTRING) {
  16649. WOLFSSL_MSG("Input is not a universal string");
  16650. return WOLFSSL_FAILURE;
  16651. }
  16652. if ((s->length % 4) != 0) {
  16653. WOLFSSL_MSG("Input string must be divisible by 4");
  16654. return WOLFSSL_FAILURE;
  16655. }
  16656. for (idx = s->data; idx < s->data + s->length; idx += 4)
  16657. if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
  16658. break;
  16659. if (idx != s->data + s->length) {
  16660. WOLFSSL_MSG("Wrong string format");
  16661. return WOLFSSL_FAILURE;
  16662. }
  16663. for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
  16664. *copy++ = idx[3];
  16665. *copy = '\0';
  16666. s->length /= 4;
  16667. s->type = V_ASN1_PRINTABLESTRING;
  16668. return WOLFSSL_SUCCESS;
  16669. }
  16670. /* Returns string representation of ASN1_STRING */
  16671. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  16672. const WOLFSSL_ASN1_STRING *s)
  16673. {
  16674. int i;
  16675. int tmpSz = 100;
  16676. int valSz = 5;
  16677. char* tmp;
  16678. char val[5];
  16679. unsigned char* str;
  16680. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  16681. (void)method;
  16682. if(s == NULL || s->data == NULL) {
  16683. WOLFSSL_MSG("Bad Function Argument");
  16684. return NULL;
  16685. }
  16686. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16687. if (str == NULL) {
  16688. WOLFSSL_MSG("Memory Error");
  16689. return NULL;
  16690. }
  16691. XMEMCPY(str, (unsigned char*)s->data, s->length);
  16692. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16693. if (tmp == NULL) {
  16694. WOLFSSL_MSG("Memory Error");
  16695. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16696. return NULL;
  16697. }
  16698. XMEMSET(tmp, 0, tmpSz);
  16699. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  16700. if (XSNPRINTF(val, valSz, "%02X:", str[i])
  16701. >= valSz)
  16702. {
  16703. WOLFSSL_MSG("Buffer overrun");
  16704. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16705. return NULL;
  16706. }
  16707. XSTRNCAT(tmp, val, valSz);
  16708. }
  16709. if (XSNPRINTF(val, valSz, "%02X", str[i])
  16710. >= valSz)
  16711. {
  16712. WOLFSSL_MSG("Buffer overrun");
  16713. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16714. return NULL;
  16715. }
  16716. XSTRNCAT(tmp, val, valSz);
  16717. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16718. return tmp;
  16719. }
  16720. #endif /* NO_ASN */
  16721. #endif /* OPENSSL_EXTRA */
  16722. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16723. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  16724. {
  16725. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  16726. if (ssl == NULL) {
  16727. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  16728. return;
  16729. }
  16730. #ifndef NO_DH
  16731. /* client creates its own DH parameters on handshake */
  16732. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  16733. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  16734. DYNAMIC_TYPE_PUBLIC_KEY);
  16735. }
  16736. ssl->buffers.serverDH_P.buffer = NULL;
  16737. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  16738. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  16739. DYNAMIC_TYPE_PUBLIC_KEY);
  16740. }
  16741. ssl->buffers.serverDH_G.buffer = NULL;
  16742. #endif
  16743. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  16744. WOLFSSL_MSG("Error initializing client side");
  16745. }
  16746. }
  16747. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16748. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  16749. {
  16750. int isShutdown = 0;
  16751. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  16752. if (ssl) {
  16753. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16754. if (ssl->options.handShakeState == NULL_STATE) {
  16755. /* The SSL object was possibly cleared with wolfSSL_clear after
  16756. * a successful shutdown. Simulate a response for a full
  16757. * bidirectional shutdown. */
  16758. isShutdown = WOLFSSL_SENT_SHUTDOWN | WOLFSSL_RECEIVED_SHUTDOWN;
  16759. }
  16760. else
  16761. #endif
  16762. {
  16763. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  16764. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  16765. if (ssl->options.sentNotify)
  16766. isShutdown |= WOLFSSL_SENT_SHUTDOWN;
  16767. if (ssl->options.closeNotify||ssl->options.connReset)
  16768. isShutdown |= WOLFSSL_RECEIVED_SHUTDOWN;
  16769. }
  16770. }
  16771. return isShutdown;
  16772. }
  16773. int wolfSSL_session_reused(WOLFSSL* ssl)
  16774. {
  16775. int resuming = 0;
  16776. WOLFSSL_ENTER("wolfSSL_session_reused");
  16777. if (ssl)
  16778. resuming = ssl->options.resuming;
  16779. WOLFSSL_LEAVE("wolfSSL_session_reused", resuming);
  16780. return resuming;
  16781. }
  16782. /* return a new malloc'd session with default settings on success */
  16783. WOLFSSL_SESSION* wolfSSL_NewSession(void* heap)
  16784. {
  16785. WOLFSSL_SESSION* ret = NULL;
  16786. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap,
  16787. DYNAMIC_TYPE_SESSION);
  16788. if (ret != NULL) {
  16789. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  16790. #ifndef SINGLE_THREADED
  16791. if (wc_InitMutex(&ret->refMutex) != 0) {
  16792. WOLFSSL_MSG("Error setting up session reference mutex");
  16793. XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION);
  16794. return NULL;
  16795. }
  16796. #endif
  16797. ret->refCount = 1;
  16798. #ifndef NO_SESSION_CACHE
  16799. ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */
  16800. #endif
  16801. ret->type = WOLFSSL_SESSION_TYPE_HEAP;
  16802. ret->heap = heap;
  16803. ret->masterSecret = ret->_masterSecret;
  16804. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16805. wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN);
  16806. wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN);
  16807. #endif
  16808. #ifndef NO_CLIENT_CACHE
  16809. ret->serverID = ret->_serverID;
  16810. #endif
  16811. #ifdef OPENSSL_EXTRA
  16812. ret->sessionCtx = ret->_sessionCtx;
  16813. #endif
  16814. #ifdef HAVE_SESSION_TICKET
  16815. ret->ticket = ret->_staticTicket;
  16816. #endif
  16817. #ifdef HAVE_STUNNEL
  16818. /* stunnel has this funny mechanism of storing the "is_authenticated"
  16819. * session info in the session ex data. This is basically their
  16820. * default so let's just hard code it. */
  16821. if (wolfSSL_SESSION_set_ex_data(ret, 0, (void *)(-1))
  16822. != WOLFSSL_SUCCESS) {
  16823. WOLFSSL_MSG("Error setting up ex data for stunnel");
  16824. XFREE(ret, NULL, DYNAMIC_TYPE_SESSION);
  16825. return NULL;
  16826. }
  16827. #endif
  16828. #ifdef HAVE_EX_DATA
  16829. ret->ownExData = 1;
  16830. #endif
  16831. }
  16832. return ret;
  16833. }
  16834. WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap)
  16835. {
  16836. return wolfSSL_NewSession(heap);
  16837. }
  16838. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  16839. {
  16840. return wolfSSL_SESSION_new_ex(NULL);
  16841. }
  16842. /* add one to session reference count
  16843. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  16844. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  16845. {
  16846. session = ClientSessionToSession(session);
  16847. if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP)
  16848. return WOLFSSL_FAILURE;
  16849. #ifndef SINGLE_THREADED
  16850. if (wc_LockMutex(&session->refMutex) != 0) {
  16851. WOLFSSL_MSG("Failed to lock session mutex");
  16852. return WOLFSSL_FAILURE;
  16853. }
  16854. #endif
  16855. session->refCount++;
  16856. #ifndef SINGLE_THREADED
  16857. wc_UnLockMutex(&session->refMutex);
  16858. #endif
  16859. return WOLFSSL_SUCCESS;
  16860. }
  16861. /**
  16862. * Deep copy the contents from input to output.
  16863. * @param input The source of the copy.
  16864. * @param output The destination of the copy.
  16865. * @param avoidSysCalls If true, then system calls will be avoided or an error
  16866. * will be returned if it is not possible to proceed
  16867. * without a system call. This is useful for fetching
  16868. * sessions from cache. When a cache row is locked, we
  16869. * don't want to block other threads with long running
  16870. * system calls.
  16871. * @return WOLFSSL_SUCCESS on success
  16872. * WOLFSSL_FAILURE on failure
  16873. */
  16874. int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output,
  16875. int avoidSysCalls)
  16876. {
  16877. #ifdef HAVE_SESSION_TICKET
  16878. int ticLenAlloc = 0;
  16879. byte *ticBuff = NULL;
  16880. #endif
  16881. const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + sizeof(input->heap);
  16882. int ret = WOLFSSL_SUCCESS;
  16883. (void)avoidSysCalls;
  16884. input = ClientSessionToSession(input);
  16885. output = ClientSessionToSession(output);
  16886. if (input == NULL || output == NULL || input == output) {
  16887. WOLFSSL_MSG("input or output are null or same");
  16888. return WOLFSSL_FAILURE;
  16889. }
  16890. #ifdef HAVE_SESSION_TICKET
  16891. if (output->ticket != output->_staticTicket) {
  16892. ticBuff = output->ticket;
  16893. ticLenAlloc = output->ticketLenAlloc;
  16894. }
  16895. #endif
  16896. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16897. if (output->peer != NULL) {
  16898. if (avoidSysCalls) {
  16899. WOLFSSL_MSG("Can't free cert when avoiding syscalls");
  16900. return WOLFSSL_FAILURE;
  16901. }
  16902. wolfSSL_X509_free(output->peer);
  16903. output->peer = NULL;
  16904. }
  16905. #endif
  16906. XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset,
  16907. sizeof(WOLFSSL_SESSION) - copyOffset);
  16908. /* Set sane values for copy */
  16909. if (output->type != WOLFSSL_SESSION_TYPE_CACHE)
  16910. #ifndef NO_SESSION_CACHE
  16911. output->cacheRow = INVALID_SESSION_ROW;
  16912. #endif
  16913. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16914. if (input->peer != NULL && input->peer->dynamicMemory) {
  16915. if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) {
  16916. WOLFSSL_MSG("Can't increase peer cert ref count");
  16917. output->peer = NULL;
  16918. }
  16919. }
  16920. else if (!avoidSysCalls)
  16921. output->peer = wolfSSL_X509_dup(input->peer);
  16922. else
  16923. /* output->peer is not that important to copy */
  16924. output->peer = NULL;
  16925. #endif
  16926. output->masterSecret = output->_masterSecret;
  16927. #ifndef NO_CLIENT_CACHE
  16928. output->serverID = output->_serverID;
  16929. #endif
  16930. #ifdef OPENSSL_EXTRA
  16931. output->sessionCtx = output->_sessionCtx;
  16932. #endif
  16933. #ifdef HAVE_SESSION_TICKET
  16934. if (input->ticketLen > SESSION_TICKET_LEN) {
  16935. /* Need dynamic buffer */
  16936. if (ticBuff == NULL || ticLenAlloc < input->ticketLen) {
  16937. /* allocate new one */
  16938. byte* tmp;
  16939. if (!avoidSysCalls) {
  16940. WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding"
  16941. " syscalls");
  16942. output->ticket = ticBuff;
  16943. output->ticketLenAlloc = (word16) ticLenAlloc;
  16944. output->ticketLen = 0;
  16945. ret = WOLFSSL_FAILURE;
  16946. }
  16947. else {
  16948. tmp = (byte*)XREALLOC(ticBuff, input->ticketLen,
  16949. output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16950. if (tmp == NULL) {
  16951. WOLFSSL_MSG("Failed to allocate memory for ticket");
  16952. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16953. output->ticket = NULL;
  16954. output->ticketLen = 0;
  16955. output->ticketLenAlloc = 0;
  16956. ret = WOLFSSL_FAILURE;
  16957. }
  16958. else {
  16959. ticBuff = tmp;
  16960. ticLenAlloc = input->ticketLen;
  16961. }
  16962. }
  16963. }
  16964. if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) {
  16965. XMEMCPY(ticBuff, input->ticket, input->ticketLen);
  16966. output->ticket = ticBuff;
  16967. output->ticketLenAlloc = (word16) ticLenAlloc;
  16968. }
  16969. }
  16970. else {
  16971. /* Default ticket to non dynamic */
  16972. if (avoidSysCalls) {
  16973. /* Try to use ticBuf if available. Caller can later move it to
  16974. * the static buffer. */
  16975. if (ticBuff != NULL) {
  16976. if (ticLenAlloc >= input->ticketLen) {
  16977. output->ticket = output->_staticTicket;
  16978. output->ticketLenAlloc = 0;
  16979. }
  16980. else {
  16981. WOLFSSL_MSG("ticket dynamic buffer too small but we are "
  16982. "avoiding system calls");
  16983. ret = WOLFSSL_FAILURE;
  16984. output->ticket = ticBuff;
  16985. output->ticketLenAlloc = (word16) ticLenAlloc;
  16986. output->ticketLen = 0;
  16987. }
  16988. }
  16989. else {
  16990. output->ticket = output->_staticTicket;
  16991. output->ticketLenAlloc = 0;
  16992. }
  16993. }
  16994. else {
  16995. if (ticBuff != NULL)
  16996. XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK);
  16997. output->ticket = output->_staticTicket;
  16998. output->ticketLenAlloc = 0;
  16999. }
  17000. if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) {
  17001. /* Shouldn't happen as session should have placed this in
  17002. * the static buffer */
  17003. XMEMCPY(output->ticket, input->ticket,
  17004. input->ticketLen);
  17005. }
  17006. }
  17007. ticBuff = NULL;
  17008. #endif /* HAVE_SESSION_TICKET */
  17009. return ret;
  17010. }
  17011. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  17012. {
  17013. #ifdef HAVE_EXT_CACHE
  17014. WOLFSSL_SESSION* copy;
  17015. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  17016. session = ClientSessionToSession(session);
  17017. if (session == NULL)
  17018. return NULL;
  17019. #ifdef HAVE_SESSION_TICKET
  17020. if (session->ticketLenAlloc > 0 && !session->ticket) {
  17021. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  17022. return NULL;
  17023. }
  17024. #endif
  17025. copy = wolfSSL_NewSession(session->heap);
  17026. if (copy != NULL &&
  17027. wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) {
  17028. wolfSSL_FreeSession(NULL, copy);
  17029. copy = NULL;
  17030. }
  17031. return copy;
  17032. #else
  17033. WOLFSSL_MSG("wolfSSL_SESSION_dup feature not compiled in");
  17034. (void)session;
  17035. return NULL;
  17036. #endif /* HAVE_EXT_CACHE */
  17037. }
  17038. void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17039. {
  17040. session = ClientSessionToSession(session);
  17041. if (session == NULL)
  17042. return;
  17043. (void)ctx;
  17044. /* refCount will always be 1 or more if created externally.
  17045. * Internal cache sessions don't initialize a refMutex. */
  17046. if (session->refCount > 0) {
  17047. #ifndef SINGLE_THREADED
  17048. if (wc_LockMutex(&session->refMutex) != 0) {
  17049. WOLFSSL_MSG("Failed to lock session mutex");
  17050. return;
  17051. }
  17052. #endif
  17053. if (session->refCount > 1) {
  17054. session->refCount--;
  17055. #ifndef SINGLE_THREADED
  17056. wc_UnLockMutex(&session->refMutex);
  17057. #endif
  17058. return;
  17059. }
  17060. #ifndef SINGLE_THREADED
  17061. wc_UnLockMutex(&session->refMutex);
  17062. wc_FreeMutex(&session->refMutex);
  17063. #endif
  17064. }
  17065. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  17066. if (ctx != NULL && ctx->rem_sess_cb
  17067. #ifdef HAVE_EX_DATA
  17068. && session->ownExData /* This will be true if we are not using the
  17069. * internal cache so it will get called for
  17070. * externally cached sessions as well. */
  17071. #endif
  17072. ) {
  17073. ctx->rem_sess_cb(ctx, session);
  17074. }
  17075. #endif
  17076. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17077. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17078. #endif
  17079. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17080. if (session->peer) {
  17081. wolfSSL_X509_free(session->peer);
  17082. session->peer = NULL;
  17083. }
  17084. #endif
  17085. #ifdef HAVE_SESSION_TICKET
  17086. if (session->ticketLenAlloc > 0) {
  17087. XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK);
  17088. }
  17089. #endif
  17090. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17091. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  17092. #endif
  17093. /* Make sure masterSecret is zeroed. */
  17094. ForceZero(session->masterSecret, SECRET_LEN);
  17095. /* Session ID is sensitive information too. */
  17096. ForceZero(session->sessionID, ID_LEN);
  17097. if (session->type == WOLFSSL_SESSION_TYPE_HEAP) {
  17098. XFREE(session, session->heap, DYNAMIC_TYPE_SESSION);
  17099. }
  17100. }
  17101. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  17102. {
  17103. session = ClientSessionToSession(session);
  17104. wolfSSL_FreeSession(NULL, session);
  17105. }
  17106. #ifndef NO_SESSION_CACHE
  17107. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  17108. {
  17109. int error = 0;
  17110. const byte* id = NULL;
  17111. byte idSz = 0;
  17112. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  17113. session = ClientSessionToSession(session);
  17114. if (session == NULL)
  17115. return WOLFSSL_FAILURE;
  17116. /* Session cache is global */
  17117. (void)ctx;
  17118. id = session->sessionID;
  17119. idSz = session->sessionIDSz;
  17120. if (session->haveAltSessionID) {
  17121. id = session->altSessionID;
  17122. idSz = ID_LEN;
  17123. }
  17124. error = AddSessionToCache(ctx, session, id, idSz,
  17125. NULL, session->side,
  17126. #ifdef HAVE_SESSION_TICKET
  17127. session->ticketLen > 0,
  17128. #else
  17129. 0,
  17130. #endif
  17131. NULL);
  17132. return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  17133. }
  17134. #endif
  17135. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  17136. /**
  17137. * set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER
  17138. * @param session a pointer to WOLFSSL_SESSION structure
  17139. * @param cipher a function pointer to WOLFSSL_CIPHER
  17140. * @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE
  17141. */
  17142. int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session,
  17143. const WOLFSSL_CIPHER* cipher)
  17144. {
  17145. WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher");
  17146. session = ClientSessionToSession(session);
  17147. /* sanity check */
  17148. if (session == NULL || cipher == NULL) {
  17149. WOLFSSL_MSG("bad argument");
  17150. return WOLFSSL_FAILURE;
  17151. }
  17152. session->cipherSuite0 = cipher->cipherSuite0;
  17153. session->cipherSuite = cipher->cipherSuite;
  17154. WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS);
  17155. return WOLFSSL_SUCCESS;
  17156. }
  17157. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  17158. /* helper function that takes in a protocol version struct and returns string */
  17159. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  17160. {
  17161. WOLFSSL_ENTER("wolfSSL_get_version");
  17162. if (version == NULL) {
  17163. return "Bad arg";
  17164. }
  17165. if (version->major == SSLv3_MAJOR) {
  17166. switch (version->minor) {
  17167. case SSLv3_MINOR :
  17168. return "SSLv3";
  17169. case TLSv1_MINOR :
  17170. return "TLSv1";
  17171. case TLSv1_1_MINOR :
  17172. return "TLSv1.1";
  17173. case TLSv1_2_MINOR :
  17174. return "TLSv1.2";
  17175. case TLSv1_3_MINOR :
  17176. return "TLSv1.3";
  17177. default:
  17178. return "unknown";
  17179. }
  17180. }
  17181. #ifdef WOLFSSL_DTLS
  17182. else if (version->major == DTLS_MAJOR) {
  17183. switch (version->minor) {
  17184. case DTLS_MINOR :
  17185. return "DTLS";
  17186. case DTLSv1_2_MINOR :
  17187. return "DTLSv1.2";
  17188. case DTLSv1_3_MINOR :
  17189. return "DTLSv1.3";
  17190. default:
  17191. return "unknown";
  17192. }
  17193. }
  17194. #endif /* WOLFSSL_DTLS */
  17195. return "unknown";
  17196. }
  17197. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  17198. {
  17199. if (ssl == NULL) {
  17200. WOLFSSL_MSG("Bad argument");
  17201. return "unknown";
  17202. }
  17203. return wolfSSL_internal_get_version(&ssl->version);
  17204. }
  17205. /* current library version */
  17206. const char* wolfSSL_lib_version(void)
  17207. {
  17208. return LIBWOLFSSL_VERSION_STRING;
  17209. }
  17210. #ifdef OPENSSL_EXTRA
  17211. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  17212. const char* wolfSSL_OpenSSL_version(int a)
  17213. {
  17214. (void)a;
  17215. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17216. }
  17217. #else
  17218. const char* wolfSSL_OpenSSL_version(void)
  17219. {
  17220. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  17221. }
  17222. #endif /* WOLFSSL_QT */
  17223. #endif
  17224. /* current library version in hex */
  17225. word32 wolfSSL_lib_version_hex(void)
  17226. {
  17227. return LIBWOLFSSL_VERSION_HEX;
  17228. }
  17229. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  17230. {
  17231. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  17232. if (ssl)
  17233. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  17234. return 0;
  17235. }
  17236. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  17237. {
  17238. WOLFSSL_ENTER("SSL_get_current_cipher");
  17239. if (ssl) {
  17240. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  17241. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  17242. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17243. ssl->cipher.bits = ssl->specs.key_size * 8;
  17244. #endif
  17245. return &ssl->cipher;
  17246. }
  17247. else
  17248. return NULL;
  17249. }
  17250. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  17251. {
  17252. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  17253. if (cipher == NULL) {
  17254. return NULL;
  17255. }
  17256. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  17257. !defined(WOLFSSL_QT)
  17258. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  17259. #else
  17260. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  17261. cipher->cipherSuite);
  17262. #endif
  17263. }
  17264. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  17265. {
  17266. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  17267. if (cipher == NULL || cipher->ssl == NULL) {
  17268. return NULL;
  17269. }
  17270. return wolfSSL_get_version(cipher->ssl);
  17271. }
  17272. const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session)
  17273. {
  17274. session = ClientSessionToSession(session);
  17275. if (session == NULL) {
  17276. return NULL;
  17277. }
  17278. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  17279. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  17280. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  17281. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  17282. #else
  17283. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  17284. #endif
  17285. #else
  17286. return NULL;
  17287. #endif
  17288. }
  17289. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  17290. {
  17291. WOLFSSL_ENTER("wolfSSL_get_cipher");
  17292. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  17293. }
  17294. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  17295. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  17296. {
  17297. /* get access to cipher_name_idx in internal.c */
  17298. return wolfSSL_get_cipher_name_internal(ssl);
  17299. }
  17300. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  17301. const byte cipherSuite)
  17302. {
  17303. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  17304. }
  17305. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  17306. const byte cipherSuite)
  17307. {
  17308. return GetCipherNameIana(cipherSuite0, cipherSuite);
  17309. }
  17310. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  17311. byte* cipherSuite, int *flags) {
  17312. if ((name == NULL) ||
  17313. (cipherSuite0 == NULL) ||
  17314. (cipherSuite == NULL) ||
  17315. (flags == NULL))
  17316. return BAD_FUNC_ARG;
  17317. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  17318. }
  17319. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17320. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17321. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  17322. {
  17323. WOLFSSL_STACK* sk;
  17324. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  17325. sk = wolfSSL_sk_new_null();
  17326. if (sk == NULL)
  17327. return NULL;
  17328. sk->type = STACK_TYPE_CIPHER;
  17329. return sk;
  17330. }
  17331. /* return 1 on success 0 on fail */
  17332. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  17333. WOLFSSL_CIPHER* cipher)
  17334. {
  17335. return wolfSSL_sk_push(sk, cipher);
  17336. }
  17337. #ifndef NO_WOLFSSL_STUB
  17338. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17339. {
  17340. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  17341. (void)sk;
  17342. return NULL;
  17343. }
  17344. #endif /* NO_WOLFSSL_STUB */
  17345. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17346. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  17347. {
  17348. word16 cipher_id = 0;
  17349. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  17350. if (cipher && cipher->ssl) {
  17351. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  17352. cipher->ssl->options.cipherSuite;
  17353. }
  17354. return cipher_id;
  17355. }
  17356. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  17357. {
  17358. const WOLFSSL_CIPHER* cipher = NULL;
  17359. byte cipherSuite0, cipherSuite;
  17360. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  17361. /* extract cipher id information */
  17362. cipherSuite = (value & 0xFF);
  17363. cipherSuite0 = ((value >> 8) & 0xFF);
  17364. /* TODO: lookup by cipherSuite0 / cipherSuite */
  17365. (void)cipherSuite0;
  17366. (void)cipherSuite;
  17367. return cipher;
  17368. }
  17369. #if defined(OPENSSL_EXTRA)
  17370. /* Free the structure for WOLFSSL_CIPHER stack
  17371. *
  17372. * sk stack to free nodes in
  17373. */
  17374. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  17375. {
  17376. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  17377. wolfSSL_sk_free(sk);
  17378. }
  17379. #endif /* OPENSSL_ALL */
  17380. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  17381. !defined(NO_DH)
  17382. #ifdef HAVE_FFDHE
  17383. static const char* wolfssl_ffdhe_name(word16 group)
  17384. {
  17385. const char* str = NULL;
  17386. switch (group) {
  17387. case WOLFSSL_FFDHE_2048:
  17388. str = "FFDHE_2048";
  17389. break;
  17390. case WOLFSSL_FFDHE_3072:
  17391. str = "FFDHE_3072";
  17392. break;
  17393. case WOLFSSL_FFDHE_4096:
  17394. str = "FFDHE_4096";
  17395. break;
  17396. case WOLFSSL_FFDHE_6144:
  17397. str = "FFDHE_6144";
  17398. break;
  17399. case WOLFSSL_FFDHE_8192:
  17400. str = "FFDHE_8192";
  17401. break;
  17402. default:
  17403. break;
  17404. }
  17405. return str;
  17406. }
  17407. #endif
  17408. /* Return the name of the curve used for key exchange as a printable string.
  17409. *
  17410. * ssl The SSL/TLS object.
  17411. * returns NULL if ECDH was not used, otherwise the name as a string.
  17412. */
  17413. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  17414. {
  17415. const char* cName = NULL;
  17416. if (ssl == NULL)
  17417. return NULL;
  17418. #if defined(WOLFSSL_TLS13) && defined(HAVE_PQC)
  17419. /* Check for post-quantum groups. Return now because we do not want the ECC
  17420. * check to override this result in the case of a hybrid. */
  17421. if (IsAtLeastTLSv1_3(ssl->version)) {
  17422. switch (ssl->namedGroup) {
  17423. #ifdef HAVE_LIBOQS
  17424. case WOLFSSL_KYBER_LEVEL1:
  17425. return "KYBER_LEVEL1";
  17426. case WOLFSSL_KYBER_LEVEL3:
  17427. return "KYBER_LEVEL3";
  17428. case WOLFSSL_KYBER_LEVEL5:
  17429. return "KYBER_LEVEL5";
  17430. case WOLFSSL_NTRU_HPS_LEVEL1:
  17431. return "NTRU_HPS_LEVEL1";
  17432. case WOLFSSL_NTRU_HPS_LEVEL3:
  17433. return "NTRU_HPS_LEVEL3";
  17434. case WOLFSSL_NTRU_HPS_LEVEL5:
  17435. return "NTRU_HPS_LEVEL5";
  17436. case WOLFSSL_NTRU_HRSS_LEVEL3:
  17437. return "NTRU_HRSS_LEVEL3";
  17438. case WOLFSSL_SABER_LEVEL1:
  17439. return "SABER_LEVEL1";
  17440. case WOLFSSL_SABER_LEVEL3:
  17441. return "SABER_LEVEL3";
  17442. case WOLFSSL_SABER_LEVEL5:
  17443. return "SABER_LEVEL5";
  17444. case WOLFSSL_KYBER_90S_LEVEL1:
  17445. return "KYBER_90S_LEVEL1";
  17446. case WOLFSSL_KYBER_90S_LEVEL3:
  17447. return "KYBER_90S_LEVEL3";
  17448. case WOLFSSL_KYBER_90S_LEVEL5:
  17449. return "KYBER_90S_LEVEL5";
  17450. case WOLFSSL_P256_NTRU_HPS_LEVEL1:
  17451. return "P256_NTRU_HPS_LEVEL1";
  17452. case WOLFSSL_P384_NTRU_HPS_LEVEL3:
  17453. return "P384_NTRU_HPS_LEVEL3";
  17454. case WOLFSSL_P521_NTRU_HPS_LEVEL5:
  17455. return "P521_NTRU_HPS_LEVEL5";
  17456. case WOLFSSL_P384_NTRU_HRSS_LEVEL3:
  17457. return "P384_NTRU_HRSS_LEVEL3";
  17458. case WOLFSSL_P256_SABER_LEVEL1:
  17459. return "P256_SABER_LEVEL1";
  17460. case WOLFSSL_P384_SABER_LEVEL3:
  17461. return "P384_SABER_LEVEL3";
  17462. case WOLFSSL_P521_SABER_LEVEL5:
  17463. return "P521_SABER_LEVEL5";
  17464. case WOLFSSL_P256_KYBER_LEVEL1:
  17465. return "P256_KYBER_LEVEL1";
  17466. case WOLFSSL_P384_KYBER_LEVEL3:
  17467. return "P384_KYBER_LEVEL3";
  17468. case WOLFSSL_P521_KYBER_LEVEL5:
  17469. return "P521_KYBER_LEVEL5";
  17470. case WOLFSSL_P256_KYBER_90S_LEVEL1:
  17471. return "P256_KYBER_90S_LEVEL1";
  17472. case WOLFSSL_P384_KYBER_90S_LEVEL3:
  17473. return "P384_KYBER_90S_LEVEL3";
  17474. case WOLFSSL_P521_KYBER_90S_LEVEL5:
  17475. return "P521_KYBER_90S_LEVEL5";
  17476. #elif defined(HAVE_PQM4)
  17477. case WOLFSSL_KYBER_LEVEL1:
  17478. return "KYBER_LEVEL1";
  17479. #endif
  17480. }
  17481. }
  17482. #endif /* WOLFSSL_TLS13 && HAVE_PQC */
  17483. #ifdef HAVE_FFDHE
  17484. if (ssl->namedGroup != 0) {
  17485. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  17486. }
  17487. #endif
  17488. #ifdef HAVE_CURVE25519
  17489. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  17490. cName = "X25519";
  17491. }
  17492. #endif
  17493. #ifdef HAVE_CURVE448
  17494. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  17495. cName = "X448";
  17496. }
  17497. #endif
  17498. #ifdef HAVE_ECC
  17499. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  17500. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  17501. NULL));
  17502. }
  17503. #endif
  17504. return cName;
  17505. }
  17506. #endif
  17507. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17508. defined(OPENSSL_EXTRA_X509_SMALL)
  17509. /* Creates a new WOLFSSL_ASN1_STRING structure.
  17510. *
  17511. * returns a pointer to the new structure created on success or NULL if fail
  17512. */
  17513. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  17514. {
  17515. WOLFSSL_ASN1_STRING* asn1;
  17516. #ifdef WOLFSSL_DEBUG_OPENSSL
  17517. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  17518. #endif
  17519. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  17520. DYNAMIC_TYPE_OPENSSL);
  17521. if (asn1 != NULL) {
  17522. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  17523. }
  17524. return asn1; /* no check for null because error case is returning null*/
  17525. }
  17526. /**
  17527. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  17528. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  17529. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  17530. */
  17531. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  17532. {
  17533. WOLFSSL_ASN1_STRING* dupl = NULL;
  17534. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  17535. if (!asn1) {
  17536. WOLFSSL_MSG("Bad parameter");
  17537. return NULL;
  17538. }
  17539. dupl = wolfSSL_ASN1_STRING_new();
  17540. if (!dupl) {
  17541. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  17542. return NULL;
  17543. }
  17544. dupl->type = asn1->type;
  17545. dupl->flags = asn1->flags;
  17546. if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
  17547. != WOLFSSL_SUCCESS) {
  17548. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  17549. wolfSSL_ASN1_STRING_free(dupl);
  17550. return NULL;
  17551. }
  17552. return dupl;
  17553. }
  17554. /* used to free a WOLFSSL_ASN1_STRING structure */
  17555. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  17556. {
  17557. #ifdef WOLFSSL_DEBUG_OPENSSL
  17558. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  17559. #endif
  17560. if (asn1 != NULL) {
  17561. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  17562. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  17563. }
  17564. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  17565. }
  17566. }
  17567. int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
  17568. {
  17569. int i;
  17570. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
  17571. if (!a || !b) {
  17572. return WOLFSSL_FATAL_ERROR;
  17573. }
  17574. if (a->length != b->length) {
  17575. return a->length - b->length;
  17576. }
  17577. if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
  17578. return i;
  17579. }
  17580. return a->type - b->type;
  17581. }
  17582. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17583. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  17584. defined(OPENSSL_EXTRA_X509_SMALL))
  17585. int wolfSSL_ASN1_STRING_copy(WOLFSSL_ASN1_STRING* dest,
  17586. const WOLFSSL_ASN1_STRING* src)
  17587. {
  17588. if (src == NULL || dest == NULL) {
  17589. return WOLFSSL_FAILURE;
  17590. }
  17591. dest->type = src->type;
  17592. if(wolfSSL_ASN1_STRING_set(dest, src->data, src->length)
  17593. != WOLFSSL_SUCCESS) {
  17594. return WOLFSSL_FAILURE;
  17595. }
  17596. dest->flags = src->flags;
  17597. return WOLFSSL_SUCCESS;
  17598. }
  17599. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  17600. *
  17601. * type is the type of set when WOLFSSL_ASN1_STRING is created
  17602. *
  17603. * returns a pointer to the new structure created on success or NULL if fail
  17604. */
  17605. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  17606. {
  17607. WOLFSSL_ASN1_STRING* asn1;
  17608. #ifdef WOLFSSL_DEBUG_OPENSSL
  17609. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  17610. #endif
  17611. asn1 = wolfSSL_ASN1_STRING_new();
  17612. if (asn1 == NULL) {
  17613. return NULL;
  17614. }
  17615. asn1->type = type;
  17616. return asn1;
  17617. }
  17618. /******************************************************************************
  17619. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  17620. *
  17621. * RETURNS:
  17622. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  17623. */
  17624. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  17625. {
  17626. #ifdef WOLFSSL_DEBUG_OPENSSL
  17627. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  17628. #endif
  17629. if (asn1 == NULL) {
  17630. return WOLFSSL_FAILURE;
  17631. }
  17632. return asn1->type;
  17633. }
  17634. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  17635. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17636. defined(OPENSSL_EXTRA_X509_SMALL)
  17637. /* if dataSz is negative then use XSTRLEN to find length of data
  17638. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  17639. /* `data` can be NULL and only buffer will be allocated */
  17640. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  17641. int dataSz)
  17642. {
  17643. int sz;
  17644. #ifdef WOLFSSL_DEBUG_OPENSSL
  17645. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  17646. #endif
  17647. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  17648. return WOLFSSL_FAILURE;
  17649. }
  17650. if (dataSz < 0) {
  17651. sz = (int)XSTRLEN((const char*)data);
  17652. }
  17653. else {
  17654. sz = dataSz;
  17655. }
  17656. if (sz < 0) {
  17657. return WOLFSSL_FAILURE;
  17658. }
  17659. /* free any existing data before copying */
  17660. if (asn1->data != NULL && asn1->isDynamic) {
  17661. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  17662. asn1->data = NULL;
  17663. }
  17664. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  17665. /* create new data buffer and copy over */
  17666. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  17667. if (asn1->data == NULL) {
  17668. return WOLFSSL_FAILURE;
  17669. }
  17670. asn1->isDynamic = 1;
  17671. }
  17672. else {
  17673. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  17674. asn1->data = asn1->strData;
  17675. asn1->isDynamic = 0;
  17676. }
  17677. if (data != NULL) {
  17678. XMEMCPY(asn1->data, data, sz);
  17679. asn1->data[sz] = '\0';
  17680. }
  17681. asn1->length = sz;
  17682. return WOLFSSL_SUCCESS;
  17683. }
  17684. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17685. #ifndef NO_CERTS
  17686. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  17687. const unsigned char* wolfSSL_ASN1_STRING_get0_data(
  17688. const WOLFSSL_ASN1_STRING* asn)
  17689. {
  17690. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_get0_data");
  17691. if (asn) {
  17692. return (const unsigned char*)asn->data;
  17693. } else {
  17694. return NULL;
  17695. }
  17696. }
  17697. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  17698. {
  17699. #ifdef WOLFSSL_DEBUG_OPENSSL
  17700. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  17701. #endif
  17702. if (asn) {
  17703. return (unsigned char*)asn->data;
  17704. }
  17705. else {
  17706. return NULL;
  17707. }
  17708. }
  17709. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  17710. {
  17711. #ifdef WOLFSSL_DEBUG_OPENSSL
  17712. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  17713. #endif
  17714. if (asn) {
  17715. return asn->length;
  17716. }
  17717. else {
  17718. return 0;
  17719. }
  17720. }
  17721. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  17722. #ifdef OPENSSL_EXTRA
  17723. #ifndef NO_WOLFSSL_STUB
  17724. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  17725. const unsigned char **in, long len)
  17726. {
  17727. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  17728. (void)asn;
  17729. (void)in;
  17730. (void)len;
  17731. return NULL;
  17732. }
  17733. #endif
  17734. #endif /* OPENSSL_EXTRA */
  17735. #endif /* !NO_CERTS */
  17736. #ifdef OPENSSL_EXTRA
  17737. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17738. /* return authentication NID corresponding to cipher suite
  17739. * @param cipher a pointer to WOLFSSL_CIPHER
  17740. * return NID if found, NID_undef if not found
  17741. */
  17742. int wolfSSL_CIPHER_get_auth_nid(const WOLFSSL_CIPHER* cipher)
  17743. {
  17744. static const struct authnid {
  17745. const char* alg_name;
  17746. const int nid;
  17747. } authnid_tbl[] = {
  17748. {"RSA", NID_auth_rsa},
  17749. {"PSK", NID_auth_psk},
  17750. {"SRP", NID_auth_srp},
  17751. {"ECDSA", NID_auth_ecdsa},
  17752. {"None", NID_auth_null},
  17753. {NULL, NID_undef}
  17754. };
  17755. const struct authnid* sa;
  17756. const char* authStr;
  17757. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17758. if (GetCipherSegment(cipher, n) == NULL) {
  17759. WOLFSSL_MSG("no suitable cipher name found");
  17760. return NID_undef;
  17761. }
  17762. authStr = GetCipherAuthStr(n);
  17763. if (authStr != NULL) {
  17764. for(sa = authnid_tbl; sa->alg_name != NULL; sa++) {
  17765. if (XSTRCMP(sa->alg_name, authStr) == 0) {
  17766. return sa->nid;
  17767. }
  17768. }
  17769. }
  17770. return NID_undef;
  17771. }
  17772. /* return cipher NID corresponding to cipher suite
  17773. * @param cipher a pointer to WOLFSSL_CIPHER
  17774. * return NID if found, NID_undef if not found
  17775. */
  17776. int wolfSSL_CIPHER_get_cipher_nid(const WOLFSSL_CIPHER* cipher)
  17777. {
  17778. static const struct ciphernid {
  17779. const char* alg_name;
  17780. const int nid;
  17781. } ciphernid_tbl[] = {
  17782. {"AESGCM(256)", NID_aes_256_gcm},
  17783. {"AESGCM(128)", NID_aes_128_gcm},
  17784. {"AESCCM(128)", NID_aes_128_ccm},
  17785. {"AES(128)", NID_aes_128_cbc},
  17786. {"AES(256)", NID_aes_256_cbc},
  17787. {"CAMELLIA(256)", NID_camellia_256_cbc},
  17788. {"CAMELLIA(128)", NID_camellia_128_cbc},
  17789. {"RC4", NID_rc4},
  17790. {"3DES", NID_des_ede3_cbc},
  17791. {"CHACHA20/POLY1305(256)", NID_chacha20_poly1305},
  17792. {"None", NID_undef},
  17793. {NULL, NID_undef}
  17794. };
  17795. const struct ciphernid* c;
  17796. const char* encStr;
  17797. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17798. WOLFSSL_ENTER("wolfSSL_CIPHER_get_cipher_nid");
  17799. if (GetCipherSegment(cipher, n) == NULL) {
  17800. WOLFSSL_MSG("no suitable cipher name found");
  17801. return NID_undef;
  17802. }
  17803. encStr = GetCipherEncStr(n);
  17804. if (encStr != NULL) {
  17805. for(c = ciphernid_tbl; c->alg_name != NULL; c++) {
  17806. if (XSTRCMP(c->alg_name, encStr) == 0) {
  17807. return c->nid;
  17808. }
  17809. }
  17810. }
  17811. return NID_undef;
  17812. }
  17813. /* return digest NID corresponding to cipher suite
  17814. * @param cipher a pointer to WOLFSSL_CIPHER
  17815. * return NID if found, NID_undef if not found
  17816. */
  17817. int wolfSSL_CIPHER_get_digest_nid(const WOLFSSL_CIPHER* cipher)
  17818. {
  17819. static const struct macnid {
  17820. const char* alg_name;
  17821. const int nid;
  17822. } macnid_tbl[] = {
  17823. {"SHA1", NID_sha1},
  17824. {"SHA256", NID_sha256},
  17825. {"SHA384", NID_sha384},
  17826. {NULL, NID_undef}
  17827. };
  17828. const struct macnid* mc;
  17829. const char* name;
  17830. const char* macStr;
  17831. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17832. (void)name;
  17833. WOLFSSL_ENTER("wolfSSL_CIPHER_get_digest_nid");
  17834. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17835. WOLFSSL_MSG("no suitable cipher name found");
  17836. return NID_undef;
  17837. }
  17838. /* in MD5 case, NID will be NID_md5 */
  17839. if (XSTRSTR(name, "MD5") != NULL) {
  17840. return NID_md5;
  17841. }
  17842. macStr = GetCipherMacStr(n);
  17843. if (macStr != NULL) {
  17844. for(mc = macnid_tbl; mc->alg_name != NULL; mc++) {
  17845. if (XSTRCMP(mc->alg_name, macStr) == 0) {
  17846. return mc->nid;
  17847. }
  17848. }
  17849. }
  17850. return NID_undef;
  17851. }
  17852. /* return key exchange NID corresponding to cipher suite
  17853. * @param cipher a pointer to WOLFSSL_CIPHER
  17854. * return NID if found, NID_undef if not found
  17855. */
  17856. int wolfSSL_CIPHER_get_kx_nid(const WOLFSSL_CIPHER* cipher)
  17857. {
  17858. static const struct kxnid {
  17859. const char* name;
  17860. const int nid;
  17861. } kxnid_table[] = {
  17862. {"ECDHEPSK", NID_kx_ecdhe_psk},
  17863. {"ECDH", NID_kx_ecdhe},
  17864. {"DHEPSK", NID_kx_dhe_psk},
  17865. {"DH", NID_kx_dhe},
  17866. {"RSAPSK", NID_kx_rsa_psk},
  17867. {"SRP", NID_kx_srp},
  17868. {"EDH", NID_kx_dhe},
  17869. {"RSA", NID_kx_rsa},
  17870. {NULL, NID_undef}
  17871. };
  17872. const struct kxnid* k;
  17873. const char* keaStr;
  17874. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17875. WOLFSSL_ENTER("wolfSSL_CIPHER_get_kx_nid");
  17876. if (GetCipherSegment(cipher, n) == NULL) {
  17877. WOLFSSL_MSG("no suitable cipher name found");
  17878. return NID_undef;
  17879. }
  17880. /* in TLS 1.3 case, NID will be NID_kx_any */
  17881. if (XSTRCMP(n[0], "TLS13") == 0) {
  17882. return NID_kx_any;
  17883. }
  17884. keaStr = GetCipherKeaStr(n);
  17885. if (keaStr != NULL) {
  17886. for(k = kxnid_table; k->name != NULL; k++) {
  17887. if (XSTRCMP(k->name, keaStr) == 0) {
  17888. return k->nid;
  17889. }
  17890. }
  17891. }
  17892. return NID_undef;
  17893. }
  17894. /* check if cipher suite is AEAD
  17895. * @param cipher a pointer to WOLFSSL_CIPHER
  17896. * return 1 if cipher is AEAD, 0 otherwise
  17897. */
  17898. int wolfSSL_CIPHER_is_aead(const WOLFSSL_CIPHER* cipher)
  17899. {
  17900. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17901. WOLFSSL_ENTER("wolfSSL_CIPHER_is_aead");
  17902. if (GetCipherSegment(cipher, n) == NULL) {
  17903. WOLFSSL_MSG("no suitable cipher name found");
  17904. return NID_undef;
  17905. }
  17906. return IsCipherAEAD(n);
  17907. }
  17908. /* Creates cipher->description based on cipher->offset
  17909. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  17910. * to a stack of ciphers.
  17911. * @param [in] cipher: A cipher from a stack of ciphers.
  17912. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  17913. */
  17914. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  17915. {
  17916. int strLen;
  17917. unsigned long offset;
  17918. char* dp;
  17919. const char* name;
  17920. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  17921. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17922. int len = MAX_DESCRIPTION_SZ-1;
  17923. const CipherSuiteInfo* cipher_names;
  17924. ProtocolVersion pv;
  17925. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  17926. if (cipher == NULL)
  17927. return WOLFSSL_FAILURE;
  17928. dp = cipher->description;
  17929. if (dp == NULL)
  17930. return WOLFSSL_FAILURE;
  17931. cipher_names = GetCipherNames();
  17932. offset = cipher->offset;
  17933. if (offset >= (unsigned long)GetCipherNamesSize())
  17934. return WOLFSSL_FAILURE;
  17935. pv.major = cipher_names[offset].major;
  17936. pv.minor = cipher_names[offset].minor;
  17937. protocol = wolfSSL_internal_get_version(&pv);
  17938. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  17939. WOLFSSL_MSG("no suitable cipher name found");
  17940. return WOLFSSL_FAILURE;
  17941. }
  17942. /* keaStr */
  17943. keaStr = GetCipherKeaStr(n);
  17944. /* authStr */
  17945. authStr = GetCipherAuthStr(n);
  17946. /* encStr */
  17947. encStr = GetCipherEncStr(n);
  17948. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  17949. WOLFSSL_MSG("Cipher Bits Not Set.");
  17950. }
  17951. /* macStr */
  17952. macStr = GetCipherMacStr(n);
  17953. /* Build up the string by copying onto the end. */
  17954. XSTRNCPY(dp, name, len);
  17955. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17956. len -= strLen; dp += strLen;
  17957. XSTRNCPY(dp, " ", len);
  17958. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17959. len -= strLen; dp += strLen;
  17960. XSTRNCPY(dp, protocol, len);
  17961. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17962. len -= strLen; dp += strLen;
  17963. XSTRNCPY(dp, " Kx=", len);
  17964. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17965. len -= strLen; dp += strLen;
  17966. XSTRNCPY(dp, keaStr, len);
  17967. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17968. len -= strLen; dp += strLen;
  17969. XSTRNCPY(dp, " Au=", len);
  17970. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17971. len -= strLen; dp += strLen;
  17972. XSTRNCPY(dp, authStr, len);
  17973. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17974. len -= strLen; dp += strLen;
  17975. XSTRNCPY(dp, " Enc=", len);
  17976. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17977. len -= strLen; dp += strLen;
  17978. XSTRNCPY(dp, encStr, len);
  17979. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17980. len -= strLen; dp += strLen;
  17981. XSTRNCPY(dp, " Mac=", len);
  17982. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17983. len -= strLen; dp += strLen;
  17984. XSTRNCPY(dp, macStr, len);
  17985. dp[len-1] = '\0';
  17986. return WOLFSSL_SUCCESS;
  17987. }
  17988. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  17989. static WC_INLINE const char* wolfssl_kea_to_string(int kea)
  17990. {
  17991. const char* keaStr;
  17992. switch (kea) {
  17993. case no_kea:
  17994. keaStr = "None";
  17995. break;
  17996. #ifndef NO_RSA
  17997. case rsa_kea:
  17998. keaStr = "RSA";
  17999. break;
  18000. #endif
  18001. #ifndef NO_DH
  18002. case diffie_hellman_kea:
  18003. keaStr = "DHE";
  18004. break;
  18005. #endif
  18006. case fortezza_kea:
  18007. keaStr = "FZ";
  18008. break;
  18009. #ifndef NO_PSK
  18010. case psk_kea:
  18011. keaStr = "PSK";
  18012. break;
  18013. #ifndef NO_DH
  18014. case dhe_psk_kea:
  18015. keaStr = "DHEPSK";
  18016. break;
  18017. #endif
  18018. #ifdef HAVE_ECC
  18019. case ecdhe_psk_kea:
  18020. keaStr = "ECDHEPSK";
  18021. break;
  18022. #endif
  18023. #endif
  18024. #ifdef HAVE_ECC
  18025. case ecc_diffie_hellman_kea:
  18026. keaStr = "ECDHE";
  18027. break;
  18028. case ecc_static_diffie_hellman_kea:
  18029. keaStr = "ECDH";
  18030. break;
  18031. #endif
  18032. default:
  18033. keaStr = "unknown";
  18034. break;
  18035. }
  18036. return keaStr;
  18037. }
  18038. static WC_INLINE const char* wolfssl_sigalg_to_string(int sig_algo)
  18039. {
  18040. const char* authStr;
  18041. switch (sig_algo) {
  18042. case anonymous_sa_algo:
  18043. authStr = "None";
  18044. break;
  18045. #ifndef NO_RSA
  18046. case rsa_sa_algo:
  18047. authStr = "RSA";
  18048. break;
  18049. #ifdef WC_RSA_PSS
  18050. case rsa_pss_sa_algo:
  18051. authStr = "RSA-PSS";
  18052. break;
  18053. #endif
  18054. #endif
  18055. #ifndef NO_DSA
  18056. case dsa_sa_algo:
  18057. authStr = "DSA";
  18058. break;
  18059. #endif
  18060. #ifdef HAVE_ECC
  18061. case ecc_dsa_sa_algo:
  18062. authStr = "ECDSA";
  18063. break;
  18064. #endif
  18065. #ifdef HAVE_ED25519
  18066. case ed25519_sa_algo:
  18067. authStr = "Ed25519";
  18068. break;
  18069. #endif
  18070. #ifdef HAVE_ED448
  18071. case ed448_sa_algo:
  18072. authStr = "Ed448";
  18073. break;
  18074. #endif
  18075. default:
  18076. authStr = "unknown";
  18077. break;
  18078. }
  18079. return authStr;
  18080. }
  18081. static WC_INLINE const char* wolfssl_cipher_to_string(int cipher, int key_size)
  18082. {
  18083. const char* encStr;
  18084. (void)key_size;
  18085. switch (cipher) {
  18086. case wolfssl_cipher_null:
  18087. encStr = "None";
  18088. break;
  18089. #ifndef NO_RC4
  18090. case wolfssl_rc4:
  18091. encStr = "RC4(128)";
  18092. break;
  18093. #endif
  18094. #ifndef NO_DES3
  18095. case wolfssl_triple_des:
  18096. encStr = "3DES(168)";
  18097. break;
  18098. #endif
  18099. #ifndef NO_AES
  18100. case wolfssl_aes:
  18101. if (key_size == 128)
  18102. encStr = "AES(128)";
  18103. else if (key_size == 256)
  18104. encStr = "AES(256)";
  18105. else
  18106. encStr = "AES(?)";
  18107. break;
  18108. #ifdef HAVE_AESGCM
  18109. case wolfssl_aes_gcm:
  18110. if (key_size == 128)
  18111. encStr = "AESGCM(128)";
  18112. else if (key_size == 256)
  18113. encStr = "AESGCM(256)";
  18114. else
  18115. encStr = "AESGCM(?)";
  18116. break;
  18117. #endif
  18118. #ifdef HAVE_AESCCM
  18119. case wolfssl_aes_ccm:
  18120. if (key_size == 128)
  18121. encStr = "AESCCM(128)";
  18122. else if (key_size == 256)
  18123. encStr = "AESCCM(256)";
  18124. else
  18125. encStr = "AESCCM(?)";
  18126. break;
  18127. #endif
  18128. #endif
  18129. #ifdef HAVE_CHACHA
  18130. case wolfssl_chacha:
  18131. encStr = "CHACHA20/POLY1305(256)";
  18132. break;
  18133. #endif
  18134. #ifdef HAVE_CAMELLIA
  18135. case wolfssl_camellia:
  18136. if (key_size == 128)
  18137. encStr = "Camellia(128)";
  18138. else if (key_size == 256)
  18139. encStr = "Camellia(256)";
  18140. else
  18141. encStr = "Camellia(?)";
  18142. break;
  18143. #endif
  18144. default:
  18145. encStr = "unknown";
  18146. break;
  18147. }
  18148. return encStr;
  18149. }
  18150. static WC_INLINE const char* wolfssl_mac_to_string(int mac)
  18151. {
  18152. const char* macStr;
  18153. switch (mac) {
  18154. case no_mac:
  18155. macStr = "None";
  18156. break;
  18157. #ifndef NO_MD5
  18158. case md5_mac:
  18159. macStr = "MD5";
  18160. break;
  18161. #endif
  18162. #ifndef NO_SHA
  18163. case sha_mac:
  18164. macStr = "SHA1";
  18165. break;
  18166. #endif
  18167. #ifdef HAVE_SHA224
  18168. case sha224_mac:
  18169. macStr = "SHA224";
  18170. break;
  18171. #endif
  18172. #ifndef NO_SHA256
  18173. case sha256_mac:
  18174. macStr = "SHA256";
  18175. break;
  18176. #endif
  18177. #ifdef HAVE_SHA384
  18178. case sha384_mac:
  18179. macStr = "SHA384";
  18180. break;
  18181. #endif
  18182. #ifdef HAVE_SHA512
  18183. case sha512_mac:
  18184. macStr = "SHA512";
  18185. break;
  18186. #endif
  18187. default:
  18188. macStr = "unknown";
  18189. break;
  18190. }
  18191. return macStr;
  18192. }
  18193. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  18194. int len)
  18195. {
  18196. char *ret = in;
  18197. const char *keaStr, *authStr, *encStr, *macStr;
  18198. size_t strLen;
  18199. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  18200. if (cipher == NULL || in == NULL)
  18201. return NULL;
  18202. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18203. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  18204. * Return the description based on cipher_names[cipher->offset]
  18205. */
  18206. if (cipher->in_stack == TRUE) {
  18207. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  18208. XSTRNCPY(in,cipher->description,len);
  18209. return ret;
  18210. }
  18211. #endif
  18212. /* Get the cipher description based on the SSL session cipher */
  18213. keaStr = wolfssl_kea_to_string(cipher->ssl->specs.kea);
  18214. authStr = wolfssl_sigalg_to_string(cipher->ssl->specs.sig_algo);
  18215. encStr = wolfssl_cipher_to_string(cipher->ssl->specs.bulk_cipher_algorithm,
  18216. cipher->ssl->specs.key_size);
  18217. macStr = wolfssl_mac_to_string(cipher->ssl->specs.mac_algorithm);
  18218. /* Build up the string by copying onto the end. */
  18219. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  18220. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18221. XSTRNCPY(in, " ", len);
  18222. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18223. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  18224. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18225. XSTRNCPY(in, " Kx=", len);
  18226. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18227. XSTRNCPY(in, keaStr, len);
  18228. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18229. XSTRNCPY(in, " Au=", len);
  18230. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18231. XSTRNCPY(in, authStr, len);
  18232. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18233. XSTRNCPY(in, " Enc=", len);
  18234. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18235. XSTRNCPY(in, encStr, len);
  18236. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18237. XSTRNCPY(in, " Mac=", len);
  18238. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18239. XSTRNCPY(in, macStr, len);
  18240. in[len-1] = '\0';
  18241. return ret;
  18242. }
  18243. #ifndef NO_WOLFSSL_STUB
  18244. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  18245. int* ssl)
  18246. {
  18247. (void)url;
  18248. (void)host;
  18249. (void)port;
  18250. (void)path;
  18251. (void)ssl;
  18252. WOLFSSL_STUB("OCSP_parse_url");
  18253. return 0;
  18254. }
  18255. #endif
  18256. #ifndef NO_MD4
  18257. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  18258. {
  18259. /* make sure we have a big enough buffer */
  18260. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  18261. (void) sizeof(ok);
  18262. WOLFSSL_ENTER("MD4_Init");
  18263. wc_InitMd4((Md4*)md4);
  18264. }
  18265. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  18266. unsigned long len)
  18267. {
  18268. WOLFSSL_ENTER("MD4_Update");
  18269. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  18270. }
  18271. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  18272. {
  18273. WOLFSSL_ENTER("MD4_Final");
  18274. wc_Md4Final((Md4*)md4, digest);
  18275. }
  18276. #endif /* NO_MD4 */
  18277. #ifndef NO_WOLFSSL_STUB
  18278. void wolfSSL_RAND_screen(void)
  18279. {
  18280. WOLFSSL_STUB("RAND_screen");
  18281. }
  18282. #endif
  18283. int wolfSSL_RAND_load_file(const char* fname, long len)
  18284. {
  18285. (void)fname;
  18286. /* wolfCrypt provides enough entropy internally or will report error */
  18287. if (len == -1)
  18288. return 1024;
  18289. else
  18290. return (int)len;
  18291. }
  18292. #ifndef NO_WOLFSSL_STUB
  18293. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  18294. {
  18295. WOLFSSL_STUB("COMP_zlib");
  18296. return 0;
  18297. }
  18298. #endif
  18299. #ifndef NO_WOLFSSL_STUB
  18300. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  18301. {
  18302. WOLFSSL_STUB("COMP_rle");
  18303. return 0;
  18304. }
  18305. #endif
  18306. #ifndef NO_WOLFSSL_STUB
  18307. int wolfSSL_COMP_add_compression_method(int method, void* data)
  18308. {
  18309. (void)method;
  18310. (void)data;
  18311. WOLFSSL_STUB("COMP_add_compression_method");
  18312. return 0;
  18313. }
  18314. #endif
  18315. /* wolfSSL_set_dynlock_create_callback
  18316. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  18317. * This function exists for compatibility purposes because wolfSSL satisfies
  18318. * thread safety without relying on the callback.
  18319. */
  18320. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  18321. const char*, int))
  18322. {
  18323. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  18324. (void)f;
  18325. }
  18326. /* wolfSSL_set_dynlock_lock_callback
  18327. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  18328. * This function exists for compatibility purposes because wolfSSL satisfies
  18329. * thread safety without relying on the callback.
  18330. */
  18331. void wolfSSL_set_dynlock_lock_callback(
  18332. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  18333. {
  18334. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  18335. (void)f;
  18336. }
  18337. /* wolfSSL_set_dynlock_destroy_callback
  18338. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  18339. * This function exists for compatibility purposes because wolfSSL satisfies
  18340. * thread safety without relying on the callback.
  18341. */
  18342. void wolfSSL_set_dynlock_destroy_callback(
  18343. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  18344. {
  18345. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  18346. (void)f;
  18347. }
  18348. #endif /* OPENSSL_EXTRA */
  18349. #ifdef OPENSSL_EXTRA
  18350. #ifndef NO_CERTS
  18351. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  18352. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  18353. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  18354. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  18355. *
  18356. * Returns size of key buffer on success
  18357. */
  18358. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18359. {
  18360. return wolfSSL_EVP_PKEY_get_der(key, der);
  18361. }
  18362. int wolfSSL_i2d_PublicKey(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  18363. {
  18364. return wolfSSL_EVP_PKEY_get_der(key, der);
  18365. }
  18366. #endif /* !NO_ASN && !NO_PWDBASED */
  18367. #endif /* !NO_CERTS */
  18368. #endif /* OPENSSL_EXTRA */
  18369. #ifdef OPENSSL_EXTRA
  18370. /******************************************************************************
  18371. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  18372. *
  18373. * RETURNS:
  18374. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  18375. * Note: Returns WOLFSSL_SUCCESS, in case either parameter is NULL,
  18376. * same as openssl.
  18377. */
  18378. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  18379. {
  18380. if (ctx == NULL || vpm == NULL)
  18381. return WOLFSSL_SUCCESS;
  18382. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  18383. }
  18384. /******************************************************************************
  18385. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  18386. *
  18387. * RETURNS:
  18388. * returns pointer to the SSL verification parameters on success,
  18389. * otherwise returns NULL
  18390. */
  18391. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  18392. {
  18393. if (ctx == NULL) {
  18394. return NULL;
  18395. }
  18396. return ctx->param;
  18397. }
  18398. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  18399. {
  18400. if (ssl == NULL) {
  18401. return NULL;
  18402. }
  18403. return ssl->param;
  18404. }
  18405. #endif /* OPENSSL_EXTRA */
  18406. #if defined(OPENSSL_EXTRA)
  18407. int wolfSSL_i2d_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER* a, unsigned char** out)
  18408. {
  18409. int ret = 0;
  18410. word32 idx = 0;
  18411. int len;
  18412. int preAlloc = 1;
  18413. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_INTEGER");
  18414. if (a == NULL || a->data == NULL || a->length <= 0 || out == NULL) {
  18415. WOLFSSL_MSG("Bad parameter.");
  18416. ret = WOLFSSL_FATAL_ERROR;
  18417. }
  18418. if (ret == 0 && *out == NULL) {
  18419. preAlloc = 0;
  18420. *out = (unsigned char*)XMALLOC(a->length, NULL, DYNAMIC_TYPE_ASN1);
  18421. if (*out == NULL) {
  18422. WOLFSSL_MSG("Failed to allocate output buffer.");
  18423. ret = WOLFSSL_FATAL_ERROR;
  18424. }
  18425. }
  18426. if (ret == 0) {
  18427. /*
  18428. * A WOLFSSL_ASN1_INTEGER stores the DER buffer of the integer in its
  18429. * "data" field, but it's only the magnitude of the number (i.e. the
  18430. * sign isn't encoded). The "negative" field is 1 if the value should
  18431. * be interpreted as negative and 0 otherwise. If the value is negative,
  18432. * we need to output the 2's complement of the value in the DER output.
  18433. */
  18434. XMEMCPY(*out, a->data, a->length);
  18435. if (a->negative) {
  18436. if (GetLength(a->data, &idx, &len, a->length) < 0) {
  18437. ret = WOLFSSL_FATAL_ERROR;
  18438. }
  18439. else {
  18440. ++idx;
  18441. for (; (int)idx < a->length; ++idx) {
  18442. (*out)[idx] = ~(*out)[idx];
  18443. }
  18444. do {
  18445. --idx;
  18446. ++(*out)[idx];
  18447. } while ((*out)[idx] == 0);
  18448. }
  18449. }
  18450. }
  18451. if (ret == 0) {
  18452. ret = a->length;
  18453. if (preAlloc) {
  18454. *out += a->length;
  18455. }
  18456. }
  18457. WOLFSSL_LEAVE("wolfSSL_i2d_ASN1_INTEGER", ret);
  18458. return ret;
  18459. }
  18460. WOLFSSL_ASN1_INTEGER* wolfSSL_d2i_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER** a,
  18461. const unsigned char** in,
  18462. long inSz)
  18463. {
  18464. WOLFSSL_ASN1_INTEGER* ret = NULL;
  18465. int err = 0;
  18466. word32 idx = 0;
  18467. int len;
  18468. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_INTEGER");
  18469. if (in == NULL || *in == NULL || inSz <= 0) {
  18470. WOLFSSL_MSG("Bad parameter");
  18471. err = 1;
  18472. }
  18473. if (err == 0 && (*in)[0] != ASN_INTEGER) {
  18474. WOLFSSL_MSG("Tag doesn't indicate integer type.");
  18475. err = 1;
  18476. }
  18477. if (err == 0) {
  18478. ret = wolfSSL_ASN1_INTEGER_new();
  18479. if (ret == NULL) {
  18480. err = 1;
  18481. }
  18482. else {
  18483. ret->type = V_ASN1_INTEGER;
  18484. }
  18485. }
  18486. if (err == 0 && inSz > (long)sizeof(ret->intData)) {
  18487. ret->data = (unsigned char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_ASN1);
  18488. if (ret->data == NULL) {
  18489. err = 1;
  18490. }
  18491. else {
  18492. ret->isDynamic = 1;
  18493. ret->dataMax = (word32)inSz;
  18494. }
  18495. }
  18496. if (err == 0) {
  18497. XMEMCPY(ret->data, *in, inSz);
  18498. ret->length = (word32)inSz;
  18499. /* Advance to the end of the length field.*/
  18500. if (GetLength(*in, &idx, &len, (word32)inSz) < 0) {
  18501. err = 1;
  18502. }
  18503. else {
  18504. /* See 2's complement comment in wolfSSL_d2i_ASN1_INTEGER. */
  18505. ret->negative = (*in)[idx+1] & 0x80;
  18506. if (ret->negative) {
  18507. ++idx;
  18508. for (; (int)idx < inSz; ++idx) {
  18509. ret->data[idx] = ~ret->data[idx];
  18510. }
  18511. do {
  18512. --idx;
  18513. ++ret->data[idx];
  18514. } while (ret->data[idx] == 0);
  18515. ret->type |= V_ASN1_NEG_INTEGER;
  18516. }
  18517. if (a != NULL) {
  18518. *a = ret;
  18519. }
  18520. }
  18521. }
  18522. if (err != 0) {
  18523. wolfSSL_ASN1_INTEGER_free(ret);
  18524. ret = NULL;
  18525. }
  18526. return ret;
  18527. }
  18528. #endif /* OPENSSL_EXTRA */
  18529. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18530. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  18531. * returns a pointer to new structure on success and NULL on failure
  18532. */
  18533. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  18534. {
  18535. WOLFSSL_ASN1_INTEGER* a;
  18536. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  18537. DYNAMIC_TYPE_OPENSSL);
  18538. if (a == NULL) {
  18539. return NULL;
  18540. }
  18541. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  18542. a->data = a->intData;
  18543. a->isDynamic = 0;
  18544. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  18545. a->length = 0;
  18546. return a;
  18547. }
  18548. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  18549. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  18550. {
  18551. if (in != NULL) {
  18552. if (in->isDynamic) {
  18553. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  18554. }
  18555. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  18556. }
  18557. }
  18558. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  18559. * src : WOLFSSL_ASN1_INTEGER to duplicate
  18560. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  18561. */
  18562. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  18563. {
  18564. WOLFSSL_ASN1_INTEGER* copy;
  18565. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  18566. if (!src)
  18567. return NULL;
  18568. copy = wolfSSL_ASN1_INTEGER_new();
  18569. if (copy == NULL)
  18570. return NULL;
  18571. copy->negative = src->negative;
  18572. copy->dataMax = src->dataMax;
  18573. copy->isDynamic = src->isDynamic;
  18574. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18575. copy->length = src->length;
  18576. #endif
  18577. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  18578. if (copy->isDynamic && src->data && copy->dataMax) {
  18579. copy->data = (unsigned char*)
  18580. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  18581. if (copy->data == NULL) {
  18582. wolfSSL_ASN1_INTEGER_free(copy);
  18583. return NULL;
  18584. }
  18585. XMEMCPY(copy->data, src->data, copy->dataMax);
  18586. }
  18587. return copy;
  18588. }
  18589. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  18590. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  18591. {
  18592. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  18593. int j;
  18594. unsigned int i = 0;
  18595. unsigned char tmp[sizeof(long)+1] = {0};
  18596. int pad = 0;
  18597. if (a != NULL) {
  18598. /* dynamically create data buffer, +2 for type and length */
  18599. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  18600. DYNAMIC_TYPE_OPENSSL);
  18601. if (a->data == NULL) {
  18602. wolfSSL_ASN1_INTEGER_free(a);
  18603. ret = WOLFSSL_FAILURE;
  18604. }
  18605. else {
  18606. a->dataMax = (int)(sizeof(long)+1) + 2;
  18607. a->isDynamic = 1;
  18608. }
  18609. }
  18610. else {
  18611. /* Invalid parameter */
  18612. ret = WOLFSSL_FAILURE;
  18613. }
  18614. if (ret != WOLFSSL_FAILURE) {
  18615. /* Set type */
  18616. a->data[i++] = ASN_INTEGER;
  18617. /* Check for negative */
  18618. if (v < 0) {
  18619. a->negative = 1;
  18620. v *= -1;
  18621. }
  18622. /* Create char buffer */
  18623. for (j = 0; j < (int)sizeof(long); j++) {
  18624. if (v == 0) {
  18625. break;
  18626. }
  18627. tmp[j] = (unsigned char)(v & 0xff);
  18628. v >>= 8;
  18629. }
  18630. /* 0 pad to indicate positive number when top bit set. */
  18631. if ((!a->negative) && (j > 0) && (tmp[j-1] & 0x80)) {
  18632. pad = 1;
  18633. }
  18634. /* Set length */
  18635. a->data[i++] = (unsigned char)(((j == 0) ? ++j : j) + pad);
  18636. /* +2 for type and length */
  18637. a->length = j + pad + 2;
  18638. /* Add padding if required. */
  18639. if (pad) {
  18640. a->data[i++] = 0;
  18641. }
  18642. /* Copy to data */
  18643. for (; j > 0; j--) {
  18644. a->data[i++] = tmp[j-1];
  18645. }
  18646. }
  18647. return ret;
  18648. }
  18649. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18650. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  18651. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  18652. #ifndef NO_ASN_TIME
  18653. #ifndef NO_BIO
  18654. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  18655. {
  18656. char buf[MAX_TIME_STRING_SZ];
  18657. int ret = WOLFSSL_SUCCESS;
  18658. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  18659. if (bio == NULL || asnTime == NULL) {
  18660. WOLFSSL_MSG("NULL function argument");
  18661. return WOLFSSL_FAILURE;
  18662. }
  18663. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  18664. sizeof(buf)) == NULL) {
  18665. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  18666. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  18667. ret = WOLFSSL_FAILURE;
  18668. }
  18669. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  18670. WOLFSSL_MSG("Unable to write to bio");
  18671. return WOLFSSL_FAILURE;
  18672. }
  18673. return ret;
  18674. }
  18675. #endif /* !NO_BIO */
  18676. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  18677. {
  18678. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  18679. if (t == NULL || buf == NULL || len < 5) {
  18680. WOLFSSL_MSG("Bad argument");
  18681. return NULL;
  18682. }
  18683. if (t->length > len) {
  18684. WOLFSSL_MSG("Length of date is longer then buffer");
  18685. return NULL;
  18686. }
  18687. if (!GetTimeString(t->data, t->type, buf, len)) {
  18688. return NULL;
  18689. }
  18690. return buf;
  18691. }
  18692. /* Converts a WOLFSSL_ASN1_TIME to a struct tm. Returns WOLFSSL_SUCCESS on
  18693. * success and WOLFSSL_FAILURE on failure. */
  18694. static int Asn1TimeToTm(WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  18695. {
  18696. unsigned char* asn1TimeBuf;
  18697. int asn1TimeBufLen;
  18698. int i = 0;
  18699. int bytesNeeded = 11;
  18700. if (asnTime == NULL) {
  18701. WOLFSSL_MSG("asnTime is NULL");
  18702. return WOLFSSL_FAILURE;
  18703. }
  18704. if (tm == NULL) {
  18705. WOLFSSL_MSG("tm is NULL");
  18706. return WOLFSSL_FAILURE;
  18707. }
  18708. asn1TimeBuf = wolfSSL_ASN1_TIME_get_data(asnTime);
  18709. if (asn1TimeBuf == NULL) {
  18710. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer.");
  18711. return WOLFSSL_FAILURE;
  18712. }
  18713. asn1TimeBufLen = wolfSSL_ASN1_TIME_get_length(asnTime);
  18714. if (asn1TimeBufLen <= 0) {
  18715. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer length.");
  18716. return WOLFSSL_FAILURE;
  18717. }
  18718. XMEMSET(tm, 0, sizeof(struct tm));
  18719. /* Convert ASN1_time to struct tm */
  18720. /* Check type */
  18721. if (asnTime->type == ASN_UTC_TIME) {
  18722. /* 2-digit year */
  18723. bytesNeeded += 2;
  18724. if (bytesNeeded > asn1TimeBufLen) {
  18725. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  18726. return WOLFSSL_FAILURE;
  18727. }
  18728. if (asn1TimeBuf[bytesNeeded-1] != 'Z') {
  18729. WOLFSSL_MSG("Expecting UTC time.");
  18730. return WOLFSSL_FAILURE;
  18731. }
  18732. tm->tm_year = (asn1TimeBuf[i] - '0') * 10; i++;
  18733. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  18734. if (tm->tm_year < 70) {
  18735. tm->tm_year += 100;
  18736. }
  18737. }
  18738. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  18739. /* 4-digit year */
  18740. bytesNeeded += 4;
  18741. if (bytesNeeded > asn1TimeBufLen) {
  18742. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  18743. return WOLFSSL_FAILURE;
  18744. }
  18745. if (asn1TimeBuf[bytesNeeded-1] != 'Z') {
  18746. WOLFSSL_MSG("Expecting UTC time.");
  18747. return WOLFSSL_FAILURE;
  18748. }
  18749. tm->tm_year = (asn1TimeBuf[i] - '0') * 1000; i++;
  18750. tm->tm_year += (asn1TimeBuf[i] - '0') * 100; i++;
  18751. tm->tm_year += (asn1TimeBuf[i] - '0') * 10; i++;
  18752. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  18753. tm->tm_year -= 1900;
  18754. }
  18755. else {
  18756. WOLFSSL_MSG("asnTime->type is invalid.");
  18757. return WOLFSSL_FAILURE;
  18758. }
  18759. tm->tm_mon = (asn1TimeBuf[i] - '0') * 10; i++;
  18760. tm->tm_mon += (asn1TimeBuf[i] - '0') - 1; i++; /* January is 0 not 1 */
  18761. tm->tm_mday = (asn1TimeBuf[i] - '0') * 10; i++;
  18762. tm->tm_mday += (asn1TimeBuf[i] - '0'); i++;
  18763. tm->tm_hour = (asn1TimeBuf[i] - '0') * 10; i++;
  18764. tm->tm_hour += (asn1TimeBuf[i] - '0'); i++;
  18765. tm->tm_min = (asn1TimeBuf[i] - '0') * 10; i++;
  18766. tm->tm_min += (asn1TimeBuf[i] - '0'); i++;
  18767. tm->tm_sec = (asn1TimeBuf[i] - '0') * 10; i++;
  18768. tm->tm_sec += (asn1TimeBuf[i] - '0');
  18769. #ifdef XMKTIME
  18770. /* Call XMKTIME on tm to get the tm_wday and tm_yday fields populated. */
  18771. XMKTIME(tm);
  18772. #endif
  18773. return WOLFSSL_SUCCESS;
  18774. }
  18775. int wolfSSL_ASN1_TIME_to_tm(const WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  18776. {
  18777. time_t currentTime;
  18778. struct tm *tmpTs;
  18779. #if defined(NEED_TMP_TIME)
  18780. /* for use with gmtime_r */
  18781. struct tm tmpTimeStorage;
  18782. tmpTs = &tmpTimeStorage;
  18783. #else
  18784. tmpTs = NULL;
  18785. #endif
  18786. (void)tmpTs;
  18787. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_tm");
  18788. /* If asnTime is NULL, then the current time is converted. */
  18789. if (asnTime == NULL) {
  18790. if (tm == NULL) {
  18791. WOLFSSL_MSG("asnTime and tm are both NULL");
  18792. return WOLFSSL_FAILURE;
  18793. }
  18794. currentTime = wc_Time(0);
  18795. if (currentTime <= 0) {
  18796. WOLFSSL_MSG("Failed to get current time.");
  18797. return WOLFSSL_FAILURE;
  18798. }
  18799. tm = XGMTIME(&currentTime, tmpTs);
  18800. if (tm == NULL) {
  18801. WOLFSSL_MSG("Failed to convert current time to UTC.");
  18802. return WOLFSSL_FAILURE;
  18803. }
  18804. return WOLFSSL_SUCCESS;
  18805. }
  18806. /* If tm is NULL this function performs a format check on asnTime only. */
  18807. if (tm == NULL) {
  18808. return wolfSSL_ASN1_TIME_check(asnTime);
  18809. }
  18810. return Asn1TimeToTm((WOLFSSL_ASN1_TIME*)asnTime, tm);
  18811. }
  18812. #endif /* !NO_ASN_TIME */
  18813. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  18814. OPENSSL_EXTRA*/
  18815. #ifdef OPENSSL_EXTRA
  18816. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  18817. const WOLFSSL_ASN1_INTEGER* b)
  18818. {
  18819. int ret = 0;
  18820. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_cmp");
  18821. if (a == NULL || b == NULL) {
  18822. WOLFSSL_MSG("Bad parameter.");
  18823. ret = WOLFSSL_FATAL_ERROR;
  18824. }
  18825. if (ret == 0 && ((a->length != b->length) ||
  18826. ((a->negative == 0) != (b->negative == 0)))) {
  18827. ret = WOLFSSL_FATAL_ERROR;
  18828. }
  18829. if (ret == 0) {
  18830. ret = XMEMCMP(a->data, b->data, a->length);
  18831. }
  18832. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_cmp", ret);
  18833. return ret;
  18834. }
  18835. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* a)
  18836. {
  18837. long ret = 1;
  18838. WOLFSSL_BIGNUM* bn = NULL;
  18839. WOLFSSL_ENTER("ASN1_INTEGER_get");
  18840. if (a == NULL) {
  18841. /* OpenSSL returns 0 when a is NULL and -1 if there is an error. Quoting
  18842. * the documentation:
  18843. *
  18844. * "ASN1_INTEGER_get() also returns the value of a but it returns 0 if a
  18845. * is NULL and -1 on error (which is ambiguous because -1 is a
  18846. * legitimate value for an ASN1_INTEGER). New applications should use
  18847. * ASN1_INTEGER_get_int64() instead."
  18848. * */
  18849. ret = 0;
  18850. }
  18851. if (ret > 0) {
  18852. bn = wolfSSL_ASN1_INTEGER_to_BN(a, NULL);
  18853. if (bn == NULL) {
  18854. ret = -1;
  18855. }
  18856. }
  18857. if (ret > 0) {
  18858. ret = wolfSSL_BN_get_word(bn);
  18859. if (a->negative == 1) {
  18860. ret = -ret;
  18861. }
  18862. }
  18863. if (bn != NULL) {
  18864. wolfSSL_BN_free(bn);
  18865. }
  18866. WOLFSSL_LEAVE("ASN1_INTEGER_get", (int)ret);
  18867. return ret;
  18868. }
  18869. #endif /* OPENSSL_EXTRA */
  18870. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18871. /* Gets an index to store SSL structure at.
  18872. *
  18873. * Returns positive index on success and negative values on failure
  18874. */
  18875. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  18876. {
  18877. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  18878. /* store SSL at index 0 */
  18879. return 0;
  18880. }
  18881. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18882. #ifdef OPENSSL_EXTRA
  18883. /* Sets a function callback that will send information about the state of all
  18884. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  18885. * in.
  18886. *
  18887. * ctx WOLFSSL_CTX structure to set callback function in
  18888. * f callback function to use
  18889. */
  18890. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  18891. void (*f)(const WOLFSSL* ssl, int type, int val))
  18892. {
  18893. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  18894. if (ctx == NULL) {
  18895. WOLFSSL_MSG("Bad function argument");
  18896. }
  18897. else {
  18898. ctx->CBIS = f;
  18899. }
  18900. }
  18901. unsigned long wolfSSL_ERR_peek_error(void)
  18902. {
  18903. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  18904. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  18905. }
  18906. int wolfSSL_ERR_GET_LIB(unsigned long err)
  18907. {
  18908. unsigned long value;
  18909. value = (err & 0xFFFFFFL);
  18910. switch (value) {
  18911. case -SSL_R_HTTP_REQUEST:
  18912. return ERR_LIB_SSL;
  18913. case PEM_R_NO_START_LINE:
  18914. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  18915. case PEM_R_BAD_PASSWORD_READ:
  18916. case PEM_R_BAD_DECRYPT:
  18917. return ERR_LIB_PEM;
  18918. case EVP_R_BAD_DECRYPT:
  18919. case EVP_R_BN_DECODE_ERROR:
  18920. case EVP_R_DECODE_ERROR:
  18921. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  18922. return ERR_LIB_EVP;
  18923. case ASN1_R_HEADER_TOO_LONG:
  18924. return ERR_LIB_ASN1;
  18925. default:
  18926. return 0;
  18927. }
  18928. }
  18929. /* This function is to find global error values that are the same through out
  18930. * all library version. With wolfSSL having only one set of error codes the
  18931. * return value is pretty straight forward. The only thing needed is all wolfSSL
  18932. * error values are typically negative.
  18933. *
  18934. * Returns the error reason
  18935. */
  18936. int wolfSSL_ERR_GET_REASON(unsigned long err)
  18937. {
  18938. int ret = (int)err;
  18939. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  18940. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  18941. /* Nginx looks for this error to know to stop parsing certificates. */
  18942. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  18943. return PEM_R_NO_START_LINE;
  18944. if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST))
  18945. return SSL_R_HTTP_REQUEST;
  18946. #endif
  18947. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  18948. if (err == ((ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG))
  18949. return ASN1_R_HEADER_TOO_LONG;
  18950. #endif
  18951. /* check if error value is in range of wolfSSL errors */
  18952. ret = 0 - ret; /* setting as negative value */
  18953. /* wolfCrypt range is less than MAX (-100)
  18954. wolfSSL range is MIN (-300) and lower */
  18955. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  18956. return ret;
  18957. }
  18958. else {
  18959. WOLFSSL_MSG("Not in range of typical error values");
  18960. ret = (int)err;
  18961. }
  18962. return ret;
  18963. }
  18964. /* returns a string that describes the alert
  18965. *
  18966. * alertID the alert value to look up
  18967. */
  18968. const char* wolfSSL_alert_type_string_long(int alertID)
  18969. {
  18970. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  18971. return AlertTypeToString(alertID);
  18972. }
  18973. const char* wolfSSL_alert_desc_string_long(int alertID)
  18974. {
  18975. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  18976. return AlertTypeToString(alertID);
  18977. }
  18978. /* Gets the current state of the WOLFSSL structure
  18979. *
  18980. * ssl WOLFSSL structure to get state of
  18981. *
  18982. * Returns a human readable string of the WOLFSSL structure state
  18983. */
  18984. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  18985. {
  18986. static const char* OUTPUT_STR[14][6][3] = {
  18987. {
  18988. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  18989. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  18990. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  18991. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  18992. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  18993. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  18994. },
  18995. {
  18996. {"SSLv3 read Server Hello Verify Request",
  18997. "SSLv3 write Server Hello Verify Request",
  18998. "SSLv3 Server Hello Verify Request"},
  18999. {"TLSv1 read Server Hello Verify Request",
  19000. "TLSv1 write Server Hello Verify Request",
  19001. "TLSv1 Server Hello Verify Request"},
  19002. {"TLSv1_1 read Server Hello Verify Request",
  19003. "TLSv1_1 write Server Hello Verify Request",
  19004. "TLSv1_1 Server Hello Verify Request"},
  19005. {"TLSv1_2 read Server Hello Verify Request",
  19006. "TLSv1_2 write Server Hello Verify Request",
  19007. "TLSv1_2 Server Hello Verify Request"},
  19008. {"DTLSv1 read Server Hello Verify Request",
  19009. "DTLSv1 write Server Hello Verify Request",
  19010. "DTLSv1 Server Hello Verify Request"},
  19011. {"DTLSv1_2 read Server Hello Verify Request",
  19012. "DTLSv1_2 write Server Hello Verify Request",
  19013. "DTLSv1_2 Server Hello Verify Request"},
  19014. },
  19015. {
  19016. {"SSLv3 read Server Hello",
  19017. "SSLv3 write Server Hello",
  19018. "SSLv3 Server Hello"},
  19019. {"TLSv1 read Server Hello",
  19020. "TLSv1 write Server Hello",
  19021. "TLSv1 Server Hello"},
  19022. {"TLSv1_1 read Server Hello",
  19023. "TLSv1_1 write Server Hello",
  19024. "TLSv1_1 Server Hello"},
  19025. {"TLSv1_2 read Server Hello",
  19026. "TLSv1_2 write Server Hello",
  19027. "TLSv1_2 Server Hello"},
  19028. {"DTLSv1 read Server Hello",
  19029. "DTLSv1 write Server Hello",
  19030. "DTLSv1 Server Hello"},
  19031. {"DTLSv1_2 read Server Hello"
  19032. "DTLSv1_2 write Server Hello",
  19033. "DTLSv1_2 Server Hello",
  19034. },
  19035. },
  19036. {
  19037. {"SSLv3 read Server Session Ticket",
  19038. "SSLv3 write Server Session Ticket",
  19039. "SSLv3 Server Session Ticket"},
  19040. {"TLSv1 read Server Session Ticket",
  19041. "TLSv1 write Server Session Ticket",
  19042. "TLSv1 Server Session Ticket"},
  19043. {"TLSv1_1 read Server Session Ticket",
  19044. "TLSv1_1 write Server Session Ticket",
  19045. "TLSv1_1 Server Session Ticket"},
  19046. {"TLSv1_2 read Server Session Ticket",
  19047. "TLSv1_2 write Server Session Ticket",
  19048. "TLSv1_2 Server Session Ticket"},
  19049. {"DTLSv1 read Server Session Ticket",
  19050. "DTLSv1 write Server Session Ticket",
  19051. "DTLSv1 Server Session Ticket"},
  19052. {"DTLSv1_2 read Server Session Ticket",
  19053. "DTLSv1_2 write Server Session Ticket",
  19054. "DTLSv1_2 Server Session Ticket"},
  19055. },
  19056. {
  19057. {"SSLv3 read Server Cert",
  19058. "SSLv3 write Server Cert",
  19059. "SSLv3 Server Cert"},
  19060. {"TLSv1 read Server Cert",
  19061. "TLSv1 write Server Cert",
  19062. "TLSv1 Server Cert"},
  19063. {"TLSv1_1 read Server Cert",
  19064. "TLSv1_1 write Server Cert",
  19065. "TLSv1_1 Server Cert"},
  19066. {"TLSv1_2 read Server Cert",
  19067. "TLSv1_2 write Server Cert",
  19068. "TLSv1_2 Server Cert"},
  19069. {"DTLSv1 read Server Cert",
  19070. "DTLSv1 write Server Cert",
  19071. "DTLSv1 Server Cert"},
  19072. {"DTLSv1_2 read Server Cert",
  19073. "DTLSv1_2 write Server Cert",
  19074. "DTLSv1_2 Server Cert"},
  19075. },
  19076. {
  19077. {"SSLv3 read Server Key Exchange",
  19078. "SSLv3 write Server Key Exchange",
  19079. "SSLv3 Server Key Exchange"},
  19080. {"TLSv1 read Server Key Exchange",
  19081. "TLSv1 write Server Key Exchange",
  19082. "TLSv1 Server Key Exchange"},
  19083. {"TLSv1_1 read Server Key Exchange",
  19084. "TLSv1_1 write Server Key Exchange",
  19085. "TLSv1_1 Server Key Exchange"},
  19086. {"TLSv1_2 read Server Key Exchange",
  19087. "TLSv1_2 write Server Key Exchange",
  19088. "TLSv1_2 Server Key Exchange"},
  19089. {"DTLSv1 read Server Key Exchange",
  19090. "DTLSv1 write Server Key Exchange",
  19091. "DTLSv1 Server Key Exchange"},
  19092. {"DTLSv1_2 read Server Key Exchange",
  19093. "DTLSv1_2 write Server Key Exchange",
  19094. "DTLSv1_2 Server Key Exchange"},
  19095. },
  19096. {
  19097. {"SSLv3 read Server Hello Done",
  19098. "SSLv3 write Server Hello Done",
  19099. "SSLv3 Server Hello Done"},
  19100. {"TLSv1 read Server Hello Done",
  19101. "TLSv1 write Server Hello Done",
  19102. "TLSv1 Server Hello Done"},
  19103. {"TLSv1_1 read Server Hello Done",
  19104. "TLSv1_1 write Server Hello Done",
  19105. "TLSv1_1 Server Hello Done"},
  19106. {"TLSv1_2 read Server Hello Done",
  19107. "TLSv1_2 write Server Hello Done",
  19108. "TLSv1_2 Server Hello Done"},
  19109. {"DTLSv1 read Server Hello Done",
  19110. "DTLSv1 write Server Hello Done",
  19111. "DTLSv1 Server Hello Done"},
  19112. {"DTLSv1_2 read Server Hello Done",
  19113. "DTLSv1_2 write Server Hello Done",
  19114. "DTLSv1_2 Server Hello Done"},
  19115. },
  19116. {
  19117. {"SSLv3 read Server Change CipherSpec",
  19118. "SSLv3 write Server Change CipherSpec",
  19119. "SSLv3 Server Change CipherSpec"},
  19120. {"TLSv1 read Server Change CipherSpec",
  19121. "TLSv1 write Server Change CipherSpec",
  19122. "TLSv1 Server Change CipherSpec"},
  19123. {"TLSv1_1 read Server Change CipherSpec",
  19124. "TLSv1_1 write Server Change CipherSpec",
  19125. "TLSv1_1 Server Change CipherSpec"},
  19126. {"TLSv1_2 read Server Change CipherSpec",
  19127. "TLSv1_2 write Server Change CipherSpec",
  19128. "TLSv1_2 Server Change CipherSpec"},
  19129. {"DTLSv1 read Server Change CipherSpec",
  19130. "DTLSv1 write Server Change CipherSpec",
  19131. "DTLSv1 Server Change CipherSpec"},
  19132. {"DTLSv1_2 read Server Change CipherSpec",
  19133. "DTLSv1_2 write Server Change CipherSpec",
  19134. "DTLSv1_2 Server Change CipherSpec"},
  19135. },
  19136. {
  19137. {"SSLv3 read Server Finished",
  19138. "SSLv3 write Server Finished",
  19139. "SSLv3 Server Finished"},
  19140. {"TLSv1 read Server Finished",
  19141. "TLSv1 write Server Finished",
  19142. "TLSv1 Server Finished"},
  19143. {"TLSv1_1 read Server Finished",
  19144. "TLSv1_1 write Server Finished",
  19145. "TLSv1_1 Server Finished"},
  19146. {"TLSv1_2 read Server Finished",
  19147. "TLSv1_2 write Server Finished",
  19148. "TLSv1_2 Server Finished"},
  19149. {"DTLSv1 read Server Finished",
  19150. "DTLSv1 write Server Finished",
  19151. "DTLSv1 Server Finished"},
  19152. {"DTLSv1_2 read Server Finished",
  19153. "DTLSv1_2 write Server Finished",
  19154. "DTLSv1_2 Server Finished"},
  19155. },
  19156. {
  19157. {"SSLv3 read Client Hello",
  19158. "SSLv3 write Client Hello",
  19159. "SSLv3 Client Hello"},
  19160. {"TLSv1 read Client Hello",
  19161. "TLSv1 write Client Hello",
  19162. "TLSv1 Client Hello"},
  19163. {"TLSv1_1 read Client Hello",
  19164. "TLSv1_1 write Client Hello",
  19165. "TLSv1_1 Client Hello"},
  19166. {"TLSv1_2 read Client Hello",
  19167. "TLSv1_2 write Client Hello",
  19168. "TLSv1_2 Client Hello"},
  19169. {"DTLSv1 read Client Hello",
  19170. "DTLSv1 write Client Hello",
  19171. "DTLSv1 Client Hello"},
  19172. {"DTLSv1_2 read Client Hello",
  19173. "DTLSv1_2 write Client Hello",
  19174. "DTLSv1_2 Client Hello"},
  19175. },
  19176. {
  19177. {"SSLv3 read Client Key Exchange",
  19178. "SSLv3 write Client Key Exchange",
  19179. "SSLv3 Client Key Exchange"},
  19180. {"TLSv1 read Client Key Exchange",
  19181. "TLSv1 write Client Key Exchange",
  19182. "TLSv1 Client Key Exchange"},
  19183. {"TLSv1_1 read Client Key Exchange",
  19184. "TLSv1_1 write Client Key Exchange",
  19185. "TLSv1_1 Client Key Exchange"},
  19186. {"TLSv1_2 read Client Key Exchange",
  19187. "TLSv1_2 write Client Key Exchange",
  19188. "TLSv1_2 Client Key Exchange"},
  19189. {"DTLSv1 read Client Key Exchange",
  19190. "DTLSv1 write Client Key Exchange",
  19191. "DTLSv1 Client Key Exchange"},
  19192. {"DTLSv1_2 read Client Key Exchange",
  19193. "DTLSv1_2 write Client Key Exchange",
  19194. "DTLSv1_2 Client Key Exchange"},
  19195. },
  19196. {
  19197. {"SSLv3 read Client Change CipherSpec",
  19198. "SSLv3 write Client Change CipherSpec",
  19199. "SSLv3 Client Change CipherSpec"},
  19200. {"TLSv1 read Client Change CipherSpec",
  19201. "TLSv1 write Client Change CipherSpec",
  19202. "TLSv1 Client Change CipherSpec"},
  19203. {"TLSv1_1 read Client Change CipherSpec",
  19204. "TLSv1_1 write Client Change CipherSpec",
  19205. "TLSv1_1 Client Change CipherSpec"},
  19206. {"TLSv1_2 read Client Change CipherSpec",
  19207. "TLSv1_2 write Client Change CipherSpec",
  19208. "TLSv1_2 Client Change CipherSpec"},
  19209. {"DTLSv1 read Client Change CipherSpec",
  19210. "DTLSv1 write Client Change CipherSpec",
  19211. "DTLSv1 Client Change CipherSpec"},
  19212. {"DTLSv1_2 read Client Change CipherSpec",
  19213. "DTLSv1_2 write Client Change CipherSpec",
  19214. "DTLSv1_2 Client Change CipherSpec"},
  19215. },
  19216. {
  19217. {"SSLv3 read Client Finished",
  19218. "SSLv3 write Client Finished",
  19219. "SSLv3 Client Finished"},
  19220. {"TLSv1 read Client Finished",
  19221. "TLSv1 write Client Finished",
  19222. "TLSv1 Client Finished"},
  19223. {"TLSv1_1 read Client Finished",
  19224. "TLSv1_1 write Client Finished",
  19225. "TLSv1_1 Client Finished"},
  19226. {"TLSv1_2 read Client Finished",
  19227. "TLSv1_2 write Client Finished",
  19228. "TLSv1_2 Client Finished"},
  19229. {"DTLSv1 read Client Finished",
  19230. "DTLSv1 write Client Finished",
  19231. "DTLSv1 Client Finished"},
  19232. {"DTLSv1_2 read Client Finished",
  19233. "DTLSv1_2 write Client Finished",
  19234. "DTLSv1_2 Client Finished"},
  19235. },
  19236. {
  19237. {"SSLv3 Handshake Done",
  19238. "SSLv3 Handshake Done",
  19239. "SSLv3 Handshake Done"},
  19240. {"TLSv1 Handshake Done",
  19241. "TLSv1 Handshake Done",
  19242. "TLSv1 Handshake Done"},
  19243. {"TLSv1_1 Handshake Done",
  19244. "TLSv1_1 Handshake Done",
  19245. "TLSv1_1 Handshake Done"},
  19246. {"TLSv1_2 Handshake Done",
  19247. "TLSv1_2 Handshake Done",
  19248. "TLSv1_2 Handshake Done"},
  19249. {"DTLSv1 Handshake Done",
  19250. "DTLSv1 Handshake Done",
  19251. "DTLSv1 Handshake Done"},
  19252. {"DTLSv1_2 Handshake Done"
  19253. "DTLSv1_2 Handshake Done"
  19254. "DTLSv1_2 Handshake Done"}
  19255. }
  19256. };
  19257. enum ProtocolVer {
  19258. SSL_V3 = 0,
  19259. TLS_V1,
  19260. TLS_V1_1,
  19261. TLS_V1_2,
  19262. DTLS_V1,
  19263. DTLS_V1_2,
  19264. UNKNOWN = 100
  19265. };
  19266. enum IOMode {
  19267. SS_READ = 0,
  19268. SS_WRITE,
  19269. SS_NEITHER
  19270. };
  19271. enum SslState {
  19272. ss_null_state = 0,
  19273. ss_server_helloverify,
  19274. ss_server_hello,
  19275. ss_sessionticket,
  19276. ss_server_cert,
  19277. ss_server_keyexchange,
  19278. ss_server_hellodone,
  19279. ss_server_changecipherspec,
  19280. ss_server_finished,
  19281. ss_client_hello,
  19282. ss_client_keyexchange,
  19283. ss_client_changecipherspec,
  19284. ss_client_finished,
  19285. ss_handshake_done
  19286. };
  19287. int protocol = 0;
  19288. int cbmode = 0;
  19289. int state = 0;
  19290. WOLFSSL_ENTER("wolfSSL_state_string_long");
  19291. if (ssl == NULL) {
  19292. WOLFSSL_MSG("Null argument passed in");
  19293. return NULL;
  19294. }
  19295. /* Get state of callback */
  19296. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  19297. cbmode = SS_WRITE;
  19298. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  19299. cbmode = SS_READ;
  19300. } else {
  19301. cbmode = SS_NEITHER;
  19302. }
  19303. /* Get protocol version */
  19304. switch (ssl->version.major){
  19305. case SSLv3_MAJOR:
  19306. switch (ssl->version.minor){
  19307. case TLSv1_MINOR:
  19308. protocol = TLS_V1;
  19309. break;
  19310. case TLSv1_1_MINOR:
  19311. protocol = TLS_V1_1;
  19312. break;
  19313. case TLSv1_2_MINOR:
  19314. protocol = TLS_V1_2;
  19315. break;
  19316. case SSLv3_MINOR:
  19317. protocol = SSL_V3;
  19318. break;
  19319. default:
  19320. protocol = UNKNOWN;
  19321. }
  19322. break;
  19323. case DTLS_MAJOR:
  19324. switch (ssl->version.minor){
  19325. case DTLS_MINOR:
  19326. protocol = DTLS_V1;
  19327. break;
  19328. case DTLSv1_2_MINOR:
  19329. protocol = DTLS_V1_2;
  19330. break;
  19331. default:
  19332. protocol = UNKNOWN;
  19333. }
  19334. break;
  19335. default:
  19336. protocol = UNKNOWN;
  19337. }
  19338. /* accept process */
  19339. if (ssl->cbmode == SSL_CB_MODE_READ){
  19340. state = ssl->cbtype;
  19341. switch (state) {
  19342. case hello_verify_request:
  19343. state = ss_server_helloverify;
  19344. break;
  19345. case session_ticket:
  19346. state = ss_sessionticket;
  19347. break;
  19348. case server_hello:
  19349. state = ss_server_hello;
  19350. break;
  19351. case server_hello_done:
  19352. state = ss_server_hellodone;
  19353. break;
  19354. case certificate:
  19355. state = ss_server_cert;
  19356. break;
  19357. case server_key_exchange:
  19358. state = ss_server_keyexchange;
  19359. break;
  19360. case client_hello:
  19361. state = ss_client_hello;
  19362. break;
  19363. case client_key_exchange:
  19364. state = ss_client_keyexchange;
  19365. break;
  19366. case finished:
  19367. if (ssl->options.side == WOLFSSL_SERVER_END)
  19368. state = ss_client_finished;
  19369. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  19370. state = ss_server_finished;
  19371. else {
  19372. WOLFSSL_MSG("Unknown State");
  19373. state = ss_null_state;
  19374. }
  19375. break;
  19376. default:
  19377. WOLFSSL_MSG("Unknown State");
  19378. state = ss_null_state;
  19379. }
  19380. } else {
  19381. /* Send process */
  19382. if (ssl->options.side == WOLFSSL_SERVER_END)
  19383. state = ssl->options.serverState;
  19384. else
  19385. state = ssl->options.clientState;
  19386. switch(state){
  19387. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  19388. state = ss_server_helloverify;
  19389. break;
  19390. case SERVER_HELLO_COMPLETE:
  19391. state = ss_server_hello;
  19392. break;
  19393. case SERVER_CERT_COMPLETE:
  19394. state = ss_server_cert;
  19395. break;
  19396. case SERVER_KEYEXCHANGE_COMPLETE:
  19397. state = ss_server_keyexchange;
  19398. break;
  19399. case SERVER_HELLODONE_COMPLETE:
  19400. state = ss_server_hellodone;
  19401. break;
  19402. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  19403. state = ss_server_changecipherspec;
  19404. break;
  19405. case SERVER_FINISHED_COMPLETE:
  19406. state = ss_server_finished;
  19407. break;
  19408. case CLIENT_HELLO_COMPLETE:
  19409. state = ss_client_hello;
  19410. break;
  19411. case CLIENT_KEYEXCHANGE_COMPLETE:
  19412. state = ss_client_keyexchange;
  19413. break;
  19414. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  19415. state = ss_client_changecipherspec;
  19416. break;
  19417. case CLIENT_FINISHED_COMPLETE:
  19418. state = ss_client_finished;
  19419. break;
  19420. case HANDSHAKE_DONE:
  19421. state = ss_handshake_done;
  19422. break;
  19423. default:
  19424. WOLFSSL_MSG("Unknown State");
  19425. state = ss_null_state;
  19426. }
  19427. }
  19428. if (protocol == UNKNOWN) {
  19429. WOLFSSL_MSG("Unknown protocol");
  19430. return "";
  19431. }
  19432. else {
  19433. return OUTPUT_STR[state][protocol][cbmode];
  19434. }
  19435. }
  19436. /*
  19437. * Sets default PEM callback password if null is passed into
  19438. * the callback parameter of a PEM_read_bio_* function.
  19439. *
  19440. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  19441. */
  19442. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  19443. {
  19444. int sz;
  19445. (void)w;
  19446. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  19447. /* We assume that the user passes a default password as userdata */
  19448. if (key) {
  19449. sz = (int)XSTRLEN((const char*)key);
  19450. sz = (sz > num) ? num : sz;
  19451. XMEMCPY(name, key, sz);
  19452. return sz;
  19453. } else {
  19454. WOLFSSL_MSG("Error, default password cannot be created.");
  19455. return WOLFSSL_FAILURE;
  19456. }
  19457. }
  19458. #endif /* OPENSSL_EXTRA */
  19459. static long wolf_set_options(long old_op, long op)
  19460. {
  19461. /* if SSL_OP_ALL then turn all bug workarounds on */
  19462. if ((op & WOLFSSL_OP_ALL) == WOLFSSL_OP_ALL) {
  19463. WOLFSSL_MSG("\tSSL_OP_ALL");
  19464. }
  19465. /* by default cookie exchange is on with DTLS */
  19466. if ((op & WOLFSSL_OP_COOKIE_EXCHANGE) == WOLFSSL_OP_COOKIE_EXCHANGE) {
  19467. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  19468. }
  19469. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  19470. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  19471. }
  19472. #ifdef SSL_OP_NO_TLSv1_3
  19473. if ((op & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  19474. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  19475. }
  19476. #endif
  19477. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  19478. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  19479. }
  19480. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  19481. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  19482. }
  19483. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  19484. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  19485. }
  19486. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  19487. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  19488. }
  19489. if ((op & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) ==
  19490. WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  19491. WOLFSSL_MSG("\tWOLFSSL_OP_CIPHER_SERVER_PREFERENCE");
  19492. }
  19493. if ((op & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  19494. #ifdef HAVE_LIBZ
  19495. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  19496. #else
  19497. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  19498. #endif
  19499. }
  19500. return old_op | op;
  19501. }
  19502. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  19503. {
  19504. word16 haveRSA = 1;
  19505. word16 havePSK = 0;
  19506. int keySz = 0;
  19507. WOLFSSL_ENTER("wolfSSL_set_options");
  19508. if (ssl == NULL) {
  19509. return 0;
  19510. }
  19511. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  19512. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) {
  19513. if (ssl->version.minor == TLSv1_3_MINOR)
  19514. ssl->version.minor = TLSv1_2_MINOR;
  19515. }
  19516. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  19517. if (ssl->version.minor == TLSv1_2_MINOR)
  19518. ssl->version.minor = TLSv1_1_MINOR;
  19519. }
  19520. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  19521. if (ssl->version.minor == TLSv1_1_MINOR)
  19522. ssl->version.minor = TLSv1_MINOR;
  19523. }
  19524. if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  19525. if (ssl->version.minor == TLSv1_MINOR)
  19526. ssl->version.minor = SSLv3_MINOR;
  19527. }
  19528. if ((ssl->options.mask & WOLFSSL_OP_NO_COMPRESSION)
  19529. == WOLFSSL_OP_NO_COMPRESSION) {
  19530. #ifdef HAVE_LIBZ
  19531. ssl->options.usingCompression = 0;
  19532. #endif
  19533. }
  19534. /* in the case of a version change the cipher suites should be reset */
  19535. #ifndef NO_PSK
  19536. havePSK = ssl->options.havePSK;
  19537. #endif
  19538. #ifdef NO_RSA
  19539. haveRSA = 0;
  19540. #endif
  19541. #ifndef NO_CERTS
  19542. keySz = ssl->buffers.keySz;
  19543. #endif
  19544. if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
  19545. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  19546. ssl->options.haveDH, ssl->options.haveECDSAsig,
  19547. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  19548. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  19549. ssl->options.haveAnon, TRUE, ssl->options.side);
  19550. return ssl->options.mask;
  19551. }
  19552. long wolfSSL_get_options(const WOLFSSL* ssl)
  19553. {
  19554. WOLFSSL_ENTER("wolfSSL_get_options");
  19555. if(ssl == NULL)
  19556. return WOLFSSL_FAILURE;
  19557. return ssl->options.mask;
  19558. }
  19559. #if defined(HAVE_SECURE_RENEGOTIATION) \
  19560. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  19561. /* clears the counter for number of renegotiations done
  19562. * returns the current count before it is cleared */
  19563. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  19564. {
  19565. long total;
  19566. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  19567. if (s == NULL)
  19568. return 0;
  19569. total = s->secure_rene_count;
  19570. s->secure_rene_count = 0;
  19571. return total;
  19572. }
  19573. /* return the number of renegotiations since wolfSSL_new */
  19574. long wolfSSL_total_renegotiations(WOLFSSL *s)
  19575. {
  19576. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  19577. return wolfSSL_num_renegotiations(s);
  19578. }
  19579. /* return the number of renegotiations since wolfSSL_new */
  19580. long wolfSSL_num_renegotiations(WOLFSSL* s)
  19581. {
  19582. if (s == NULL) {
  19583. return 0;
  19584. }
  19585. return s->secure_rene_count;
  19586. }
  19587. /* Is there a renegotiation currently in progress? */
  19588. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  19589. {
  19590. return s && s->options.handShakeDone &&
  19591. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  19592. }
  19593. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  19594. #ifdef OPENSSL_EXTRA
  19595. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  19596. {
  19597. WOLFSSL_ENTER("SSL_clear_options");
  19598. if(ssl == NULL)
  19599. return WOLFSSL_FAILURE;
  19600. ssl->options.mask &= ~opt;
  19601. return ssl->options.mask;
  19602. }
  19603. #ifdef HAVE_PK_CALLBACKS
  19604. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  19605. {
  19606. if (ssl == NULL) {
  19607. return WOLFSSL_FAILURE;
  19608. }
  19609. ssl->loggingCtx = arg;
  19610. return WOLFSSL_SUCCESS;
  19611. }
  19612. #endif /* HAVE_PK_CALLBACKS */
  19613. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  19614. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  19615. {
  19616. sess = ClientSessionToSession(sess);
  19617. return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  19618. }
  19619. #endif
  19620. /*** TBD ***/
  19621. #ifndef NO_WOLFSSL_STUB
  19622. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  19623. {
  19624. (void)st;
  19625. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  19626. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  19627. return WOLFSSL_FAILURE;
  19628. }
  19629. #endif
  19630. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  19631. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  19632. {
  19633. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  19634. if (s == NULL){
  19635. return BAD_FUNC_ARG;
  19636. }
  19637. if (type == TLSEXT_STATUSTYPE_ocsp){
  19638. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  19639. s->heap, s->devId);
  19640. return (long)r;
  19641. } else {
  19642. WOLFSSL_MSG(
  19643. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  19644. return SSL_FAILURE;
  19645. }
  19646. }
  19647. long wolfSSL_get_tlsext_status_type(WOLFSSL *s)
  19648. {
  19649. TLSX* extension;
  19650. if (s == NULL)
  19651. return WOLFSSL_FATAL_ERROR;
  19652. extension = TLSX_Find(s->extensions, TLSX_STATUS_REQUEST);
  19653. return extension != NULL ? TLSEXT_STATUSTYPE_ocsp : WOLFSSL_FATAL_ERROR;
  19654. }
  19655. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  19656. #ifndef NO_WOLFSSL_STUB
  19657. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  19658. {
  19659. (void)s;
  19660. (void)arg;
  19661. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  19662. return WOLFSSL_FAILURE;
  19663. }
  19664. #endif
  19665. /*** TBD ***/
  19666. #ifndef NO_WOLFSSL_STUB
  19667. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  19668. {
  19669. (void)s;
  19670. (void)arg;
  19671. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  19672. return WOLFSSL_FAILURE;
  19673. }
  19674. #endif
  19675. /*** TBD ***/
  19676. #ifndef NO_WOLFSSL_STUB
  19677. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  19678. {
  19679. (void)s;
  19680. (void)arg;
  19681. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  19682. return WOLFSSL_FAILURE;
  19683. }
  19684. #endif
  19685. /*** TBD ***/
  19686. #ifndef NO_WOLFSSL_STUB
  19687. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  19688. {
  19689. (void)s;
  19690. (void)arg;
  19691. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  19692. return WOLFSSL_FAILURE;
  19693. }
  19694. #endif
  19695. /*** TBD ***/
  19696. #ifndef NO_WOLFSSL_STUB
  19697. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  19698. {
  19699. (void)s;
  19700. (void)sid;
  19701. (void)sid_len;
  19702. WOLFSSL_STUB("SSL_SESSION_set1_id");
  19703. return WOLFSSL_FAILURE;
  19704. }
  19705. #endif
  19706. #ifndef NO_WOLFSSL_STUB
  19707. /*** TBD ***/
  19708. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  19709. {
  19710. (void)s;
  19711. (void)sid_ctx;
  19712. (void)sid_ctx_len;
  19713. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  19714. return WOLFSSL_FAILURE;
  19715. }
  19716. #endif
  19717. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  19718. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  19719. /**
  19720. * Set `a` in a smart way.
  19721. *
  19722. * @param a Object to set
  19723. * @param type The type of object in value
  19724. * @param value Object to set
  19725. */
  19726. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  19727. {
  19728. if (!a) {
  19729. return;
  19730. }
  19731. switch (type) {
  19732. case V_ASN1_NULL:
  19733. a->value.ptr = (char *)value;
  19734. break;
  19735. case V_ASN1_SEQUENCE:
  19736. a->value.asn1_string = (WOLFSSL_ASN1_STRING*)value;
  19737. break;
  19738. case V_ASN1_OBJECT:
  19739. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  19740. break;
  19741. case V_ASN1_UTCTIME:
  19742. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  19743. break;
  19744. case V_ASN1_GENERALIZEDTIME:
  19745. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  19746. break;
  19747. default:
  19748. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  19749. return;
  19750. }
  19751. a->type = type;
  19752. }
  19753. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS */
  19754. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  19755. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) \
  19756. || defined(OPENSSL_EXTRA)
  19757. /**
  19758. * Allocate a new WOLFSSL_ASN1_TYPE object.
  19759. *
  19760. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  19761. */
  19762. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  19763. {
  19764. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  19765. NULL, DYNAMIC_TYPE_OPENSSL);
  19766. if (!ret)
  19767. return NULL;
  19768. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  19769. return ret;
  19770. }
  19771. /**
  19772. * Free WOLFSSL_ASN1_TYPE and all its members.
  19773. *
  19774. * @param at Object to free
  19775. */
  19776. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  19777. {
  19778. if (at) {
  19779. switch (at->type) {
  19780. case V_ASN1_OBJECT:
  19781. wolfSSL_ASN1_OBJECT_free(at->value.object);
  19782. break;
  19783. case V_ASN1_UTCTIME:
  19784. #ifndef NO_ASN_TIME
  19785. wolfSSL_ASN1_TIME_free(at->value.utctime);
  19786. #endif
  19787. break;
  19788. case V_ASN1_GENERALIZEDTIME:
  19789. #ifndef NO_ASN_TIME
  19790. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  19791. #endif
  19792. break;
  19793. case V_ASN1_UTF8STRING:
  19794. case V_ASN1_PRINTABLESTRING:
  19795. case V_ASN1_T61STRING:
  19796. case V_ASN1_IA5STRING:
  19797. case V_ASN1_UNIVERSALSTRING:
  19798. case V_ASN1_SEQUENCE:
  19799. wolfSSL_ASN1_STRING_free(at->value.asn1_string);
  19800. break;
  19801. default:
  19802. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  19803. break;
  19804. }
  19805. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  19806. }
  19807. }
  19808. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS
  19809. || OPENSSL_EXTRA */
  19810. #ifndef NO_WOLFSSL_STUB
  19811. /*** TBD ***/
  19812. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  19813. {
  19814. (void)ssl;
  19815. WOLFSSL_STUB("SSL_get_privatekey");
  19816. return NULL;
  19817. }
  19818. #endif
  19819. /**
  19820. * Get a textual representation of given WOLFSSL_ASN1_OBJECT then write it to
  19821. * buf at most buf_len bytes.
  19822. *
  19823. * params
  19824. * - buf: buffer where the textual representation is to be written to
  19825. * - buf_len: buffer size in bytes
  19826. * - a: WOLFSSL_ASN1_OBJECT
  19827. *
  19828. * return the string length written on success, WOLFSSL_FAILURE on failure.
  19829. */
  19830. WOLFSSL_API int wolfSSL_i2t_ASN1_OBJECT(char *buf, int buf_len,
  19831. WOLFSSL_ASN1_OBJECT *a)
  19832. {
  19833. WOLFSSL_ENTER("wolfSSL_i2t_ASN1_OBJECT");
  19834. return wolfSSL_OBJ_obj2txt(buf, buf_len, a, 0);
  19835. }
  19836. WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  19837. const unsigned char **der,
  19838. long length)
  19839. {
  19840. const unsigned char *d;
  19841. long len;
  19842. int tag, cls;
  19843. WOLFSSL_ASN1_OBJECT* ret = NULL;
  19844. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
  19845. if (!der || !*der || length <= 0) {
  19846. WOLFSSL_MSG("Bad parameter");
  19847. return NULL;
  19848. }
  19849. d = *der;
  19850. if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
  19851. WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
  19852. return NULL;
  19853. }
  19854. /* d now points to value */
  19855. if (tag != ASN_OBJECT_ID) {
  19856. WOLFSSL_MSG("Not an ASN object");
  19857. return NULL;
  19858. }
  19859. ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
  19860. if (ret)
  19861. *der = d;
  19862. return ret;
  19863. }
  19864. /**
  19865. * Parse an ASN1 encoded input and output information about the parsed object
  19866. * @param in ASN1 encoded data. *in is moved to the value of the ASN1 object
  19867. * @param len Length of parsed ASN1 object
  19868. * @param tag Tag value of parsed ASN1 object
  19869. * @param cls Class of parsed ASN1 object
  19870. * @param inLen Length of *in buffer
  19871. * @return int Depends on which bits are set in the returned int:
  19872. * 0x80 an error occurred during parsing
  19873. * 0x20 parsed object is constructed
  19874. * 0x01 the parsed object length is infinite
  19875. */
  19876. int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
  19877. int *cls, long inLen)
  19878. {
  19879. word32 inOutIdx = 0;
  19880. int l;
  19881. byte t;
  19882. int ret = 0x80;
  19883. WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
  19884. if (!in || !*in || !len || !tag || !cls || inLen == 0) {
  19885. WOLFSSL_MSG("Bad parameter");
  19886. return ret;
  19887. }
  19888. if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
  19889. WOLFSSL_MSG("GetASNTag error");
  19890. return ret;
  19891. }
  19892. if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
  19893. WOLFSSL_MSG("GetLength error");
  19894. return ret;
  19895. }
  19896. *tag = t & 0x1F; /* Tag number is 5 lsb */
  19897. *cls = t & 0xC0; /* Class is 2 msb */
  19898. *len = l;
  19899. ret = t & ASN_CONSTRUCTED;
  19900. if (l > (int)(inLen - inOutIdx)) {
  19901. /* Still return other values but indicate error in msb */
  19902. ret |= 0x80;
  19903. }
  19904. *in += inOutIdx;
  19905. return ret;
  19906. }
  19907. WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  19908. const unsigned char **pp, long len)
  19909. {
  19910. WOLFSSL_ASN1_OBJECT* ret = NULL;
  19911. WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
  19912. if (!pp || !*pp || len <= 0) {
  19913. WOLFSSL_MSG("Bad parameter");
  19914. return NULL;
  19915. }
  19916. if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
  19917. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  19918. return NULL;
  19919. }
  19920. ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  19921. if (!ret->obj) {
  19922. WOLFSSL_MSG("error allocating asn data memory");
  19923. wolfSSL_ASN1_OBJECT_free(ret);
  19924. return NULL;
  19925. }
  19926. XMEMCPY((byte*)ret->obj, *pp, len);
  19927. ret->objSz = (unsigned int)len;
  19928. ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  19929. *pp += len;
  19930. if (a)
  19931. *a = ret;
  19932. return ret;
  19933. }
  19934. #ifndef NO_BIO
  19935. /* Return number of bytes written to BIO on success. 0 on failure. */
  19936. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  19937. WOLFSSL_ASN1_OBJECT *a)
  19938. {
  19939. int length = 0;
  19940. word32 idx = 0;
  19941. const char null_str[] = "NULL";
  19942. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  19943. if (bp == NULL)
  19944. return WOLFSSL_FAILURE;
  19945. if (a == NULL) {
  19946. /* Write "NULL" */
  19947. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  19948. (int)XSTRLEN(null_str)) {
  19949. return (int)XSTRLEN(null_str);
  19950. }
  19951. else {
  19952. return WOLFSSL_FAILURE;
  19953. }
  19954. }
  19955. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  19956. WOLFSSL_MSG("Bad ASN1 Object");
  19957. return WOLFSSL_FAILURE;
  19958. }
  19959. if (GetLength((const byte*)a->obj, &idx, &length,
  19960. a->objSz) < 0 || length < 0) {
  19961. return WOLFSSL_FAILURE;
  19962. }
  19963. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  19964. return length;
  19965. }
  19966. return WOLFSSL_FAILURE;
  19967. }
  19968. #endif /* !NO_BIO */
  19969. /* Returns object data for an ASN1_OBJECT */
  19970. /* If pp is NULL then only the size is returned */
  19971. /* If pp has pointer to pointer then its used directly */
  19972. /* If pp has pointer to pointer that is NULL then new variable is allocated */
  19973. /* Failure returns WOLFSSL_FAILURE (0) */
  19974. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  19975. {
  19976. byte *p;
  19977. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  19978. if (!a || !a->obj) {
  19979. WOLFSSL_MSG("Bad parameters");
  19980. return WOLFSSL_FAILURE;
  19981. }
  19982. if (!pp)
  19983. return a->objSz;
  19984. if (*pp)
  19985. p = *pp;
  19986. else {
  19987. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  19988. if (!p) {
  19989. WOLFSSL_MSG("Bad malloc");
  19990. return WOLFSSL_FAILURE;
  19991. }
  19992. }
  19993. XMEMCPY(p, a->obj, a->objSz);
  19994. *pp = p + a->objSz;
  19995. return a->objSz;
  19996. }
  19997. #ifndef NO_WOLFSSL_STUB
  19998. /*** TBD ***/
  19999. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  20000. {
  20001. (void)ctx;
  20002. (void)dh;
  20003. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  20004. }
  20005. #endif
  20006. #ifndef NO_WOLFSSL_STUB
  20007. /*** TBD ***/
  20008. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  20009. {
  20010. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  20011. return NULL;
  20012. }
  20013. #endif
  20014. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  20015. {
  20016. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  20017. if (p == NULL) {
  20018. return WOLFSSL_FATAL_ERROR;
  20019. }
  20020. return (int)p->num;
  20021. }
  20022. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  20023. {
  20024. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  20025. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  20026. }
  20027. #if !defined(NETOS)
  20028. WOLFSSL_API void ERR_load_SSL_strings(void)
  20029. {
  20030. }
  20031. #endif
  20032. #ifdef HAVE_OCSP
  20033. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  20034. {
  20035. if (s == NULL || resp == NULL)
  20036. return 0;
  20037. *resp = s->ocspResp;
  20038. return s->ocspRespSz;
  20039. }
  20040. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  20041. {
  20042. if (s == NULL)
  20043. return WOLFSSL_FAILURE;
  20044. s->ocspResp = resp;
  20045. s->ocspRespSz = len;
  20046. return WOLFSSL_SUCCESS;
  20047. }
  20048. #endif /* HAVE_OCSP */
  20049. #ifdef HAVE_MAX_FRAGMENT
  20050. #ifndef NO_WOLFSSL_CLIENT
  20051. /**
  20052. * Set max fragment tls extension
  20053. * @param c a pointer to WOLFSSL_CTX object
  20054. * @param mode maximum fragment length mode
  20055. * @return 1 on success, otherwise 0 or negative error code
  20056. */
  20057. WOLFSSL_API int wolfSSL_CTX_set_tlsext_max_fragment_length(WOLFSSL_CTX *c,
  20058. unsigned char mode)
  20059. {
  20060. if (c == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  20061. return BAD_FUNC_ARG;
  20062. return wolfSSL_CTX_UseMaxFragment(c, mode);
  20063. }
  20064. /**
  20065. * Set max fragment tls extension
  20066. * @param c a pointer to WOLFSSL object
  20067. * @param mode maximum fragment length mode
  20068. * @return 1 on success, otherwise 0 or negative error code
  20069. */
  20070. WOLFSSL_API int wolfSSL_set_tlsext_max_fragment_length(WOLFSSL *s,
  20071. unsigned char mode)
  20072. {
  20073. if (s == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  20074. return BAD_FUNC_ARG;
  20075. return wolfSSL_UseMaxFragment(s, mode);
  20076. }
  20077. #endif /* NO_WOLFSSL_CLIENT */
  20078. #endif /* HAVE_MAX_FRAGMENT */
  20079. #endif /* OPENSSL_EXTRA */
  20080. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  20081. WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  20082. {
  20083. byte len = 0;
  20084. WOLFSSL_ENTER("SSL_get_finished");
  20085. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  20086. WOLFSSL_MSG("Bad parameter");
  20087. return WOLFSSL_FAILURE;
  20088. }
  20089. if (ssl->options.side == WOLFSSL_SERVER_END) {
  20090. len = ssl->serverFinished_len;
  20091. XMEMCPY(buf, ssl->serverFinished, len);
  20092. }
  20093. else {
  20094. len = ssl->clientFinished_len;
  20095. XMEMCPY(buf, ssl->clientFinished, len);
  20096. }
  20097. return len;
  20098. }
  20099. WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  20100. {
  20101. byte len = 0;
  20102. WOLFSSL_ENTER("SSL_get_peer_finished");
  20103. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  20104. WOLFSSL_MSG("Bad parameter");
  20105. return WOLFSSL_FAILURE;
  20106. }
  20107. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  20108. len = ssl->serverFinished_len;
  20109. XMEMCPY(buf, ssl->serverFinished, len);
  20110. }
  20111. else {
  20112. len = ssl->clientFinished_len;
  20113. XMEMCPY(buf, ssl->clientFinished, len);
  20114. }
  20115. return len;
  20116. }
  20117. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  20118. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  20119. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  20120. {
  20121. if (ssl == NULL) {
  20122. return WOLFSSL_FAILURE;
  20123. }
  20124. return ssl->peerVerifyRet;
  20125. }
  20126. #endif
  20127. #ifdef OPENSSL_EXTRA
  20128. #ifndef NO_WOLFSSL_STUB
  20129. /* shows the number of accepts attempted by CTX in it's lifetime */
  20130. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  20131. {
  20132. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  20133. (void)ctx;
  20134. return 0;
  20135. }
  20136. #endif
  20137. #ifndef NO_WOLFSSL_STUB
  20138. /* shows the number of connects attempted CTX in it's lifetime */
  20139. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  20140. {
  20141. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  20142. (void)ctx;
  20143. return 0;
  20144. }
  20145. #endif
  20146. #ifndef NO_WOLFSSL_STUB
  20147. /* shows the number of accepts completed by CTX in it's lifetime */
  20148. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  20149. {
  20150. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  20151. (void)ctx;
  20152. return 0;
  20153. }
  20154. #endif
  20155. #ifndef NO_WOLFSSL_STUB
  20156. /* shows the number of connects completed by CTX in it's lifetime */
  20157. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  20158. {
  20159. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  20160. (void)ctx;
  20161. return 0;
  20162. }
  20163. #endif
  20164. #ifndef NO_WOLFSSL_STUB
  20165. /* shows the number of renegotiation accepts attempted by CTX */
  20166. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  20167. {
  20168. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  20169. (void)ctx;
  20170. return 0;
  20171. }
  20172. #endif
  20173. #ifndef NO_WOLFSSL_STUB
  20174. /* shows the number of renegotiation accepts attempted by CTX */
  20175. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  20176. {
  20177. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  20178. (void)ctx;
  20179. return 0;
  20180. }
  20181. #endif
  20182. #ifndef NO_WOLFSSL_STUB
  20183. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  20184. {
  20185. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  20186. (void)ctx;
  20187. return 0;
  20188. }
  20189. #endif
  20190. #ifndef NO_WOLFSSL_STUB
  20191. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  20192. {
  20193. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  20194. (void)ctx;
  20195. return 0;
  20196. }
  20197. #endif
  20198. #ifndef NO_WOLFSSL_STUB
  20199. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  20200. {
  20201. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  20202. (void)ctx;
  20203. return 0;
  20204. }
  20205. #endif
  20206. #ifndef NO_WOLFSSL_STUB
  20207. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  20208. {
  20209. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  20210. (void)ctx;
  20211. return 0;
  20212. }
  20213. #endif
  20214. #ifndef NO_WOLFSSL_STUB
  20215. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  20216. {
  20217. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  20218. (void)ctx;
  20219. return 0;
  20220. }
  20221. #endif
  20222. /* Return the total number of sessions */
  20223. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  20224. {
  20225. word32 total = 0;
  20226. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  20227. (void)ctx;
  20228. #if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE)
  20229. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  20230. WOLFSSL_MSG("Error getting session stats");
  20231. }
  20232. #else
  20233. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  20234. #endif
  20235. return (long)total;
  20236. }
  20237. #ifndef NO_CERTS
  20238. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  20239. {
  20240. byte* chain = NULL;
  20241. long chainSz = 0;
  20242. int derSz;
  20243. const byte* der;
  20244. int ret;
  20245. int idx = 0;
  20246. DerBuffer *derBuffer = NULL;
  20247. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  20248. if (ctx == NULL || x509 == NULL) {
  20249. WOLFSSL_MSG("Bad Argument");
  20250. return WOLFSSL_FAILURE;
  20251. }
  20252. der = wolfSSL_X509_get_der(x509, &derSz);
  20253. if (der == NULL || derSz <= 0) {
  20254. WOLFSSL_MSG("Error getting X509 DER");
  20255. return WOLFSSL_FAILURE;
  20256. }
  20257. if (ctx->certificate == NULL) {
  20258. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  20259. /* Process buffer makes first certificate the leaf. */
  20260. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  20261. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  20262. if (ret != WOLFSSL_SUCCESS) {
  20263. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  20264. return WOLFSSL_FAILURE;
  20265. }
  20266. }
  20267. else {
  20268. /* TODO: Do this elsewhere. */
  20269. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  20270. if (ret != 0) {
  20271. WOLFSSL_MSG("Memory Error");
  20272. return WOLFSSL_FAILURE;
  20273. }
  20274. XMEMCPY(derBuffer->buffer, der, derSz);
  20275. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  20276. GET_VERIFY_SETTING_CTX(ctx));
  20277. if (ret != WOLFSSL_SUCCESS) {
  20278. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  20279. return WOLFSSL_FAILURE;
  20280. }
  20281. /* adding cert to existing chain */
  20282. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  20283. chainSz += ctx->certChain->length;
  20284. }
  20285. chainSz += OPAQUE24_LEN + derSz;
  20286. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  20287. if (chain == NULL) {
  20288. WOLFSSL_MSG("Memory Error");
  20289. return WOLFSSL_FAILURE;
  20290. }
  20291. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  20292. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  20293. idx = ctx->certChain->length;
  20294. }
  20295. c32to24(derSz, chain + idx);
  20296. idx += OPAQUE24_LEN;
  20297. XMEMCPY(chain + idx, der, derSz);
  20298. idx += derSz;
  20299. #ifdef WOLFSSL_TLS13
  20300. ctx->certChainCnt++;
  20301. #endif
  20302. FreeDer(&ctx->certChain);
  20303. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  20304. if (ret == 0) {
  20305. XMEMCPY(ctx->certChain->buffer, chain, idx);
  20306. }
  20307. }
  20308. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  20309. wolfSSL_X509_free(x509);
  20310. if (chain != NULL)
  20311. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  20312. return WOLFSSL_SUCCESS;
  20313. }
  20314. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  20315. {
  20316. if (ctx == NULL || ctx->cm == NULL) {
  20317. return WOLFSSL_FAILURE;
  20318. }
  20319. ctx->cm->ocspIOCtx = arg;
  20320. return WOLFSSL_SUCCESS;
  20321. }
  20322. #endif /* NO_CERTS */
  20323. /* Get the session cache mode for CTX
  20324. *
  20325. * ctx WOLFSSL_CTX struct to get cache mode from
  20326. *
  20327. * Returns a bit mask that has the session cache mode */
  20328. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  20329. {
  20330. long m = 0;
  20331. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  20332. if (ctx == NULL) {
  20333. return m;
  20334. }
  20335. if (ctx->sessionCacheOff != 1) {
  20336. m |= SSL_SESS_CACHE_SERVER;
  20337. }
  20338. if (ctx->sessionCacheFlushOff == 1) {
  20339. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  20340. }
  20341. #ifdef HAVE_EXT_CACHE
  20342. if (ctx->internalCacheOff == 1) {
  20343. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  20344. }
  20345. if (ctx->internalCacheLookupOff == 1) {
  20346. m |= SSL_SESS_CACHE_NO_INTERNAL_LOOKUP;
  20347. }
  20348. #endif
  20349. return m;
  20350. }
  20351. int wolfSSL_get_read_ahead(const WOLFSSL* ssl)
  20352. {
  20353. if (ssl == NULL) {
  20354. return WOLFSSL_FAILURE;
  20355. }
  20356. return ssl->readAhead;
  20357. }
  20358. int wolfSSL_set_read_ahead(WOLFSSL* ssl, int v)
  20359. {
  20360. if (ssl == NULL) {
  20361. return WOLFSSL_FAILURE;
  20362. }
  20363. ssl->readAhead = (byte)v;
  20364. return WOLFSSL_SUCCESS;
  20365. }
  20366. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  20367. {
  20368. if (ctx == NULL) {
  20369. return WOLFSSL_FAILURE;
  20370. }
  20371. return ctx->readAhead;
  20372. }
  20373. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  20374. {
  20375. if (ctx == NULL) {
  20376. return WOLFSSL_FAILURE;
  20377. }
  20378. ctx->readAhead = (byte)v;
  20379. return WOLFSSL_SUCCESS;
  20380. }
  20381. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  20382. void* arg)
  20383. {
  20384. if (ctx == NULL) {
  20385. return WOLFSSL_FAILURE;
  20386. }
  20387. ctx->userPRFArg = arg;
  20388. return WOLFSSL_SUCCESS;
  20389. }
  20390. #ifndef NO_DES3
  20391. /* 0 on success */
  20392. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  20393. WOLFSSL_DES_key_schedule* key)
  20394. {
  20395. #ifdef WOLFSSL_CHECK_DESKEY
  20396. return wolfSSL_DES_set_key_checked(myDes, key);
  20397. #else
  20398. wolfSSL_DES_set_key_unchecked(myDes, key);
  20399. return 0;
  20400. #endif
  20401. }
  20402. /* return true in fail case (1) */
  20403. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  20404. {
  20405. word32 value[2];
  20406. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  20407. value[0] = mask;
  20408. value[1] = mask2;
  20409. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  20410. }
  20411. /* check that the key is odd parity and is not a weak key
  20412. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  20413. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  20414. WOLFSSL_DES_key_schedule* key)
  20415. {
  20416. if (myDes == NULL || key == NULL) {
  20417. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  20418. return -2;
  20419. }
  20420. else {
  20421. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  20422. /* sanity check before call to DES_check */
  20423. if (sz != (sizeof(word32) * 2)) {
  20424. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  20425. return -2;
  20426. }
  20427. /* check odd parity */
  20428. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  20429. WOLFSSL_MSG("Odd parity test fail");
  20430. return -1;
  20431. }
  20432. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  20433. WOLFSSL_MSG("Weak key found");
  20434. return -2;
  20435. }
  20436. /* passed tests, now copy over key */
  20437. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  20438. return 0;
  20439. }
  20440. }
  20441. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  20442. * Data Encryption Algorithm (TDEA) Block Cipher"
  20443. *
  20444. * returns 1 if is weak 0 if not
  20445. */
  20446. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  20447. {
  20448. word32 mask, mask2;
  20449. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  20450. if (key == NULL) {
  20451. WOLFSSL_MSG("NULL key passed in");
  20452. return 1;
  20453. }
  20454. mask = 0x01010101; mask2 = 0x01010101;
  20455. if (DES_check(mask, mask2, *key)) {
  20456. WOLFSSL_MSG("Weak key found");
  20457. return 1;
  20458. }
  20459. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  20460. if (DES_check(mask, mask2, *key)) {
  20461. WOLFSSL_MSG("Weak key found");
  20462. return 1;
  20463. }
  20464. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  20465. if (DES_check(mask, mask2, *key)) {
  20466. WOLFSSL_MSG("Weak key found");
  20467. return 1;
  20468. }
  20469. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  20470. if (DES_check(mask, mask2, *key)) {
  20471. WOLFSSL_MSG("Weak key found");
  20472. return 1;
  20473. }
  20474. /* semi-weak *key check (list from same Nist paper) */
  20475. mask = 0x011F011F; mask2 = 0x010E010E;
  20476. if (DES_check(mask, mask2, *key) ||
  20477. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  20478. WOLFSSL_MSG("Weak key found");
  20479. return 1;
  20480. }
  20481. mask = 0x01E001E0; mask2 = 0x01F101F1;
  20482. if (DES_check(mask, mask2, *key) ||
  20483. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  20484. WOLFSSL_MSG("Weak key found");
  20485. return 1;
  20486. }
  20487. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  20488. if (DES_check(mask, mask2, *key) ||
  20489. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  20490. WOLFSSL_MSG("Weak key found");
  20491. return 1;
  20492. }
  20493. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  20494. if (DES_check(mask, mask2, *key) ||
  20495. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  20496. WOLFSSL_MSG("Weak key found");
  20497. return 1;
  20498. }
  20499. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  20500. if (DES_check(mask, mask2, *key) ||
  20501. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  20502. WOLFSSL_MSG("Weak key found");
  20503. return 1;
  20504. }
  20505. return 0;
  20506. }
  20507. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  20508. WOLFSSL_DES_key_schedule* key)
  20509. {
  20510. if (myDes != NULL && key != NULL) {
  20511. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  20512. }
  20513. }
  20514. /* Sets the parity of the DES key for use */
  20515. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  20516. {
  20517. word32 i;
  20518. word32 sz = sizeof(WOLFSSL_DES_cblock);
  20519. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  20520. for (i = 0; i < sz; i++) {
  20521. unsigned char c = (*myDes)[i];
  20522. if ((
  20523. ((c >> 1) & 0x01) ^
  20524. ((c >> 2) & 0x01) ^
  20525. ((c >> 3) & 0x01) ^
  20526. ((c >> 4) & 0x01) ^
  20527. ((c >> 5) & 0x01) ^
  20528. ((c >> 6) & 0x01) ^
  20529. ((c >> 7) & 0x01)) == (c & 0x01)) {
  20530. WOLFSSL_MSG("Flipping parity bit");
  20531. (*myDes)[i] = c ^ 0x01;
  20532. }
  20533. }
  20534. }
  20535. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  20536. {
  20537. word32 i;
  20538. word32 sz = sizeof(WOLFSSL_DES_cblock);
  20539. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  20540. for (i = 0; i < sz; i++) {
  20541. unsigned char c = (*myDes)[i];
  20542. if ((
  20543. ((c >> 1) & 0x01) ^
  20544. ((c >> 2) & 0x01) ^
  20545. ((c >> 3) & 0x01) ^
  20546. ((c >> 4) & 0x01) ^
  20547. ((c >> 5) & 0x01) ^
  20548. ((c >> 6) & 0x01) ^
  20549. ((c >> 7) & 0x01)) == (c & 0x01)) {
  20550. return 0;
  20551. }
  20552. }
  20553. return 1;
  20554. }
  20555. #ifdef WOLFSSL_DES_ECB
  20556. /* Encrypt or decrypt input message desa with key and get output in desb.
  20557. * if enc is DES_ENCRYPT,input message is encrypted or
  20558. * if enc is DES_DECRYPT,input message is decrypted.
  20559. * */
  20560. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  20561. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  20562. {
  20563. Des myDes;
  20564. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  20565. if (desa == NULL || key == NULL || desb == NULL ||
  20566. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  20567. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  20568. } else {
  20569. if (wc_Des_SetKey(&myDes, (const byte*) key,
  20570. (const byte*) NULL, !enc) != 0) {
  20571. WOLFSSL_MSG("wc_Des_SetKey return error.");
  20572. return;
  20573. }
  20574. if (enc == DES_ENCRYPT){
  20575. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  20576. sizeof(WOLFSSL_DES_cblock)) != 0){
  20577. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  20578. }
  20579. } else {
  20580. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  20581. sizeof(WOLFSSL_DES_cblock)) != 0){
  20582. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  20583. }
  20584. }
  20585. }
  20586. }
  20587. #endif
  20588. #endif /* NO_DES3 */
  20589. #ifndef NO_RC4
  20590. /* Set the key state for Arc4 structure.
  20591. *
  20592. * key Arc4 structure to use
  20593. * len length of data buffer
  20594. * data initial state to set Arc4 structure
  20595. */
  20596. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  20597. const unsigned char* data)
  20598. {
  20599. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  20600. (void)sizeof(rc4_test);
  20601. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  20602. if (key == NULL || len < 0) {
  20603. WOLFSSL_MSG("bad argument passed in");
  20604. return;
  20605. }
  20606. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  20607. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  20608. }
  20609. /* Encrypt/decrypt with Arc4 structure.
  20610. *
  20611. * len length of buffer to encrypt/decrypt (in/out)
  20612. * in buffer to encrypt/decrypt
  20613. * out results of encryption/decryption
  20614. */
  20615. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  20616. const unsigned char* in, unsigned char* out)
  20617. {
  20618. WOLFSSL_ENTER("wolfSSL_RC4");
  20619. if (key == NULL || in == NULL || out == NULL) {
  20620. WOLFSSL_MSG("Bad argument passed in");
  20621. return;
  20622. }
  20623. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  20624. }
  20625. #endif /* NO_RC4 */
  20626. #ifndef NO_AES
  20627. #ifdef WOLFSSL_AES_DIRECT
  20628. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  20629. *
  20630. * input Data to encrypt
  20631. * output Encrypted data after done
  20632. * key AES key to use for encryption
  20633. */
  20634. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  20635. AES_KEY *key)
  20636. {
  20637. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  20638. if (input == NULL || output == NULL || key == NULL) {
  20639. WOLFSSL_MSG("Null argument passed in");
  20640. return;
  20641. }
  20642. #if !defined(HAVE_SELFTEST) && \
  20643. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  20644. if (wc_AesEncryptDirect((Aes*)key, output, input) != 0) {
  20645. WOLFSSL_MSG("wc_AesEncryptDirect failed");
  20646. return;
  20647. }
  20648. #else
  20649. wc_AesEncryptDirect((Aes*)key, output, input);
  20650. #endif
  20651. }
  20652. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  20653. *
  20654. * input Data to decrypt
  20655. * output Decrypted data after done
  20656. * key AES key to use for encryption
  20657. */
  20658. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  20659. AES_KEY *key)
  20660. {
  20661. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  20662. if (input == NULL || output == NULL || key == NULL) {
  20663. WOLFSSL_MSG("Null argument passed in");
  20664. return;
  20665. }
  20666. #if !defined(HAVE_SELFTEST) && \
  20667. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  20668. if (wc_AesDecryptDirect((Aes*)key, output, input) != 0) {
  20669. WOLFSSL_MSG("wc_AesDecryptDirect failed");
  20670. return;
  20671. }
  20672. #else
  20673. wc_AesDecryptDirect((Aes*)key, output, input);
  20674. #endif
  20675. }
  20676. #endif /* WOLFSSL_AES_DIRECT */
  20677. /* Setup of an AES key to use for encryption.
  20678. *
  20679. * key key in bytes to use for encryption
  20680. * bits size of key in bits
  20681. * aes AES structure to initialize
  20682. */
  20683. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  20684. AES_KEY *aes)
  20685. {
  20686. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  20687. (void)sizeof(aes_test);
  20688. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  20689. if (key == NULL || aes == NULL) {
  20690. WOLFSSL_MSG("Null argument passed in");
  20691. return -1;
  20692. }
  20693. XMEMSET(aes, 0, sizeof(AES_KEY));
  20694. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPT) != 0) {
  20695. WOLFSSL_MSG("Error in setting AES key");
  20696. return -1;
  20697. }
  20698. return 0;
  20699. }
  20700. /* Setup of an AES key to use for decryption.
  20701. *
  20702. * key key in bytes to use for decryption
  20703. * bits size of key in bits
  20704. * aes AES structure to initialize
  20705. */
  20706. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  20707. AES_KEY *aes)
  20708. {
  20709. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  20710. (void)sizeof(aes_test);
  20711. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  20712. if (key == NULL || aes == NULL) {
  20713. WOLFSSL_MSG("Null argument passed in");
  20714. return -1;
  20715. }
  20716. XMEMSET(aes, 0, sizeof(AES_KEY));
  20717. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPT) != 0) {
  20718. WOLFSSL_MSG("Error in setting AES key");
  20719. return -1;
  20720. }
  20721. return 0;
  20722. }
  20723. #ifdef HAVE_AES_ECB
  20724. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  20725. *
  20726. * in buffer to encrypt/decrypt
  20727. * out buffer to hold result of encryption/decryption
  20728. * key AES structure to use with encryption/decryption
  20729. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  20730. */
  20731. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  20732. AES_KEY *key, const int enc)
  20733. {
  20734. Aes* aes;
  20735. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  20736. if (key == NULL || in == NULL || out == NULL) {
  20737. WOLFSSL_MSG("Error, Null argument passed in");
  20738. return;
  20739. }
  20740. aes = (Aes*)key;
  20741. if (enc == AES_ENCRYPT) {
  20742. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  20743. WOLFSSL_MSG("Error with AES CBC encrypt");
  20744. }
  20745. }
  20746. else {
  20747. #ifdef HAVE_AES_DECRYPT
  20748. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  20749. WOLFSSL_MSG("Error with AES CBC decrypt");
  20750. }
  20751. #else
  20752. WOLFSSL_MSG("AES decryption not compiled in");
  20753. #endif
  20754. }
  20755. }
  20756. #endif /* HAVE_AES_ECB */
  20757. #ifdef HAVE_AES_CBC
  20758. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  20759. * state after encryption/decryption.
  20760. *
  20761. * in buffer to encrypt/decrypt
  20762. * out buffer to hold result of encryption/decryption
  20763. * len length of input buffer
  20764. * key AES structure to use with encryption/decryption
  20765. * iv iv to use with operation
  20766. * enc 1 for encryption and 0 for decryption
  20767. */
  20768. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  20769. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  20770. {
  20771. Aes* aes;
  20772. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  20773. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  20774. WOLFSSL_MSG("Error, Null argument passed in");
  20775. return;
  20776. }
  20777. aes = (Aes*)key;
  20778. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  20779. WOLFSSL_MSG("Error with setting iv");
  20780. return;
  20781. }
  20782. if (enc == AES_ENCRYPT) {
  20783. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  20784. WOLFSSL_MSG("Error with AES CBC encrypt");
  20785. return;
  20786. }
  20787. }
  20788. else {
  20789. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  20790. WOLFSSL_MSG("Error with AES CBC decrypt");
  20791. return;
  20792. }
  20793. }
  20794. /* to be compatible copy iv to iv buffer after completing operation */
  20795. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  20796. }
  20797. #endif /* HAVE_AES_CBC */
  20798. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  20799. * most recent iv state after encryption/decryption.
  20800. *
  20801. * in buffer to encrypt/decrypt
  20802. * out buffer to hold result of encryption/decryption
  20803. * len length of input buffer
  20804. * key AES structure to use with encryption/decryption
  20805. * iv iv to use with operation
  20806. * num contains the amount of block used
  20807. * enc AES_ENCRYPT for encryption and AES_DECRYPT for decryption
  20808. */
  20809. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  20810. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  20811. const int enc)
  20812. {
  20813. #ifndef WOLFSSL_AES_CFB
  20814. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  20815. (void)in;
  20816. (void)out;
  20817. (void)len;
  20818. (void)key;
  20819. (void)iv;
  20820. (void)num;
  20821. (void)enc;
  20822. return;
  20823. #else
  20824. Aes* aes;
  20825. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  20826. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  20827. WOLFSSL_MSG("Error, Null argument passed in");
  20828. return;
  20829. }
  20830. aes = (Aes*)key;
  20831. /*
  20832. * We copy the IV directly into reg here because using wc_AesSetIV will
  20833. * clear the leftover bytes field "left", and this function relies on the
  20834. * leftover bytes being preserved between calls.
  20835. */
  20836. XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE);
  20837. if (enc == AES_ENCRYPT) {
  20838. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  20839. WOLFSSL_MSG("Error with AES CBC encrypt");
  20840. return;
  20841. }
  20842. }
  20843. else {
  20844. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  20845. WOLFSSL_MSG("Error with AES CBC decrypt");
  20846. return;
  20847. }
  20848. }
  20849. /* to be compatible copy iv to iv buffer after completing operation */
  20850. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  20851. /* store number of left over bytes to num */
  20852. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  20853. #endif /* WOLFSSL_AES_CFB */
  20854. }
  20855. /* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */
  20856. #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  20857. int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv,
  20858. unsigned char *out,
  20859. const unsigned char *in, unsigned int inlen)
  20860. {
  20861. int ret;
  20862. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  20863. if (out == NULL || in == NULL) {
  20864. WOLFSSL_MSG("Error, Null argument passed in");
  20865. return WOLFSSL_FAILURE;
  20866. }
  20867. ret = wc_AesKeyWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  20868. return ret < 0 ? WOLFSSL_FAILURE : ret;
  20869. }
  20870. int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
  20871. unsigned char *out,
  20872. const unsigned char *in, unsigned int inlen)
  20873. {
  20874. int ret;
  20875. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  20876. if (out == NULL || in == NULL) {
  20877. WOLFSSL_MSG("Error, Null argument passed in");
  20878. return WOLFSSL_FAILURE;
  20879. }
  20880. ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  20881. return ret < 0 ? WOLFSSL_FAILURE : ret;
  20882. }
  20883. #endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */
  20884. #ifdef HAVE_CTS
  20885. /*
  20886. * Ciphertext stealing interface compatible with RFC2040 and RFC3962.
  20887. */
  20888. size_t wolfSSL_CRYPTO_cts128_encrypt(const unsigned char *in,
  20889. unsigned char *out, size_t len, const void *key,
  20890. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  20891. {
  20892. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  20893. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  20894. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_encrypt");
  20895. if (in == NULL || out == NULL || len < WOLFSSL_CTS128_BLOCK_SZ ||
  20896. cbc == NULL) {
  20897. WOLFSSL_MSG("Bad parameter");
  20898. return WOLFSSL_FAILURE;
  20899. }
  20900. if (lastBlkLen == 0)
  20901. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  20902. /* Encrypt data up to last block */
  20903. (*cbc)(in, out, len - lastBlkLen, key, iv, AES_ENCRYPT);
  20904. /* Move to last block */
  20905. in += len - lastBlkLen;
  20906. out += len - lastBlkLen;
  20907. /* RFC2040: Pad Pn with zeros at the end to create P of length BB. */
  20908. XMEMCPY(lastBlk, in, lastBlkLen);
  20909. XMEMSET(lastBlk + lastBlkLen, 0, WOLFSSL_CTS128_BLOCK_SZ - lastBlkLen);
  20910. /* RFC2040: Select the first Ln bytes of En-1 to create Cn */
  20911. XMEMCPY(out, out - WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  20912. (*cbc)(lastBlk, out - WOLFSSL_CTS128_BLOCK_SZ, WOLFSSL_CTS128_BLOCK_SZ,
  20913. key, iv, AES_ENCRYPT);
  20914. return len;
  20915. }
  20916. size_t wolfSSL_CRYPTO_cts128_decrypt(const unsigned char *in,
  20917. unsigned char *out, size_t len, const void *key,
  20918. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  20919. {
  20920. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  20921. byte prevBlk[WOLFSSL_CTS128_BLOCK_SZ];
  20922. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  20923. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_decrypt");
  20924. if (in == NULL || out == NULL || len <= WOLFSSL_CTS128_BLOCK_SZ ||
  20925. cbc == NULL) {
  20926. WOLFSSL_MSG("Bad parameter");
  20927. return WOLFSSL_FAILURE;
  20928. }
  20929. if (lastBlkLen == 0)
  20930. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  20931. /* Decrypt up to last two blocks */
  20932. (*cbc)(in, out, len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ, key, iv,
  20933. AES_DECRYPTION);
  20934. /* Move to last two blocks */
  20935. in += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  20936. out += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  20937. /* RFC2040: Decrypt Cn-1 to create Dn.
  20938. * Use 0 buffer as IV to do straight decryption.
  20939. * This places the Cn-1 block at lastBlk */
  20940. XMEMSET(lastBlk, 0, WOLFSSL_CTS128_BLOCK_SZ);
  20941. (*cbc)(in, prevBlk, WOLFSSL_CTS128_BLOCK_SZ, key, lastBlk, AES_DECRYPT);
  20942. /* RFC2040: Append the tail (BB minus Ln) bytes of Xn to Cn
  20943. * to create En. */
  20944. XMEMCPY(prevBlk, in + WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  20945. /* Cn and Cn-1 can now be decrypted */
  20946. (*cbc)(prevBlk, out, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  20947. (*cbc)(lastBlk, lastBlk, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  20948. XMEMCPY(out + WOLFSSL_CTS128_BLOCK_SZ, lastBlk, lastBlkLen);
  20949. return len;
  20950. }
  20951. #endif /* HAVE_CTS */
  20952. #endif /* NO_AES */
  20953. #ifndef NO_ASN_TIME
  20954. #ifndef NO_BIO
  20955. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  20956. {
  20957. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  20958. if (bio == NULL || a == NULL) {
  20959. return WOLFSSL_FAILURE;
  20960. }
  20961. if (a->type != ASN_UTC_TIME) {
  20962. WOLFSSL_MSG("Error, not UTC_TIME");
  20963. return WOLFSSL_FAILURE;
  20964. }
  20965. return wolfSSL_ASN1_TIME_print(bio, a);
  20966. }
  20967. #endif /* !NO_BIO */
  20968. /* Checks the ASN1 syntax of "a"
  20969. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  20970. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  20971. {
  20972. char buf[MAX_TIME_STRING_SZ];
  20973. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  20974. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  20975. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  20976. MAX_TIME_STRING_SZ) == NULL) {
  20977. return WOLFSSL_FAILURE;
  20978. }
  20979. return WOLFSSL_SUCCESS;
  20980. }
  20981. /*
  20982. * Convert time to Unix time (GMT).
  20983. */
  20984. static long long TimeToUnixTime(int sec, int min, int hour, int mday, int mon,
  20985. int year)
  20986. {
  20987. /* Number of cumulative days from the previous months, starting from
  20988. * beginning of January. */
  20989. static const int monthDaysCumulative [12] = {
  20990. 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
  20991. };
  20992. int leapDays = year;
  20993. if (mon <= 1) {
  20994. --leapDays;
  20995. }
  20996. leapDays = leapDays / 4 - leapDays / 100 + leapDays / 400 - 1969 / 4 +
  20997. 1969 / 100 - 1969 / 400;
  20998. return ((((long long) (year - 1970) * 365 + leapDays +
  20999. monthDaysCumulative[mon] + mday - 1) * 24 + hour) * 60 + min) * 60 +
  21000. sec;
  21001. }
  21002. int wolfSSL_ASN1_TIME_diff(int *days, int *secs, const WOLFSSL_ASN1_TIME *from,
  21003. const WOLFSSL_ASN1_TIME *to)
  21004. {
  21005. const int SECS_PER_DAY = 24 * 60 * 60;
  21006. struct tm fromTm_s, *fromTmGmt = &fromTm_s;
  21007. struct tm toTm_s, *toTmGmt = &toTm_s;
  21008. time_t currTime;
  21009. long long fromSecs;
  21010. long long toSecs;
  21011. double diffSecs;
  21012. struct tm *tmpTs;
  21013. #if defined(NEED_TMP_TIME)
  21014. /* for use with gmtime_r */
  21015. struct tm tmpTimeStorage;
  21016. tmpTs = &tmpTimeStorage;
  21017. #else
  21018. tmpTs = NULL;
  21019. #endif
  21020. (void)tmpTs;
  21021. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_diff");
  21022. if (days == NULL) {
  21023. WOLFSSL_MSG("days is NULL");
  21024. return WOLFSSL_FAILURE;
  21025. }
  21026. if (secs == NULL) {
  21027. WOLFSSL_MSG("secs is NULL");
  21028. return WOLFSSL_FAILURE;
  21029. }
  21030. if (from == NULL && to == NULL) {
  21031. *days = 0;
  21032. *secs = 0;
  21033. return WOLFSSL_SUCCESS;
  21034. }
  21035. if (from == NULL) {
  21036. currTime = wc_Time(0);
  21037. fromTmGmt = XGMTIME(&currTime, tmpTs);
  21038. if (fromTmGmt == NULL) {
  21039. WOLFSSL_MSG("XGMTIME for from time failed.");
  21040. return WOLFSSL_FAILURE;
  21041. }
  21042. }
  21043. else if (wolfSSL_ASN1_TIME_to_tm(from, fromTmGmt) != WOLFSSL_SUCCESS) {
  21044. WOLFSSL_MSG("Failed to convert from time to struct tm.");
  21045. return WOLFSSL_FAILURE;
  21046. }
  21047. /* We use TimeToUnixTime here instead of XMKTIME to avoid the Year 2038
  21048. * Problem on platforms where time_t is 32 bits. struct tm stores the year
  21049. * as years since 1900, so we add 1900 to the year. */
  21050. fromSecs = TimeToUnixTime(fromTmGmt->tm_sec, fromTmGmt->tm_min,
  21051. fromTmGmt->tm_hour, fromTmGmt->tm_mday,
  21052. fromTmGmt->tm_mon, fromTmGmt->tm_year + 1900);
  21053. if (to == NULL) {
  21054. currTime = wc_Time(0);
  21055. toTmGmt = XGMTIME(&currTime, tmpTs);
  21056. if (toTmGmt == NULL) {
  21057. WOLFSSL_MSG("XGMTIME for to time failed.");
  21058. return WOLFSSL_FAILURE;
  21059. }
  21060. }
  21061. else if (wolfSSL_ASN1_TIME_to_tm(to, toTmGmt) != WOLFSSL_SUCCESS) {
  21062. WOLFSSL_MSG("Failed to convert to time to struct tm.");
  21063. return WOLFSSL_FAILURE;
  21064. }
  21065. toSecs = TimeToUnixTime(toTmGmt->tm_sec, toTmGmt->tm_min, toTmGmt->tm_hour,
  21066. toTmGmt->tm_mday, toTmGmt->tm_mon,
  21067. toTmGmt->tm_year + 1900);
  21068. diffSecs = (double)(toSecs - fromSecs);
  21069. *days = (int) (diffSecs / SECS_PER_DAY);
  21070. *secs = (int) (diffSecs - (((double)*days) * SECS_PER_DAY));
  21071. return WOLFSSL_SUCCESS;
  21072. }
  21073. int wolfSSL_ASN1_TIME_compare(const WOLFSSL_ASN1_TIME *a,
  21074. const WOLFSSL_ASN1_TIME *b)
  21075. {
  21076. int ret;
  21077. int days;
  21078. int secs;
  21079. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_compare");
  21080. if (wolfSSL_ASN1_TIME_diff(&days, &secs, a, b) != WOLFSSL_SUCCESS) {
  21081. WOLFSSL_MSG("Failed to get time difference.");
  21082. ret = -2;
  21083. }
  21084. else {
  21085. if (days == 0 && secs == 0) {
  21086. /* a and b are the same time. */
  21087. ret = 0;
  21088. }
  21089. else if (days >= 0 && secs >= 0) {
  21090. /* a is before b. */
  21091. ret = -1;
  21092. }
  21093. else if (days <= 0 && secs <= 0) {
  21094. /* a is after b. */
  21095. ret = 1;
  21096. }
  21097. else {
  21098. WOLFSSL_MSG("Incoherent time difference.");
  21099. ret = -2;
  21100. }
  21101. }
  21102. WOLFSSL_LEAVE("wolfSSL_ASN1_TIME_compare", ret);
  21103. return ret;
  21104. }
  21105. #endif /* !NO_ASN_TIME */
  21106. #ifndef NO_WOLFSSL_STUB
  21107. WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  21108. {
  21109. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  21110. (void)s;
  21111. (void)t;
  21112. return s;
  21113. }
  21114. #endif /* !NO_WOLFSSL_STUB */
  21115. int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
  21116. {
  21117. int slen;
  21118. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
  21119. if (!str) {
  21120. WOLFSSL_MSG("Bad parameter");
  21121. return WOLFSSL_FAILURE;
  21122. }
  21123. slen = (int)XSTRLEN(str)+1;
  21124. if (slen > CTC_DATE_SIZE) {
  21125. WOLFSSL_MSG("Date string too long");
  21126. return WOLFSSL_FAILURE;
  21127. }
  21128. if (s) {
  21129. XMEMCPY(s->data, str, slen);
  21130. s->length = slen - 1; /* do not include null terminator in length */
  21131. s->type = slen == ASN_UTC_TIME_SIZE ? V_ASN1_UTCTIME :
  21132. V_ASN1_GENERALIZEDTIME;
  21133. }
  21134. return WOLFSSL_SUCCESS;
  21135. }
  21136. #ifndef NO_BIO
  21137. /* Return the month as a string.
  21138. *
  21139. * n The number of the month as a two characters (1 based).
  21140. * returns the month as a string.
  21141. */
  21142. static WC_INLINE const char* MonthStr(const char* n)
  21143. {
  21144. static const char monthStr[12][4] = {
  21145. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  21146. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  21147. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  21148. }
  21149. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  21150. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  21151. {
  21152. const char* p;
  21153. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  21154. if (bio == NULL || asnTime == NULL)
  21155. return BAD_FUNC_ARG;
  21156. if (asnTime->type != ASN_GENERALIZED_TIME) {
  21157. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  21158. return WOLFSSL_FAILURE;
  21159. }
  21160. p = (const char *)(asnTime->data);
  21161. /* GetTimeString not always available. */
  21162. if (wolfSSL_BIO_write(bio, MonthStr(p + 4), 3) <= 0)
  21163. return WOLFSSL_FAILURE;
  21164. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21165. return WOLFSSL_FAILURE;
  21166. /* Day */
  21167. if (wolfSSL_BIO_write(bio, p + 6, 2) <= 0)
  21168. return WOLFSSL_FAILURE;
  21169. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21170. return WOLFSSL_FAILURE;
  21171. /* Hour */
  21172. if (wolfSSL_BIO_write(bio, p + 8, 2) <= 0)
  21173. return WOLFSSL_FAILURE;
  21174. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  21175. return WOLFSSL_FAILURE;
  21176. /* Min */
  21177. if (wolfSSL_BIO_write(bio, p + 10, 2) <= 0)
  21178. return WOLFSSL_FAILURE;
  21179. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  21180. return WOLFSSL_FAILURE;
  21181. /* Secs */
  21182. if (wolfSSL_BIO_write(bio, p + 12, 2) <= 0)
  21183. return WOLFSSL_FAILURE;
  21184. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  21185. return WOLFSSL_FAILURE;
  21186. if (wolfSSL_BIO_write(bio, p, 4) <= 0)
  21187. return WOLFSSL_FAILURE;
  21188. return 0;
  21189. }
  21190. #endif /* !NO_BIO */
  21191. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  21192. {
  21193. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  21194. if (asn1Time == NULL)
  21195. return;
  21196. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  21197. }
  21198. #endif /* OPENSSL_EXTRA */
  21199. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21200. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  21201. {
  21202. WOLFSSL_ENTER("wolfSSL_sk_num");
  21203. if (sk == NULL)
  21204. return 0;
  21205. return (int)sk->num;
  21206. }
  21207. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  21208. {
  21209. WOLFSSL_ENTER("wolfSSL_sk_value");
  21210. for (; sk != NULL && i > 0; i--)
  21211. sk = sk->next;
  21212. if (sk == NULL)
  21213. return NULL;
  21214. switch (sk->type) {
  21215. case STACK_TYPE_X509:
  21216. return (void*)sk->data.x509;
  21217. case STACK_TYPE_GEN_NAME:
  21218. return (void*)sk->data.gn;
  21219. case STACK_TYPE_BIO:
  21220. return (void*)sk->data.bio;
  21221. case STACK_TYPE_OBJ:
  21222. return (void*)sk->data.obj;
  21223. case STACK_TYPE_STRING:
  21224. return (void*)sk->data.string;
  21225. case STACK_TYPE_CIPHER:
  21226. return (void*)&sk->data.cipher;
  21227. case STACK_TYPE_ACCESS_DESCRIPTION:
  21228. return (void*)sk->data.access;
  21229. case STACK_TYPE_X509_EXT:
  21230. return (void*)sk->data.ext;
  21231. case STACK_TYPE_X509_REQ_ATTR:
  21232. return (void*)sk->data.generic;
  21233. case STACK_TYPE_NULL:
  21234. return (void*)sk->data.generic;
  21235. case STACK_TYPE_X509_NAME:
  21236. return (void*)sk->data.name;
  21237. case STACK_TYPE_X509_NAME_ENTRY:
  21238. return (void*)sk->data.name_entry;
  21239. case STACK_TYPE_CONF_VALUE:
  21240. #ifdef OPENSSL_EXTRA
  21241. return (void*)sk->data.conf;
  21242. #else
  21243. return NULL;
  21244. #endif
  21245. case STACK_TYPE_X509_INFO:
  21246. return (void*)sk->data.info;
  21247. case STACK_TYPE_BY_DIR_entry:
  21248. return (void*)sk->data.dir_entry;
  21249. case STACK_TYPE_BY_DIR_hash:
  21250. return (void*)sk->data.dir_hash;
  21251. case STACK_TYPE_X509_OBJ:
  21252. return (void*)sk->data.x509_obj;
  21253. case STACK_TYPE_DIST_POINT:
  21254. return (void*)sk->data.dp;
  21255. case STACK_TYPE_X509_CRL:
  21256. return (void*)sk->data.crl;
  21257. default:
  21258. return (void*)sk->data.generic;
  21259. }
  21260. }
  21261. /* copies over data of "in" to "out" */
  21262. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  21263. {
  21264. if (in == NULL || out == NULL)
  21265. return;
  21266. *out = *in;
  21267. }
  21268. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  21269. {
  21270. WOLFSSL_STACK* ret = NULL;
  21271. WOLFSSL_STACK* last = NULL;
  21272. WOLFSSL_ENTER("wolfSSL_sk_dup");
  21273. while (sk) {
  21274. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  21275. if (!cur) {
  21276. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  21277. goto error;
  21278. }
  21279. if (!ret) {
  21280. /* Set first node */
  21281. ret = cur;
  21282. }
  21283. if (last) {
  21284. last->next = cur;
  21285. }
  21286. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  21287. /* We will allocate new memory for this */
  21288. XMEMSET(&cur->data, 0, sizeof(cur->data));
  21289. cur->next = NULL;
  21290. switch (sk->type) {
  21291. case STACK_TYPE_X509:
  21292. if (!sk->data.x509)
  21293. break;
  21294. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  21295. if (!cur->data.x509) {
  21296. WOLFSSL_MSG("wolfSSL_X509_dup error");
  21297. goto error;
  21298. }
  21299. break;
  21300. case STACK_TYPE_CIPHER:
  21301. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  21302. break;
  21303. case STACK_TYPE_GEN_NAME:
  21304. if (!sk->data.gn)
  21305. break;
  21306. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  21307. if (!cur->data.gn) {
  21308. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  21309. goto error;
  21310. }
  21311. break;
  21312. case STACK_TYPE_OBJ:
  21313. if (!sk->data.obj)
  21314. break;
  21315. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  21316. if (!cur->data.obj) {
  21317. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  21318. goto error;
  21319. }
  21320. break;
  21321. case STACK_TYPE_BIO:
  21322. case STACK_TYPE_STRING:
  21323. case STACK_TYPE_ACCESS_DESCRIPTION:
  21324. case STACK_TYPE_X509_EXT:
  21325. case STACK_TYPE_X509_REQ_ATTR:
  21326. case STACK_TYPE_NULL:
  21327. case STACK_TYPE_X509_NAME:
  21328. case STACK_TYPE_X509_NAME_ENTRY:
  21329. case STACK_TYPE_CONF_VALUE:
  21330. case STACK_TYPE_X509_INFO:
  21331. case STACK_TYPE_BY_DIR_entry:
  21332. case STACK_TYPE_BY_DIR_hash:
  21333. case STACK_TYPE_X509_OBJ:
  21334. case STACK_TYPE_DIST_POINT:
  21335. case STACK_TYPE_X509_CRL:
  21336. default:
  21337. WOLFSSL_MSG("Unsupported stack type");
  21338. goto error;
  21339. }
  21340. sk = sk->next;
  21341. last = cur;
  21342. }
  21343. return ret;
  21344. error:
  21345. if (ret) {
  21346. wolfSSL_sk_GENERAL_NAME_free(ret);
  21347. }
  21348. return NULL;
  21349. }
  21350. /* Free the just the stack structure */
  21351. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  21352. {
  21353. WOLFSSL_ENTER("wolfSSL_sk_free");
  21354. while (sk != NULL) {
  21355. WOLFSSL_STACK* next = sk->next;
  21356. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  21357. sk = next;
  21358. }
  21359. }
  21360. /* Frees each node in the stack and frees the stack.
  21361. */
  21362. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  21363. void (*f) (void*))
  21364. {
  21365. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  21366. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  21367. }
  21368. /* return 1 on success 0 on fail */
  21369. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  21370. {
  21371. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  21372. return wolfSSL_sk_push(sk, generic);
  21373. }
  21374. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  21375. {
  21376. wolfSSL_sk_free(sk);
  21377. }
  21378. /* Free all nodes in a stack including the pushed objects */
  21379. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  21380. wolfSSL_sk_freefunc func)
  21381. {
  21382. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  21383. if (sk == NULL) {
  21384. /* pop_free can be called with NULL, do not print bad argument */
  21385. return;
  21386. }
  21387. #if defined(WOLFSSL_QT)
  21388. /* In Qt v15.5, it calls OPENSSL_sk_free(xxx, OPENSSL_sk_free).
  21389. * By using OPENSSL_sk_free for free causes access violation.
  21390. * Therefore, switching free func to wolfSSL_ACCESS_DESCRIPTION_free
  21391. * is needed even the func isn't NULL.
  21392. */
  21393. if (sk->type == STACK_TYPE_ACCESS_DESCRIPTION) {
  21394. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  21395. }
  21396. #endif
  21397. if (func == NULL) {
  21398. switch(sk->type) {
  21399. case STACK_TYPE_ACCESS_DESCRIPTION:
  21400. #if defined(OPENSSL_ALL)
  21401. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  21402. #endif
  21403. break;
  21404. case STACK_TYPE_X509:
  21405. func = (wolfSSL_sk_freefunc)wolfSSL_X509_free;
  21406. break;
  21407. case STACK_TYPE_X509_OBJ:
  21408. #ifdef OPENSSL_ALL
  21409. func = (wolfSSL_sk_freefunc)wolfSSL_X509_OBJECT_free;
  21410. #endif
  21411. break;
  21412. case STACK_TYPE_OBJ:
  21413. func = (wolfSSL_sk_freefunc)wolfSSL_ASN1_OBJECT_free;
  21414. break;
  21415. case STACK_TYPE_DIST_POINT:
  21416. #ifdef OPENSSL_EXTRA
  21417. func = (wolfSSL_sk_freefunc)wolfSSL_DIST_POINT_free;
  21418. #endif
  21419. break;
  21420. case STACK_TYPE_GEN_NAME:
  21421. func = (wolfSSL_sk_freefunc)wolfSSL_GENERAL_NAME_free;
  21422. break;
  21423. case STACK_TYPE_STRING:
  21424. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  21425. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21426. func = (wolfSSL_sk_freefunc)wolfSSL_WOLFSSL_STRING_free;
  21427. #endif
  21428. break;
  21429. case STACK_TYPE_X509_NAME:
  21430. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  21431. && !defined(WOLFCRYPT_ONLY)
  21432. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_free;
  21433. #endif
  21434. break;
  21435. case STACK_TYPE_X509_NAME_ENTRY:
  21436. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  21437. && !defined(WOLFCRYPT_ONLY)
  21438. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_ENTRY_free;
  21439. #endif
  21440. break;
  21441. case STACK_TYPE_X509_EXT:
  21442. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  21443. func = (wolfSSL_sk_freefunc)wolfSSL_X509_EXTENSION_free;
  21444. #endif
  21445. break;
  21446. case STACK_TYPE_X509_REQ_ATTR:
  21447. #if defined(OPENSSL_ALL) && \
  21448. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  21449. func = (wolfSSL_sk_freefunc)wolfSSL_X509_ATTRIBUTE_free;
  21450. #endif
  21451. break;
  21452. case STACK_TYPE_CONF_VALUE:
  21453. #if defined(OPENSSL_ALL)
  21454. func = (wolfSSL_sk_freefunc)wolfSSL_X509V3_conf_free;
  21455. #endif
  21456. break;
  21457. case STACK_TYPE_X509_INFO:
  21458. #if defined(OPENSSL_ALL)
  21459. func = (wolfSSL_sk_freefunc)wolfSSL_X509_INFO_free;
  21460. #endif
  21461. break;
  21462. case STACK_TYPE_BIO:
  21463. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  21464. func = (wolfSSL_sk_freefunc)wolfSSL_BIO_vfree;
  21465. #endif
  21466. break;
  21467. case STACK_TYPE_BY_DIR_entry:
  21468. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  21469. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_entry_free;
  21470. #endif
  21471. break;
  21472. case STACK_TYPE_BY_DIR_hash:
  21473. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  21474. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_HASH_free;
  21475. #endif
  21476. break;
  21477. case STACK_TYPE_X509_CRL:
  21478. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  21479. func = (wolfSSL_sk_freefunc)wolfSSL_X509_CRL_free;
  21480. #endif
  21481. break;
  21482. case STACK_TYPE_CIPHER:
  21483. case STACK_TYPE_NULL:
  21484. default:
  21485. break;
  21486. }
  21487. }
  21488. while (sk != NULL) {
  21489. WOLFSSL_STACK* next = sk->next;
  21490. if (func != NULL) {
  21491. if (sk->type != STACK_TYPE_CIPHER)
  21492. func(sk->data.generic);
  21493. }
  21494. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  21495. sk = next;
  21496. }
  21497. }
  21498. /* Creates and returns a new null stack. */
  21499. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  21500. {
  21501. WOLFSSL_STACK* sk;
  21502. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  21503. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  21504. DYNAMIC_TYPE_OPENSSL);
  21505. if (sk == NULL) {
  21506. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  21507. return NULL;
  21508. }
  21509. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  21510. sk->type = STACK_TYPE_NULL;
  21511. return sk;
  21512. }
  21513. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  21514. {
  21515. if (sk == NULL)
  21516. return 0;
  21517. return (int)sk->num;
  21518. }
  21519. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  21520. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  21521. defined(HAVE_EXT_CACHE))
  21522. /* stunnel 4.28 needs
  21523. *
  21524. * Callback that is called if a session tries to resume but could not find
  21525. * the session to resume it.
  21526. */
  21527. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  21528. WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*))
  21529. {
  21530. if (ctx == NULL)
  21531. return;
  21532. #ifdef HAVE_EXT_CACHE
  21533. ctx->get_sess_cb = f;
  21534. #else
  21535. (void)f;
  21536. #endif
  21537. }
  21538. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  21539. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  21540. {
  21541. if (ctx == NULL)
  21542. return;
  21543. #ifdef HAVE_EXT_CACHE
  21544. ctx->new_sess_cb = f;
  21545. #else
  21546. (void)f;
  21547. #endif
  21548. }
  21549. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  21550. WOLFSSL_SESSION*))
  21551. {
  21552. if (ctx == NULL)
  21553. return;
  21554. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  21555. ctx->rem_sess_cb = f;
  21556. #else
  21557. (void)f;
  21558. #endif
  21559. }
  21560. /*
  21561. *
  21562. * Note: It is expected that the importing and exporting function have been
  21563. * built with the same settings. For example if session tickets was
  21564. * enabled with the wolfSSL library exporting a session then it is
  21565. * expected to be turned on with the wolfSSL library importing the session.
  21566. */
  21567. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  21568. {
  21569. int size = 0;
  21570. #ifdef HAVE_EXT_CACHE
  21571. int idx = 0;
  21572. #ifdef SESSION_CERTS
  21573. int i;
  21574. #endif
  21575. unsigned char *data;
  21576. WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION");
  21577. sess = ClientSessionToSession(sess);
  21578. if (sess == NULL) {
  21579. return BAD_FUNC_ARG;
  21580. }
  21581. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  21582. * haveEMS */
  21583. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  21584. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  21585. /* altSessionID */
  21586. size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0);
  21587. #ifdef SESSION_CERTS
  21588. /* Peer chain */
  21589. size += OPAQUE8_LEN;
  21590. for (i = 0; i < sess->chain.count; i++)
  21591. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  21592. #endif
  21593. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  21594. defined(HAVE_SESSION_TICKET))
  21595. /* Protocol version */
  21596. size += OPAQUE16_LEN;
  21597. #endif
  21598. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  21599. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  21600. /* cipher suite */
  21601. size += OPAQUE16_LEN;
  21602. #endif
  21603. #ifndef NO_CLIENT_CACHE
  21604. /* ServerID len | ServerID */
  21605. size += OPAQUE16_LEN + sess->idLen;
  21606. #endif
  21607. #ifdef OPENSSL_EXTRA
  21608. /* session context ID len | session context ID */
  21609. size += OPAQUE8_LEN + sess->sessionCtxSz;
  21610. #endif
  21611. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21612. /* peerVerifyRet */
  21613. size += OPAQUE8_LEN;
  21614. #endif
  21615. #ifdef WOLFSSL_TLS13
  21616. /* namedGroup */
  21617. size += OPAQUE16_LEN;
  21618. #endif
  21619. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  21620. #ifdef WOLFSSL_TLS13
  21621. /* ticketSeen | ticketAdd */
  21622. size += OPAQUE32_LEN + OPAQUE32_LEN;
  21623. /* ticketNonce */
  21624. size += OPAQUE8_LEN + sess->ticketNonce.len;
  21625. #endif
  21626. #ifdef WOLFSSL_EARLY_DATA
  21627. size += OPAQUE32_LEN;
  21628. #endif
  21629. #endif
  21630. #ifdef HAVE_SESSION_TICKET
  21631. /* ticket len | ticket */
  21632. size += OPAQUE16_LEN + sess->ticketLen;
  21633. #endif
  21634. if (p != NULL) {
  21635. if (*p == NULL)
  21636. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  21637. if (*p == NULL)
  21638. return 0;
  21639. data = *p;
  21640. data[idx++] = sess->side;
  21641. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  21642. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  21643. data[idx++] = sess->sessionIDSz;
  21644. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  21645. idx += sess->sessionIDSz;
  21646. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  21647. data[idx++] = (byte)sess->haveEMS;
  21648. data[idx++] = sess->haveAltSessionID ? ID_LEN : 0;
  21649. if (sess->haveAltSessionID) {
  21650. XMEMCPY(data + idx, sess->altSessionID, ID_LEN);
  21651. idx += ID_LEN;
  21652. }
  21653. #ifdef SESSION_CERTS
  21654. data[idx++] = (byte)sess->chain.count;
  21655. for (i = 0; i < sess->chain.count; i++) {
  21656. c16toa((word16)sess->chain.certs[i].length, data + idx);
  21657. idx += OPAQUE16_LEN;
  21658. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  21659. sess->chain.certs[i].length);
  21660. idx += sess->chain.certs[i].length;
  21661. }
  21662. #endif
  21663. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  21664. defined(HAVE_SESSION_TICKET))
  21665. data[idx++] = sess->version.major;
  21666. data[idx++] = sess->version.minor;
  21667. #endif
  21668. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  21669. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  21670. data[idx++] = sess->cipherSuite0;
  21671. data[idx++] = sess->cipherSuite;
  21672. #endif
  21673. #ifndef NO_CLIENT_CACHE
  21674. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  21675. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  21676. idx += sess->idLen;
  21677. #endif
  21678. #ifdef OPENSSL_EXTRA
  21679. data[idx++] = sess->sessionCtxSz;
  21680. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  21681. idx += sess->sessionCtxSz;
  21682. #endif
  21683. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21684. data[idx++] = sess->peerVerifyRet;
  21685. #endif
  21686. #ifdef WOLFSSL_TLS13
  21687. c16toa(sess->namedGroup, data + idx);
  21688. idx += OPAQUE16_LEN;
  21689. #endif
  21690. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  21691. #ifdef WOLFSSL_TLS13
  21692. c32toa(sess->ticketSeen, data + idx);
  21693. idx += OPAQUE32_LEN;
  21694. c32toa(sess->ticketAdd, data + idx);
  21695. idx += OPAQUE32_LEN;
  21696. data[idx++] = sess->ticketNonce.len;
  21697. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  21698. idx += sess->ticketNonce.len;
  21699. #endif
  21700. #ifdef WOLFSSL_EARLY_DATA
  21701. c32toa(sess->maxEarlyDataSz, data + idx);
  21702. idx += OPAQUE32_LEN;
  21703. #endif
  21704. #endif
  21705. #ifdef HAVE_SESSION_TICKET
  21706. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  21707. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  21708. idx += sess->ticketLen;
  21709. #endif
  21710. }
  21711. #endif
  21712. (void)sess;
  21713. (void)p;
  21714. #ifdef HAVE_EXT_CACHE
  21715. (void)idx;
  21716. #endif
  21717. return size;
  21718. }
  21719. /* TODO: no function to free new session.
  21720. *
  21721. * Note: It is expected that the importing and exporting function have been
  21722. * built with the same settings. For example if session tickets was
  21723. * enabled with the wolfSSL library exporting a session then it is
  21724. * expected to be turned on with the wolfSSL library importing the session.
  21725. */
  21726. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  21727. const unsigned char** p, long i)
  21728. {
  21729. WOLFSSL_SESSION* s = NULL;
  21730. int ret = 0;
  21731. #if defined(HAVE_EXT_CACHE)
  21732. int idx;
  21733. byte* data;
  21734. #ifdef SESSION_CERTS
  21735. int j;
  21736. word16 length;
  21737. #endif
  21738. #endif /* HAVE_EXT_CACHE */
  21739. (void)p;
  21740. (void)i;
  21741. (void)ret;
  21742. (void)sess;
  21743. #ifdef HAVE_EXT_CACHE
  21744. if (p == NULL || *p == NULL)
  21745. return NULL;
  21746. s = wolfSSL_SESSION_new();
  21747. if (s == NULL)
  21748. return NULL;
  21749. idx = 0;
  21750. data = (byte*)*p;
  21751. /* side | bornOn | timeout | sessionID len */
  21752. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  21753. ret = BUFFER_ERROR;
  21754. goto end;
  21755. }
  21756. s->side = data[idx++];
  21757. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  21758. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  21759. s->sessionIDSz = data[idx++];
  21760. /* sessionID | secret | haveEMS | haveAltSessionID */
  21761. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) {
  21762. ret = BUFFER_ERROR;
  21763. goto end;
  21764. }
  21765. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  21766. idx += s->sessionIDSz;
  21767. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  21768. s->haveEMS = data[idx++];
  21769. if (data[idx] != ID_LEN && data[idx] != 0) {
  21770. ret = BUFFER_ERROR;
  21771. goto end;
  21772. }
  21773. s->haveAltSessionID = data[idx++] == ID_LEN;
  21774. /* altSessionID */
  21775. if (s->haveAltSessionID) {
  21776. if (i - idx < ID_LEN) {
  21777. ret = BUFFER_ERROR;
  21778. goto end;
  21779. }
  21780. XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN;
  21781. }
  21782. #ifdef SESSION_CERTS
  21783. /* Certificate chain */
  21784. if (i - idx == 0) {
  21785. ret = BUFFER_ERROR;
  21786. goto end;
  21787. }
  21788. s->chain.count = data[idx++];
  21789. for (j = 0; j < s->chain.count; j++) {
  21790. if (i - idx < OPAQUE16_LEN) {
  21791. ret = BUFFER_ERROR;
  21792. goto end;
  21793. }
  21794. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  21795. s->chain.certs[j].length = length;
  21796. if (i - idx < length) {
  21797. ret = BUFFER_ERROR;
  21798. goto end;
  21799. }
  21800. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  21801. idx += length;
  21802. }
  21803. #endif
  21804. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  21805. defined(HAVE_SESSION_TICKET))
  21806. /* Protocol Version */
  21807. if (i - idx < OPAQUE16_LEN) {
  21808. ret = BUFFER_ERROR;
  21809. goto end;
  21810. }
  21811. s->version.major = data[idx++];
  21812. s->version.minor = data[idx++];
  21813. #endif
  21814. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  21815. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  21816. /* Cipher suite */
  21817. if (i - idx < OPAQUE16_LEN) {
  21818. ret = BUFFER_ERROR;
  21819. goto end;
  21820. }
  21821. s->cipherSuite0 = data[idx++];
  21822. s->cipherSuite = data[idx++];
  21823. #endif
  21824. #ifndef NO_CLIENT_CACHE
  21825. /* ServerID len */
  21826. if (i - idx < OPAQUE16_LEN) {
  21827. ret = BUFFER_ERROR;
  21828. goto end;
  21829. }
  21830. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  21831. /* ServerID */
  21832. if (i - idx < s->idLen) {
  21833. ret = BUFFER_ERROR;
  21834. goto end;
  21835. }
  21836. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  21837. #endif
  21838. #ifdef OPENSSL_EXTRA
  21839. /* byte for length of session context ID */
  21840. if (i - idx < OPAQUE8_LEN) {
  21841. ret = BUFFER_ERROR;
  21842. goto end;
  21843. }
  21844. s->sessionCtxSz = data[idx++];
  21845. /* app session context ID */
  21846. if (i - idx < s->sessionCtxSz) {
  21847. ret = BUFFER_ERROR;
  21848. goto end;
  21849. }
  21850. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  21851. #endif
  21852. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21853. /* byte for peerVerifyRet */
  21854. if (i - idx < OPAQUE8_LEN) {
  21855. ret = BUFFER_ERROR;
  21856. goto end;
  21857. }
  21858. s->peerVerifyRet = data[idx++];
  21859. #endif
  21860. #ifdef WOLFSSL_TLS13
  21861. if (i - idx < OPAQUE16_LEN) {
  21862. ret = BUFFER_ERROR;
  21863. goto end;
  21864. }
  21865. ato16(data + idx, &s->namedGroup);
  21866. idx += OPAQUE16_LEN;
  21867. #endif
  21868. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  21869. #ifdef WOLFSSL_TLS13
  21870. if (i - idx < (OPAQUE32_LEN * 2)) {
  21871. ret = BUFFER_ERROR;
  21872. goto end;
  21873. }
  21874. ato32(data + idx, &s->ticketSeen);
  21875. idx += OPAQUE32_LEN;
  21876. ato32(data + idx, &s->ticketAdd);
  21877. idx += OPAQUE32_LEN;
  21878. if (i - idx < OPAQUE8_LEN) {
  21879. ret = BUFFER_ERROR;
  21880. goto end;
  21881. }
  21882. s->ticketNonce.len = data[idx++];
  21883. if (i - idx < s->ticketNonce.len) {
  21884. ret = BUFFER_ERROR;
  21885. goto end;
  21886. }
  21887. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  21888. idx += s->ticketNonce.len;
  21889. #endif
  21890. #ifdef WOLFSSL_EARLY_DATA
  21891. if (i - idx < OPAQUE32_LEN) {
  21892. ret = BUFFER_ERROR;
  21893. goto end;
  21894. }
  21895. ato32(data + idx, &s->maxEarlyDataSz);
  21896. idx += OPAQUE32_LEN;
  21897. #endif
  21898. #endif
  21899. #ifdef HAVE_SESSION_TICKET
  21900. /* ticket len */
  21901. if (i - idx < OPAQUE16_LEN) {
  21902. ret = BUFFER_ERROR;
  21903. goto end;
  21904. }
  21905. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  21906. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  21907. if (s->ticketLenAlloc > 0) {
  21908. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  21909. }
  21910. if (s->ticketLen <= SESSION_TICKET_LEN)
  21911. s->ticket = s->_staticTicket;
  21912. else {
  21913. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  21914. DYNAMIC_TYPE_SESSION_TICK);
  21915. if (s->ticket == NULL) {
  21916. ret = MEMORY_ERROR;
  21917. goto end;
  21918. }
  21919. s->ticketLenAlloc = (word16)s->ticketLen;
  21920. }
  21921. /* ticket */
  21922. if (i - idx < s->ticketLen) {
  21923. ret = BUFFER_ERROR;
  21924. goto end;
  21925. }
  21926. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  21927. #endif
  21928. (void)idx;
  21929. if (sess != NULL) {
  21930. *sess = s;
  21931. }
  21932. *p += idx;
  21933. end:
  21934. if (ret != 0 && (sess == NULL || *sess != s)) {
  21935. wolfSSL_SESSION_free(s);
  21936. s = NULL;
  21937. }
  21938. #endif /* HAVE_EXT_CACHE */
  21939. return s;
  21940. }
  21941. /* Check if there is a session ticket associated with this WOLFSSL_SESSION.
  21942. *
  21943. * sess - pointer to WOLFSSL_SESSION struct
  21944. *
  21945. * Returns 1 if has session ticket, otherwise 0 */
  21946. int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess)
  21947. {
  21948. WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket");
  21949. #ifdef HAVE_SESSION_TICKET
  21950. sess = ClientSessionToSession(sess);
  21951. if (sess) {
  21952. if ((sess->ticketLen > 0) && (sess->ticket != NULL)) {
  21953. return WOLFSSL_SUCCESS;
  21954. }
  21955. }
  21956. #else
  21957. (void)sess;
  21958. #endif
  21959. return WOLFSSL_FAILURE;
  21960. }
  21961. unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint(
  21962. const WOLFSSL_SESSION* sess)
  21963. {
  21964. WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint");
  21965. sess = ClientSessionToSession(sess);
  21966. if (sess) {
  21967. return sess->timeout;
  21968. }
  21969. return 0;
  21970. }
  21971. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  21972. {
  21973. long timeout = 0;
  21974. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  21975. sess = ClientSessionToSession(sess);
  21976. if (sess)
  21977. timeout = sess->timeout;
  21978. return timeout;
  21979. }
  21980. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  21981. {
  21982. long bornOn = 0;
  21983. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  21984. sess = ClientSessionToSession(sess);
  21985. if (sess)
  21986. bornOn = sess->bornOn;
  21987. return bornOn;
  21988. }
  21989. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  21990. {
  21991. word32 tmptime;
  21992. ses = ClientSessionToSession(ses);
  21993. if (ses == NULL || t < 0) {
  21994. return BAD_FUNC_ARG;
  21995. }
  21996. tmptime = t & 0xFFFFFFFF;
  21997. ses->timeout = tmptime;
  21998. return WOLFSSL_SUCCESS;
  21999. }
  22000. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  22001. #ifdef OPENSSL_EXTRA
  22002. #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
  22003. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  22004. {
  22005. int ret = WOLFSSL_FATAL_ERROR;
  22006. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  22007. if (ssl != NULL && fname != NULL)
  22008. {
  22009. #ifdef WOLFSSL_SMALL_STACK
  22010. byte staticBuffer[1]; /* force heap usage */
  22011. #else
  22012. byte staticBuffer[FILE_BUFFER_SIZE];
  22013. #endif
  22014. byte* myBuffer = staticBuffer;
  22015. int dynamic = 0;
  22016. XFILE file;
  22017. long sz = 0;
  22018. WOLFSSL_CTX* ctx = ssl->ctx;
  22019. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  22020. DerBuffer* fileDer = NULL;
  22021. file = XFOPEN(fname, "rb");
  22022. if (file == XBADFILE)
  22023. return WOLFSSL_BAD_FILE;
  22024. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  22025. XFCLOSE(file);
  22026. return WOLFSSL_BAD_FILE;
  22027. }
  22028. sz = XFTELL(file);
  22029. XREWIND(file);
  22030. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  22031. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  22032. XFCLOSE(file);
  22033. return WOLFSSL_BAD_FILE;
  22034. }
  22035. if (sz > (long)sizeof(staticBuffer)) {
  22036. WOLFSSL_MSG("Getting dynamic buffer");
  22037. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  22038. dynamic = 1;
  22039. }
  22040. if ((myBuffer != NULL) &&
  22041. (sz > 0) &&
  22042. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  22043. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  22044. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  22045. (fileDer->length != 0) &&
  22046. (fileDer->length == peer_cert->derCert->length) &&
  22047. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  22048. fileDer->length) == 0))
  22049. {
  22050. ret = 0;
  22051. }
  22052. FreeDer(&fileDer);
  22053. if (dynamic)
  22054. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  22055. XFCLOSE(file);
  22056. }
  22057. return ret;
  22058. }
  22059. #endif
  22060. #endif /* OPENSSL_EXTRA */
  22061. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  22062. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  22063. #ifndef NO_CERTS
  22064. /* oidCertExtType */
  22065. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  22066. "X509v3 Basic Constraints"},
  22067. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  22068. "X509v3 Subject Alternative Name"},
  22069. { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  22070. "X509v3 CRL Distribution Points"},
  22071. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  22072. "Authority Information Access"},
  22073. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  22074. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  22075. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  22076. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  22077. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  22078. "X509v3 Key Usage"},
  22079. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  22080. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  22081. { NID_ext_key_usage, EXT_KEY_USAGE_OID, oidCertExtType,
  22082. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  22083. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  22084. "nameConstraints", "X509v3 Name Constraints"},
  22085. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  22086. "certificatePolicies", "X509v3 Certificate Policies"},
  22087. /* oidCertAuthInfoType */
  22088. { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP",
  22089. "OCSP"},
  22090. { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  22091. "caIssuers", "CA Issuers"},
  22092. /* oidCertPolicyType */
  22093. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  22094. "X509v3 Any Policy"},
  22095. /* oidCertAltNameType */
  22096. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  22097. /* oidCertKeyUseType */
  22098. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  22099. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  22100. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  22101. "serverAuth", "TLS Web Server Authentication"},
  22102. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  22103. "clientAuth", "TLS Web Client Authentication"},
  22104. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  22105. "OCSPSigning", "OCSP Signing"},
  22106. /* oidCertNameType */
  22107. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  22108. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  22109. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  22110. "serialNumber"},
  22111. { NID_userId, NID_userId, oidCertNameType, "UID", "userid"},
  22112. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  22113. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  22114. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  22115. "stateOrProvinceName"},
  22116. { NID_streetAddress, NID_streetAddress, oidCertNameType, "street",
  22117. "streetAddress"},
  22118. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  22119. "organizationName"},
  22120. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  22121. "OU", "organizationalUnitName"},
  22122. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  22123. "emailAddress"},
  22124. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  22125. "domainComponent"},
  22126. { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink",
  22127. "favouriteDrink"},
  22128. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  22129. "businessCategory"},
  22130. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  22131. "jurisdictionCountryName"},
  22132. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  22133. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  22134. { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"},
  22135. { NID_userId, NID_userId, oidCertNameType, "UID", "userId"},
  22136. #ifdef WOLFSSL_CERT_REQ
  22137. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  22138. oidCsrAttrType, "challengePassword", "challengePassword"},
  22139. { NID_pkcs9_contentType, PKCS9_CONTENT_TYPE_OID,
  22140. oidCsrAttrType, "contentType", "contentType" },
  22141. { NID_pkcs9_unstructuredName, UNSTRUCTURED_NAME_OID,
  22142. oidCsrAttrType, "unstructuredName", "unstructuredName" },
  22143. { NID_name, NAME_OID, oidCsrAttrType, "name", "name" },
  22144. { NID_surname, SURNAME_OID,
  22145. oidCsrAttrType, "surname", "surname" },
  22146. { NID_givenName, GIVEN_NAME_OID,
  22147. oidCsrAttrType, "givenName", "givenName" },
  22148. { NID_initials, INITIALS_OID,
  22149. oidCsrAttrType, "initials", "initials" },
  22150. { NID_dnQualifier, DNQUALIFIER_OID,
  22151. oidCsrAttrType, "dnQualifer", "dnQualifier" },
  22152. #endif
  22153. #endif
  22154. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  22155. /* oidHashType */
  22156. #ifdef WOLFSSL_MD2
  22157. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  22158. #endif
  22159. #ifdef WOLFSSL_MD5
  22160. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  22161. #endif
  22162. #ifndef NO_SHA
  22163. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  22164. #endif
  22165. #ifdef WOLFSSL_SHA224
  22166. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  22167. #endif
  22168. #ifndef NO_SHA256
  22169. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  22170. #endif
  22171. #ifdef WOLFSSL_SHA384
  22172. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  22173. #endif
  22174. #ifdef WOLFSSL_SHA512
  22175. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  22176. #endif
  22177. #ifdef WOLFSSL_SHA3
  22178. #ifndef WOLFSSL_NOSHA3_224
  22179. { NID_sha3_224, SHA3_224h, oidHashType, "SHA3-224", "sha3-224"},
  22180. #endif
  22181. #ifndef WOLFSSL_NOSHA3_256
  22182. { NID_sha3_256, SHA3_256h, oidHashType, "SHA3-256", "sha3-256"},
  22183. #endif
  22184. #ifndef WOLFSSL_NOSHA3_384
  22185. { NID_sha3_384, SHA3_384h, oidHashType, "SHA3-384", "sha3-384"},
  22186. #endif
  22187. #ifndef WOLFSSL_NOSHA3_512
  22188. { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"},
  22189. #endif
  22190. #endif /* WOLFSSL_SHA3 */
  22191. /* oidSigType */
  22192. #ifndef NO_DSA
  22193. #ifndef NO_SHA
  22194. { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  22195. { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  22196. "dsa_with_SHA256"},
  22197. #endif
  22198. #endif /* NO_DSA */
  22199. #ifndef NO_RSA
  22200. #ifdef WOLFSSL_MD2
  22201. { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  22202. "md2WithRSAEncryption"},
  22203. #endif
  22204. #ifndef NO_MD5
  22205. { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  22206. "md5WithRSAEncryption"},
  22207. #endif
  22208. #ifndef NO_SHA
  22209. { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  22210. "sha1WithRSAEncryption"},
  22211. #endif
  22212. #ifdef WOLFSSL_SHA224
  22213. { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  22214. "sha224WithRSAEncryption"},
  22215. #endif
  22216. #ifndef NO_SHA256
  22217. { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  22218. "sha256WithRSAEncryption"},
  22219. #endif
  22220. #ifdef WOLFSSL_SHA384
  22221. { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  22222. "sha384WithRSAEncryption"},
  22223. #endif
  22224. #ifdef WOLFSSL_SHA512
  22225. { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  22226. "sha512WithRSAEncryption"},
  22227. #endif
  22228. #ifdef WOLFSSL_SHA3
  22229. #ifndef WOLFSSL_NOSHA3_224
  22230. { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224",
  22231. "sha3-224WithRSAEncryption"},
  22232. #endif
  22233. #ifndef WOLFSSL_NOSHA3_256
  22234. { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256",
  22235. "sha3-256WithRSAEncryption"},
  22236. #endif
  22237. #ifndef WOLFSSL_NOSHA3_384
  22238. { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384",
  22239. "sha3-384WithRSAEncryption"},
  22240. #endif
  22241. #ifndef WOLFSSL_NOSHA3_512
  22242. { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512",
  22243. "sha3-512WithRSAEncryption"},
  22244. #endif
  22245. #endif
  22246. #endif /* NO_RSA */
  22247. #ifdef HAVE_ECC
  22248. #ifndef NO_SHA
  22249. { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  22250. #endif
  22251. #ifdef WOLFSSL_SHA224
  22252. { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  22253. #endif
  22254. #ifndef NO_SHA256
  22255. { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  22256. #endif
  22257. #ifdef WOLFSSL_SHA384
  22258. { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  22259. #endif
  22260. #ifdef WOLFSSL_SHA512
  22261. { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  22262. #endif
  22263. #ifdef WOLFSSL_SHA3
  22264. #ifndef WOLFSSL_NOSHA3_224
  22265. { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224",
  22266. "ecdsa_with_SHA3-224"},
  22267. #endif
  22268. #ifndef WOLFSSL_NOSHA3_256
  22269. { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256",
  22270. "ecdsa_with_SHA3-256"},
  22271. #endif
  22272. #ifndef WOLFSSL_NOSHA3_384
  22273. { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384",
  22274. "ecdsa_with_SHA3-384"},
  22275. #endif
  22276. #ifndef WOLFSSL_NOSHA3_512
  22277. { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512",
  22278. "ecdsa_with_SHA3-512"},
  22279. #endif
  22280. #endif
  22281. #endif /* HAVE_ECC */
  22282. /* oidKeyType */
  22283. #ifndef NO_DSA
  22284. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  22285. #endif /* NO_DSA */
  22286. #ifndef NO_RSA
  22287. { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"},
  22288. #endif /* NO_RSA */
  22289. #ifdef HAVE_ECC
  22290. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  22291. "id-ecPublicKey"},
  22292. #endif /* HAVE_ECC */
  22293. #ifndef NO_DH
  22294. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  22295. #endif
  22296. #ifdef HAVE_ED448
  22297. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  22298. #endif
  22299. #ifdef HAVE_ED25519
  22300. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  22301. #endif
  22302. #ifdef HAVE_PQC
  22303. #ifdef HAVE_FALCON
  22304. { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1",
  22305. "Falcon Level 1"},
  22306. { CTC_FALCON_LEVEL5, FALCON_LEVEL5k, oidKeyType, "Falcon Level 5",
  22307. "Falcon Level 5"},
  22308. #endif /* HAVE_FALCON */
  22309. #ifdef HAVE_DILITHIUM
  22310. { CTC_DILITHIUM_LEVEL2, DILITHIUM_LEVEL2k, oidKeyType,
  22311. "Dilithium Level 2", "Dilithium Level 2"},
  22312. { CTC_DILITHIUM_LEVEL3, DILITHIUM_LEVEL3k, oidKeyType,
  22313. "Dilithium Level 3", "Dilithium Level 3"},
  22314. { CTC_DILITHIUM_LEVEL5, DILITHIUM_LEVEL5k, oidKeyType,
  22315. "Dilithium Level 5", "Dilithium Level 5"},
  22316. { CTC_DILITHIUM_AES_LEVEL2, DILITHIUM_AES_LEVEL2k, oidKeyType,
  22317. "Dilithium AES Level 2", "Dilithium AES Level 2"},
  22318. { CTC_DILITHIUM_AES_LEVEL3, DILITHIUM_AES_LEVEL3k, oidKeyType,
  22319. "Dilithium AES Level 3", "Dilithium AES Level 3"},
  22320. { CTC_DILITHIUM_AES_LEVEL5, DILITHIUM_AES_LEVEL5k, oidKeyType,
  22321. "Dilithium AES Level 5", "Dilithium AES Level 5"},
  22322. #endif /* HAVE_DILITHIUM */
  22323. #endif /* HAVE_PQC */
  22324. /* oidCurveType */
  22325. #ifdef HAVE_ECC
  22326. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  22327. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  22328. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  22329. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  22330. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  22331. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  22332. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  22333. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  22334. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  22335. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  22336. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  22337. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  22338. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  22339. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  22340. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  22341. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  22342. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  22343. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  22344. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  22345. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  22346. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  22347. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  22348. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  22349. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  22350. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  22351. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  22352. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  22353. #endif /* HAVE_ECC */
  22354. /* oidBlkType */
  22355. #ifdef WOLFSSL_AES_128
  22356. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  22357. #endif
  22358. #ifdef WOLFSSL_AES_192
  22359. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  22360. #endif
  22361. #ifdef WOLFSSL_AES_256
  22362. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  22363. #endif
  22364. #ifndef NO_DES3
  22365. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  22366. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  22367. #endif /* !NO_DES3 */
  22368. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  22369. { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, "ChaCha20-Poly1305", "chacha20-poly1305"},
  22370. #endif
  22371. /* oidOcspType */
  22372. #ifdef HAVE_OCSP
  22373. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  22374. "Basic OCSP Response"},
  22375. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  22376. "OCSP Nonce"},
  22377. #endif /* HAVE_OCSP */
  22378. #ifndef NO_PWDBASED
  22379. /* oidKdfType */
  22380. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  22381. /* oidPBEType */
  22382. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  22383. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  22384. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  22385. "pbeWithSHA1AndDES-CBC"},
  22386. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  22387. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  22388. #endif
  22389. /* oidKeyWrapType */
  22390. #ifdef WOLFSSL_AES_128
  22391. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  22392. #endif
  22393. #ifdef WOLFSSL_AES_192
  22394. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  22395. #endif
  22396. #ifdef WOLFSSL_AES_256
  22397. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  22398. #endif
  22399. #ifndef NO_PKCS7
  22400. #ifndef NO_DH
  22401. /* oidCmsKeyAgreeType */
  22402. #ifndef NO_SHA
  22403. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  22404. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  22405. #endif
  22406. #ifdef WOLFSSL_SHA224
  22407. { dhSinglePass_stdDH_sha224kdf_scheme,
  22408. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  22409. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  22410. #endif
  22411. #ifndef NO_SHA256
  22412. { dhSinglePass_stdDH_sha256kdf_scheme,
  22413. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  22414. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  22415. #endif
  22416. #ifdef WOLFSSL_SHA384
  22417. { dhSinglePass_stdDH_sha384kdf_scheme,
  22418. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  22419. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  22420. #endif
  22421. #ifdef WOLFSSL_SHA512
  22422. { dhSinglePass_stdDH_sha512kdf_scheme,
  22423. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  22424. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  22425. #endif
  22426. #endif
  22427. #endif
  22428. #if defined(WOLFSSL_APACHE_HTTPD)
  22429. /* "1.3.6.1.5.5.7.8.7" */
  22430. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  22431. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  22432. /* "1.3.6.1.4.1.311.20.2.3" */
  22433. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  22434. WOLFSSL_LN_MS_UPN },
  22435. /* "1.3.6.1.5.5.7.1.24" */
  22436. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  22437. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  22438. #endif
  22439. #endif /* OPENSSL_EXTRA */
  22440. };
  22441. #define WOLFSSL_OBJECT_INFO_SZ \
  22442. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  22443. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  22444. #endif
  22445. #ifdef OPENSSL_EXTRA
  22446. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  22447. {
  22448. WOLFSSL_ASN1_INTEGER* a;
  22449. int len;
  22450. const int extraTagSz = MAX_LENGTH_SZ + 1;
  22451. byte intTag[MAX_LENGTH_SZ + 1];
  22452. int idx = 0;
  22453. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  22454. if (ai == NULL) {
  22455. a = wolfSSL_ASN1_INTEGER_new();
  22456. if (a == NULL)
  22457. return NULL;
  22458. a->type = V_ASN1_INTEGER;
  22459. }
  22460. else {
  22461. a = ai;
  22462. }
  22463. if (a) {
  22464. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  22465. a->type |= V_ASN1_NEG_INTEGER;
  22466. a->negative = 1;
  22467. }
  22468. len = wolfSSL_BN_num_bytes(bn);
  22469. if (len == 0)
  22470. len = 1;
  22471. /* allocate buffer */
  22472. if (len + extraTagSz > (int)sizeof(a->intData)) {
  22473. /* create new data buffer and copy over */
  22474. a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  22475. DYNAMIC_TYPE_OPENSSL);
  22476. if (a->data == NULL) {
  22477. if (a != ai)
  22478. wolfSSL_ASN1_INTEGER_free(a);
  22479. return NULL;
  22480. }
  22481. a->isDynamic = 1;
  22482. }
  22483. else {
  22484. XMEMSET(a->intData, 0, sizeof(a->intData));
  22485. a->data = a->intData;
  22486. a->isDynamic = 0;
  22487. }
  22488. /* populate data */
  22489. if (wolfSSL_BN_is_zero(bn)) {
  22490. a->data[0] = 0;
  22491. }
  22492. else {
  22493. len = wolfSSL_BN_bn2bin(bn, a->data);
  22494. if (len < 0) {
  22495. wolfSSL_ASN1_INTEGER_free(a);
  22496. return NULL;
  22497. }
  22498. }
  22499. a->length = len;
  22500. /* Write ASN tag */
  22501. idx = SetASNInt(a->length, a->data[0], intTag);
  22502. XMEMMOVE(a->data + idx, a->data, a->length);
  22503. XMEMCPY(a->data, intTag, idx);
  22504. a->dataMax = a->length += idx;
  22505. }
  22506. return a;
  22507. }
  22508. #ifdef OPENSSL_ALL
  22509. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  22510. {
  22511. void *ret = NULL;
  22512. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  22513. size_t i;
  22514. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  22515. if (!tpl) {
  22516. return NULL;
  22517. }
  22518. if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  22519. return NULL;
  22520. }
  22521. XMEMSET(ret, 0, tpl->size);
  22522. for (member = tpl->members, i = 0; i < tpl->mcount;
  22523. member++, i++) {
  22524. switch (member->type) {
  22525. case WOLFSSL_X509_ALGOR_ASN1:
  22526. {
  22527. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  22528. if (!algor) {
  22529. goto error;
  22530. }
  22531. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  22532. break;
  22533. }
  22534. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  22535. {
  22536. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  22537. if (!bit_str) {
  22538. goto error;
  22539. }
  22540. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  22541. break;
  22542. }
  22543. default:
  22544. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  22545. goto error;
  22546. }
  22547. }
  22548. return ret;
  22549. error:
  22550. wolfSSL_ASN1_item_free(ret, tpl);
  22551. return NULL;
  22552. }
  22553. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  22554. {
  22555. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  22556. size_t i;
  22557. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  22558. if (val) {
  22559. for (member = tpl->members, i = 0; i < tpl->mcount;
  22560. member++, i++) {
  22561. switch (member->type) {
  22562. case WOLFSSL_X509_ALGOR_ASN1:
  22563. {
  22564. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  22565. (((byte*)val) + member->offset);
  22566. if (algor) {
  22567. wolfSSL_X509_ALGOR_free(algor);
  22568. }
  22569. break;
  22570. }
  22571. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  22572. {
  22573. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  22574. (((byte*)val) + member->offset);
  22575. if (bit_str) {
  22576. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  22577. }
  22578. break;
  22579. }
  22580. default:
  22581. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  22582. }
  22583. }
  22584. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  22585. }
  22586. }
  22587. #define bufLenOrNull(buf, len) ((buf) ? (buf) + (len) : NULL)
  22588. static int i2dProcessMembers(const void *src, byte *buf,
  22589. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  22590. {
  22591. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  22592. int len = 0, ret;
  22593. size_t i;
  22594. WOLFSSL_ENTER("processMembers");
  22595. for (member = members, i = 0; i < mcount; member++, i++) {
  22596. switch (member->type) {
  22597. case WOLFSSL_X509_ALGOR_ASN1:
  22598. {
  22599. word32 oid = 0;
  22600. word32 idx = 0;
  22601. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  22602. (((byte*)src) + member->offset);
  22603. if (!algor->algorithm) {
  22604. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  22605. return WOLFSSL_FAILURE;
  22606. }
  22607. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  22608. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  22609. WOLFSSL_MSG("Issue getting OID of object");
  22610. return -1;
  22611. }
  22612. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  22613. algor->algorithm->grp, 0);
  22614. if (!ret) {
  22615. return WOLFSSL_FAILURE;
  22616. }
  22617. len += ret;
  22618. break;
  22619. }
  22620. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  22621. {
  22622. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  22623. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  22624. (((byte*)src) + member->offset);
  22625. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  22626. if (buf && bit_str->data) {
  22627. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  22628. }
  22629. len += bit_str->length;
  22630. break;
  22631. }
  22632. default:
  22633. WOLFSSL_MSG("Type not support in processMembers");
  22634. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  22635. return WOLFSSL_FAILURE;
  22636. }
  22637. }
  22638. WOLFSSL_LEAVE("processMembers", len);
  22639. return len;
  22640. }
  22641. static int wolfSSL_ASN1_item_i2d_1(const void *src, byte *buf,
  22642. const WOLFSSL_ASN1_ITEM *tpl, int *len)
  22643. {
  22644. *len = 0;
  22645. switch (tpl->type) {
  22646. case ASN_SEQUENCE:
  22647. {
  22648. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  22649. tpl->mcount);
  22650. if (seq_len == WOLFSSL_FAILURE)
  22651. return WOLFSSL_FAILURE;
  22652. *len += SetSequence(seq_len, bufLenOrNull(buf, *len));
  22653. if (buf) {
  22654. if (i2dProcessMembers(src, bufLenOrNull(buf, *len), tpl->members,
  22655. tpl->mcount) != seq_len) {
  22656. WOLFSSL_MSG("Inconsistent sequence length");
  22657. return WOLFSSL_FAILURE;
  22658. }
  22659. }
  22660. *len += seq_len;
  22661. break;
  22662. }
  22663. default:
  22664. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  22665. return WOLFSSL_FAILURE;
  22666. }
  22667. return WOLFSSL_SUCCESS;
  22668. }
  22669. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  22670. const WOLFSSL_ASN1_ITEM *tpl)
  22671. {
  22672. int len;
  22673. byte *buf = NULL;
  22674. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  22675. if ((src == NULL) || (tpl == NULL))
  22676. goto error;
  22677. if (wolfSSL_ASN1_item_i2d_1(src, NULL, tpl, &len) != WOLFSSL_SUCCESS)
  22678. goto error;
  22679. if (dest == NULL) {
  22680. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_SUCCESS);
  22681. return len;
  22682. }
  22683. if (*dest == NULL) {
  22684. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  22685. if (buf == NULL)
  22686. goto error;
  22687. } else
  22688. buf = *dest;
  22689. if (wolfSSL_ASN1_item_i2d_1(src, buf, tpl, &len) != WOLFSSL_SUCCESS)
  22690. goto error;
  22691. if (*dest == NULL)
  22692. *dest = buf;
  22693. else {
  22694. /* XXX *dest length is not checked because the user is responsible
  22695. * for providing a long enough buffer
  22696. */
  22697. XMEMCPY(*dest, buf, len);
  22698. }
  22699. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  22700. return len;
  22701. error:
  22702. if (buf) {
  22703. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  22704. }
  22705. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  22706. return WOLFSSL_FAILURE;
  22707. }
  22708. #endif /* OPENSSL_ALL */
  22709. #endif /* OPENSSL_EXTRA */
  22710. #ifdef OPENSSL_EXTRA
  22711. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  22712. {
  22713. WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
  22714. sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
  22715. if (hmac_ctx != NULL) {
  22716. XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  22717. }
  22718. return hmac_ctx;
  22719. }
  22720. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  22721. {
  22722. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  22723. if (ctx != NULL) {
  22724. /* wc_HmacSetKey sets up ctx->hmac */
  22725. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  22726. }
  22727. return WOLFSSL_SUCCESS;
  22728. }
  22729. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  22730. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  22731. {
  22732. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  22733. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  22734. (void)e;
  22735. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  22736. }
  22737. /* helper function for Deep copy of internal wolfSSL hmac structure
  22738. * returns WOLFSSL_SUCCESS on success */
  22739. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  22740. {
  22741. void* heap;
  22742. int ret;
  22743. #ifndef HAVE_FIPS
  22744. heap = src->heap;
  22745. #else
  22746. heap = NULL;
  22747. #endif
  22748. if (wc_HmacInit(des, heap, 0) != 0) {
  22749. return WOLFSSL_FAILURE;
  22750. }
  22751. /* requires that hash structures have no dynamic parts to them */
  22752. switch (src->macType) {
  22753. #ifndef NO_MD5
  22754. case WC_MD5:
  22755. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  22756. break;
  22757. #endif /* !NO_MD5 */
  22758. #ifndef NO_SHA
  22759. case WC_SHA:
  22760. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  22761. break;
  22762. #endif /* !NO_SHA */
  22763. #ifdef WOLFSSL_SHA224
  22764. case WC_SHA224:
  22765. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  22766. break;
  22767. #endif /* WOLFSSL_SHA224 */
  22768. #ifndef NO_SHA256
  22769. case WC_SHA256:
  22770. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  22771. break;
  22772. #endif /* !NO_SHA256 */
  22773. #ifdef WOLFSSL_SHA384
  22774. case WC_SHA384:
  22775. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  22776. break;
  22777. #endif /* WOLFSSL_SHA384 */
  22778. #ifdef WOLFSSL_SHA512
  22779. case WC_SHA512:
  22780. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  22781. break;
  22782. #endif /* WOLFSSL_SHA512 */
  22783. #ifdef WOLFSSL_SHA3
  22784. #ifndef WOLFSSL_NOSHA3_224
  22785. case WC_SHA3_224:
  22786. ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
  22787. break;
  22788. #endif /* WOLFSSL_NO_SHA3_224 */
  22789. #ifndef WOLFSSL_NOSHA3_256
  22790. case WC_SHA3_256:
  22791. ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
  22792. break;
  22793. #endif /* WOLFSSL_NO_SHA3_256 */
  22794. #ifndef WOLFSSL_NOSHA3_384
  22795. case WC_SHA3_384:
  22796. ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
  22797. break;
  22798. #endif /* WOLFSSL_NO_SHA3_384 */
  22799. #ifndef WOLFSSL_NOSHA3_512
  22800. case WC_SHA3_512:
  22801. ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
  22802. break;
  22803. #endif /* WOLFSSL_NO_SHA3_512 */
  22804. #endif /* WOLFSSL_SHA3 */
  22805. default:
  22806. return WOLFSSL_FAILURE;
  22807. }
  22808. if (ret != 0)
  22809. return WOLFSSL_FAILURE;
  22810. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  22811. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  22812. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  22813. #ifndef HAVE_FIPS
  22814. des->heap = heap;
  22815. #endif
  22816. des->macType = src->macType;
  22817. des->innerHashKeyed = src->innerHashKeyed;
  22818. #ifdef WOLFSSL_ASYNC_CRYPT
  22819. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  22820. des->keyLen = src->keyLen;
  22821. #ifdef HAVE_CAVIUM
  22822. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  22823. DYNAMIC_TYPE_HMAC);
  22824. if (des->data == NULL) {
  22825. return BUFFER_E;
  22826. }
  22827. XMEMCPY(des->data, src->data, src->dataLen);
  22828. des->dataLen = src->dataLen;
  22829. #endif /* HAVE_CAVIUM */
  22830. #endif /* WOLFSSL_ASYNC_CRYPT */
  22831. return WOLFSSL_SUCCESS;
  22832. }
  22833. /* Deep copy of information from src to des structure
  22834. *
  22835. * des destination to copy information to
  22836. * src structure to get information from
  22837. *
  22838. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  22839. */
  22840. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  22841. {
  22842. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  22843. if (des == NULL || src == NULL) {
  22844. return WOLFSSL_FAILURE;
  22845. }
  22846. des->type = src->type;
  22847. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  22848. WC_HMAC_BLOCK_SIZE);
  22849. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  22850. WC_HMAC_BLOCK_SIZE);
  22851. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  22852. }
  22853. #if defined(HAVE_FIPS) && \
  22854. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  22855. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  22856. {
  22857. int ret = 0;
  22858. switch (type) {
  22859. #ifndef NO_MD5
  22860. case WC_MD5:
  22861. ret = wc_InitMd5(&hmac->hash.md5);
  22862. break;
  22863. #endif /* !NO_MD5 */
  22864. #ifndef NO_SHA
  22865. case WC_SHA:
  22866. ret = wc_InitSha(&hmac->hash.sha);
  22867. break;
  22868. #endif /* !NO_SHA */
  22869. #ifdef WOLFSSL_SHA224
  22870. case WC_SHA224:
  22871. ret = wc_InitSha224(&hmac->hash.sha224);
  22872. break;
  22873. #endif /* WOLFSSL_SHA224 */
  22874. #ifndef NO_SHA256
  22875. case WC_SHA256:
  22876. ret = wc_InitSha256(&hmac->hash.sha256);
  22877. break;
  22878. #endif /* !NO_SHA256 */
  22879. #ifdef WOLFSSL_SHA384
  22880. case WC_SHA384:
  22881. ret = wc_InitSha384(&hmac->hash.sha384);
  22882. break;
  22883. #endif /* WOLFSSL_SHA384 */
  22884. #ifdef WOLFSSL_SHA512
  22885. case WC_SHA512:
  22886. ret = wc_InitSha512(&hmac->hash.sha512);
  22887. break;
  22888. #endif /* WOLFSSL_SHA512 */
  22889. #ifdef WOLFSSL_SHA3
  22890. case WC_SHA3_224:
  22891. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  22892. break;
  22893. case WC_SHA3_256:
  22894. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  22895. break;
  22896. case WC_SHA3_384:
  22897. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  22898. break;
  22899. case WC_SHA3_512:
  22900. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  22901. break;
  22902. #endif
  22903. default:
  22904. ret = BAD_FUNC_ARG;
  22905. break;
  22906. }
  22907. (void)heap;
  22908. return ret;
  22909. }
  22910. #else
  22911. #define _HMAC_Init _InitHmac
  22912. #endif
  22913. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  22914. const EVP_MD* type)
  22915. {
  22916. int hmac_error = 0;
  22917. void* heap = NULL;
  22918. int inited;
  22919. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  22920. if (ctx == NULL) {
  22921. WOLFSSL_MSG("no ctx on init");
  22922. return WOLFSSL_FAILURE;
  22923. }
  22924. #ifndef HAVE_FIPS
  22925. heap = ctx->hmac.heap;
  22926. #endif
  22927. if (type) {
  22928. WOLFSSL_MSG("init has type");
  22929. #ifndef NO_MD5
  22930. if (XSTRNCMP(type, "MD5", 3) == 0) {
  22931. WOLFSSL_MSG("md5 hmac");
  22932. ctx->type = WC_MD5;
  22933. }
  22934. else
  22935. #endif
  22936. #ifdef WOLFSSL_SHA224
  22937. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  22938. WOLFSSL_MSG("sha224 hmac");
  22939. ctx->type = WC_SHA224;
  22940. }
  22941. else
  22942. #endif
  22943. #ifndef NO_SHA256
  22944. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  22945. WOLFSSL_MSG("sha256 hmac");
  22946. ctx->type = WC_SHA256;
  22947. }
  22948. else
  22949. #endif
  22950. #ifdef WOLFSSL_SHA384
  22951. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  22952. WOLFSSL_MSG("sha384 hmac");
  22953. ctx->type = WC_SHA384;
  22954. }
  22955. else
  22956. #endif
  22957. #ifdef WOLFSSL_SHA512
  22958. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  22959. WOLFSSL_MSG("sha512 hmac");
  22960. ctx->type = WC_SHA512;
  22961. }
  22962. else
  22963. #endif
  22964. #ifdef WOLFSSL_SHA3
  22965. #ifndef WOLFSSL_NOSHA3_224
  22966. if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
  22967. WOLFSSL_MSG("sha3_224 hmac");
  22968. ctx->type = WC_SHA3_224;
  22969. }
  22970. else
  22971. #endif
  22972. #ifndef WOLFSSL_NOSHA3_256
  22973. if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
  22974. WOLFSSL_MSG("sha3_256 hmac");
  22975. ctx->type = WC_SHA3_256;
  22976. }
  22977. else
  22978. #endif
  22979. if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
  22980. WOLFSSL_MSG("sha3_384 hmac");
  22981. ctx->type = WC_SHA3_384;
  22982. }
  22983. else
  22984. #ifndef WOLFSSL_NOSHA3_512
  22985. if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
  22986. WOLFSSL_MSG("sha3_512 hmac");
  22987. ctx->type = WC_SHA3_512;
  22988. }
  22989. else
  22990. #endif
  22991. #endif
  22992. #ifndef NO_SHA
  22993. /* has to be last since would pick or 256, 384, or 512 too */
  22994. if (XSTRNCMP(type, "SHA", 3) == 0) {
  22995. WOLFSSL_MSG("sha hmac");
  22996. ctx->type = WC_SHA;
  22997. }
  22998. else
  22999. #endif
  23000. {
  23001. WOLFSSL_MSG("bad init type");
  23002. return WOLFSSL_FAILURE;
  23003. }
  23004. }
  23005. /* Check if init has been called before */
  23006. inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
  23007. /* Free if needed */
  23008. if (inited) {
  23009. wc_HmacFree(&ctx->hmac);
  23010. }
  23011. if (key != NULL) {
  23012. WOLFSSL_MSG("keying hmac");
  23013. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  23014. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  23015. (word32)keylen);
  23016. if (hmac_error < 0){
  23017. /* in FIPS mode a key < 14 characters will fail here */
  23018. WOLFSSL_MSG("hmac set key error");
  23019. WOLFSSL_ERROR(hmac_error);
  23020. wc_HmacFree(&ctx->hmac);
  23021. return WOLFSSL_FAILURE;
  23022. }
  23023. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  23024. WC_HMAC_BLOCK_SIZE);
  23025. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  23026. WC_HMAC_BLOCK_SIZE);
  23027. }
  23028. /* OpenSSL compat, no error */
  23029. }
  23030. else if (!inited) {
  23031. return WOLFSSL_FAILURE;
  23032. }
  23033. else if (ctx->type >= 0) { /* MD5 == 0 */
  23034. WOLFSSL_MSG("recover hmac");
  23035. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  23036. ctx->hmac.macType = (byte)ctx->type;
  23037. ctx->hmac.innerHashKeyed = 0;
  23038. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  23039. WC_HMAC_BLOCK_SIZE);
  23040. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  23041. WC_HMAC_BLOCK_SIZE);
  23042. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  23043. !=0) {
  23044. WOLFSSL_MSG("hmac init error");
  23045. WOLFSSL_ERROR(hmac_error);
  23046. return WOLFSSL_FAILURE;
  23047. }
  23048. }
  23049. }
  23050. (void)hmac_error;
  23051. return WOLFSSL_SUCCESS;
  23052. }
  23053. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  23054. int len)
  23055. {
  23056. int hmac_error = 0;
  23057. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  23058. if (ctx == NULL) {
  23059. WOLFSSL_MSG("no ctx");
  23060. return WOLFSSL_FAILURE;
  23061. }
  23062. if (data) {
  23063. WOLFSSL_MSG("updating hmac");
  23064. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  23065. if (hmac_error < 0){
  23066. WOLFSSL_MSG("hmac update error");
  23067. return WOLFSSL_FAILURE;
  23068. }
  23069. }
  23070. return WOLFSSL_SUCCESS;
  23071. }
  23072. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  23073. unsigned int* len)
  23074. {
  23075. int hmac_error;
  23076. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  23077. /* "len" parameter is optional. */
  23078. if (ctx == NULL || hash == NULL) {
  23079. WOLFSSL_MSG("invalid parameter");
  23080. return WOLFSSL_FAILURE;
  23081. }
  23082. WOLFSSL_MSG("final hmac");
  23083. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  23084. if (hmac_error < 0){
  23085. WOLFSSL_MSG("final hmac error");
  23086. return WOLFSSL_FAILURE;
  23087. }
  23088. if (len) {
  23089. WOLFSSL_MSG("setting output len");
  23090. switch (ctx->type) {
  23091. #ifndef NO_MD5
  23092. case WC_MD5:
  23093. *len = WC_MD5_DIGEST_SIZE;
  23094. break;
  23095. #endif
  23096. #ifndef NO_SHA
  23097. case WC_SHA:
  23098. *len = WC_SHA_DIGEST_SIZE;
  23099. break;
  23100. #endif
  23101. #ifdef WOLFSSL_SHA224
  23102. case WC_SHA224:
  23103. *len = WC_SHA224_DIGEST_SIZE;
  23104. break;
  23105. #endif
  23106. #ifndef NO_SHA256
  23107. case WC_SHA256:
  23108. *len = WC_SHA256_DIGEST_SIZE;
  23109. break;
  23110. #endif
  23111. #ifdef WOLFSSL_SHA384
  23112. case WC_SHA384:
  23113. *len = WC_SHA384_DIGEST_SIZE;
  23114. break;
  23115. #endif
  23116. #ifdef WOLFSSL_SHA512
  23117. case WC_SHA512:
  23118. *len = WC_SHA512_DIGEST_SIZE;
  23119. break;
  23120. #endif
  23121. #ifdef WOLFSSL_SHA3
  23122. #ifndef WOLFSSL_NOSHA3_224
  23123. case WC_SHA3_224:
  23124. *len = WC_SHA3_224_DIGEST_SIZE;
  23125. break;
  23126. #endif
  23127. #ifndef WOLFSSL_NOSHA3_256
  23128. case WC_SHA3_256:
  23129. *len = WC_SHA3_256_DIGEST_SIZE;
  23130. break;
  23131. #endif
  23132. #ifndef WOLFSSL_NOSHA3_384
  23133. case WC_SHA3_384:
  23134. *len = WC_SHA3_384_DIGEST_SIZE;
  23135. break;
  23136. #endif
  23137. #ifndef WOLFSSL_NOSHA3_512
  23138. case WC_SHA3_512:
  23139. *len = WC_SHA3_512_DIGEST_SIZE;
  23140. break;
  23141. #endif
  23142. #endif
  23143. default:
  23144. WOLFSSL_MSG("bad hmac type");
  23145. return WOLFSSL_FAILURE;
  23146. }
  23147. }
  23148. return WOLFSSL_SUCCESS;
  23149. }
  23150. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  23151. {
  23152. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  23153. if (ctx) {
  23154. wc_HmacFree(&ctx->hmac);
  23155. }
  23156. return WOLFSSL_SUCCESS;
  23157. }
  23158. void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
  23159. {
  23160. if (ctx) {
  23161. wolfSSL_HMAC_cleanup(ctx);
  23162. }
  23163. }
  23164. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  23165. {
  23166. if (ctx) {
  23167. wolfSSL_HMAC_CTX_cleanup(ctx);
  23168. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23169. }
  23170. }
  23171. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  23172. {
  23173. if (!ctx) {
  23174. return 0;
  23175. }
  23176. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  23177. }
  23178. const WOLFSSL_EVP_MD *wolfSSL_HMAC_CTX_get_md(const WOLFSSL_HMAC_CTX *ctx)
  23179. {
  23180. if (!ctx) {
  23181. return NULL;
  23182. }
  23183. return wolfSSL_macType2EVP_md((enum wc_HashType)ctx->type);
  23184. }
  23185. #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
  23186. defined(WOLFSSL_AES_DIRECT)
  23187. WOLFSSL_CMAC_CTX* wolfSSL_CMAC_CTX_new(void)
  23188. {
  23189. WOLFSSL_CMAC_CTX* ctx = NULL;
  23190. ctx = (WOLFSSL_CMAC_CTX*)XMALLOC(sizeof(WOLFSSL_CMAC_CTX), NULL,
  23191. DYNAMIC_TYPE_OPENSSL);
  23192. if (ctx != NULL) {
  23193. ctx->internal = (Cmac*)XMALLOC(sizeof(Cmac), NULL, DYNAMIC_TYPE_CMAC);
  23194. if (ctx->internal == NULL) {
  23195. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23196. ctx = NULL;
  23197. }
  23198. }
  23199. if (ctx != NULL) {
  23200. ctx->cctx = wolfSSL_EVP_CIPHER_CTX_new();
  23201. if (ctx->cctx == NULL) {
  23202. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  23203. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23204. ctx = NULL;
  23205. }
  23206. }
  23207. return ctx;
  23208. }
  23209. void wolfSSL_CMAC_CTX_free(WOLFSSL_CMAC_CTX *ctx)
  23210. {
  23211. if (ctx != NULL) {
  23212. if (ctx->internal != NULL) {
  23213. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  23214. }
  23215. if (ctx->cctx != NULL) {
  23216. wolfSSL_EVP_CIPHER_CTX_free(ctx->cctx);
  23217. }
  23218. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  23219. }
  23220. }
  23221. WOLFSSL_EVP_CIPHER_CTX* wolfSSL_CMAC_CTX_get0_cipher_ctx(WOLFSSL_CMAC_CTX* ctx)
  23222. {
  23223. WOLFSSL_EVP_CIPHER_CTX* cctx = NULL;
  23224. if (ctx != NULL) {
  23225. cctx = ctx->cctx;
  23226. }
  23227. return cctx;
  23228. }
  23229. int wolfSSL_CMAC_Init(WOLFSSL_CMAC_CTX* ctx, const void *key, size_t keyLen,
  23230. const WOLFSSL_EVP_CIPHER* cipher, WOLFSSL_ENGINE* engine)
  23231. {
  23232. int ret = WOLFSSL_SUCCESS;
  23233. (void)engine;
  23234. WOLFSSL_ENTER("wolfSSL_CMAC_Init");
  23235. if (ctx == NULL || cipher == NULL || (
  23236. cipher != EVP_AES_128_CBC &&
  23237. cipher != EVP_AES_192_CBC &&
  23238. cipher != EVP_AES_256_CBC)) {
  23239. ret = WOLFSSL_FAILURE;
  23240. }
  23241. if (ret == WOLFSSL_SUCCESS) {
  23242. ret = wc_InitCmac((Cmac*)ctx->internal, (const byte*)key,
  23243. (word32)keyLen, WC_CMAC_AES, NULL);
  23244. if (ret != 0) {
  23245. ret = WOLFSSL_FAILURE;
  23246. }
  23247. else {
  23248. ret = WOLFSSL_SUCCESS;
  23249. }
  23250. }
  23251. if (ret == WOLFSSL_SUCCESS) {
  23252. ret = wolfSSL_EVP_CipherInit(ctx->cctx, cipher, (const byte*)key, NULL,
  23253. 1);
  23254. }
  23255. WOLFSSL_LEAVE("wolfSSL_CMAC_Init", ret);
  23256. return ret;
  23257. }
  23258. int wolfSSL_CMAC_Update(WOLFSSL_CMAC_CTX* ctx, const void* data, size_t len)
  23259. {
  23260. int ret = WOLFSSL_SUCCESS;
  23261. WOLFSSL_ENTER("wolfSSL_CMAC_Update");
  23262. if (ctx == NULL || ctx->internal == NULL) {
  23263. ret = WOLFSSL_FAILURE;
  23264. }
  23265. if (ret == WOLFSSL_SUCCESS) {
  23266. if (data) {
  23267. ret = wc_CmacUpdate((Cmac*)ctx->internal, (const byte*)data,
  23268. (word32)len);
  23269. if (ret != 0){
  23270. ret = WOLFSSL_FAILURE;
  23271. }
  23272. else {
  23273. ret = WOLFSSL_SUCCESS;
  23274. }
  23275. }
  23276. }
  23277. WOLFSSL_LEAVE("wolfSSL_CMAC_Update", ret);
  23278. return ret;
  23279. }
  23280. int wolfSSL_CMAC_Final(WOLFSSL_CMAC_CTX* ctx, unsigned char* out,
  23281. size_t* len)
  23282. {
  23283. int ret = WOLFSSL_SUCCESS;
  23284. int blockSize;
  23285. WOLFSSL_ENTER("wolfSSL_CMAC_Final");
  23286. if (ctx == NULL || ctx->cctx == NULL || ctx->internal == NULL ||
  23287. len == NULL) {
  23288. ret = WOLFSSL_FAILURE;
  23289. }
  23290. if (ret == WOLFSSL_SUCCESS) {
  23291. blockSize = EVP_CIPHER_CTX_block_size(ctx->cctx);
  23292. if (blockSize <= 0) {
  23293. ret = WOLFSSL_FAILURE;
  23294. }
  23295. else {
  23296. *len = blockSize;
  23297. }
  23298. }
  23299. if (ret == WOLFSSL_SUCCESS) {
  23300. word32 len32 = (word32)*len;
  23301. ret = wc_CmacFinal((Cmac*)ctx->internal, out, &len32);
  23302. *len = (size_t)len32;
  23303. if (ret != 0) {
  23304. ret = WOLFSSL_FAILURE;
  23305. }
  23306. else {
  23307. ret = WOLFSSL_SUCCESS;
  23308. }
  23309. }
  23310. WOLFSSL_LEAVE("wolfSSL_CMAC_Final", ret);
  23311. return ret;
  23312. }
  23313. #endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */
  23314. #endif /* OPENSSL_EXTRA */
  23315. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23316. /* Free the dynamically allocated data.
  23317. *
  23318. * p Pointer to dynamically allocated memory.
  23319. */
  23320. void wolfSSL_OPENSSL_free(void* p)
  23321. {
  23322. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  23323. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  23324. }
  23325. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  23326. #ifdef OPENSSL_EXTRA
  23327. void *wolfSSL_OPENSSL_malloc(size_t a)
  23328. {
  23329. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  23330. }
  23331. int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
  23332. {
  23333. /* 'char' is unsigned on some platforms. */
  23334. return (int)(signed char)HexCharToByte((char)c);
  23335. }
  23336. unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
  23337. {
  23338. unsigned char* targetBuf;
  23339. int srcDigitHigh = 0;
  23340. int srcDigitLow = 0;
  23341. size_t srcLen;
  23342. size_t srcIdx = 0;
  23343. long targetIdx = 0;
  23344. srcLen = XSTRLEN(str);
  23345. targetBuf = (unsigned char*)XMALLOC(srcLen / 2, NULL, DYNAMIC_TYPE_OPENSSL);
  23346. if (targetBuf == NULL) {
  23347. return NULL;
  23348. }
  23349. while (srcIdx < srcLen) {
  23350. if (str[srcIdx] == ':') {
  23351. srcIdx++;
  23352. continue;
  23353. }
  23354. srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  23355. srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  23356. if (srcDigitHigh < 0 || srcDigitLow < 0) {
  23357. WOLFSSL_MSG("Invalid hex character.");
  23358. XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  23359. return NULL;
  23360. }
  23361. targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow);
  23362. }
  23363. if (len != NULL)
  23364. *len = targetIdx;
  23365. return targetBuf;
  23366. }
  23367. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  23368. {
  23369. (void)opts;
  23370. (void)settings;
  23371. return wolfSSL_library_init();
  23372. }
  23373. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  23374. {
  23375. (void)opts;
  23376. (void)settings;
  23377. return wolfSSL_library_init();
  23378. }
  23379. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  23380. int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  23381. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  23382. int maxDerSz)
  23383. {
  23384. int ret, paddingSz;
  23385. word32 idx, cipherInfoSz;
  23386. #ifdef WOLFSSL_SMALL_STACK
  23387. EncryptedInfo* info = NULL;
  23388. #else
  23389. EncryptedInfo info[1];
  23390. #endif
  23391. WOLFSSL_ENTER("EncryptDerKey");
  23392. if (der == NULL || derSz == NULL || cipher == NULL ||
  23393. passwd == NULL || cipherInfo == NULL)
  23394. return BAD_FUNC_ARG;
  23395. #ifdef WOLFSSL_SMALL_STACK
  23396. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  23397. DYNAMIC_TYPE_ENCRYPTEDINFO);
  23398. if (info == NULL) {
  23399. WOLFSSL_MSG("malloc failed");
  23400. return WOLFSSL_FAILURE;
  23401. }
  23402. #endif
  23403. XMEMSET(info, 0, sizeof(EncryptedInfo));
  23404. /* set the cipher name on info */
  23405. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  23406. info->name[NAME_SZ-1] = '\0'; /* null term */
  23407. ret = wc_EncryptedInfoGet(info, info->name);
  23408. if (ret != 0) {
  23409. WOLFSSL_MSG("unsupported cipher");
  23410. #ifdef WOLFSSL_SMALL_STACK
  23411. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23412. #endif
  23413. return WOLFSSL_FAILURE;
  23414. }
  23415. /* Generate a random salt */
  23416. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  23417. WOLFSSL_MSG("generate iv failed");
  23418. #ifdef WOLFSSL_SMALL_STACK
  23419. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23420. #endif
  23421. return WOLFSSL_FAILURE;
  23422. }
  23423. /* add the padding before encryption */
  23424. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  23425. if (paddingSz == 0)
  23426. paddingSz = info->ivSz;
  23427. if (maxDerSz < *derSz + paddingSz) {
  23428. WOLFSSL_MSG("not enough DER buffer allocated");
  23429. #ifdef WOLFSSL_SMALL_STACK
  23430. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23431. #endif
  23432. return WOLFSSL_FAILURE;
  23433. }
  23434. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  23435. (*derSz) += paddingSz;
  23436. /* encrypt buffer */
  23437. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  23438. WOLFSSL_MSG("encrypt key failed");
  23439. #ifdef WOLFSSL_SMALL_STACK
  23440. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23441. #endif
  23442. return WOLFSSL_FAILURE;
  23443. }
  23444. /* create cipher info : 'cipher_name,Salt(hex)' */
  23445. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  23446. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  23447. DYNAMIC_TYPE_STRING);
  23448. if (*cipherInfo == NULL) {
  23449. WOLFSSL_MSG("malloc failed");
  23450. #ifdef WOLFSSL_SMALL_STACK
  23451. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23452. #endif
  23453. return WOLFSSL_FAILURE;
  23454. }
  23455. XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  23456. XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz);
  23457. idx = (word32)XSTRLEN((char*)*cipherInfo);
  23458. cipherInfoSz -= idx;
  23459. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  23460. #ifdef WOLFSSL_SMALL_STACK
  23461. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  23462. #endif
  23463. if (ret != 0) {
  23464. WOLFSSL_MSG("Base16_Encode failed");
  23465. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  23466. return WOLFSSL_FAILURE;
  23467. }
  23468. return WOLFSSL_SUCCESS;
  23469. }
  23470. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  23471. #ifndef NO_BIO
  23472. static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  23473. {
  23474. int ret;
  23475. int pemSz;
  23476. byte* pemBuf;
  23477. int derSz = 0;
  23478. byte* derBuf = NULL;
  23479. if (bio == NULL || key == NULL) {
  23480. WOLFSSL_MSG("Bad parameters");
  23481. return WOLFSSL_FAILURE;
  23482. }
  23483. switch (key->type) {
  23484. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  23485. case EVP_PKEY_RSA:
  23486. if ((derSz = wolfSSL_RSA_To_Der(key->rsa, &derBuf, 1, bio->heap))
  23487. < 0) {
  23488. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  23489. break;
  23490. }
  23491. break;
  23492. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  23493. #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  23494. defined(WOLFSSL_CERT_GEN))
  23495. case EVP_PKEY_DSA:
  23496. if (key->dsa == NULL) {
  23497. WOLFSSL_MSG("key->dsa is null");
  23498. break;
  23499. }
  23500. derSz = MAX_DSA_PUBKEY_SZ;
  23501. derBuf = (byte*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23502. if (derBuf == NULL) {
  23503. WOLFSSL_MSG("malloc failed");
  23504. break;
  23505. }
  23506. /* Key to DER */
  23507. derSz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, derBuf,
  23508. derSz);
  23509. if (derSz < 0) {
  23510. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  23511. break;
  23512. }
  23513. break;
  23514. #endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */
  23515. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  23516. case EVP_PKEY_EC:
  23517. {
  23518. if (key->ecc == NULL) {
  23519. WOLFSSL_MSG("key->ecc is null");
  23520. break;
  23521. }
  23522. derSz = wc_EccPublicKeyDerSize((ecc_key*)key->ecc->internal, 1);
  23523. if (derSz <= 0) {
  23524. WOLFSSL_MSG("wc_EccPublicKeyDerSize failed");
  23525. break;
  23526. }
  23527. derBuf = (byte*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23528. if (derBuf == NULL) {
  23529. WOLFSSL_MSG("malloc failed");
  23530. break;
  23531. }
  23532. derSz = wc_EccPublicKeyToDer((ecc_key*)key->ecc->internal, derBuf,
  23533. derSz, 1);
  23534. if (derSz < 0) {
  23535. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  23536. break;
  23537. }
  23538. break;
  23539. }
  23540. #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
  23541. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  23542. case EVP_PKEY_DH:
  23543. WOLFSSL_MSG("Writing DH PUBKEY not supported!");
  23544. break;
  23545. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  23546. default:
  23547. WOLFSSL_MSG("Unknown Key type!");
  23548. break;
  23549. }
  23550. if (derBuf == NULL || derSz <= 0) {
  23551. if (derBuf != NULL)
  23552. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  23553. return WOLFSSL_FAILURE;
  23554. }
  23555. pemSz = wc_DerToPem(derBuf, derSz, NULL, 0, PUBLICKEY_TYPE);
  23556. if (pemSz < 0) {
  23557. WOLFSSL_LEAVE("pem_write_bio_pubkey", pemSz);
  23558. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  23559. return WOLFSSL_FAILURE;
  23560. }
  23561. pemBuf = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23562. if (pemBuf == NULL) {
  23563. WOLFSSL_LEAVE("pem_write_bio_pubkey", pemSz);
  23564. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  23565. return WOLFSSL_FAILURE;
  23566. }
  23567. ret = wc_DerToPem(derBuf, derSz, pemBuf, pemSz, PUBLICKEY_TYPE);
  23568. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  23569. if (ret < 0) {
  23570. WOLFSSL_LEAVE("pem_write_bio_pubkey", ret);
  23571. XFREE(pemBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23572. return WOLFSSL_FAILURE;
  23573. }
  23574. ret = wolfSSL_BIO_write(bio, pemBuf, pemSz);
  23575. XFREE(pemBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  23576. if (ret != pemSz) {
  23577. WOLFSSL_MSG("Unable to write full PEM to BIO");
  23578. return WOLFSSL_FAILURE;
  23579. }
  23580. return WOLFSSL_SUCCESS;
  23581. }
  23582. /* Takes a public key and writes it out to a WOLFSSL_BIO
  23583. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  23584. */
  23585. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  23586. {
  23587. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  23588. return pem_write_bio_pubkey(bio, key);
  23589. }
  23590. /* Takes a private key and writes it out to a WOLFSSL_BIO
  23591. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  23592. */
  23593. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  23594. const WOLFSSL_EVP_CIPHER* cipher,
  23595. unsigned char* passwd, int len,
  23596. wc_pem_password_cb* cb, void* arg)
  23597. {
  23598. byte* keyDer;
  23599. int pemSz;
  23600. int type;
  23601. int ret;
  23602. byte* tmp;
  23603. (void)cipher;
  23604. (void)passwd;
  23605. (void)len;
  23606. (void)cb;
  23607. (void)arg;
  23608. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  23609. if (bio == NULL || key == NULL) {
  23610. WOLFSSL_MSG("Bad Function Arguments");
  23611. return WOLFSSL_FAILURE;
  23612. }
  23613. keyDer = (byte*)key->pkey.ptr;
  23614. switch (key->type) {
  23615. #ifndef NO_RSA
  23616. case EVP_PKEY_RSA:
  23617. type = PRIVATEKEY_TYPE;
  23618. break;
  23619. #endif
  23620. #ifndef NO_DSA
  23621. case EVP_PKEY_DSA:
  23622. type = DSA_PRIVATEKEY_TYPE;
  23623. break;
  23624. #endif
  23625. #ifdef HAVE_ECC
  23626. case EVP_PKEY_EC:
  23627. type = ECC_PRIVATEKEY_TYPE;
  23628. break;
  23629. #endif
  23630. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  23631. case EVP_PKEY_DH:
  23632. type = DH_PRIVATEKEY_TYPE;
  23633. break;
  23634. #endif
  23635. default:
  23636. WOLFSSL_MSG("Unknown Key type!");
  23637. type = PRIVATEKEY_TYPE;
  23638. }
  23639. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  23640. if (pemSz < 0) {
  23641. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  23642. return WOLFSSL_FAILURE;
  23643. }
  23644. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23645. if (tmp == NULL) {
  23646. return MEMORY_E;
  23647. }
  23648. ret = wc_DerToPem(keyDer, key->pkey_sz, tmp, pemSz, type);
  23649. if (ret < 0) {
  23650. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  23651. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23652. return WOLFSSL_FAILURE;
  23653. }
  23654. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  23655. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23656. if (ret != pemSz) {
  23657. WOLFSSL_MSG("Unable to write full PEM to BIO");
  23658. return WOLFSSL_FAILURE;
  23659. }
  23660. return WOLFSSL_SUCCESS;
  23661. }
  23662. #endif /* !NO_BIO */
  23663. /* Colon separated list of <public key>+<digest> algorithms.
  23664. * Replaces list in context.
  23665. */
  23666. int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list)
  23667. {
  23668. WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list");
  23669. if (ctx == NULL || list == NULL) {
  23670. WOLFSSL_MSG("Bad function arguments");
  23671. return WOLFSSL_FAILURE;
  23672. }
  23673. /* alloc/init on demand only */
  23674. if (ctx->suites == NULL) {
  23675. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  23676. DYNAMIC_TYPE_SUITES);
  23677. if (ctx->suites == NULL) {
  23678. WOLFSSL_MSG("Memory alloc for Suites failed");
  23679. return WOLFSSL_FAILURE;
  23680. }
  23681. XMEMSET(ctx->suites, 0, sizeof(Suites));
  23682. }
  23683. return SetSuitesHashSigAlgo(ctx->suites, list);
  23684. }
  23685. /* Colon separated list of <public key>+<digest> algorithms.
  23686. * Replaces list in SSL.
  23687. */
  23688. int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list)
  23689. {
  23690. WOLFSSL_MSG("wolfSSL_set1_sigalg_list");
  23691. if (ssl == NULL) {
  23692. WOLFSSL_MSG("Bad function arguments");
  23693. return WOLFSSL_FAILURE;
  23694. }
  23695. #ifdef SINGLE_THREADED
  23696. if (ssl->ctx->suites == ssl->suites) {
  23697. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  23698. DYNAMIC_TYPE_SUITES);
  23699. if (ssl->suites == NULL) {
  23700. WOLFSSL_MSG("Suites Memory error");
  23701. return MEMORY_E;
  23702. }
  23703. *ssl->suites = *ssl->ctx->suites;
  23704. ssl->options.ownSuites = 1;
  23705. }
  23706. #endif
  23707. if (ssl == NULL || list == NULL) {
  23708. WOLFSSL_MSG("Bad function arguments");
  23709. return WOLFSSL_FAILURE;
  23710. }
  23711. return SetSuitesHashSigAlgo(ssl->suites, list);
  23712. }
  23713. struct WOLFSSL_HashSigInfo {
  23714. int hashAlgo;
  23715. int sigAlgo;
  23716. int nid;
  23717. } wolfssl_hash_sig_info[] =
  23718. {
  23719. #ifndef NO_RSA
  23720. #ifndef NO_SHA256
  23721. { sha256_mac, rsa_sa_algo, CTC_SHA256wRSA },
  23722. #endif
  23723. #ifdef WOLFSSL_SHA384
  23724. { sha384_mac, rsa_sa_algo, CTC_SHA384wRSA },
  23725. #endif
  23726. #ifdef WOLFSSL_SHA512
  23727. { sha512_mac, rsa_sa_algo, CTC_SHA512wRSA },
  23728. #endif
  23729. #ifdef WOLFSSL_SHA224
  23730. { sha224_mac, rsa_sa_algo, CTC_SHA224wRSA },
  23731. #endif
  23732. #ifndef NO_SHA
  23733. { sha_mac, rsa_sa_algo, CTC_SHAwRSA },
  23734. #endif
  23735. #ifdef WC_RSA_PSS
  23736. #ifndef NO_SHA256
  23737. { sha256_mac, rsa_pss_sa_algo, CTC_SHA256wRSA },
  23738. #endif
  23739. #ifdef WOLFSSL_SHA384
  23740. { sha384_mac, rsa_pss_sa_algo, CTC_SHA384wRSA },
  23741. #endif
  23742. #ifdef WOLFSSL_SHA512
  23743. { sha512_mac, rsa_pss_sa_algo, CTC_SHA512wRSA },
  23744. #endif
  23745. #ifdef WOLFSSL_SHA224
  23746. { sha224_mac, rsa_pss_sa_algo, CTC_SHA224wRSA },
  23747. #endif
  23748. #endif
  23749. #endif
  23750. #ifdef HAVE_ECC
  23751. #ifndef NO_SHA256
  23752. { sha256_mac, ecc_dsa_sa_algo, CTC_SHA256wECDSA },
  23753. #endif
  23754. #ifdef WOLFSSL_SHA384
  23755. { sha384_mac, ecc_dsa_sa_algo, CTC_SHA384wECDSA },
  23756. #endif
  23757. #ifdef WOLFSSL_SHA512
  23758. { sha512_mac, ecc_dsa_sa_algo, CTC_SHA512wECDSA },
  23759. #endif
  23760. #ifdef WOLFSSL_SHA224
  23761. { sha224_mac, ecc_dsa_sa_algo, CTC_SHA224wECDSA },
  23762. #endif
  23763. #ifndef NO_SHA
  23764. { sha_mac, ecc_dsa_sa_algo, CTC_SHAwECDSA },
  23765. #endif
  23766. #endif
  23767. #ifdef HAVE_ED25519
  23768. { no_mac, ed25519_sa_algo, CTC_ED25519 },
  23769. #endif
  23770. #ifdef HAVE_ED448
  23771. { no_mac, ed448_sa_algo, CTC_ED448 },
  23772. #endif
  23773. #ifdef HAVE_PQC
  23774. #ifdef HAVE_FALCON
  23775. { no_mac, falcon_level1_sa_algo, CTC_FALCON_LEVEL1 },
  23776. { no_mac, falcon_level5_sa_algo, CTC_FALCON_LEVEL5 },
  23777. #endif /* HAVE_FALCON */
  23778. #ifdef HAVE_DILITHIUM
  23779. { no_mac, dilithium_level2_sa_algo, CTC_DILITHIUM_LEVEL2 },
  23780. { no_mac, dilithium_level3_sa_algo, CTC_DILITHIUM_LEVEL3 },
  23781. { no_mac, dilithium_level5_sa_algo, CTC_DILITHIUM_LEVEL5 },
  23782. { no_mac, dilithium_aes_level2_sa_algo, CTC_DILITHIUM_AES_LEVEL2 },
  23783. { no_mac, dilithium_aes_level3_sa_algo, CTC_DILITHIUM_AES_LEVEL3 },
  23784. { no_mac, dilithium_aes_level5_sa_algo, CTC_DILITHIUM_AES_LEVEL5 },
  23785. #endif /* HAVE_DILITHIUM */
  23786. #endif /* HAVE_PQC */
  23787. #ifndef NO_DSA
  23788. #ifndef NO_SHA
  23789. { sha_mac, dsa_sa_algo, CTC_SHAwDSA },
  23790. #endif
  23791. #endif
  23792. };
  23793. #define WOLFSSL_HASH_SIG_INFO_SZ \
  23794. (int)(sizeof(wolfssl_hash_sig_info)/sizeof(*wolfssl_hash_sig_info))
  23795. int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid)
  23796. {
  23797. int i;
  23798. int ret = WOLFSSL_FAILURE;
  23799. WOLFSSL_MSG("wolfSSL_get_signature_nid");
  23800. if (ssl == NULL) {
  23801. WOLFSSL_MSG("Bad function arguments");
  23802. return WOLFSSL_FAILURE;
  23803. }
  23804. for (i = 0; i < WOLFSSL_HASH_SIG_INFO_SZ; i++) {
  23805. if (ssl->suites->hashAlgo == wolfssl_hash_sig_info[i].hashAlgo &&
  23806. ssl->suites->sigAlgo == wolfssl_hash_sig_info[i].sigAlgo) {
  23807. *nid = wolfssl_hash_sig_info[i].nid;
  23808. ret = WOLFSSL_SUCCESS;
  23809. break;
  23810. }
  23811. }
  23812. return ret;
  23813. }
  23814. #ifdef HAVE_ECC
  23815. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  23816. static int populate_groups(int* groups, int max_count, char *list)
  23817. {
  23818. char *end;
  23819. int len;
  23820. int count = 0;
  23821. const WOLF_EC_NIST_NAME* nist_name;
  23822. if (!groups || !list) {
  23823. return -1;
  23824. }
  23825. for (end = list; ; list = ++end) {
  23826. if (count > max_count) {
  23827. WOLFSSL_MSG("Too many curves in list");
  23828. return -1;
  23829. }
  23830. while (*end != ':' && *end != '\0') end++;
  23831. len = (int)(end - list); /* end points to char after end
  23832. * of curve name so no need for -1 */
  23833. if ((len < kNistCurves_MIN_NAME_LEN) ||
  23834. (len > kNistCurves_MAX_NAME_LEN)) {
  23835. WOLFSSL_MSG("Unrecognized curve name in list");
  23836. return -1;
  23837. }
  23838. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  23839. if (len == nist_name->name_len &&
  23840. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  23841. break;
  23842. }
  23843. }
  23844. if (!nist_name->name) {
  23845. WOLFSSL_MSG("Unrecognized curve name in list");
  23846. return -1;
  23847. }
  23848. groups[count++] = nist_name->nid;
  23849. if (*end == '\0') break;
  23850. }
  23851. return count;
  23852. }
  23853. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  23854. {
  23855. int groups[WOLFSSL_MAX_GROUP_COUNT];
  23856. int count;
  23857. if (!ctx || !list) {
  23858. return WOLFSSL_FAILURE;
  23859. }
  23860. if ((count = populate_groups(groups,
  23861. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  23862. return WOLFSSL_FAILURE;
  23863. }
  23864. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  23865. }
  23866. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  23867. {
  23868. int groups[WOLFSSL_MAX_GROUP_COUNT];
  23869. int count;
  23870. if (!ssl || !list) {
  23871. return WOLFSSL_FAILURE;
  23872. }
  23873. if ((count = populate_groups(groups,
  23874. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  23875. return WOLFSSL_FAILURE;
  23876. }
  23877. return wolfSSL_set1_groups(ssl, groups, count);
  23878. }
  23879. #endif /* WOLFSSL_TLS13 */
  23880. #endif /* HAVE_ECC */
  23881. #ifndef NO_BIO
  23882. /* Number of bytes to read from a file at a time. */
  23883. #define PEM_READ_FILE_CHUNK_SZ 100
  23884. static int pem_read_bio_file(WOLFSSL_BIO* bio, char** pem)
  23885. {
  23886. int ret = 0;
  23887. int idx = 0;
  23888. int sz = PEM_READ_FILE_CHUNK_SZ; /* read from file by chunks */
  23889. int memSz = 0;
  23890. char* mem = NULL;
  23891. char* tmp;
  23892. /* Allocate a chunk to read into. */
  23893. tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23894. if (tmp == NULL) {
  23895. WOLFSSL_MSG("Memory error");
  23896. ret = MEMORY_E;
  23897. }
  23898. while (ret == 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  23899. char* newMem;
  23900. /* sanity check for signed overflow */
  23901. if (memSz + sz < 0) {
  23902. break;
  23903. }
  23904. /* Reallocate to make space for read data. */
  23905. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  23906. DYNAMIC_TYPE_OPENSSL);
  23907. if (newMem == NULL) {
  23908. WOLFSSL_MSG("Memory error");
  23909. ret = MEMORY_E;
  23910. break;
  23911. }
  23912. mem = newMem;
  23913. /* Copy in new data. */
  23914. XMEMCPY(mem + idx, tmp, sz);
  23915. memSz += sz;
  23916. idx += sz;
  23917. sz = PEM_READ_FILE_CHUNK_SZ; /* read another chunk from file */
  23918. }
  23919. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23920. tmp = NULL;
  23921. if (ret == 0) {
  23922. /* Check data was read. */
  23923. if (memSz <= 0) {
  23924. WOLFSSL_MSG("No data to read from bio");
  23925. ret = BUFFER_E;
  23926. }
  23927. else {
  23928. /* Return size of data read. */
  23929. ret = memSz;
  23930. }
  23931. }
  23932. /* Dispose of any allocated memory on error. */
  23933. if (ret < 0) {
  23934. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23935. mem = NULL;
  23936. }
  23937. *pem = mem;
  23938. return ret;
  23939. }
  23940. static int pem_read_bio_pending(WOLFSSL_BIO* bio, int pendingSz, char** pem)
  23941. {
  23942. int ret = 0;
  23943. char* mem;
  23944. /* Allocate buffer to hold pending data. */
  23945. mem = (char*)XMALLOC(pendingSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23946. if (mem == NULL) {
  23947. WOLFSSL_MSG("Memory error");
  23948. ret = MEMORY_E;
  23949. }
  23950. else if ((ret = wolfSSL_BIO_read(bio, mem, pendingSz)) <= 0) {
  23951. /* Pending data not read. */
  23952. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23953. mem = NULL;
  23954. ret = MEMORY_E;
  23955. }
  23956. *pem = mem;
  23957. return ret;
  23958. }
  23959. static int pem_read_bio_key(WOLFSSL_BIO* bio, wc_pem_password_cb* cb,
  23960. void* pass, int keyType, int* eccFlag,
  23961. DerBuffer** der)
  23962. {
  23963. #ifdef WOLFSSL_SMALL_STACK
  23964. EncryptedInfo* info = NULL;
  23965. #else
  23966. EncryptedInfo info[1];
  23967. #endif /* WOLFSSL_SMALL_STACK */
  23968. wc_pem_password_cb* localCb = NULL;
  23969. char* mem = NULL;
  23970. int ret;
  23971. if (cb != NULL) {
  23972. localCb = cb;
  23973. }
  23974. else if (pass != NULL) {
  23975. localCb = wolfSSL_PEM_def_callback;
  23976. }
  23977. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  23978. ret = pem_read_bio_pending(bio, ret, &mem);
  23979. }
  23980. else if (bio->type == WOLFSSL_BIO_FILE) {
  23981. ret = pem_read_bio_file(bio, &mem);
  23982. }
  23983. else {
  23984. WOLFSSL_MSG("No data to read from bio");
  23985. ret = NOT_COMPILED_IN;
  23986. }
  23987. #ifdef WOLFSSL_SMALL_STACK
  23988. if (ret >= 0) {
  23989. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  23990. DYNAMIC_TYPE_TMP_BUFFER);
  23991. if (info == NULL) {
  23992. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  23993. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  23994. mem = NULL;
  23995. ret = MEMORY_E;
  23996. }
  23997. }
  23998. #endif /* WOLFSSL_SMALL_STACK */
  23999. if (ret >= 0) {
  24000. int memSz = ret;
  24001. XMEMSET(info, 0, sizeof(EncryptedInfo));
  24002. info->passwd_cb = localCb;
  24003. info->passwd_userdata = pass;
  24004. /* Do not strip PKCS8 header */
  24005. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der, NULL,
  24006. info, eccFlag);
  24007. if (ret < 0) {
  24008. WOLFSSL_MSG("Bad PEM To DER");
  24009. }
  24010. /* Write left over data back to BIO if not a file BIO */
  24011. else if ((memSz - (int)info->consumed) > 0 &&
  24012. bio->type != WOLFSSL_BIO_FILE) {
  24013. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  24014. memSz - (int)info->consumed) <= 0) {
  24015. WOLFSSL_MSG("Unable to advance bio read pointer");
  24016. }
  24017. }
  24018. }
  24019. #ifdef WOLFSSL_SMALL_STACK
  24020. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24021. #endif
  24022. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  24023. return ret;
  24024. }
  24025. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  24026. WOLFSSL_EVP_PKEY** key,
  24027. wc_pem_password_cb* cb,
  24028. void* pass)
  24029. {
  24030. WOLFSSL_EVP_PKEY* pkey = NULL;
  24031. DerBuffer* der = NULL;
  24032. int keyFormat = 0;
  24033. int type = -1;
  24034. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  24035. if (bio == NULL)
  24036. return pkey;
  24037. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  24038. &der) >= 0) {
  24039. const unsigned char* ptr = der->buffer;
  24040. if (keyFormat) {
  24041. /* keyFormat is Key_Sum enum */
  24042. if (keyFormat == RSAk)
  24043. type = EVP_PKEY_RSA;
  24044. else if (keyFormat == ECDSAk)
  24045. type = EVP_PKEY_EC;
  24046. else if (keyFormat == DSAk)
  24047. type = EVP_PKEY_DSA;
  24048. else if (keyFormat == DHk)
  24049. type = EVP_PKEY_DH;
  24050. }
  24051. else {
  24052. /* Default to RSA if format is not set */
  24053. type = EVP_PKEY_RSA;
  24054. }
  24055. /* handle case where reuse is attempted */
  24056. if (key != NULL && *key != NULL)
  24057. pkey = *key;
  24058. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  24059. if (pkey == NULL) {
  24060. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  24061. }
  24062. }
  24063. FreeDer(&der);
  24064. if (key != NULL && pkey != NULL)
  24065. *key = pkey;
  24066. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  24067. return pkey;
  24068. }
  24069. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  24070. WOLFSSL_EVP_PKEY **key,
  24071. wc_pem_password_cb *cb,
  24072. void *pass)
  24073. {
  24074. WOLFSSL_EVP_PKEY* pkey = NULL;
  24075. DerBuffer* der = NULL;
  24076. int keyFormat = 0;
  24077. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  24078. if (bio == NULL)
  24079. return pkey;
  24080. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  24081. const unsigned char* ptr = der->buffer;
  24082. /* handle case where reuse is attempted */
  24083. if (key != NULL && *key != NULL)
  24084. pkey = *key;
  24085. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  24086. if (pkey == NULL) {
  24087. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  24088. }
  24089. }
  24090. FreeDer(&der);
  24091. if (key != NULL && pkey != NULL)
  24092. *key = pkey;
  24093. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  24094. return pkey;
  24095. }
  24096. #endif /* !NO_BIO */
  24097. #if !defined(NO_FILESYSTEM)
  24098. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **x,
  24099. wc_pem_password_cb *cb, void *u)
  24100. {
  24101. (void)fp;
  24102. (void)x;
  24103. (void)cb;
  24104. (void)u;
  24105. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  24106. return NULL;
  24107. }
  24108. #endif /* NO_FILESYSTEM */
  24109. #endif /* OPENSSL_EXTRA */
  24110. #ifdef WOLFSSL_ALT_CERT_CHAINS
  24111. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  24112. {
  24113. int isUsing = 0;
  24114. if (ssl)
  24115. isUsing = ssl->options.usingAltCertChain;
  24116. return isUsing;
  24117. }
  24118. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  24119. #ifdef SESSION_CERTS
  24120. #ifdef WOLFSSL_ALT_CERT_CHAINS
  24121. /* Get peer's alternate certificate chain */
  24122. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  24123. {
  24124. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  24125. if (ssl)
  24126. return &ssl->session->altChain;
  24127. return 0;
  24128. }
  24129. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  24130. /* Get peer's certificate chain */
  24131. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  24132. {
  24133. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  24134. if (ssl)
  24135. return &ssl->session->chain;
  24136. return 0;
  24137. }
  24138. /* Get peer's certificate chain total count */
  24139. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  24140. {
  24141. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  24142. if (chain)
  24143. return chain->count;
  24144. return 0;
  24145. }
  24146. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  24147. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  24148. {
  24149. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  24150. if (chain)
  24151. return chain->certs[idx].length;
  24152. return 0;
  24153. }
  24154. /* Get peer's ASN.1 DER certificate at index (idx) */
  24155. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  24156. {
  24157. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  24158. if (chain)
  24159. return chain->certs[idx].buffer;
  24160. return 0;
  24161. }
  24162. /* Get peer's wolfSSL X509 certificate at index (idx) */
  24163. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  24164. {
  24165. int ret;
  24166. WOLFSSL_X509* x509 = NULL;
  24167. #ifdef WOLFSSL_SMALL_STACK
  24168. DecodedCert* cert = NULL;
  24169. #else
  24170. DecodedCert cert[1];
  24171. #endif
  24172. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  24173. if (chain != NULL) {
  24174. #ifdef WOLFSSL_SMALL_STACK
  24175. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  24176. DYNAMIC_TYPE_DCERT);
  24177. if (cert != NULL)
  24178. #endif
  24179. {
  24180. InitDecodedCert(cert, chain->certs[idx].buffer,
  24181. chain->certs[idx].length, NULL);
  24182. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  24183. WOLFSSL_MSG("Failed to parse cert");
  24184. }
  24185. else {
  24186. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  24187. DYNAMIC_TYPE_X509);
  24188. if (x509 == NULL) {
  24189. WOLFSSL_MSG("Failed alloc X509");
  24190. }
  24191. else {
  24192. InitX509(x509, 1, NULL);
  24193. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  24194. WOLFSSL_MSG("Failed to copy decoded");
  24195. wolfSSL_X509_free(x509);
  24196. x509 = NULL;
  24197. }
  24198. }
  24199. }
  24200. FreeDecodedCert(cert);
  24201. #ifdef WOLFSSL_SMALL_STACK
  24202. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  24203. #endif
  24204. }
  24205. }
  24206. (void)ret;
  24207. return x509;
  24208. }
  24209. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  24210. enough else return error (-1). If buffer is NULL only calculate
  24211. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  24212. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  24213. unsigned char* buf, int inLen, int* outLen)
  24214. {
  24215. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  24216. const char* header = NULL;
  24217. const char* footer = NULL;
  24218. int headerLen;
  24219. int footerLen;
  24220. int i;
  24221. int err;
  24222. word32 szNeeded = 0;
  24223. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  24224. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  24225. return BAD_FUNC_ARG;
  24226. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  24227. if (err != 0)
  24228. return err;
  24229. headerLen = (int)XSTRLEN(header);
  24230. footerLen = (int)XSTRLEN(footer);
  24231. /* Null output buffer return size needed in outLen */
  24232. if(!buf) {
  24233. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  24234. NULL, &szNeeded) != LENGTH_ONLY_E)
  24235. return WOLFSSL_FAILURE;
  24236. *outLen = szNeeded + headerLen + footerLen;
  24237. return LENGTH_ONLY_E;
  24238. }
  24239. /* don't even try if inLen too short */
  24240. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  24241. return BAD_FUNC_ARG;
  24242. /* header */
  24243. if (XMEMCPY(buf, header, headerLen) == NULL)
  24244. return WOLFSSL_FATAL_ERROR;
  24245. i = headerLen;
  24246. /* body */
  24247. *outLen = inLen; /* input to Base64_Encode */
  24248. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  24249. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  24250. return err;
  24251. i += *outLen;
  24252. /* footer */
  24253. if ( (i + footerLen) > inLen)
  24254. return BAD_FUNC_ARG;
  24255. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  24256. return WOLFSSL_FATAL_ERROR;
  24257. *outLen += headerLen + footerLen;
  24258. return WOLFSSL_SUCCESS;
  24259. #else
  24260. (void)chain;
  24261. (void)idx;
  24262. (void)buf;
  24263. (void)inLen;
  24264. (void)outLen;
  24265. return WOLFSSL_FAILURE;
  24266. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  24267. }
  24268. /* get session ID */
  24269. WOLFSSL_ABI
  24270. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  24271. {
  24272. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  24273. session = ClientSessionToSession(session);
  24274. if (session)
  24275. return session->sessionID;
  24276. return NULL;
  24277. }
  24278. #endif /* SESSION_CERTS */
  24279. #ifdef HAVE_FUZZER
  24280. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  24281. {
  24282. if (ssl) {
  24283. ssl->fuzzerCb = cbf;
  24284. ssl->fuzzerCtx = fCtx;
  24285. }
  24286. }
  24287. #endif
  24288. #ifndef NO_CERTS
  24289. #ifdef HAVE_PK_CALLBACKS
  24290. #ifdef HAVE_ECC
  24291. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  24292. {
  24293. if (ctx)
  24294. ctx->EccKeyGenCb = cb;
  24295. }
  24296. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  24297. {
  24298. if (ssl)
  24299. ssl->EccKeyGenCtx = ctx;
  24300. }
  24301. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  24302. {
  24303. if (ssl)
  24304. return ssl->EccKeyGenCtx;
  24305. return NULL;
  24306. }
  24307. void wolfSSL_CTX_SetEccSignCtx(WOLFSSL_CTX* ctx, void *userCtx)
  24308. {
  24309. if (ctx)
  24310. ctx->EccSignCtx = userCtx;
  24311. }
  24312. void* wolfSSL_CTX_GetEccSignCtx(WOLFSSL_CTX* ctx)
  24313. {
  24314. if (ctx)
  24315. return ctx->EccSignCtx;
  24316. return NULL;
  24317. }
  24318. WOLFSSL_ABI
  24319. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  24320. {
  24321. if (ctx)
  24322. ctx->EccSignCb = cb;
  24323. }
  24324. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  24325. {
  24326. if (ssl)
  24327. ssl->EccSignCtx = ctx;
  24328. }
  24329. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  24330. {
  24331. if (ssl)
  24332. return ssl->EccSignCtx;
  24333. return NULL;
  24334. }
  24335. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  24336. {
  24337. if (ctx)
  24338. ctx->EccVerifyCb = cb;
  24339. }
  24340. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  24341. {
  24342. if (ssl)
  24343. ssl->EccVerifyCtx = ctx;
  24344. }
  24345. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  24346. {
  24347. if (ssl)
  24348. return ssl->EccVerifyCtx;
  24349. return NULL;
  24350. }
  24351. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  24352. {
  24353. if (ctx)
  24354. ctx->EccSharedSecretCb = cb;
  24355. }
  24356. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24357. {
  24358. if (ssl)
  24359. ssl->EccSharedSecretCtx = ctx;
  24360. }
  24361. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  24362. {
  24363. if (ssl)
  24364. return ssl->EccSharedSecretCtx;
  24365. return NULL;
  24366. }
  24367. #endif /* HAVE_ECC */
  24368. #ifdef HAVE_ED25519
  24369. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  24370. {
  24371. if (ctx)
  24372. ctx->Ed25519SignCb = cb;
  24373. }
  24374. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  24375. {
  24376. if (ssl)
  24377. ssl->Ed25519SignCtx = ctx;
  24378. }
  24379. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  24380. {
  24381. if (ssl)
  24382. return ssl->Ed25519SignCtx;
  24383. return NULL;
  24384. }
  24385. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  24386. {
  24387. if (ctx)
  24388. ctx->Ed25519VerifyCb = cb;
  24389. }
  24390. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  24391. {
  24392. if (ssl)
  24393. ssl->Ed25519VerifyCtx = ctx;
  24394. }
  24395. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  24396. {
  24397. if (ssl)
  24398. return ssl->Ed25519VerifyCtx;
  24399. return NULL;
  24400. }
  24401. #endif /* HAVE_ED25519 */
  24402. #ifdef HAVE_CURVE25519
  24403. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  24404. CallbackX25519KeyGen cb)
  24405. {
  24406. if (ctx)
  24407. ctx->X25519KeyGenCb = cb;
  24408. }
  24409. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  24410. {
  24411. if (ssl)
  24412. ssl->X25519KeyGenCtx = ctx;
  24413. }
  24414. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  24415. {
  24416. if (ssl)
  24417. return ssl->X25519KeyGenCtx;
  24418. return NULL;
  24419. }
  24420. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  24421. CallbackX25519SharedSecret cb)
  24422. {
  24423. if (ctx)
  24424. ctx->X25519SharedSecretCb = cb;
  24425. }
  24426. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24427. {
  24428. if (ssl)
  24429. ssl->X25519SharedSecretCtx = ctx;
  24430. }
  24431. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  24432. {
  24433. if (ssl)
  24434. return ssl->X25519SharedSecretCtx;
  24435. return NULL;
  24436. }
  24437. #endif /* HAVE_CURVE25519 */
  24438. #ifdef HAVE_ED448
  24439. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  24440. {
  24441. if (ctx)
  24442. ctx->Ed448SignCb = cb;
  24443. }
  24444. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  24445. {
  24446. if (ssl)
  24447. ssl->Ed448SignCtx = ctx;
  24448. }
  24449. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  24450. {
  24451. if (ssl)
  24452. return ssl->Ed448SignCtx;
  24453. return NULL;
  24454. }
  24455. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  24456. {
  24457. if (ctx)
  24458. ctx->Ed448VerifyCb = cb;
  24459. }
  24460. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  24461. {
  24462. if (ssl)
  24463. ssl->Ed448VerifyCtx = ctx;
  24464. }
  24465. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  24466. {
  24467. if (ssl)
  24468. return ssl->Ed448VerifyCtx;
  24469. return NULL;
  24470. }
  24471. #endif /* HAVE_ED448 */
  24472. #ifdef HAVE_CURVE448
  24473. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  24474. CallbackX448KeyGen cb)
  24475. {
  24476. if (ctx)
  24477. ctx->X448KeyGenCb = cb;
  24478. }
  24479. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  24480. {
  24481. if (ssl)
  24482. ssl->X448KeyGenCtx = ctx;
  24483. }
  24484. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  24485. {
  24486. if (ssl)
  24487. return ssl->X448KeyGenCtx;
  24488. return NULL;
  24489. }
  24490. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  24491. CallbackX448SharedSecret cb)
  24492. {
  24493. if (ctx)
  24494. ctx->X448SharedSecretCb = cb;
  24495. }
  24496. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  24497. {
  24498. if (ssl)
  24499. ssl->X448SharedSecretCtx = ctx;
  24500. }
  24501. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  24502. {
  24503. if (ssl)
  24504. return ssl->X448SharedSecretCtx;
  24505. return NULL;
  24506. }
  24507. #endif /* HAVE_CURVE448 */
  24508. #ifndef NO_RSA
  24509. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  24510. {
  24511. if (ctx)
  24512. ctx->RsaSignCb = cb;
  24513. }
  24514. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  24515. {
  24516. if (ctx)
  24517. ctx->RsaSignCheckCb = cb;
  24518. }
  24519. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  24520. {
  24521. if (ssl)
  24522. ssl->RsaSignCtx = ctx;
  24523. }
  24524. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  24525. {
  24526. if (ssl)
  24527. return ssl->RsaSignCtx;
  24528. return NULL;
  24529. }
  24530. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  24531. {
  24532. if (ctx)
  24533. ctx->RsaVerifyCb = cb;
  24534. }
  24535. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  24536. {
  24537. if (ssl)
  24538. ssl->RsaVerifyCtx = ctx;
  24539. }
  24540. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  24541. {
  24542. if (ssl)
  24543. return ssl->RsaVerifyCtx;
  24544. return NULL;
  24545. }
  24546. #ifdef WC_RSA_PSS
  24547. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  24548. {
  24549. if (ctx)
  24550. ctx->RsaPssSignCb = cb;
  24551. }
  24552. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  24553. {
  24554. if (ctx)
  24555. ctx->RsaPssSignCheckCb = cb;
  24556. }
  24557. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  24558. {
  24559. if (ssl)
  24560. ssl->RsaPssSignCtx = ctx;
  24561. }
  24562. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  24563. {
  24564. if (ssl)
  24565. return ssl->RsaPssSignCtx;
  24566. return NULL;
  24567. }
  24568. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  24569. {
  24570. if (ctx)
  24571. ctx->RsaPssVerifyCb = cb;
  24572. }
  24573. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  24574. {
  24575. if (ssl)
  24576. ssl->RsaPssVerifyCtx = ctx;
  24577. }
  24578. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  24579. {
  24580. if (ssl)
  24581. return ssl->RsaPssVerifyCtx;
  24582. return NULL;
  24583. }
  24584. #endif /* WC_RSA_PSS */
  24585. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  24586. {
  24587. if (ctx)
  24588. ctx->RsaEncCb = cb;
  24589. }
  24590. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  24591. {
  24592. if (ssl)
  24593. ssl->RsaEncCtx = ctx;
  24594. }
  24595. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  24596. {
  24597. if (ssl)
  24598. return ssl->RsaEncCtx;
  24599. return NULL;
  24600. }
  24601. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  24602. {
  24603. if (ctx)
  24604. ctx->RsaDecCb = cb;
  24605. }
  24606. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  24607. {
  24608. if (ssl)
  24609. ssl->RsaDecCtx = ctx;
  24610. }
  24611. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  24612. {
  24613. if (ssl)
  24614. return ssl->RsaDecCtx;
  24615. return NULL;
  24616. }
  24617. #endif /* NO_RSA */
  24618. /* callback for premaster secret generation */
  24619. void wolfSSL_CTX_SetGenPreMasterCb(WOLFSSL_CTX* ctx, CallbackGenPreMaster cb)
  24620. {
  24621. if (ctx)
  24622. ctx->GenPreMasterCb = cb;
  24623. }
  24624. /* Set premaster secret generation callback context */
  24625. void wolfSSL_SetGenPreMasterCtx(WOLFSSL* ssl, void *ctx)
  24626. {
  24627. if (ssl)
  24628. ssl->GenPreMasterCtx = ctx;
  24629. }
  24630. /* Get premaster secret generation callback context */
  24631. void* wolfSSL_GetGenPreMasterCtx(WOLFSSL* ssl)
  24632. {
  24633. if (ssl)
  24634. return ssl->GenPreMasterCtx;
  24635. return NULL;
  24636. }
  24637. /* callback for master secret generation */
  24638. void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb)
  24639. {
  24640. if (ctx)
  24641. ctx->GenMasterCb = cb;
  24642. }
  24643. /* Set master secret generation callback context */
  24644. void wolfSSL_SetGenMasterSecretCtx(WOLFSSL* ssl, void *ctx)
  24645. {
  24646. if (ssl)
  24647. ssl->GenMasterCtx = ctx;
  24648. }
  24649. /* Get master secret generation callback context */
  24650. void* wolfSSL_GetGenMasterSecretCtx(WOLFSSL* ssl)
  24651. {
  24652. if (ssl)
  24653. return ssl->GenMasterCtx;
  24654. return NULL;
  24655. }
  24656. /* callback for session key generation */
  24657. void wolfSSL_CTX_SetGenSessionKeyCb(WOLFSSL_CTX* ctx, CallbackGenSessionKey cb)
  24658. {
  24659. if (ctx)
  24660. ctx->GenSessionKeyCb = cb;
  24661. }
  24662. /* Set session key generation callback context */
  24663. void wolfSSL_SetGenSessionKeyCtx(WOLFSSL* ssl, void *ctx)
  24664. {
  24665. if (ssl)
  24666. ssl->GenSessionKeyCtx = ctx;
  24667. }
  24668. /* Get session key generation callback context */
  24669. void* wolfSSL_GetGenSessionKeyCtx(WOLFSSL* ssl)
  24670. {
  24671. if (ssl)
  24672. return ssl->GenSessionKeyCtx;
  24673. return NULL;
  24674. }
  24675. /* callback for setting encryption keys */
  24676. void wolfSSL_CTX_SetEncryptKeysCb(WOLFSSL_CTX* ctx, CallbackEncryptKeys cb)
  24677. {
  24678. if (ctx)
  24679. ctx->EncryptKeysCb = cb;
  24680. }
  24681. /* Set encryption keys callback context */
  24682. void wolfSSL_SetEncryptKeysCtx(WOLFSSL* ssl, void *ctx)
  24683. {
  24684. if (ssl)
  24685. ssl->EncryptKeysCtx = ctx;
  24686. }
  24687. /* Get encryption keys callback context */
  24688. void* wolfSSL_GetEncryptKeysCtx(WOLFSSL* ssl)
  24689. {
  24690. if (ssl)
  24691. return ssl->EncryptKeysCtx;
  24692. return NULL;
  24693. }
  24694. /* callback for Tls finished */
  24695. /* the callback can be used to build TLS Finished message if enabled */
  24696. void wolfSSL_CTX_SetTlsFinishedCb(WOLFSSL_CTX* ctx, CallbackTlsFinished cb)
  24697. {
  24698. if (ctx)
  24699. ctx->TlsFinishedCb = cb;
  24700. }
  24701. /* Set Tls finished callback context */
  24702. void wolfSSL_SetTlsFinishedCtx(WOLFSSL* ssl, void *ctx)
  24703. {
  24704. if (ssl)
  24705. ssl->TlsFinishedCtx = ctx;
  24706. }
  24707. /* Get Tls finished callback context */
  24708. void* wolfSSL_GetTlsFinishedCtx(WOLFSSL* ssl)
  24709. {
  24710. if (ssl)
  24711. return ssl->TlsFinishedCtx;
  24712. return NULL;
  24713. }
  24714. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  24715. /* callback for verify data */
  24716. void wolfSSL_CTX_SetVerifyMacCb(WOLFSSL_CTX* ctx, CallbackVerifyMac cb)
  24717. {
  24718. if (ctx)
  24719. ctx->VerifyMacCb = cb;
  24720. }
  24721. /* Set set keys callback context */
  24722. void wolfSSL_SetVerifyMacCtx(WOLFSSL* ssl, void *ctx)
  24723. {
  24724. if (ssl)
  24725. ssl->VerifyMacCtx = ctx;
  24726. }
  24727. /* Get set keys callback context */
  24728. void* wolfSSL_GetVerifyMacCtx(WOLFSSL* ssl)
  24729. {
  24730. if (ssl)
  24731. return ssl->VerifyMacCtx;
  24732. return NULL;
  24733. }
  24734. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  24735. #endif /* HAVE_PK_CALLBACKS */
  24736. #endif /* NO_CERTS */
  24737. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  24738. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  24739. {
  24740. if (ctx)
  24741. ctx->DhAgreeCb = cb;
  24742. }
  24743. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  24744. {
  24745. if (ssl)
  24746. ssl->DhAgreeCtx = ctx;
  24747. }
  24748. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  24749. {
  24750. if (ssl)
  24751. return ssl->DhAgreeCtx;
  24752. return NULL;
  24753. }
  24754. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  24755. #if defined(HAVE_PK_CALLBACKS) && defined(HAVE_HKDF)
  24756. void wolfSSL_CTX_SetHKDFExtractCb(WOLFSSL_CTX* ctx, CallbackHKDFExtract cb)
  24757. {
  24758. if (ctx)
  24759. ctx->HkdfExtractCb = cb;
  24760. }
  24761. void wolfSSL_SetHKDFExtractCtx(WOLFSSL* ssl, void *ctx)
  24762. {
  24763. if (ssl)
  24764. ssl->HkdfExtractCtx = ctx;
  24765. }
  24766. void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
  24767. {
  24768. if (ssl)
  24769. return ssl->HkdfExtractCtx;
  24770. return NULL;
  24771. }
  24772. #endif /* HAVE_PK_CALLBACKS && HAVE_HKDF */
  24773. #ifdef WOLFSSL_HAVE_WOLFSCEP
  24774. /* Used by autoconf to see if wolfSCEP is available */
  24775. void wolfSSL_wolfSCEP(void) {}
  24776. #endif
  24777. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  24778. /* Used by autoconf to see if cert service is available */
  24779. void wolfSSL_cert_service(void) {}
  24780. #endif
  24781. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  24782. !defined(WOLFCRYPT_ONLY)
  24783. #ifndef NO_CERTS
  24784. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  24785. /* Convert ASN1 input string into canonical ASN1 string */
  24786. /* , which has the following rules: */
  24787. /* convert to UTF8 */
  24788. /* convert to lower case */
  24789. /* multi-spaces collapsed */
  24790. /* @param asn_out a pointer to ASN1_STRING to be converted */
  24791. /* @param asn_in a pointer to input ASN1_STRING */
  24792. /* @return WOLFSSL_SUCCESS on successful converted, otherwise <=0 error code*/
  24793. int wolfSSL_ASN1_STRING_canon(WOLFSSL_ASN1_STRING* asn_out,
  24794. const WOLFSSL_ASN1_STRING* asn_in)
  24795. {
  24796. char* dst;
  24797. char* src;
  24798. int i, len;
  24799. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_canon");
  24800. /* sanity check */
  24801. if (asn_out == NULL || asn_in == NULL) {
  24802. WOLFSSL_MSG("invalid function arguments");
  24803. return BAD_FUNC_ARG;
  24804. }
  24805. switch (asn_in->type) {
  24806. case MBSTRING_UTF8:
  24807. case V_ASN1_PRINTABLESTRING:
  24808. break;
  24809. default:
  24810. WOLFSSL_MSG("just copy string");
  24811. return wolfSSL_ASN1_STRING_copy(asn_out, asn_in);
  24812. }
  24813. /* type is set as UTF8 */
  24814. asn_out->type = MBSTRING_UTF8;
  24815. asn_out->length = wolfSSL_ASN1_STRING_to_UTF8(
  24816. (unsigned char**)&asn_out->data, (WOLFSSL_ASN1_STRING*)asn_in);
  24817. if (asn_out->length < 0) {
  24818. return WOLFSSL_FAILURE;
  24819. }
  24820. /* point to the last */
  24821. dst = asn_out->data + asn_out->length;
  24822. /* point to the start */
  24823. src = asn_out->data;
  24824. len = asn_out->length;
  24825. /* trimming spaces at the head and tail */
  24826. dst--;
  24827. for (; (len > 0 && XISSPACE(*dst)); len--) {
  24828. dst--;
  24829. }
  24830. for (; (len > 0 && XISSPACE(*src)); len--) {
  24831. src++;
  24832. }
  24833. /* point to the start */
  24834. dst = asn_out->data;
  24835. for (i = 0; i < len; dst++, i++) {
  24836. if (!XISASCII(*src)) {
  24837. /* keep non-ascii code */
  24838. *dst = *src++;
  24839. } else if (XISSPACE(*src)) {
  24840. *dst = 0x20; /* space */
  24841. /* remove the rest of spaces */
  24842. while (XISSPACE(*++src) && i++ < len);
  24843. } else {
  24844. *dst = (char)XTOLOWER((unsigned char)*src++);
  24845. }
  24846. }
  24847. /* put actual length */
  24848. asn_out->length = (int)(dst - asn_out->data);
  24849. return WOLFSSL_SUCCESS;
  24850. }
  24851. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  24852. #if !defined(NO_FILESYSTEM)
  24853. #ifndef NO_BIO
  24854. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp,
  24855. WOLFSSL_EVP_PKEY **x, wc_pem_password_cb *cb, void *u)
  24856. {
  24857. int err = 0;
  24858. WOLFSSL_EVP_PKEY* ret = NULL;
  24859. WOLFSSL_BIO* bio = NULL;
  24860. WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey");
  24861. if (fp == XBADFILE) {
  24862. err = 1;
  24863. }
  24864. if (err == 0) {
  24865. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  24866. err = bio == NULL;
  24867. }
  24868. if (err == 0) {
  24869. err = wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS;
  24870. }
  24871. if (err == 0) {
  24872. ret = wolfSSL_PEM_read_bio_PrivateKey(bio, x, cb, u);
  24873. }
  24874. if (bio != NULL) {
  24875. wolfSSL_BIO_free(bio);
  24876. }
  24877. return ret;
  24878. }
  24879. #endif
  24880. #endif
  24881. #endif
  24882. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/
  24883. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  24884. #define PEM_BEGIN "-----BEGIN "
  24885. #define PEM_BEGIN_SZ 11
  24886. #define PEM_END "-----END "
  24887. #define PEM_END_SZ 9
  24888. #define PEM_HDR_FIN "-----"
  24889. #define PEM_HDR_FIN_SZ 5
  24890. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  24891. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  24892. #define PEM_HDR_FIN_EOL_SZ 6
  24893. #ifndef NO_BIO
  24894. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  24895. unsigned char **data, long *len)
  24896. {
  24897. int ret = WOLFSSL_SUCCESS;
  24898. char pem[256];
  24899. int pemLen;
  24900. char* p;
  24901. char* nameStr = NULL;
  24902. int nameLen = 0;
  24903. char* headerStr = NULL;
  24904. int headerLen;
  24905. int headerFound = 0;
  24906. unsigned char* der = NULL;
  24907. word32 derLen = 0;
  24908. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  24909. len == NULL) {
  24910. return WOLFSSL_FAILURE;
  24911. }
  24912. /* Find header line. */
  24913. pem[sizeof(pem) - 1] = '\0';
  24914. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  24915. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  24916. break;
  24917. }
  24918. if (pemLen <= 0)
  24919. ret = WOLFSSL_FAILURE;
  24920. /* Have a header line. */
  24921. if (ret == WOLFSSL_SUCCESS) {
  24922. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  24923. pemLen--;
  24924. pem[pemLen] = '\0';
  24925. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  24926. PEM_HDR_FIN_SZ) != 0) {
  24927. ret = WOLFSSL_FAILURE;
  24928. }
  24929. }
  24930. /* Get out name. */
  24931. if (ret == WOLFSSL_SUCCESS) {
  24932. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  24933. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  24934. DYNAMIC_TYPE_TMP_BUFFER);
  24935. if (nameStr == NULL)
  24936. ret = WOLFSSL_FAILURE;
  24937. }
  24938. if (ret == WOLFSSL_SUCCESS) {
  24939. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  24940. nameStr[nameLen] = '\0';
  24941. /* Get header of PEM - encryption header. */
  24942. headerLen = 0;
  24943. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  24944. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  24945. pem[pemLen - 1] == '\n')) {
  24946. pemLen--;
  24947. }
  24948. pem[pemLen++] = '\n';
  24949. pem[pemLen] = '\0';
  24950. /* Header separator is a blank line. */
  24951. if (pem[0] == '\n') {
  24952. headerFound = 1;
  24953. break;
  24954. }
  24955. /* Didn't find a blank line - no header. */
  24956. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  24957. der = (unsigned char*)headerStr;
  24958. derLen = headerLen;
  24959. /* Empty header - empty string. */
  24960. headerStr = (char*)XMALLOC(1, NULL,
  24961. DYNAMIC_TYPE_TMP_BUFFER);
  24962. if (headerStr == NULL)
  24963. ret = WOLFSSL_FAILURE;
  24964. else
  24965. headerStr[0] = '\0';
  24966. break;
  24967. }
  24968. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  24969. DYNAMIC_TYPE_TMP_BUFFER);
  24970. if (p == NULL) {
  24971. ret = WOLFSSL_FAILURE;
  24972. break;
  24973. }
  24974. headerStr = p;
  24975. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  24976. headerLen += pemLen;
  24977. }
  24978. if (pemLen <= 0)
  24979. ret = WOLFSSL_FAILURE;
  24980. }
  24981. /* Get body of PEM - if there was a header */
  24982. if (ret == WOLFSSL_SUCCESS && headerFound) {
  24983. derLen = 0;
  24984. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  24985. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  24986. pem[pemLen - 1] == '\n')) {
  24987. pemLen--;
  24988. }
  24989. pem[pemLen++] = '\n';
  24990. pem[pemLen] = '\0';
  24991. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  24992. break;
  24993. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  24994. DYNAMIC_TYPE_TMP_BUFFER);
  24995. if (p == NULL) {
  24996. ret = WOLFSSL_FAILURE;
  24997. break;
  24998. }
  24999. der = (unsigned char*)p;
  25000. XMEMCPY(der + derLen, pem, pemLen + 1);
  25001. derLen += pemLen;
  25002. }
  25003. if (pemLen <= 0)
  25004. ret = WOLFSSL_FAILURE;
  25005. }
  25006. /* Check trailer. */
  25007. if (ret == WOLFSSL_SUCCESS) {
  25008. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  25009. ret = WOLFSSL_FAILURE;
  25010. }
  25011. if (ret == WOLFSSL_SUCCESS) {
  25012. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  25013. PEM_HDR_FIN_EOL_NEWLINE,
  25014. PEM_HDR_FIN_EOL_SZ) != 0 &&
  25015. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  25016. PEM_HDR_FIN_EOL_NULL_TERM,
  25017. PEM_HDR_FIN_EOL_SZ) != 0) {
  25018. ret = WOLFSSL_FAILURE;
  25019. }
  25020. }
  25021. /* Base64 decode body. */
  25022. if (ret == WOLFSSL_SUCCESS) {
  25023. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  25024. ret = WOLFSSL_FAILURE;
  25025. }
  25026. if (ret == WOLFSSL_SUCCESS) {
  25027. *name = nameStr;
  25028. *header = headerStr;
  25029. *data = der;
  25030. *len = derLen;
  25031. nameStr = NULL;
  25032. headerStr = NULL;
  25033. der = NULL;
  25034. }
  25035. if (nameStr != NULL)
  25036. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25037. if (headerStr != NULL)
  25038. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25039. if (der != NULL)
  25040. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25041. return ret;
  25042. }
  25043. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  25044. const char *header, const unsigned char *data,
  25045. long len)
  25046. {
  25047. int err = 0;
  25048. int outSz = 0;
  25049. int nameLen;
  25050. int headerLen;
  25051. byte* pem = NULL;
  25052. word32 pemLen;
  25053. word32 derLen = (word32)len;
  25054. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  25055. return 0;
  25056. nameLen = (int)XSTRLEN(name);
  25057. headerLen = (int)XSTRLEN(header);
  25058. pemLen = (derLen + 2) / 3 * 4;
  25059. pemLen += (pemLen + 63) / 64;
  25060. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25061. err = pem == NULL;
  25062. if (!err)
  25063. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  25064. if (!err) {
  25065. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  25066. (int)PEM_BEGIN_SZ;
  25067. }
  25068. if (!err)
  25069. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  25070. if (!err) {
  25071. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  25072. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  25073. }
  25074. if (!err && headerLen > 0) {
  25075. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  25076. /* Blank line after a header and before body. */
  25077. if (!err)
  25078. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  25079. headerLen++;
  25080. }
  25081. if (!err)
  25082. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  25083. if (!err)
  25084. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  25085. (int)PEM_END_SZ;
  25086. if (!err)
  25087. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  25088. if (!err) {
  25089. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  25090. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  25091. }
  25092. if (!err) {
  25093. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  25094. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  25095. }
  25096. if (pem != NULL)
  25097. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25098. return outSz;
  25099. }
  25100. #if !defined(NO_FILESYSTEM)
  25101. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  25102. unsigned char **data, long *len)
  25103. {
  25104. int ret;
  25105. WOLFSSL_BIO* bio;
  25106. if (name == NULL || header == NULL || data == NULL || len == NULL)
  25107. return WOLFSSL_FAILURE;
  25108. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  25109. if (bio == NULL)
  25110. return 0;
  25111. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  25112. wolfSSL_BIO_free(bio);
  25113. bio = NULL;
  25114. }
  25115. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  25116. if (bio != NULL)
  25117. wolfSSL_BIO_free(bio);
  25118. return ret;
  25119. }
  25120. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  25121. const unsigned char *data, long len)
  25122. {
  25123. int ret;
  25124. WOLFSSL_BIO* bio;
  25125. if (name == NULL || header == NULL || data == NULL)
  25126. return 0;
  25127. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  25128. if (bio == NULL)
  25129. return 0;
  25130. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  25131. wolfSSL_BIO_free(bio);
  25132. bio = NULL;
  25133. }
  25134. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  25135. if (bio != NULL)
  25136. wolfSSL_BIO_free(bio);
  25137. return ret;
  25138. }
  25139. #endif
  25140. #endif /* !NO_BIO */
  25141. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  25142. EncryptedInfo* cipher)
  25143. {
  25144. if (header == NULL || cipher == NULL)
  25145. return WOLFSSL_FAILURE;
  25146. XMEMSET(cipher, 0, sizeof(*cipher));
  25147. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  25148. return WOLFSSL_FAILURE;
  25149. return WOLFSSL_SUCCESS;
  25150. }
  25151. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  25152. long* len, wc_pem_password_cb* callback,
  25153. void* ctx)
  25154. {
  25155. int ret = WOLFSSL_SUCCESS;
  25156. char password[NAME_SZ];
  25157. int passwordSz;
  25158. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  25159. return WOLFSSL_FAILURE;
  25160. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  25161. if (passwordSz < 0)
  25162. ret = WOLFSSL_FAILURE;
  25163. if (ret == WOLFSSL_SUCCESS) {
  25164. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  25165. passwordSz, WC_MD5) != 0) {
  25166. ret = WOLFSSL_FAILURE;
  25167. }
  25168. }
  25169. if (passwordSz > 0)
  25170. XMEMSET(password, 0, passwordSz);
  25171. return ret;
  25172. }
  25173. #ifndef NO_BIO
  25174. /*
  25175. * bp : bio to read X509 from
  25176. * x : x509 to write to
  25177. * cb : password call back for reading PEM
  25178. * u : password
  25179. * _AUX is for working with a trusted X509 certificate
  25180. */
  25181. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  25182. WOLFSSL_X509 **x, wc_pem_password_cb *cb,
  25183. void *u)
  25184. {
  25185. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  25186. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  25187. * and potentially a stack of "other" info. wolfSSL does not store
  25188. * friendly name or private key id yet in WOLFSSL_X509 for human
  25189. * readability and does not support extra trusted/rejected uses for
  25190. * root CA. */
  25191. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  25192. }
  25193. #endif /* !NO_BIO */
  25194. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  25195. #endif /* !NO_CERTS */
  25196. /* NID variables are dependent on compatibility header files currently
  25197. *
  25198. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  25199. * on fail
  25200. */
  25201. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  25202. {
  25203. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  25204. }
  25205. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  25206. WOLFSSL_ASN1_OBJECT* arg_obj)
  25207. {
  25208. word32 oidSz = 0;
  25209. int nid = 0;
  25210. const byte* oid;
  25211. word32 type = 0;
  25212. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  25213. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  25214. word32 objSz = 0;
  25215. const char* sName = NULL;
  25216. int i;
  25217. #ifdef WOLFSSL_DEBUG_OPENSSL
  25218. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  25219. #endif
  25220. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  25221. if (wolfssl_object_info[i].nid == id) {
  25222. nid = id;
  25223. id = wolfssl_object_info[i].id;
  25224. sName = wolfssl_object_info[i].sName;
  25225. type = wolfssl_object_info[i].type;
  25226. break;
  25227. }
  25228. }
  25229. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  25230. WOLFSSL_MSG("NID not in table");
  25231. #ifdef WOLFSSL_QT
  25232. sName = NULL;
  25233. type = id;
  25234. #else
  25235. return NULL;
  25236. #endif
  25237. }
  25238. #ifdef HAVE_ECC
  25239. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  25240. type = oidCurveType;
  25241. }
  25242. #endif /* HAVE_ECC */
  25243. if (sName != NULL) {
  25244. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  25245. WOLFSSL_MSG("Attempted short name is too large");
  25246. return NULL;
  25247. }
  25248. }
  25249. oid = OidFromId(id, type, &oidSz);
  25250. /* set object ID to buffer */
  25251. if (obj == NULL){
  25252. obj = wolfSSL_ASN1_OBJECT_new();
  25253. if (obj == NULL) {
  25254. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  25255. return NULL;
  25256. }
  25257. }
  25258. obj->nid = nid;
  25259. obj->type = id;
  25260. obj->grp = type;
  25261. obj->sName[0] = '\0';
  25262. if (sName != NULL) {
  25263. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  25264. }
  25265. objBuf[0] = ASN_OBJECT_ID; objSz++;
  25266. objSz += SetLength(oidSz, objBuf + 1);
  25267. if (oidSz) {
  25268. XMEMCPY(objBuf + objSz, oid, oidSz);
  25269. objSz += oidSz;
  25270. }
  25271. if (obj->objSz == 0 || objSz != obj->objSz) {
  25272. obj->objSz = objSz;
  25273. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  25274. (obj->obj == NULL)) {
  25275. if (obj->obj != NULL)
  25276. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  25277. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  25278. if (obj->obj == NULL) {
  25279. wolfSSL_ASN1_OBJECT_free(obj);
  25280. return NULL;
  25281. }
  25282. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  25283. }
  25284. else {
  25285. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  25286. }
  25287. }
  25288. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  25289. (void)type;
  25290. return obj;
  25291. }
  25292. static const char* oid_translate_num_to_str(const char* oid)
  25293. {
  25294. const struct oid_dict {
  25295. const char* num;
  25296. const char* desc;
  25297. } oid_dict[] = {
  25298. { "2.5.29.37.0", "Any Extended Key Usage" },
  25299. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  25300. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  25301. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  25302. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  25303. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  25304. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  25305. { NULL, NULL }
  25306. };
  25307. const struct oid_dict* idx;
  25308. for (idx = oid_dict; idx->num != NULL; idx++) {
  25309. if (!XSTRCMP(oid, idx->num)) {
  25310. return idx->desc;
  25311. }
  25312. }
  25313. return NULL;
  25314. }
  25315. static int wolfssl_obj2txt_numeric(char *buf, int bufLen,
  25316. const WOLFSSL_ASN1_OBJECT *a)
  25317. {
  25318. int bufSz;
  25319. int length;
  25320. word32 idx = 0;
  25321. byte tag;
  25322. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  25323. return WOLFSSL_FAILURE;
  25324. }
  25325. if (tag != ASN_OBJECT_ID) {
  25326. WOLFSSL_MSG("Bad ASN1 Object");
  25327. return WOLFSSL_FAILURE;
  25328. }
  25329. if (GetLength((const byte*)a->obj, &idx, &length,
  25330. a->objSz) < 0 || length < 0) {
  25331. return ASN_PARSE_E;
  25332. }
  25333. if (bufLen < MAX_OID_STRING_SZ) {
  25334. bufSz = bufLen - 1;
  25335. }
  25336. else {
  25337. bufSz = MAX_OID_STRING_SZ;
  25338. }
  25339. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  25340. (word32)length)) <= 0) {
  25341. WOLFSSL_MSG("Error decoding OID");
  25342. return WOLFSSL_FAILURE;
  25343. }
  25344. buf[bufSz] = '\0';
  25345. return bufSz;
  25346. }
  25347. /* If no_name is one then use numerical form, otherwise short name.
  25348. *
  25349. * Returns the buffer size on success, WOLFSSL_FAILURE on error
  25350. */
  25351. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, const WOLFSSL_ASN1_OBJECT *a,
  25352. int no_name)
  25353. {
  25354. int bufSz;
  25355. const char* desc;
  25356. const char* name;
  25357. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  25358. if (buf == NULL || bufLen <= 1 || a == NULL) {
  25359. WOLFSSL_MSG("Bad input argument");
  25360. return WOLFSSL_FAILURE;
  25361. }
  25362. if (no_name == 1) {
  25363. return wolfssl_obj2txt_numeric(buf, bufLen, a);
  25364. }
  25365. /* return long name unless using x509small, then return short name */
  25366. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  25367. name = a->sName;
  25368. #else
  25369. name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  25370. #endif
  25371. if (name == NULL) {
  25372. WOLFSSL_MSG("Name not found");
  25373. bufSz = 0;
  25374. }
  25375. else if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  25376. bufSz = (int)XSTRLEN(name);
  25377. }
  25378. else {
  25379. bufSz = bufLen - 1;
  25380. }
  25381. if (bufSz) {
  25382. XMEMCPY(buf, name, bufSz);
  25383. }
  25384. else if (a->type == GEN_DNS || a->type == GEN_EMAIL ||
  25385. a->type == GEN_URI) {
  25386. bufSz = (int)XSTRLEN((const char*)a->obj);
  25387. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  25388. }
  25389. else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) {
  25390. if ((desc = oid_translate_num_to_str(buf))) {
  25391. bufSz = (int)XSTRLEN(desc);
  25392. bufSz = min(bufSz, bufLen - 1);
  25393. XMEMCPY(buf, desc, bufSz);
  25394. }
  25395. }
  25396. buf[bufSz] = '\0';
  25397. return bufSz;
  25398. }
  25399. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  25400. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  25401. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  25402. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  25403. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS_SMALL)
  25404. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  25405. * n : NID value of ASN1_OBJECT to search */
  25406. const char* wolfSSL_OBJ_nid2ln(int n)
  25407. {
  25408. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  25409. size_t i;
  25410. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  25411. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  25412. if (obj_info->nid == n) {
  25413. return obj_info->lName;
  25414. }
  25415. }
  25416. WOLFSSL_MSG("NID not found in table");
  25417. return NULL;
  25418. }
  25419. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  25420. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY, WOLFSSL_WPAS_SMALL */
  25421. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  25422. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  25423. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  25424. defined(WOLFSSL_HAPROXY)
  25425. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  25426. {
  25427. int ret;
  25428. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  25429. if (!ctx || !x || !x->derCert) {
  25430. WOLFSSL_MSG("Bad parameter");
  25431. return WOLFSSL_FAILURE;
  25432. }
  25433. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  25434. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  25435. ctx->heap);
  25436. if (ret != 0)
  25437. return WOLFSSL_FAILURE;
  25438. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  25439. x->derCert->length);
  25440. #ifdef KEEP_OUR_CERT
  25441. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  25442. wolfSSL_X509_free(ctx->ourCert);
  25443. }
  25444. #ifndef WOLFSSL_X509_STORE_CERTS
  25445. ctx->ourCert = x;
  25446. if (wolfSSL_X509_up_ref(x) != 1) {
  25447. return WOLFSSL_FAILURE;
  25448. }
  25449. #else
  25450. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  25451. if(ctx->ourCert == NULL){
  25452. return WOLFSSL_FAILURE;
  25453. }
  25454. #endif
  25455. /* We own the cert because either we up its reference counter
  25456. * or we create our own copy of the cert object. */
  25457. ctx->ownOurCert = 1;
  25458. #endif
  25459. /* Update the available options with public keys. */
  25460. switch (x->pubKeyOID) {
  25461. #ifndef NO_RSA
  25462. #ifdef WC_RSA_PSS
  25463. case RSAPSSk:
  25464. #endif
  25465. case RSAk:
  25466. ctx->haveRSA = 1;
  25467. break;
  25468. #endif
  25469. #ifdef HAVE_ED25519
  25470. case ED25519k:
  25471. #endif
  25472. #ifdef HAVE_ED448
  25473. case ED448k:
  25474. #endif
  25475. case ECDSAk:
  25476. ctx->haveECC = 1;
  25477. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  25478. ctx->pkCurveOID = x->pkCurveOID;
  25479. #endif
  25480. break;
  25481. }
  25482. return WOLFSSL_SUCCESS;
  25483. }
  25484. static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn,
  25485. byte* cert, word32 certSz, void* heap)
  25486. {
  25487. int ret;
  25488. DerBuffer* inChain = NULL;
  25489. DerBuffer* der = NULL;
  25490. word32 len = 0;
  25491. if (inOutDer == NULL)
  25492. return BAD_FUNC_ARG;
  25493. inChain = *inOutDer;
  25494. if (inChain != NULL)
  25495. len = inChain->length;
  25496. ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE,
  25497. heap);
  25498. if (ret != 0) {
  25499. WOLFSSL_MSG("AllocDer error");
  25500. return ret;
  25501. }
  25502. if (inChain != NULL)
  25503. XMEMCPY(der->buffer, inChain->buffer, len);
  25504. c32to24(certSz, der->buffer + len);
  25505. XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz);
  25506. if (weOwn)
  25507. FreeDer(inOutDer);
  25508. *inOutDer = der;
  25509. return WOLFSSL_SUCCESS;
  25510. }
  25511. /**
  25512. * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it
  25513. * on success
  25514. */
  25515. int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  25516. {
  25517. WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert");
  25518. if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) {
  25519. return WOLFSSL_FAILURE;
  25520. }
  25521. wolfSSL_X509_free(x509);
  25522. return WOLFSSL_SUCCESS;
  25523. }
  25524. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  25525. {
  25526. int ret;
  25527. WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert");
  25528. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  25529. return WOLFSSL_FAILURE;
  25530. }
  25531. if (ctx->certificate == NULL)
  25532. ret = (int)wolfSSL_CTX_use_certificate(ctx, x509);
  25533. else {
  25534. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  25535. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  25536. return WOLFSSL_FAILURE;
  25537. }
  25538. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  25539. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  25540. if (ret == WOLFSSL_SUCCESS) {
  25541. /* push to ctx->certChain */
  25542. ret = PushCertToDerBuffer(&ctx->certChain, 1,
  25543. x509->derCert->buffer, x509->derCert->length, ctx->heap);
  25544. }
  25545. /* Store cert to free it later */
  25546. if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) {
  25547. ctx->x509Chain = wolfSSL_sk_X509_new();
  25548. if (ctx->x509Chain == NULL) {
  25549. WOLFSSL_MSG("wolfSSL_sk_X509_new error");
  25550. ret = WOLFSSL_FAILURE;
  25551. }
  25552. }
  25553. if (ret == WOLFSSL_SUCCESS &&
  25554. wolfSSL_sk_X509_push(ctx->x509Chain, x509)
  25555. != WOLFSSL_SUCCESS) {
  25556. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  25557. ret = WOLFSSL_FAILURE;
  25558. }
  25559. if (ret != WOLFSSL_SUCCESS)
  25560. wolfSSL_X509_free(x509); /* Decrease ref counter */
  25561. }
  25562. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  25563. }
  25564. #ifdef KEEP_OUR_CERT
  25565. int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  25566. {
  25567. int ret;
  25568. WOLFSSL_ENTER("wolfSSL_add0_chain_cert");
  25569. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  25570. x509->derCert == NULL)
  25571. return WOLFSSL_FAILURE;
  25572. if (ssl->buffers.certificate == NULL) {
  25573. ret = wolfSSL_use_certificate(ssl, x509);
  25574. /* Store cert to free it later */
  25575. if (ret == WOLFSSL_SUCCESS) {
  25576. if (ssl->buffers.weOwnCert)
  25577. wolfSSL_X509_free(ssl->ourCert);
  25578. ssl->ourCert = x509;
  25579. ssl->buffers.weOwnCert = 1;
  25580. }
  25581. }
  25582. else {
  25583. ret = PushCertToDerBuffer(&ssl->buffers.certChain,
  25584. ssl->buffers.weOwnCertChain, x509->derCert->buffer,
  25585. x509->derCert->length, ssl->heap);
  25586. if (ret == WOLFSSL_SUCCESS) {
  25587. ssl->buffers.weOwnCertChain = 1;
  25588. /* Store cert to free it later */
  25589. if (ssl->ourCertChain == NULL) {
  25590. ssl->ourCertChain = wolfSSL_sk_X509_new();
  25591. if (ssl->ourCertChain == NULL) {
  25592. WOLFSSL_MSG("wolfSSL_sk_X509_new error");
  25593. return WOLFSSL_FAILURE;
  25594. }
  25595. }
  25596. if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509)
  25597. != WOLFSSL_SUCCESS) {
  25598. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  25599. return WOLFSSL_FAILURE;
  25600. }
  25601. }
  25602. }
  25603. return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  25604. }
  25605. int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  25606. {
  25607. int ret;
  25608. WOLFSSL_ENTER("wolfSSL_add1_chain_cert");
  25609. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  25610. x509->derCert == NULL)
  25611. return WOLFSSL_FAILURE;
  25612. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  25613. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  25614. return WOLFSSL_FAILURE;
  25615. }
  25616. ret = wolfSSL_add0_chain_cert(ssl, x509);
  25617. /* Decrease ref counter on error */
  25618. if (ret != WOLFSSL_SUCCESS)
  25619. wolfSSL_X509_free(x509);
  25620. return ret;
  25621. }
  25622. #endif
  25623. /* Return the corresponding short name for the nid <n>.
  25624. * or NULL if short name can't be found.
  25625. */
  25626. const char * wolfSSL_OBJ_nid2sn(int n) {
  25627. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  25628. size_t i;
  25629. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  25630. if (n == NID_md5) {
  25631. /* NID_surname == NID_md5 and NID_surname comes before NID_md5 in
  25632. * wolfssl_object_info. As a result, the loop below will incorrectly
  25633. * return "SN" instead of "MD5." NID_surname isn't the true OpenSSL
  25634. * NID, but other functions rely on this table and modifying it to
  25635. * conform with OpenSSL's NIDs isn't trivial. */
  25636. return "MD5";
  25637. }
  25638. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  25639. if (obj_info->nid == n) {
  25640. return obj_info->sName;
  25641. }
  25642. }
  25643. WOLFSSL_MSG("SN not found");
  25644. return NULL;
  25645. }
  25646. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  25647. int wolfSSL_OBJ_sn2nid(const char *sn) {
  25648. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  25649. if (sn == NULL)
  25650. return NID_undef;
  25651. return wc_OBJ_sn2nid(sn);
  25652. }
  25653. #endif
  25654. size_t wolfSSL_OBJ_length(const WOLFSSL_ASN1_OBJECT* o)
  25655. {
  25656. size_t ret = 0;
  25657. int err = 0;
  25658. word32 idx = 0;
  25659. int len = 0;
  25660. WOLFSSL_ENTER("wolfSSL_OBJ_length");
  25661. if (o == NULL || o->obj == NULL) {
  25662. WOLFSSL_MSG("Bad argument.");
  25663. err = 1;
  25664. }
  25665. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  25666. WOLFSSL_MSG("Error parsing ASN.1 header.");
  25667. err = 1;
  25668. }
  25669. if (err == 0) {
  25670. ret = len;
  25671. }
  25672. WOLFSSL_LEAVE("wolfSSL_OBJ_length", (int)ret);
  25673. return ret;
  25674. }
  25675. const unsigned char* wolfSSL_OBJ_get0_data(const WOLFSSL_ASN1_OBJECT* o)
  25676. {
  25677. const unsigned char* ret = NULL;
  25678. int err = 0;
  25679. word32 idx = 0;
  25680. int len = 0;
  25681. WOLFSSL_ENTER("wolfSSL_OBJ_get0_data");
  25682. if (o == NULL || o->obj == NULL) {
  25683. WOLFSSL_MSG("Bad argument.");
  25684. err = 1;
  25685. }
  25686. if (err == 0 && GetASNObjectId(o->obj, &idx, &len, o->objSz)) {
  25687. WOLFSSL_MSG("Error parsing ASN.1 header.");
  25688. err = 1;
  25689. }
  25690. if (err == 0) {
  25691. ret = o->obj + idx;
  25692. }
  25693. return ret;
  25694. }
  25695. /* Gets the NID value that corresponds with the ASN1 object.
  25696. *
  25697. * o ASN1 object to get NID of
  25698. *
  25699. * Return NID on success and a negative value on failure
  25700. */
  25701. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  25702. {
  25703. word32 oid = 0;
  25704. word32 idx = 0;
  25705. int ret;
  25706. #ifdef WOLFSSL_DEBUG_OPENSSL
  25707. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  25708. #endif
  25709. if (o == NULL) {
  25710. return -1;
  25711. }
  25712. #ifdef WOLFSSL_QT
  25713. if (o->grp == oidCertExtType) {
  25714. /* If nid is an unknown extension, return NID_undef */
  25715. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  25716. return NID_undef;
  25717. }
  25718. #endif
  25719. if (o->nid > 0)
  25720. return o->nid;
  25721. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  25722. if (ret == ASN_OBJECT_ID_E) {
  25723. /* Put ASN object tag in front and try again */
  25724. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  25725. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25726. if (!buf) {
  25727. WOLFSSL_MSG("malloc error");
  25728. return -1;
  25729. }
  25730. idx = SetObjectId(o->objSz, buf);
  25731. XMEMCPY(buf + idx, o->obj, o->objSz);
  25732. idx = 0;
  25733. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  25734. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25735. if (ret < 0) {
  25736. WOLFSSL_MSG("Issue getting OID of object");
  25737. return -1;
  25738. }
  25739. }
  25740. else {
  25741. WOLFSSL_MSG("Issue getting OID of object");
  25742. return -1;
  25743. }
  25744. }
  25745. return oid2nid(oid, o->grp);
  25746. }
  25747. /* Return the corresponding NID for the long name <ln>
  25748. * or NID_undef if NID can't be found.
  25749. */
  25750. int wolfSSL_OBJ_ln2nid(const char *ln)
  25751. {
  25752. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  25753. size_t i, lnlen;
  25754. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  25755. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  25756. /* Accept input like "/commonName=" */
  25757. if (ln[0] == '/') {
  25758. ln++;
  25759. lnlen--;
  25760. }
  25761. if (lnlen) {
  25762. if (ln[lnlen-1] == '=') {
  25763. lnlen--;
  25764. }
  25765. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  25766. if (lnlen == XSTRLEN(obj_info->lName) &&
  25767. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  25768. return obj_info->nid;
  25769. }
  25770. }
  25771. }
  25772. }
  25773. return NID_undef;
  25774. }
  25775. /* compares two objects, return 0 if equal */
  25776. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  25777. const WOLFSSL_ASN1_OBJECT* b)
  25778. {
  25779. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  25780. if (a && b && a->obj && b->obj) {
  25781. if (a->objSz == b->objSz) {
  25782. return XMEMCMP(a->obj, b->obj, a->objSz);
  25783. }
  25784. else if (a->type == EXT_KEY_USAGE_OID ||
  25785. b->type == EXT_KEY_USAGE_OID) {
  25786. /* Special case for EXT_KEY_USAGE_OID so that
  25787. * cmp will be treated as a substring search */
  25788. /* Used in libest to check for id-kp-cmcRA in
  25789. * EXT_KEY_USAGE extension */
  25790. unsigned int idx;
  25791. const byte* s; /* shorter */
  25792. unsigned int sLen;
  25793. const byte* l; /* longer */
  25794. unsigned int lLen;
  25795. if (a->objSz > b->objSz) {
  25796. s = b->obj; sLen = b->objSz;
  25797. l = a->obj; lLen = a->objSz;
  25798. }
  25799. else {
  25800. s = a->obj; sLen = a->objSz;
  25801. l = b->obj; lLen = b->objSz;
  25802. }
  25803. for (idx = 0; idx <= lLen - sLen; idx++) {
  25804. if (XMEMCMP(l + idx, s, sLen) == 0) {
  25805. /* Found substring */
  25806. return 0;
  25807. }
  25808. }
  25809. }
  25810. }
  25811. return WOLFSSL_FATAL_ERROR;
  25812. }
  25813. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  25814. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  25815. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  25816. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  25817. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  25818. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  25819. /* Gets the NID value that is related to the OID string passed in. Example
  25820. * string would be "2.5.29.14" for subject key ID.
  25821. *
  25822. * returns NID value on success and NID_undef on error
  25823. */
  25824. int wolfSSL_OBJ_txt2nid(const char* s)
  25825. {
  25826. unsigned int i;
  25827. #ifdef WOLFSSL_CERT_EXT
  25828. int ret;
  25829. unsigned int sum = 0;
  25830. unsigned int outSz = MAX_OID_SZ;
  25831. unsigned char out[MAX_OID_SZ];
  25832. #endif
  25833. WOLFSSL_ENTER("OBJ_txt2nid");
  25834. if (s == NULL) {
  25835. return NID_undef;
  25836. }
  25837. #ifdef WOLFSSL_CERT_EXT
  25838. ret = EncodePolicyOID(out, &outSz, s, NULL);
  25839. if (ret == 0) {
  25840. /* sum OID */
  25841. for (i = 0; i < outSz; i++) {
  25842. sum += out[i];
  25843. }
  25844. }
  25845. #endif /* WOLFSSL_CERT_EXT */
  25846. /* get the group that the OID's sum is in
  25847. * @TODO possible conflict with multiples */
  25848. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  25849. int len;
  25850. #ifdef WOLFSSL_CERT_EXT
  25851. if (ret == 0) {
  25852. if (wolfssl_object_info[i].id == (int)sum) {
  25853. return wolfssl_object_info[i].nid;
  25854. }
  25855. }
  25856. #endif
  25857. /* try as a short name */
  25858. len = (int)XSTRLEN(s);
  25859. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  25860. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  25861. return wolfssl_object_info[i].nid;
  25862. }
  25863. /* try as a long name */
  25864. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  25865. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  25866. return wolfssl_object_info[i].nid;
  25867. }
  25868. }
  25869. return NID_undef;
  25870. }
  25871. #endif
  25872. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  25873. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  25874. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  25875. defined(WOLFSSL_HAPROXY)
  25876. /* Creates new ASN1_OBJECT from short name, long name, or text
  25877. * representation of oid. If no_name is 0, then short name, long name, and
  25878. * numerical value of oid are interpreted. If no_name is 1, then only the
  25879. * numerical value of the oid is interpreted.
  25880. *
  25881. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  25882. */
  25883. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  25884. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  25885. {
  25886. int i, ret;
  25887. int nid = NID_undef;
  25888. unsigned int outSz = MAX_OID_SZ;
  25889. unsigned char out[MAX_OID_SZ];
  25890. WOLFSSL_ASN1_OBJECT* obj;
  25891. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  25892. if (s == NULL)
  25893. return NULL;
  25894. /* If s is numerical value, try to sum oid */
  25895. ret = EncodePolicyOID(out, &outSz, s, NULL);
  25896. if (ret == 0 && outSz > 0) {
  25897. /* If numerical encode succeeded then just
  25898. * create object from that because sums are
  25899. * not unique and can cause confusion. */
  25900. obj = wolfSSL_ASN1_OBJECT_new();
  25901. if (obj == NULL) {
  25902. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  25903. return NULL;
  25904. }
  25905. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  25906. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  25907. DYNAMIC_TYPE_ASN1);
  25908. if (obj->obj == NULL) {
  25909. wolfSSL_ASN1_OBJECT_free(obj);
  25910. return NULL;
  25911. }
  25912. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  25913. i = SetObjectId(outSz, (byte*)obj->obj);
  25914. XMEMCPY((byte*)obj->obj + i, out, outSz);
  25915. obj->objSz = i + outSz;
  25916. return obj;
  25917. }
  25918. /* TODO: update short names in wolfssl_object_info and check OID sums
  25919. are correct */
  25920. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  25921. /* Short name, long name, and numerical value are interpreted */
  25922. if (no_name == 0 &&
  25923. ((XSTRCMP(s, wolfssl_object_info[i].sName) == 0) ||
  25924. (XSTRCMP(s, wolfssl_object_info[i].lName) == 0)))
  25925. {
  25926. nid = wolfssl_object_info[i].nid;
  25927. }
  25928. }
  25929. if (nid != NID_undef)
  25930. return wolfSSL_OBJ_nid2obj(nid);
  25931. return NULL;
  25932. }
  25933. #endif
  25934. /* compatibility function. Its intended use is to remove OID's from an
  25935. * internal table that have been added with OBJ_create. wolfSSL manages its
  25936. * own internal OID values and does not currently support OBJ_create. */
  25937. void wolfSSL_OBJ_cleanup(void)
  25938. {
  25939. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  25940. }
  25941. #ifndef NO_WOLFSSL_STUB
  25942. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  25943. {
  25944. (void)oid;
  25945. (void)sn;
  25946. (void)ln;
  25947. WOLFSSL_STUB("wolfSSL_OBJ_create");
  25948. return WOLFSSL_FAILURE;
  25949. }
  25950. #endif
  25951. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  25952. {
  25953. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  25954. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  25955. ssl->options.verifyDepth = (byte)depth;
  25956. #endif
  25957. }
  25958. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  25959. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  25960. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  25961. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  25962. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  25963. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  25964. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
  25965. {
  25966. WOLFSSL_ASN1_OBJECT* obj = NULL;
  25967. #ifdef WOLFSSL_DEBUG_OPENSSL
  25968. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  25969. #endif
  25970. if (ne == NULL) return NULL;
  25971. obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
  25972. if (obj != NULL) {
  25973. obj->nid = ne->nid;
  25974. return obj;
  25975. }
  25976. return NULL;
  25977. }
  25978. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  25979. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  25980. #ifdef OPENSSL_EXTRA
  25981. /* wolfSSL uses negative values for error states. This function returns an
  25982. * unsigned type so the value returned is the absolute value of the error.
  25983. */
  25984. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  25985. {
  25986. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  25987. (void)line;
  25988. (void)file;
  25989. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  25990. {
  25991. int ret;
  25992. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  25993. WOLFSSL_MSG("Issue peeking at error node in queue");
  25994. return 0;
  25995. }
  25996. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  25997. if (ret == -ASN_NO_PEM_HEADER)
  25998. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  25999. #endif
  26000. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  26001. if (ret == ASN1_R_HEADER_TOO_LONG) {
  26002. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  26003. }
  26004. #endif
  26005. return (unsigned long)ret;
  26006. }
  26007. #else
  26008. return (unsigned long)(0 - NOT_COMPILED_IN);
  26009. #endif
  26010. }
  26011. #ifndef NO_CERTS
  26012. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  26013. {
  26014. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  26015. if (ctx == NULL || pkey == NULL) {
  26016. return WOLFSSL_FAILURE;
  26017. }
  26018. switch (pkey->type) {
  26019. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && !defined(NO_RSA)
  26020. case EVP_PKEY_RSA:
  26021. WOLFSSL_MSG("populating RSA key");
  26022. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS)
  26023. return WOLFSSL_FAILURE;
  26024. break;
  26025. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  26026. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  26027. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  26028. case EVP_PKEY_DSA:
  26029. break;
  26030. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  26031. #ifdef HAVE_ECC
  26032. case EVP_PKEY_EC:
  26033. WOLFSSL_MSG("populating ECC key");
  26034. if (ECC_populate_EVP_PKEY(pkey, pkey->ecc)
  26035. != WOLFSSL_SUCCESS)
  26036. return WOLFSSL_FAILURE;
  26037. break;
  26038. #endif
  26039. default:
  26040. return WOLFSSL_FAILURE;
  26041. }
  26042. if (pkey->pkey.ptr != NULL) {
  26043. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  26044. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  26045. (const unsigned char*)pkey->pkey.ptr,
  26046. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  26047. }
  26048. WOLFSSL_MSG("wolfSSL private key not set");
  26049. return BAD_FUNC_ARG;
  26050. }
  26051. #endif /* !NO_CERTS */
  26052. #endif /* OPENSSL_EXTRA */
  26053. #if defined(HAVE_EX_DATA) && \
  26054. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  26055. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  26056. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  26057. defined(WOLFSSL_WPAS_SMALL)
  26058. /**
  26059. * get_ex_new_index is a helper function for the following
  26060. * xx_get_ex_new_index functions:
  26061. * - wolfSSL_CRYPTO_get_ex_new_index
  26062. * - wolfSSL_CTX_get_ex_new_index
  26063. * - wolfSSL_get_ex_new_index
  26064. * Issues a unique index number for the specified class-index.
  26065. * Returns an index number greater or equal to zero on success,
  26066. * -1 on failure.
  26067. */
  26068. int wolfssl_get_ex_new_index(int class_index)
  26069. {
  26070. /* index counter for each class index*/
  26071. static int ctx_idx = 0;
  26072. static int ssl_idx = 0;
  26073. static int ssl_session_idx = 0;
  26074. static int x509_idx = 0;
  26075. int idx = -1;
  26076. switch(class_index) {
  26077. case WOLF_CRYPTO_EX_INDEX_SSL:
  26078. idx = ssl_idx++;
  26079. break;
  26080. case WOLF_CRYPTO_EX_INDEX_SSL_CTX:
  26081. idx = ctx_idx++;
  26082. break;
  26083. case WOLF_CRYPTO_EX_INDEX_X509:
  26084. idx = x509_idx++;
  26085. break;
  26086. case WOLF_CRYPTO_EX_INDEX_SSL_SESSION:
  26087. idx = ssl_session_idx++;
  26088. break;
  26089. /* following class indexes are not supoprted */
  26090. case WOLF_CRYPTO_EX_INDEX_X509_STORE:
  26091. case WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX:
  26092. case WOLF_CRYPTO_EX_INDEX_DH:
  26093. case WOLF_CRYPTO_EX_INDEX_DSA:
  26094. case WOLF_CRYPTO_EX_INDEX_EC_KEY:
  26095. case WOLF_CRYPTO_EX_INDEX_RSA:
  26096. case WOLF_CRYPTO_EX_INDEX_ENGINE:
  26097. case WOLF_CRYPTO_EX_INDEX_UI:
  26098. case WOLF_CRYPTO_EX_INDEX_BIO:
  26099. case WOLF_CRYPTO_EX_INDEX_APP:
  26100. case WOLF_CRYPTO_EX_INDEX_UI_METHOD:
  26101. case WOLF_CRYPTO_EX_INDEX_DRBG:
  26102. default:
  26103. break;
  26104. }
  26105. return idx;
  26106. }
  26107. #endif /* HAVE_EX_DATA || WOLFSSL_WPAS_SMALL */
  26108. #if defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL)
  26109. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  26110. {
  26111. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  26112. #ifdef HAVE_EX_DATA
  26113. if(ctx != NULL) {
  26114. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  26115. }
  26116. #else
  26117. (void)ctx;
  26118. (void)idx;
  26119. #endif
  26120. return NULL;
  26121. }
  26122. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  26123. void* c)
  26124. {
  26125. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  26126. (void)idx;
  26127. (void)arg;
  26128. (void)a;
  26129. (void)b;
  26130. (void)c;
  26131. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX);
  26132. }
  26133. /* Return the index that can be used for the WOLFSSL structure to store
  26134. * application data.
  26135. *
  26136. */
  26137. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  26138. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  26139. WOLFSSL_CRYPTO_EX_free* cb3)
  26140. {
  26141. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  26142. (void)argValue;
  26143. (void)arg;
  26144. (void)cb1;
  26145. (void)cb2;
  26146. (void)cb3;
  26147. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL);
  26148. }
  26149. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  26150. {
  26151. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  26152. #ifdef HAVE_EX_DATA
  26153. if (ctx != NULL)
  26154. {
  26155. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  26156. }
  26157. #else
  26158. (void)ctx;
  26159. (void)idx;
  26160. (void)data;
  26161. #endif
  26162. return WOLFSSL_FAILURE;
  26163. }
  26164. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  26165. int wolfSSL_CTX_set_ex_data_with_cleanup(
  26166. WOLFSSL_CTX* ctx,
  26167. int idx,
  26168. void* data,
  26169. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  26170. {
  26171. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data_with_cleanup");
  26172. if (ctx != NULL)
  26173. {
  26174. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  26175. cleanup_routine);
  26176. }
  26177. return WOLFSSL_FAILURE;
  26178. }
  26179. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  26180. #endif /* defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL) */
  26181. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  26182. /* Returns char* to app data stored in ex[0].
  26183. *
  26184. * ssl WOLFSSL structure to get app data from
  26185. */
  26186. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  26187. {
  26188. /* checkout exdata stuff... */
  26189. WOLFSSL_ENTER("wolfSSL_get_app_data");
  26190. return wolfSSL_get_ex_data(ssl, 0);
  26191. }
  26192. /* Set ex array 0 to have app data
  26193. *
  26194. * ssl WOLFSSL struct to set app data in
  26195. * arg data to be stored
  26196. *
  26197. * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
  26198. */
  26199. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  26200. WOLFSSL_ENTER("wolfSSL_set_app_data");
  26201. return wolfSSL_set_ex_data(ssl, 0, arg);
  26202. }
  26203. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  26204. #if defined(HAVE_EX_DATA) || defined(OPENSSL_EXTRA) || \
  26205. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  26206. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  26207. {
  26208. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  26209. #ifdef HAVE_EX_DATA
  26210. if (ssl != NULL)
  26211. {
  26212. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  26213. }
  26214. #else
  26215. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  26216. (void)ssl;
  26217. (void)idx;
  26218. (void)data;
  26219. #endif
  26220. return WOLFSSL_FAILURE;
  26221. }
  26222. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  26223. int wolfSSL_set_ex_data_with_cleanup(
  26224. WOLFSSL* ssl,
  26225. int idx,
  26226. void* data,
  26227. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  26228. {
  26229. WOLFSSL_ENTER("wolfSSL_set_ex_data_with_cleanup");
  26230. if (ssl != NULL)
  26231. {
  26232. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ssl->ex_data, idx, data,
  26233. cleanup_routine);
  26234. }
  26235. return WOLFSSL_FAILURE;
  26236. }
  26237. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  26238. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  26239. {
  26240. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  26241. #ifdef HAVE_EX_DATA
  26242. if (ssl != NULL) {
  26243. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  26244. }
  26245. #else
  26246. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  26247. (void)ssl;
  26248. (void)idx;
  26249. #endif
  26250. return 0;
  26251. }
  26252. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  26253. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  26254. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  26255. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  26256. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  26257. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  26258. {
  26259. int pSz, gSz;
  26260. byte *p, *g;
  26261. int ret=0;
  26262. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  26263. if(!ctx || !dh)
  26264. return BAD_FUNC_ARG;
  26265. /* Get needed size for p and g */
  26266. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  26267. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  26268. if(pSz <= 0 || gSz <= 0)
  26269. return WOLFSSL_FATAL_ERROR;
  26270. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26271. if(!p)
  26272. return MEMORY_E;
  26273. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26274. if(!g) {
  26275. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26276. return MEMORY_E;
  26277. }
  26278. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  26279. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  26280. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  26281. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  26282. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26283. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26284. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  26285. }
  26286. #endif /* OPENSSL_EXTRA && !NO_DH */
  26287. /* returns the enum value associated with handshake state
  26288. *
  26289. * ssl the WOLFSSL structure to get state of
  26290. */
  26291. int wolfSSL_get_state(const WOLFSSL* ssl)
  26292. {
  26293. WOLFSSL_ENTER("wolfSSL_get_state");
  26294. if (ssl == NULL) {
  26295. WOLFSSL_MSG("Null argument passed in");
  26296. return SSL_FAILURE;
  26297. }
  26298. return ssl->options.handShakeState;
  26299. }
  26300. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  26301. #ifdef OPENSSL_EXTRA
  26302. void wolfSSL_certs_clear(WOLFSSL* ssl)
  26303. {
  26304. WOLFSSL_ENTER("wolfSSL_certs_clear()");
  26305. if (ssl == NULL)
  26306. return;
  26307. /* ctx still owns certificate, certChain, key, dh, and cm */
  26308. if (ssl->buffers.weOwnCert)
  26309. FreeDer(&ssl->buffers.certificate);
  26310. ssl->buffers.certificate = NULL;
  26311. if (ssl->buffers.weOwnCertChain)
  26312. FreeDer(&ssl->buffers.certChain);
  26313. ssl->buffers.certChain = NULL;
  26314. #ifdef WOLFSSL_TLS13
  26315. ssl->buffers.certChainCnt = 0;
  26316. #endif
  26317. if (ssl->buffers.weOwnKey)
  26318. FreeDer(&ssl->buffers.key);
  26319. ssl->buffers.key = NULL;
  26320. ssl->buffers.keyType = 0;
  26321. ssl->buffers.keyId = 0;
  26322. ssl->buffers.keyLabel = 0;
  26323. ssl->buffers.keySz = 0;
  26324. ssl->buffers.keyDevId = 0;
  26325. }
  26326. #endif
  26327. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  26328. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  26329. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  26330. {
  26331. WOLFSSL_ENTER("wolfSSL_ctrl");
  26332. if (ssl == NULL)
  26333. return BAD_FUNC_ARG;
  26334. switch (cmd) {
  26335. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  26336. #ifdef HAVE_SNI
  26337. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  26338. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  26339. if (pt == NULL) {
  26340. WOLFSSL_MSG("Passed in NULL Host Name.");
  26341. break;
  26342. }
  26343. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  26344. #endif /* HAVE_SNI */
  26345. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  26346. default:
  26347. WOLFSSL_MSG("Case not implemented.");
  26348. }
  26349. (void)opt;
  26350. (void)pt;
  26351. return WOLFSSL_FAILURE;
  26352. }
  26353. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  26354. {
  26355. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  26356. long ctrl_opt;
  26357. #endif
  26358. long ret = WOLFSSL_SUCCESS;
  26359. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  26360. if (ctx == NULL)
  26361. return WOLFSSL_FAILURE;
  26362. switch (cmd) {
  26363. case SSL_CTRL_CHAIN:
  26364. #ifdef SESSION_CERTS
  26365. {
  26366. /*
  26367. * We don't care about opt here because a copy of the certificate is
  26368. * stored anyway so increasing the reference counter is not necessary.
  26369. * Just check to make sure that it is set to one of the correct values.
  26370. */
  26371. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  26372. WOLFSSL_X509* x509;
  26373. int i;
  26374. if (opt != 0 && opt != 1) {
  26375. ret = WOLFSSL_FAILURE;
  26376. break;
  26377. }
  26378. /* Clear certificate chain */
  26379. FreeDer(&ctx->certChain);
  26380. if (sk) {
  26381. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  26382. x509 = wolfSSL_sk_X509_value(sk, i);
  26383. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  26384. if (wolfSSL_X509_up_ref(x509) != 1) {
  26385. WOLFSSL_MSG("Error increasing reference count");
  26386. continue;
  26387. }
  26388. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  26389. WOLFSSL_SUCCESS) {
  26390. WOLFSSL_MSG("Error adding certificate to context");
  26391. /* Decrease reference count on failure */
  26392. wolfSSL_X509_free(x509);
  26393. }
  26394. }
  26395. }
  26396. /* Free previous chain */
  26397. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  26398. ctx->x509Chain = sk;
  26399. if (sk && opt == 1) {
  26400. /* up all refs when opt == 1 */
  26401. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  26402. x509 = wolfSSL_sk_X509_value(sk, i);
  26403. if (wolfSSL_X509_up_ref(x509) != 1) {
  26404. WOLFSSL_MSG("Error increasing reference count");
  26405. continue;
  26406. }
  26407. }
  26408. }
  26409. }
  26410. #else
  26411. WOLFSSL_MSG("Session certificates not compiled in");
  26412. ret = WOLFSSL_FAILURE;
  26413. #endif
  26414. break;
  26415. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  26416. case SSL_CTRL_OPTIONS:
  26417. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  26418. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  26419. #ifdef WOLFSSL_QT
  26420. /* Set whether to use client or server cipher preference */
  26421. if ((ctrl_opt & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE)
  26422. == WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  26423. WOLFSSL_MSG("Using Server's Cipher Preference.");
  26424. ctx->useClientOrder = FALSE;
  26425. } else {
  26426. WOLFSSL_MSG("Using Client's Cipher Preference.");
  26427. ctx->useClientOrder = TRUE;
  26428. }
  26429. #endif /* WOLFSSL_QT */
  26430. return ctrl_opt;
  26431. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  26432. case SSL_CTRL_EXTRA_CHAIN_CERT:
  26433. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  26434. if (pt == NULL) {
  26435. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  26436. ret = WOLFSSL_FAILURE;
  26437. break;
  26438. }
  26439. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  26440. #ifndef NO_DH
  26441. case SSL_CTRL_SET_TMP_DH:
  26442. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  26443. if (pt == NULL) {
  26444. WOLFSSL_MSG("Passed in DH pointer NULL.");
  26445. ret = WOLFSSL_FAILURE;
  26446. break;
  26447. }
  26448. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  26449. #endif
  26450. #ifdef HAVE_ECC
  26451. case SSL_CTRL_SET_TMP_ECDH:
  26452. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  26453. if (pt == NULL) {
  26454. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  26455. ret = WOLFSSL_FAILURE;
  26456. break;
  26457. }
  26458. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  26459. #endif
  26460. case SSL_CTRL_MODE:
  26461. wolfSSL_CTX_set_mode(ctx,opt);
  26462. break;
  26463. case SSL_CTRL_SET_MIN_PROTO_VERSION:
  26464. WOLFSSL_MSG("set min proto version");
  26465. return wolfSSL_CTX_set_min_proto_version(ctx, (int)opt);
  26466. case SSL_CTRL_SET_MAX_PROTO_VERSION:
  26467. WOLFSSL_MSG("set max proto version");
  26468. return wolfSSL_CTX_set_max_proto_version(ctx, (int)opt);
  26469. case SSL_CTRL_GET_MIN_PROTO_VERSION:
  26470. WOLFSSL_MSG("get min proto version");
  26471. return wolfSSL_CTX_get_min_proto_version(ctx);
  26472. case SSL_CTRL_GET_MAX_PROTO_VERSION:
  26473. WOLFSSL_MSG("get max proto version");
  26474. return wolfSSL_CTX_get_max_proto_version(ctx);
  26475. default:
  26476. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  26477. ret = WOLFSSL_FAILURE;
  26478. break;
  26479. }
  26480. (void)ctx;
  26481. (void)cmd;
  26482. (void)opt;
  26483. (void)pt;
  26484. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  26485. return ret;
  26486. }
  26487. #ifndef WOLFSSL_NO_STUB
  26488. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  26489. {
  26490. (void) ctx;
  26491. (void) cmd;
  26492. (void) fp;
  26493. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  26494. return WOLFSSL_FAILURE;
  26495. }
  26496. #endif /* WOLFSSL_NO_STUB */
  26497. #ifndef NO_WOLFSSL_STUB
  26498. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  26499. {
  26500. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0L, NULL);
  26501. }
  26502. #endif
  26503. /* Returns the verifyCallback from the ssl structure if successful.
  26504. Returns NULL otherwise. */
  26505. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  26506. {
  26507. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  26508. if (ssl) {
  26509. return ssl->verifyCallback;
  26510. }
  26511. return NULL;
  26512. }
  26513. /* Adds the ASN1 certificate to the user ctx.
  26514. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  26515. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  26516. const unsigned char *der)
  26517. {
  26518. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  26519. if (der != NULL && ctx != NULL) {
  26520. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  26521. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  26522. return WOLFSSL_SUCCESS;
  26523. }
  26524. }
  26525. return WOLFSSL_FAILURE;
  26526. }
  26527. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  26528. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26529. /* Adds the rsa private key to the user ctx.
  26530. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  26531. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  26532. {
  26533. int ret;
  26534. int derSize;
  26535. unsigned char *maxDerBuf;
  26536. unsigned char* key = NULL;
  26537. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  26538. if (ctx == NULL || rsa == NULL) {
  26539. WOLFSSL_MSG("one or more inputs were NULL");
  26540. return BAD_FUNC_ARG;
  26541. }
  26542. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26543. if (maxDerBuf == NULL) {
  26544. WOLFSSL_MSG("Malloc failure");
  26545. return MEMORY_E;
  26546. }
  26547. key = maxDerBuf;
  26548. /* convert RSA struct to der encoded buffer and get the size */
  26549. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  26550. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  26551. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26552. return WOLFSSL_FAILURE;
  26553. }
  26554. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  26555. derSize, SSL_FILETYPE_ASN1);
  26556. if (ret != WOLFSSL_SUCCESS) {
  26557. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  26558. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26559. return WOLFSSL_FAILURE;
  26560. }
  26561. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26562. return ret;
  26563. }
  26564. #endif /* NO_RSA && !HAVE_FAST_RSA */
  26565. #ifndef NO_BIO
  26566. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  26567. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  26568. is a failure.*/
  26569. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  26570. WOLFSSL_EVP_PKEY** out)
  26571. {
  26572. unsigned char* mem = NULL;
  26573. int memSz = 0;
  26574. WOLFSSL_EVP_PKEY* key = NULL;
  26575. int i = 0, j = 0;
  26576. unsigned char* extraBioMem = NULL;
  26577. int extraBioMemSz = 0;
  26578. int derLength = 0;
  26579. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  26580. if (bio == NULL) {
  26581. return NULL;
  26582. }
  26583. (void)out;
  26584. memSz = wolfSSL_BIO_get_len(bio);
  26585. if (memSz <= 0) {
  26586. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  26587. return NULL;
  26588. }
  26589. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26590. if (mem == NULL) {
  26591. WOLFSSL_MSG("Malloc failure");
  26592. return NULL;
  26593. }
  26594. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  26595. /* Determines key type and returns the new private EVP_PKEY object */
  26596. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  26597. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  26598. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26599. return NULL;
  26600. }
  26601. /* Write extra data back into bio object if necessary. */
  26602. derLength = key->pkey_sz;
  26603. extraBioMemSz = (memSz - derLength);
  26604. if (extraBioMemSz > 0) {
  26605. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  26606. DYNAMIC_TYPE_TMP_BUFFER);
  26607. if (extraBioMem == NULL) {
  26608. WOLFSSL_MSG("Malloc failure");
  26609. XFREE((unsigned char*)extraBioMem, bio->heap,
  26610. DYNAMIC_TYPE_TMP_BUFFER);
  26611. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26612. return NULL;
  26613. }
  26614. for (i = derLength; i < memSz; i++) {
  26615. *(extraBioMem + j) = *(mem + i);
  26616. j++;
  26617. }
  26618. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  26619. if (wolfSSL_BIO_get_len(bio) <= 0) {
  26620. WOLFSSL_MSG("Failed to write memory to bio");
  26621. XFREE((unsigned char*)extraBioMem, bio->heap,
  26622. DYNAMIC_TYPE_TMP_BUFFER);
  26623. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26624. return NULL;
  26625. }
  26626. XFREE((unsigned char*)extraBioMem, bio->heap,
  26627. DYNAMIC_TYPE_TMP_BUFFER);
  26628. }
  26629. if (out != NULL) {
  26630. *out = key;
  26631. }
  26632. }
  26633. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26634. return key;
  26635. }
  26636. #endif /* !NO_BIO */
  26637. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  26638. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \
  26639. defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL)
  26640. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  26641. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  26642. * on fail */
  26643. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  26644. unsigned char** in, long inSz)
  26645. {
  26646. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP");
  26647. return d2iGenericKey(out, (const unsigned char**)in, inSz, 1);
  26648. }
  26649. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/
  26650. /* stunnel compatibility functions*/
  26651. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  26652. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  26653. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  26654. void wolfSSL_ERR_remove_thread_state(void* pid)
  26655. {
  26656. (void) pid;
  26657. return;
  26658. }
  26659. #ifndef NO_FILESYSTEM
  26660. /***TBD ***/
  26661. void wolfSSL_print_all_errors_fp(XFILE fp)
  26662. {
  26663. (void)fp;
  26664. }
  26665. #endif /* !NO_FILESYSTEM */
  26666. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  26667. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  26668. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  26669. defined(HAVE_EX_DATA)
  26670. #if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
  26671. static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx,
  26672. void* data, byte get, void** getRet, int* setRet)
  26673. {
  26674. int row;
  26675. int i;
  26676. int error = 0;
  26677. SessionRow* sessRow = NULL;
  26678. const byte* id;
  26679. byte foundCache = 0;
  26680. if (getRet != NULL)
  26681. *getRet = NULL;
  26682. if (setRet != NULL)
  26683. *setRet = WOLFSSL_FAILURE;
  26684. id = session->sessionID;
  26685. if (session->haveAltSessionID)
  26686. id = session->altSessionID;
  26687. row = (int)(HashSession(id, ID_LEN, &error) % SESSION_ROWS);
  26688. if (error != 0) {
  26689. WOLFSSL_MSG("Hash session failed");
  26690. return;
  26691. }
  26692. sessRow = &SessionCache[row];
  26693. if (SESSION_ROW_LOCK(sessRow) != 0) {
  26694. WOLFSSL_MSG("Session row lock failed");
  26695. return;
  26696. }
  26697. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  26698. if (XMEMCMP(id, sessRow->Sessions[i].sessionID, ID_LEN) == 0
  26699. && session->side == sessRow->Sessions[i].side) {
  26700. if (get) {
  26701. *getRet = wolfSSL_CRYPTO_get_ex_data(
  26702. &sessRow->Sessions[i].ex_data, idx);
  26703. }
  26704. else {
  26705. *setRet = wolfSSL_CRYPTO_set_ex_data(
  26706. &sessRow->Sessions[i].ex_data, idx, data);
  26707. }
  26708. foundCache = 1;
  26709. break;
  26710. }
  26711. }
  26712. SESSION_ROW_UNLOCK(sessRow);
  26713. /* If we don't have a session in cache then clear the ex_data and
  26714. * own it */
  26715. if (!foundCache) {
  26716. XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA));
  26717. session->ownExData = 1;
  26718. if (!get) {
  26719. *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx,
  26720. data);
  26721. }
  26722. }
  26723. }
  26724. #endif
  26725. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  26726. {
  26727. int ret = WOLFSSL_FAILURE;
  26728. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  26729. #ifdef HAVE_EX_DATA
  26730. session = ClientSessionToSession(session);
  26731. if (session != NULL) {
  26732. #ifndef NO_SESSION_CACHE
  26733. if (!session->ownExData) {
  26734. /* Need to update in cache */
  26735. SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret);
  26736. }
  26737. else
  26738. #endif
  26739. {
  26740. ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  26741. }
  26742. }
  26743. #else
  26744. (void)session;
  26745. (void)idx;
  26746. (void)data;
  26747. #endif
  26748. return ret;
  26749. }
  26750. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  26751. int wolfSSL_SESSION_set_ex_data_with_cleanup(
  26752. WOLFSSL_SESSION* session,
  26753. int idx,
  26754. void* data,
  26755. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  26756. {
  26757. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup");
  26758. session = ClientSessionToSession(session);
  26759. if(session != NULL) {
  26760. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx,
  26761. data, cleanup_routine);
  26762. }
  26763. return WOLFSSL_FAILURE;
  26764. }
  26765. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  26766. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  26767. {
  26768. void* ret = NULL;
  26769. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  26770. #ifdef HAVE_EX_DATA
  26771. session = ClientSessionToSession(session);
  26772. if (session != NULL) {
  26773. #ifndef NO_SESSION_CACHE
  26774. if (!session->ownExData) {
  26775. /* Need to retrieve the data from the session cache */
  26776. SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL,
  26777. 1, &ret, NULL);
  26778. }
  26779. else
  26780. #endif
  26781. {
  26782. ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  26783. }
  26784. }
  26785. #else
  26786. (void)session;
  26787. (void)idx;
  26788. #endif
  26789. return ret;
  26790. }
  26791. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */
  26792. /* Note: This is a huge section of API's - through
  26793. * wolfSSL_X509_OBJECT_get0_X509_CRL */
  26794. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \
  26795. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  26796. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  26797. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))
  26798. #ifdef HAVE_EX_DATA
  26799. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  26800. void* cb2, CRYPTO_free_func* cb3)
  26801. {
  26802. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  26803. (void)idx;
  26804. (void)cb1;
  26805. (void)cb2;
  26806. (void)cb3;
  26807. (void)data;
  26808. return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION);
  26809. }
  26810. #endif
  26811. #if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY)
  26812. static wolfSSL_OSSL_Malloc_cb ossl_malloc = NULL;
  26813. static wolfSSL_OSSL_Free_cb ossl_free = NULL;
  26814. static wolfSSL_OSSL_Realloc_cb ossl_realloc = NULL;
  26815. static void* OSSL_Malloc(size_t size)
  26816. {
  26817. if (ossl_malloc != NULL)
  26818. return ossl_malloc(size, NULL, 0);
  26819. else
  26820. return NULL;
  26821. }
  26822. static void OSSL_Free(void *ptr)
  26823. {
  26824. if (ossl_free != NULL)
  26825. ossl_free(ptr, NULL, 0);
  26826. }
  26827. static void* OSSL_Realloc(void *ptr, size_t size)
  26828. {
  26829. if (ossl_realloc != NULL)
  26830. return ossl_realloc(ptr, size, NULL, 0);
  26831. else
  26832. return NULL;
  26833. }
  26834. #endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY */
  26835. int wolfSSL_CRYPTO_set_mem_functions(
  26836. wolfSSL_OSSL_Malloc_cb m,
  26837. wolfSSL_OSSL_Realloc_cb r,
  26838. wolfSSL_OSSL_Free_cb f)
  26839. {
  26840. #ifdef USE_WOLFSSL_MEMORY
  26841. #ifdef WOLFSSL_DEBUG_MEMORY
  26842. WOLFSSL_MSG("mem functions will receive function name instead of "
  26843. "file name");
  26844. if (wolfSSL_SetAllocators((wolfSSL_Malloc_cb)m, (wolfSSL_Free_cb)f,
  26845. (wolfSSL_Realloc_cb)r) == 0)
  26846. return WOLFSSL_SUCCESS;
  26847. #else
  26848. WOLFSSL_MSG("wolfSSL was compiled without WOLFSSL_DEBUG_MEMORY. mem "
  26849. "functions will receive a NULL file name and 0 for the "
  26850. "line number.");
  26851. if (wolfSSL_SetAllocators(OSSL_Malloc, OSSL_Free, OSSL_Realloc) == 0) {
  26852. ossl_malloc = m;
  26853. ossl_free = f;
  26854. ossl_realloc = r;
  26855. return WOLFSSL_SUCCESS;
  26856. }
  26857. #endif
  26858. else
  26859. return WOLFSSL_FAILURE;
  26860. #else
  26861. (void)m;
  26862. (void)r;
  26863. (void)f;
  26864. WOLFSSL_MSG("wolfSSL allocator callback functions not compiled in");
  26865. return WOLFSSL_FAILURE;
  26866. #endif
  26867. }
  26868. int wolfSSL_ERR_load_ERR_strings(void)
  26869. {
  26870. return WOLFSSL_SUCCESS;
  26871. }
  26872. void wolfSSL_ERR_load_crypto_strings(void)
  26873. {
  26874. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  26875. /* Do nothing */
  26876. return;
  26877. }
  26878. int wolfSSL_FIPS_mode(void)
  26879. {
  26880. #ifdef HAVE_FIPS
  26881. return 1;
  26882. #else
  26883. return 0;
  26884. #endif
  26885. }
  26886. int wolfSSL_FIPS_mode_set(int r)
  26887. {
  26888. #ifdef HAVE_FIPS
  26889. if (r == 0) {
  26890. WOLFSSL_MSG("Cannot disable FIPS at runtime.");
  26891. return WOLFSSL_FAILURE;
  26892. }
  26893. return WOLFSSL_SUCCESS;
  26894. #else
  26895. if (r == 0) {
  26896. return WOLFSSL_SUCCESS;
  26897. }
  26898. WOLFSSL_MSG("Cannot enable FIPS. This isn't the wolfSSL FIPS code.");
  26899. return WOLFSSL_FAILURE;
  26900. #endif
  26901. }
  26902. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  26903. {
  26904. int ret = WOLFSSL_FAILURE;
  26905. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  26906. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  26907. (void)alg_bits;
  26908. if (c!= NULL)
  26909. ret = c->bits;
  26910. #else
  26911. if (c != NULL && c->ssl != NULL) {
  26912. ret = 8 * c->ssl->specs.key_size;
  26913. if (alg_bits != NULL) {
  26914. *alg_bits = ret;
  26915. }
  26916. }
  26917. #endif
  26918. return ret;
  26919. }
  26920. /* returns value less than 0 on fail to match
  26921. * On a successful match the priority level found is returned
  26922. */
  26923. int wolfSSL_sk_SSL_CIPHER_find(
  26924. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  26925. {
  26926. WOLFSSL_STACK* next;
  26927. int i, sz;
  26928. if (sk == NULL || toFind == NULL) {
  26929. return WOLFSSL_FATAL_ERROR;
  26930. }
  26931. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  26932. next = sk;
  26933. for (i = 0; i < sz && next != NULL; i++) {
  26934. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  26935. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  26936. return sz - i; /* reverse because stack pushed highest on first */
  26937. }
  26938. next = next->next;
  26939. }
  26940. return WOLFSSL_FATAL_ERROR;
  26941. }
  26942. /* free's all nodes in the stack and there data */
  26943. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  26944. {
  26945. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_free");
  26946. wolfSSL_sk_free(sk);
  26947. }
  26948. #ifdef HAVE_SNI
  26949. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  26950. {
  26951. int ret;
  26952. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  26953. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  26954. host_name, (word16)XSTRLEN(host_name));
  26955. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  26956. return ret;
  26957. }
  26958. #ifndef NO_WOLFSSL_SERVER
  26959. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  26960. {
  26961. void * serverName = NULL;
  26962. if (ssl == NULL)
  26963. return NULL;
  26964. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  26965. return (const char *)serverName;
  26966. }
  26967. #endif /* NO_WOLFSSL_SERVER */
  26968. #endif /* HAVE_SNI */
  26969. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  26970. {
  26971. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  26972. return ssl->ctx;
  26973. return NULL;
  26974. }
  26975. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  26976. {
  26977. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  26978. if(ctx)
  26979. return ctx->verifyCallback;
  26980. return NULL;
  26981. }
  26982. #ifdef HAVE_SNI
  26983. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  26984. {
  26985. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  26986. if (ctx)
  26987. ctx->sniRecvCb = cb;
  26988. }
  26989. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  26990. CallbackSniRecv cb)
  26991. {
  26992. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  26993. if (ctx) {
  26994. ctx->sniRecvCb = cb;
  26995. return WOLFSSL_SUCCESS;
  26996. }
  26997. return WOLFSSL_FAILURE;
  26998. }
  26999. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  27000. {
  27001. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  27002. if (ctx) {
  27003. ctx->sniRecvCbArg = arg;
  27004. return WOLFSSL_SUCCESS;
  27005. }
  27006. return WOLFSSL_FAILURE;
  27007. }
  27008. #endif /* HAVE_SNI */
  27009. #ifndef NO_BIO
  27010. void wolfSSL_ERR_load_BIO_strings(void) {
  27011. WOLFSSL_ENTER("ERR_load_BIO_strings");
  27012. /* do nothing */
  27013. }
  27014. #endif
  27015. #ifndef NO_WOLFSSL_STUB
  27016. /* Set THREADID callback, return 1 on success, 0 on error */
  27017. int wolfSSL_THREADID_set_callback(
  27018. void(*threadid_func)(WOLFSSL_CRYPTO_THREADID*))
  27019. {
  27020. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  27021. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  27022. (void)threadid_func;
  27023. return 1;
  27024. }
  27025. #endif
  27026. #ifndef NO_WOLFSSL_STUB
  27027. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  27028. {
  27029. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  27030. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  27031. (void)id;
  27032. (void)val;
  27033. return;
  27034. }
  27035. #endif
  27036. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  27037. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  27038. * HAVE_SBLIM_SFCB)) */
  27039. #if defined(OPENSSL_EXTRA)
  27040. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  27041. {
  27042. if (!a || !b)
  27043. return 0;
  27044. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  27045. }
  27046. unsigned long wolfSSL_ERR_peek_last_error(void)
  27047. {
  27048. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  27049. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  27050. {
  27051. int ret;
  27052. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  27053. WOLFSSL_MSG("Issue peeking at error node in queue");
  27054. return 0;
  27055. }
  27056. if (ret == -ASN_NO_PEM_HEADER)
  27057. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  27058. #if defined(WOLFSSL_PYTHON)
  27059. if (ret == ASN1_R_HEADER_TOO_LONG)
  27060. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  27061. #endif
  27062. return (unsigned long)ret;
  27063. }
  27064. #else
  27065. return (unsigned long)(0 - NOT_COMPILED_IN);
  27066. #endif
  27067. }
  27068. #endif /* OPENSSL_EXTRA */
  27069. int wolfSSL_version(WOLFSSL* ssl)
  27070. {
  27071. WOLFSSL_ENTER("wolfSSL_version");
  27072. if (ssl->version.major == SSLv3_MAJOR) {
  27073. switch (ssl->version.minor) {
  27074. case SSLv3_MINOR :
  27075. return SSL3_VERSION;
  27076. case TLSv1_MINOR :
  27077. return TLS1_VERSION;
  27078. case TLSv1_1_MINOR :
  27079. return TLS1_1_VERSION;
  27080. case TLSv1_2_MINOR :
  27081. return TLS1_2_VERSION;
  27082. case TLSv1_3_MINOR :
  27083. return TLS1_3_VERSION;
  27084. default:
  27085. return WOLFSSL_FAILURE;
  27086. }
  27087. }
  27088. else if (ssl->version.major == DTLS_MAJOR) {
  27089. switch (ssl->version.minor) {
  27090. case DTLS_MINOR :
  27091. return DTLS1_VERSION;
  27092. case DTLSv1_2_MINOR :
  27093. return DTLS1_2_VERSION;
  27094. default:
  27095. return WOLFSSL_FAILURE;
  27096. }
  27097. }
  27098. return WOLFSSL_FAILURE;
  27099. }
  27100. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  27101. {
  27102. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  27103. return ssl->ctx;
  27104. }
  27105. #if defined(OPENSSL_ALL) || \
  27106. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  27107. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  27108. const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess,
  27109. unsigned int* idLen)
  27110. {
  27111. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  27112. sess = ClientSessionToSession(sess);
  27113. if (sess == NULL || idLen == NULL) {
  27114. WOLFSSL_MSG("Bad func args. Please provide idLen");
  27115. return NULL;
  27116. }
  27117. *idLen = sess->sessionIDSz;
  27118. return sess->sessionID;
  27119. }
  27120. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  27121. !defined(NO_FILESYSTEM)
  27122. #ifndef NO_BIO
  27123. #if defined(SESSION_CERTS) || \
  27124. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  27125. /* returns a pointer to the protocol used by the session */
  27126. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  27127. {
  27128. in = ClientSessionToSession(in);
  27129. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  27130. }
  27131. #endif
  27132. /* returns true (non 0) if the session has EMS (extended master secret) */
  27133. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  27134. {
  27135. in = ClientSessionToSession(in);
  27136. if (in == NULL)
  27137. return 0;
  27138. return in->haveEMS;
  27139. }
  27140. #if defined(HAVE_SESSION_TICKET)
  27141. /* prints out the ticket to bio passed in
  27142. * return WOLFSSL_SUCCESS on success
  27143. */
  27144. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  27145. const WOLFSSL_SESSION* in, const char* tab)
  27146. {
  27147. unsigned short i, j, z, sz;
  27148. short tag = 0;
  27149. byte* pt;
  27150. in = ClientSessionToSession(in);
  27151. if (in == NULL || bio == NULL) {
  27152. return BAD_FUNC_ARG;
  27153. }
  27154. sz = in->ticketLen;
  27155. pt = in->ticket;
  27156. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  27157. return WOLFSSL_FAILURE;
  27158. for (i = 0; i < sz;) {
  27159. char asc[16];
  27160. if (sz - i < 16) {
  27161. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  27162. return WOLFSSL_FAILURE;
  27163. }
  27164. else {
  27165. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  27166. return WOLFSSL_FAILURE;
  27167. }
  27168. for (j = 0; i < sz && j < 8; j++,i++) {
  27169. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27170. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  27171. return WOLFSSL_FAILURE;
  27172. }
  27173. if (i < sz) {
  27174. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27175. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  27176. return WOLFSSL_FAILURE;
  27177. j++;
  27178. i++;
  27179. }
  27180. for (; i < sz && j < 16; j++,i++) {
  27181. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  27182. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  27183. return WOLFSSL_FAILURE;
  27184. }
  27185. /* pad out spacing */
  27186. for (z = j; z < 17; z++) {
  27187. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  27188. return WOLFSSL_FAILURE;
  27189. }
  27190. for (z = 0; z < j; z++) {
  27191. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  27192. return WOLFSSL_FAILURE;
  27193. }
  27194. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  27195. return WOLFSSL_FAILURE;
  27196. tag += 16;
  27197. }
  27198. return WOLFSSL_SUCCESS;
  27199. }
  27200. #endif /* HAVE_SESSION_TICKET */
  27201. /* prints out the session information in human readable form
  27202. * return WOLFSSL_SUCCESS on success
  27203. */
  27204. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session)
  27205. {
  27206. const unsigned char* pt;
  27207. unsigned char buf[SECRET_LEN];
  27208. unsigned int sz = 0, i;
  27209. int ret;
  27210. session = ClientSessionToSession(session);
  27211. if (session == NULL) {
  27212. return WOLFSSL_FAILURE;
  27213. }
  27214. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  27215. return WOLFSSL_FAILURE;
  27216. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  27217. defined(HAVE_SESSION_TICKET))
  27218. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  27219. wolfSSL_SESSION_get_protocol(session)) <= 0)
  27220. return WOLFSSL_FAILURE;
  27221. #endif
  27222. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  27223. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  27224. return WOLFSSL_FAILURE;
  27225. pt = wolfSSL_SESSION_get_id(session, &sz);
  27226. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  27227. return WOLFSSL_FAILURE;
  27228. for (i = 0; i < sz; i++) {
  27229. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  27230. return WOLFSSL_FAILURE;
  27231. }
  27232. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  27233. return WOLFSSL_FAILURE;
  27234. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  27235. return WOLFSSL_FAILURE;
  27236. ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf));
  27237. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  27238. return WOLFSSL_FAILURE;
  27239. if (ret > 0) {
  27240. sz = (unsigned int)ret;
  27241. for (i = 0; i < sz; i++) {
  27242. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  27243. return WOLFSSL_FAILURE;
  27244. }
  27245. }
  27246. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  27247. return WOLFSSL_FAILURE;
  27248. /* @TODO PSK identity hint and SRP */
  27249. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  27250. return WOLFSSL_FAILURE;
  27251. #ifdef HAVE_SESSION_TICKET
  27252. if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS)
  27253. return WOLFSSL_FAILURE;
  27254. #endif
  27255. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  27256. defined(HAVE_EXT_CACHE))
  27257. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  27258. wolfSSL_SESSION_get_time(session)) <= 0)
  27259. return WOLFSSL_FAILURE;
  27260. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  27261. wolfSSL_SESSION_get_timeout(session)) <= 0)
  27262. return WOLFSSL_FAILURE;
  27263. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  27264. /* @TODO verify return code print */
  27265. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  27266. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  27267. return WOLFSSL_FAILURE;
  27268. return WOLFSSL_SUCCESS;
  27269. }
  27270. #endif /* !NO_BIO */
  27271. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  27272. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  27273. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  27274. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  27275. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  27276. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  27277. int mode = 0;
  27278. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  27279. if (!ssl) {
  27280. return WOLFSSL_FAILURE;
  27281. }
  27282. if (ssl->options.verifyNone) {
  27283. mode = WOLFSSL_VERIFY_NONE;
  27284. }
  27285. else {
  27286. if (ssl->options.verifyPeer) {
  27287. mode |= WOLFSSL_VERIFY_PEER;
  27288. }
  27289. if (ssl->options.failNoCert) {
  27290. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  27291. }
  27292. if (ssl->options.failNoCertxPSK) {
  27293. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  27294. }
  27295. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  27296. if (ssl->options.verifyPostHandshake) {
  27297. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  27298. }
  27299. #endif
  27300. }
  27301. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  27302. return mode;
  27303. }
  27304. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  27305. {
  27306. int mode = 0;
  27307. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  27308. if (!ctx) {
  27309. return WOLFSSL_FAILURE;
  27310. }
  27311. if (ctx->verifyNone) {
  27312. mode = WOLFSSL_VERIFY_NONE;
  27313. }
  27314. else {
  27315. if (ctx->verifyPeer) {
  27316. mode |= WOLFSSL_VERIFY_PEER;
  27317. }
  27318. if (ctx->failNoCert) {
  27319. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  27320. }
  27321. if (ctx->failNoCertxPSK) {
  27322. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  27323. }
  27324. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  27325. if (ctx->verifyPostHandshake) {
  27326. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  27327. }
  27328. #endif
  27329. }
  27330. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  27331. return mode;
  27332. }
  27333. #endif
  27334. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  27335. /* return 1 if success, 0 if error
  27336. * output keys are little endian format
  27337. */
  27338. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  27339. unsigned char *pub, unsigned int *pubSz)
  27340. {
  27341. #ifndef WOLFSSL_KEY_GEN
  27342. WOLFSSL_MSG("No Key Gen built in");
  27343. (void) priv;
  27344. (void) privSz;
  27345. (void) pub;
  27346. (void) pubSz;
  27347. return WOLFSSL_FAILURE;
  27348. #else /* WOLFSSL_KEY_GEN */
  27349. int ret = WOLFSSL_FAILURE;
  27350. int initTmpRng = 0;
  27351. WC_RNG *rng = NULL;
  27352. #ifdef WOLFSSL_SMALL_STACK
  27353. WC_RNG *tmpRNG = NULL;
  27354. #else
  27355. WC_RNG tmpRNG[1];
  27356. #endif
  27357. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  27358. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  27359. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  27360. WOLFSSL_MSG("Bad arguments");
  27361. return WOLFSSL_FAILURE;
  27362. }
  27363. #ifdef WOLFSSL_SMALL_STACK
  27364. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27365. if (tmpRNG == NULL)
  27366. return WOLFSSL_FAILURE;
  27367. #endif
  27368. if (wc_InitRng(tmpRNG) == 0) {
  27369. rng = tmpRNG;
  27370. initTmpRng = 1;
  27371. }
  27372. else {
  27373. WOLFSSL_MSG("Bad RNG Init, trying global");
  27374. if (initGlobalRNG == 0)
  27375. WOLFSSL_MSG("Global RNG no Init");
  27376. else
  27377. rng = &globalRNG;
  27378. }
  27379. if (rng) {
  27380. curve25519_key key;
  27381. if (wc_curve25519_init(&key) != MP_OKAY)
  27382. WOLFSSL_MSG("wc_curve25519_init failed");
  27383. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  27384. WOLFSSL_MSG("wc_curve25519_make_key failed");
  27385. /* export key pair */
  27386. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  27387. pubSz, EC25519_LITTLE_ENDIAN)
  27388. != MP_OKAY)
  27389. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  27390. else
  27391. ret = WOLFSSL_SUCCESS;
  27392. wc_curve25519_free(&key);
  27393. }
  27394. if (initTmpRng)
  27395. wc_FreeRng(tmpRNG);
  27396. #ifdef WOLFSSL_SMALL_STACK
  27397. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27398. #endif
  27399. return ret;
  27400. #endif /* WOLFSSL_KEY_GEN */
  27401. }
  27402. /* return 1 if success, 0 if error
  27403. * input and output keys are little endian format
  27404. */
  27405. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  27406. const unsigned char *priv, unsigned int privSz,
  27407. const unsigned char *pub, unsigned int pubSz)
  27408. {
  27409. #ifndef WOLFSSL_KEY_GEN
  27410. WOLFSSL_MSG("No Key Gen built in");
  27411. (void) shared;
  27412. (void) sharedSz;
  27413. (void) priv;
  27414. (void) privSz;
  27415. (void) pub;
  27416. (void) pubSz;
  27417. return WOLFSSL_FAILURE;
  27418. #else /* WOLFSSL_KEY_GEN */
  27419. int ret = WOLFSSL_FAILURE;
  27420. curve25519_key privkey, pubkey;
  27421. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  27422. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  27423. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  27424. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  27425. WOLFSSL_MSG("Bad arguments");
  27426. return WOLFSSL_FAILURE;
  27427. }
  27428. /* import private key */
  27429. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  27430. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  27431. return ret;
  27432. }
  27433. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  27434. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  27435. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  27436. wc_curve25519_free(&privkey);
  27437. return ret;
  27438. }
  27439. /* import public key */
  27440. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  27441. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  27442. wc_curve25519_free(&privkey);
  27443. return ret;
  27444. }
  27445. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  27446. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  27447. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  27448. wc_curve25519_free(&privkey);
  27449. wc_curve25519_free(&pubkey);
  27450. return ret;
  27451. }
  27452. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  27453. shared, sharedSz,
  27454. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  27455. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  27456. else
  27457. ret = WOLFSSL_SUCCESS;
  27458. wc_curve25519_free(&privkey);
  27459. wc_curve25519_free(&pubkey);
  27460. return ret;
  27461. #endif /* WOLFSSL_KEY_GEN */
  27462. }
  27463. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  27464. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  27465. /* return 1 if success, 0 if error
  27466. * output keys are little endian format
  27467. */
  27468. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  27469. unsigned char *pub, unsigned int *pubSz)
  27470. {
  27471. #ifndef WOLFSSL_KEY_GEN
  27472. WOLFSSL_MSG("No Key Gen built in");
  27473. (void) priv;
  27474. (void) privSz;
  27475. (void) pub;
  27476. (void) pubSz;
  27477. return WOLFSSL_FAILURE;
  27478. #elif !defined(HAVE_ED25519_KEY_EXPORT)
  27479. WOLFSSL_MSG("No ED25519 key export built in");
  27480. (void) priv;
  27481. (void) privSz;
  27482. (void) pub;
  27483. (void) pubSz;
  27484. return WOLFSSL_FAILURE;
  27485. #else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  27486. int ret = WOLFSSL_FAILURE;
  27487. int initTmpRng = 0;
  27488. WC_RNG *rng = NULL;
  27489. #ifdef WOLFSSL_SMALL_STACK
  27490. WC_RNG *tmpRNG = NULL;
  27491. #else
  27492. WC_RNG tmpRNG[1];
  27493. #endif
  27494. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  27495. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  27496. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  27497. WOLFSSL_MSG("Bad arguments");
  27498. return WOLFSSL_FAILURE;
  27499. }
  27500. #ifdef WOLFSSL_SMALL_STACK
  27501. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27502. if (tmpRNG == NULL)
  27503. return WOLFSSL_FATAL_ERROR;
  27504. #endif
  27505. if (wc_InitRng(tmpRNG) == 0) {
  27506. rng = tmpRNG;
  27507. initTmpRng = 1;
  27508. }
  27509. else {
  27510. WOLFSSL_MSG("Bad RNG Init, trying global");
  27511. if (initGlobalRNG == 0)
  27512. WOLFSSL_MSG("Global RNG no Init");
  27513. else
  27514. rng = &globalRNG;
  27515. }
  27516. if (rng) {
  27517. ed25519_key key;
  27518. if (wc_ed25519_init(&key) != MP_OKAY)
  27519. WOLFSSL_MSG("wc_ed25519_init failed");
  27520. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  27521. WOLFSSL_MSG("wc_ed25519_make_key failed");
  27522. /* export private key */
  27523. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  27524. WOLFSSL_MSG("wc_ed25519_export_key failed");
  27525. else
  27526. ret = WOLFSSL_SUCCESS;
  27527. wc_ed25519_free(&key);
  27528. }
  27529. if (initTmpRng)
  27530. wc_FreeRng(tmpRNG);
  27531. #ifdef WOLFSSL_SMALL_STACK
  27532. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27533. #endif
  27534. return ret;
  27535. #endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  27536. }
  27537. /* return 1 if success, 0 if error
  27538. * input and output keys are little endian format
  27539. * priv is a buffer containing private and public part of key
  27540. */
  27541. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  27542. const unsigned char *priv, unsigned int privSz,
  27543. unsigned char *sig, unsigned int *sigSz)
  27544. {
  27545. #if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  27546. #if !defined(HAVE_ED25519_SIGN)
  27547. WOLFSSL_MSG("No ED25519 sign built in");
  27548. #elif !defined(WOLFSSL_KEY_GEN)
  27549. WOLFSSL_MSG("No Key Gen built in");
  27550. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  27551. WOLFSSL_MSG("No ED25519 Key import built in");
  27552. #endif
  27553. (void) msg;
  27554. (void) msgSz;
  27555. (void) priv;
  27556. (void) privSz;
  27557. (void) sig;
  27558. (void) sigSz;
  27559. return WOLFSSL_FAILURE;
  27560. #else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27561. ed25519_key key;
  27562. int ret = WOLFSSL_FAILURE;
  27563. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  27564. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  27565. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  27566. WOLFSSL_MSG("Bad arguments");
  27567. return WOLFSSL_FAILURE;
  27568. }
  27569. /* import key */
  27570. if (wc_ed25519_init(&key) != MP_OKAY) {
  27571. WOLFSSL_MSG("wc_curve25519_init failed");
  27572. return ret;
  27573. }
  27574. if (wc_ed25519_import_private_key(priv, privSz/2,
  27575. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  27576. &key) != MP_OKAY){
  27577. WOLFSSL_MSG("wc_ed25519_import_private failed");
  27578. wc_ed25519_free(&key);
  27579. return ret;
  27580. }
  27581. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  27582. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  27583. else
  27584. ret = WOLFSSL_SUCCESS;
  27585. wc_ed25519_free(&key);
  27586. return ret;
  27587. #endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27588. }
  27589. /* return 1 if success, 0 if error
  27590. * input and output keys are little endian format
  27591. * pub is a buffer containing public part of key
  27592. */
  27593. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  27594. const unsigned char *pub, unsigned int pubSz,
  27595. const unsigned char *sig, unsigned int sigSz)
  27596. {
  27597. #if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  27598. #if !defined(HAVE_ED25519_VERIFY)
  27599. WOLFSSL_MSG("No ED25519 verify built in");
  27600. #elif !defined(WOLFSSL_KEY_GEN)
  27601. WOLFSSL_MSG("No Key Gen built in");
  27602. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  27603. WOLFSSL_MSG("No ED25519 Key import built in");
  27604. #endif
  27605. (void) msg;
  27606. (void) msgSz;
  27607. (void) pub;
  27608. (void) pubSz;
  27609. (void) sig;
  27610. (void) sigSz;
  27611. return WOLFSSL_FAILURE;
  27612. #else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27613. ed25519_key key;
  27614. int ret = WOLFSSL_FAILURE, check = 0;
  27615. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  27616. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  27617. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  27618. WOLFSSL_MSG("Bad arguments");
  27619. return WOLFSSL_FAILURE;
  27620. }
  27621. /* import key */
  27622. if (wc_ed25519_init(&key) != MP_OKAY) {
  27623. WOLFSSL_MSG("wc_curve25519_init failed");
  27624. return ret;
  27625. }
  27626. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  27627. WOLFSSL_MSG("wc_ed25519_import_public failed");
  27628. wc_ed25519_free(&key);
  27629. return ret;
  27630. }
  27631. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  27632. &check, &key)) != MP_OKAY) {
  27633. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  27634. }
  27635. else if (!check)
  27636. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  27637. else
  27638. ret = WOLFSSL_SUCCESS;
  27639. wc_ed25519_free(&key);
  27640. return ret;
  27641. #endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  27642. }
  27643. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  27644. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  27645. /* return 1 if success, 0 if error
  27646. * output keys are little endian format
  27647. */
  27648. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  27649. unsigned char *pub, unsigned int *pubSz)
  27650. {
  27651. #ifndef WOLFSSL_KEY_GEN
  27652. WOLFSSL_MSG("No Key Gen built in");
  27653. (void) priv;
  27654. (void) privSz;
  27655. (void) pub;
  27656. (void) pubSz;
  27657. return WOLFSSL_FAILURE;
  27658. #else /* WOLFSSL_KEY_GEN */
  27659. int ret = WOLFSSL_FAILURE;
  27660. int initTmpRng = 0;
  27661. WC_RNG *rng = NULL;
  27662. #ifdef WOLFSSL_SMALL_STACK
  27663. WC_RNG *tmpRNG = NULL;
  27664. #else
  27665. WC_RNG tmpRNG[1];
  27666. #endif
  27667. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  27668. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  27669. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  27670. WOLFSSL_MSG("Bad arguments");
  27671. return WOLFSSL_FAILURE;
  27672. }
  27673. #ifdef WOLFSSL_SMALL_STACK
  27674. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27675. if (tmpRNG == NULL)
  27676. return WOLFSSL_FAILURE;
  27677. #endif
  27678. if (wc_InitRng(tmpRNG) == 0) {
  27679. rng = tmpRNG;
  27680. initTmpRng = 1;
  27681. }
  27682. else {
  27683. WOLFSSL_MSG("Bad RNG Init, trying global");
  27684. if (initGlobalRNG == 0)
  27685. WOLFSSL_MSG("Global RNG no Init");
  27686. else
  27687. rng = &globalRNG;
  27688. }
  27689. if (rng) {
  27690. curve448_key key;
  27691. if (wc_curve448_init(&key) != MP_OKAY)
  27692. WOLFSSL_MSG("wc_curve448_init failed");
  27693. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  27694. WOLFSSL_MSG("wc_curve448_make_key failed");
  27695. /* export key pair */
  27696. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  27697. EC448_LITTLE_ENDIAN)
  27698. != MP_OKAY)
  27699. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  27700. else
  27701. ret = WOLFSSL_SUCCESS;
  27702. wc_curve448_free(&key);
  27703. }
  27704. if (initTmpRng)
  27705. wc_FreeRng(tmpRNG);
  27706. #ifdef WOLFSSL_SMALL_STACK
  27707. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27708. #endif
  27709. return ret;
  27710. #endif /* WOLFSSL_KEY_GEN */
  27711. }
  27712. /* return 1 if success, 0 if error
  27713. * input and output keys are little endian format
  27714. */
  27715. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  27716. const unsigned char *priv, unsigned int privSz,
  27717. const unsigned char *pub, unsigned int pubSz)
  27718. {
  27719. #ifndef WOLFSSL_KEY_GEN
  27720. WOLFSSL_MSG("No Key Gen built in");
  27721. (void) shared;
  27722. (void) sharedSz;
  27723. (void) priv;
  27724. (void) privSz;
  27725. (void) pub;
  27726. (void) pubSz;
  27727. return WOLFSSL_FAILURE;
  27728. #else /* WOLFSSL_KEY_GEN */
  27729. int ret = WOLFSSL_FAILURE;
  27730. curve448_key privkey, pubkey;
  27731. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  27732. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  27733. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  27734. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  27735. WOLFSSL_MSG("Bad arguments");
  27736. return WOLFSSL_FAILURE;
  27737. }
  27738. /* import private key */
  27739. if (wc_curve448_init(&privkey) != MP_OKAY) {
  27740. WOLFSSL_MSG("wc_curve448_init privkey failed");
  27741. return ret;
  27742. }
  27743. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  27744. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  27745. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  27746. wc_curve448_free(&privkey);
  27747. return ret;
  27748. }
  27749. /* import public key */
  27750. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  27751. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  27752. wc_curve448_free(&privkey);
  27753. return ret;
  27754. }
  27755. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  27756. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  27757. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  27758. wc_curve448_free(&privkey);
  27759. wc_curve448_free(&pubkey);
  27760. return ret;
  27761. }
  27762. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  27763. EC448_LITTLE_ENDIAN) != MP_OKAY)
  27764. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  27765. else
  27766. ret = WOLFSSL_SUCCESS;
  27767. wc_curve448_free(&privkey);
  27768. wc_curve448_free(&pubkey);
  27769. return ret;
  27770. #endif /* WOLFSSL_KEY_GEN */
  27771. }
  27772. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  27773. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  27774. /* return 1 if success, 0 if error
  27775. * output keys are little endian format
  27776. */
  27777. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  27778. unsigned char *pub, unsigned int *pubSz)
  27779. {
  27780. #ifndef WOLFSSL_KEY_GEN
  27781. WOLFSSL_MSG("No Key Gen built in");
  27782. (void) priv;
  27783. (void) privSz;
  27784. (void) pub;
  27785. (void) pubSz;
  27786. return WOLFSSL_FAILURE;
  27787. #elif !defined(HAVE_ED448_KEY_EXPORT)
  27788. WOLFSSL_MSG("No ED448 key export built in");
  27789. (void) priv;
  27790. (void) privSz;
  27791. (void) pub;
  27792. (void) pubSz;
  27793. return WOLFSSL_FAILURE;
  27794. #else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  27795. int ret = WOLFSSL_FAILURE;
  27796. int initTmpRng = 0;
  27797. WC_RNG *rng = NULL;
  27798. #ifdef WOLFSSL_SMALL_STACK
  27799. WC_RNG *tmpRNG = NULL;
  27800. #else
  27801. WC_RNG tmpRNG[1];
  27802. #endif
  27803. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  27804. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  27805. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  27806. WOLFSSL_MSG("Bad arguments");
  27807. return WOLFSSL_FAILURE;
  27808. }
  27809. #ifdef WOLFSSL_SMALL_STACK
  27810. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27811. if (tmpRNG == NULL)
  27812. return WOLFSSL_FATAL_ERROR;
  27813. #endif
  27814. if (wc_InitRng(tmpRNG) == 0) {
  27815. rng = tmpRNG;
  27816. initTmpRng = 1;
  27817. }
  27818. else {
  27819. WOLFSSL_MSG("Bad RNG Init, trying global");
  27820. if (initGlobalRNG == 0)
  27821. WOLFSSL_MSG("Global RNG no Init");
  27822. else
  27823. rng = &globalRNG;
  27824. }
  27825. if (rng) {
  27826. ed448_key key;
  27827. if (wc_ed448_init(&key) != MP_OKAY)
  27828. WOLFSSL_MSG("wc_ed448_init failed");
  27829. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  27830. WOLFSSL_MSG("wc_ed448_make_key failed");
  27831. /* export private key */
  27832. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  27833. WOLFSSL_MSG("wc_ed448_export_key failed");
  27834. else
  27835. ret = WOLFSSL_SUCCESS;
  27836. wc_ed448_free(&key);
  27837. }
  27838. if (initTmpRng)
  27839. wc_FreeRng(tmpRNG);
  27840. #ifdef WOLFSSL_SMALL_STACK
  27841. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27842. #endif
  27843. return ret;
  27844. #endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  27845. }
  27846. /* return 1 if success, 0 if error
  27847. * input and output keys are little endian format
  27848. * priv is a buffer containing private and public part of key
  27849. */
  27850. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  27851. const unsigned char *priv, unsigned int privSz,
  27852. unsigned char *sig, unsigned int *sigSz)
  27853. {
  27854. #if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  27855. #if !defined(HAVE_ED448_SIGN)
  27856. WOLFSSL_MSG("No ED448 sign built in");
  27857. #elif !defined(WOLFSSL_KEY_GEN)
  27858. WOLFSSL_MSG("No Key Gen built in");
  27859. #elif !defined(HAVE_ED448_KEY_IMPORT)
  27860. WOLFSSL_MSG("No ED448 Key import built in");
  27861. #endif
  27862. (void) msg;
  27863. (void) msgSz;
  27864. (void) priv;
  27865. (void) privSz;
  27866. (void) sig;
  27867. (void) sigSz;
  27868. return WOLFSSL_FAILURE;
  27869. #else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  27870. ed448_key key;
  27871. int ret = WOLFSSL_FAILURE;
  27872. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  27873. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  27874. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  27875. WOLFSSL_MSG("Bad arguments");
  27876. return WOLFSSL_FAILURE;
  27877. }
  27878. /* import key */
  27879. if (wc_ed448_init(&key) != MP_OKAY) {
  27880. WOLFSSL_MSG("wc_curve448_init failed");
  27881. return ret;
  27882. }
  27883. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  27884. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  27885. WOLFSSL_MSG("wc_ed448_import_private failed");
  27886. wc_ed448_free(&key);
  27887. return ret;
  27888. }
  27889. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  27890. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  27891. else
  27892. ret = WOLFSSL_SUCCESS;
  27893. wc_ed448_free(&key);
  27894. return ret;
  27895. #endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  27896. }
  27897. /* return 1 if success, 0 if error
  27898. * input and output keys are little endian format
  27899. * pub is a buffer containing public part of key
  27900. */
  27901. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  27902. const unsigned char *pub, unsigned int pubSz,
  27903. const unsigned char *sig, unsigned int sigSz)
  27904. {
  27905. #if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  27906. #if !defined(HAVE_ED448_VERIFY)
  27907. WOLFSSL_MSG("No ED448 verify built in");
  27908. #elif !defined(WOLFSSL_KEY_GEN)
  27909. WOLFSSL_MSG("No Key Gen built in");
  27910. #elif !defined(HAVE_ED448_KEY_IMPORT)
  27911. WOLFSSL_MSG("No ED448 Key import built in");
  27912. #endif
  27913. (void) msg;
  27914. (void) msgSz;
  27915. (void) pub;
  27916. (void) pubSz;
  27917. (void) sig;
  27918. (void) sigSz;
  27919. return WOLFSSL_FAILURE;
  27920. #else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  27921. ed448_key key;
  27922. int ret = WOLFSSL_FAILURE, check = 0;
  27923. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  27924. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  27925. sig == NULL || sigSz != ED448_SIG_SIZE) {
  27926. WOLFSSL_MSG("Bad arguments");
  27927. return WOLFSSL_FAILURE;
  27928. }
  27929. /* import key */
  27930. if (wc_ed448_init(&key) != MP_OKAY) {
  27931. WOLFSSL_MSG("wc_curve448_init failed");
  27932. return ret;
  27933. }
  27934. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  27935. WOLFSSL_MSG("wc_ed448_import_public failed");
  27936. wc_ed448_free(&key);
  27937. return ret;
  27938. }
  27939. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  27940. &key, NULL, 0)) != MP_OKAY) {
  27941. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  27942. }
  27943. else if (!check)
  27944. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  27945. else
  27946. ret = WOLFSSL_SUCCESS;
  27947. wc_ed448_free(&key);
  27948. return ret;
  27949. #endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */
  27950. }
  27951. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  27952. #ifdef WOLFSSL_JNI
  27953. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  27954. {
  27955. WOLFSSL_ENTER("wolfSSL_set_jobject");
  27956. if (ssl != NULL)
  27957. {
  27958. ssl->jObjectRef = objPtr;
  27959. return WOLFSSL_SUCCESS;
  27960. }
  27961. return WOLFSSL_FAILURE;
  27962. }
  27963. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  27964. {
  27965. WOLFSSL_ENTER("wolfSSL_get_jobject");
  27966. if (ssl != NULL)
  27967. return ssl->jObjectRef;
  27968. return NULL;
  27969. }
  27970. #endif /* WOLFSSL_JNI */
  27971. #ifdef WOLFSSL_ASYNC_CRYPT
  27972. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  27973. WOLF_EVENT_FLAG flags, int* eventCount)
  27974. {
  27975. if (ctx == NULL) {
  27976. return BAD_FUNC_ARG;
  27977. }
  27978. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  27979. events, maxEvents, flags, eventCount);
  27980. }
  27981. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  27982. {
  27983. int ret, eventCount = 0;
  27984. WOLF_EVENT* events[1];
  27985. if (ssl == NULL) {
  27986. return BAD_FUNC_ARG;
  27987. }
  27988. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  27989. events, sizeof(events)/sizeof(events[0]), flags, &eventCount);
  27990. if (ret == 0) {
  27991. ret = eventCount;
  27992. }
  27993. return ret;
  27994. }
  27995. #endif /* WOLFSSL_ASYNC_CRYPT */
  27996. #ifdef OPENSSL_EXTRA
  27997. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  27998. const char **data, int *flags)
  27999. {
  28000. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  28001. (void)line;
  28002. (void)file;
  28003. /* No data or flags stored - error display only in Nginx. */
  28004. if (data != NULL) {
  28005. *data = "";
  28006. }
  28007. if (flags != NULL) {
  28008. *flags = 0;
  28009. }
  28010. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  28011. {
  28012. int ret = 0;
  28013. while (1) {
  28014. ret = wc_PeekErrorNode(0, file, NULL, line);
  28015. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  28016. WOLFSSL_MSG("Issue peeking at error node in queue");
  28017. return 0;
  28018. }
  28019. /* OpenSSL uses positive error codes */
  28020. if (ret < 0) {
  28021. ret = -ret;
  28022. }
  28023. if (ret == -ASN_NO_PEM_HEADER)
  28024. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  28025. #ifdef OPENSSL_ALL
  28026. /* PARSE_ERROR is returned if an HTTP request is detected. */
  28027. if (ret == -SSL_R_HTTP_REQUEST)
  28028. return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST;
  28029. #endif
  28030. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  28031. if (ret == ASN1_R_HEADER_TOO_LONG) {
  28032. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  28033. }
  28034. #endif
  28035. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  28036. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  28037. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  28038. break;
  28039. wc_RemoveErrorNode(0);
  28040. }
  28041. return (unsigned long)ret;
  28042. }
  28043. #else
  28044. return (unsigned long)(0 - NOT_COMPILED_IN);
  28045. #endif
  28046. }
  28047. #endif
  28048. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  28049. #if !defined(WOLFSSL_USER_IO)
  28050. /* converts an IPv6 or IPv4 address into an octet string for use with rfc3280
  28051. * example input would be "127.0.0.1" and the returned value would be 7F000001
  28052. */
  28053. WOLFSSL_ASN1_STRING* wolfSSL_a2i_IPADDRESS(const char* ipa)
  28054. {
  28055. int ipaSz = WOLFSSL_IP4_ADDR_LEN;
  28056. char buf[WOLFSSL_IP6_ADDR_LEN + 1]; /* plus 1 for terminator */
  28057. int af = WOLFSSL_IP4;
  28058. WOLFSSL_ASN1_STRING *ret = NULL;
  28059. if (ipa == NULL)
  28060. return NULL;
  28061. if (XSTRSTR(ipa, ":") != NULL) {
  28062. af = WOLFSSL_IP6;
  28063. ipaSz = WOLFSSL_IP6_ADDR_LEN;
  28064. }
  28065. buf[WOLFSSL_IP6_ADDR_LEN] = '\0';
  28066. if (XINET_PTON(af, ipa, (void*)buf) != 1) {
  28067. WOLFSSL_MSG("Error parsing IP address");
  28068. return NULL;
  28069. }
  28070. ret = wolfSSL_ASN1_STRING_new();
  28071. if (ret != NULL) {
  28072. if (wolfSSL_ASN1_STRING_set(ret, buf, ipaSz) != WOLFSSL_SUCCESS) {
  28073. WOLFSSL_MSG("Error setting the string");
  28074. wolfSSL_ASN1_STRING_free(ret);
  28075. ret = NULL;
  28076. }
  28077. }
  28078. return ret;
  28079. }
  28080. #endif /* !WOLFSSL_USER_IO */
  28081. /* Is the specified cipher suite a fake one used an an extension proxy? */
  28082. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  28083. {
  28084. (void)suite0;
  28085. (void)suite;
  28086. #ifdef HAVE_RENEGOTIATION_INDICATION
  28087. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  28088. return 1;
  28089. #endif
  28090. return 0;
  28091. }
  28092. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  28093. byte suite)
  28094. {
  28095. const CipherSuiteInfo* cipher_names = GetCipherNames();
  28096. int cipherSz = GetCipherNamesSize();
  28097. int i;
  28098. for (i = 0; i < cipherSz; i++)
  28099. if (cipher_names[i].cipherSuite0 == suite0 &&
  28100. cipher_names[i].cipherSuite == suite)
  28101. break;
  28102. if (i == cipherSz)
  28103. return 1;
  28104. /* Check min version */
  28105. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  28106. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  28107. cipher_names[i].minor >= TLSv1_MINOR)
  28108. /* 1.0 ciphersuites are in general available in 1.1 and
  28109. * 1.1 ciphersuites are in general available in 1.2 */
  28110. return 0;
  28111. return 1;
  28112. }
  28113. /* Check max version */
  28114. switch (cipher_names[i].minor) {
  28115. case SSLv3_MINOR :
  28116. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  28117. case TLSv1_MINOR :
  28118. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  28119. case TLSv1_1_MINOR :
  28120. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  28121. case TLSv1_2_MINOR :
  28122. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  28123. case TLSv1_3_MINOR :
  28124. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  28125. default:
  28126. WOLFSSL_MSG("Unrecognized minor version");
  28127. return 1;
  28128. }
  28129. }
  28130. /* returns a pointer to internal cipher suite list. Should not be free'd by
  28131. * caller.
  28132. */
  28133. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  28134. {
  28135. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  28136. Suites* suites;
  28137. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28138. const CipherSuiteInfo* cipher_names = GetCipherNames();
  28139. int cipherSz = GetCipherNamesSize();
  28140. #endif
  28141. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  28142. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  28143. return NULL;
  28144. }
  28145. if (ssl->suites != NULL) {
  28146. if (ssl->suites->suiteSz == 0 &&
  28147. InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
  28148. WOLFSSL_MSG("Suite initialization failure");
  28149. return NULL;
  28150. }
  28151. suites = ssl->suites;
  28152. }
  28153. else {
  28154. suites = ssl->ctx->suites;
  28155. }
  28156. /* check if stack needs populated */
  28157. if (suites->stack == NULL) {
  28158. int i;
  28159. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28160. int j;
  28161. /* higher priority of cipher suite will be on top of stack */
  28162. for (i = suites->suiteSz - 2; i >=0; i-=2) {
  28163. #else
  28164. for (i = 0; i < suites->suiteSz; i+=2) {
  28165. #endif
  28166. WOLFSSL_STACK* add;
  28167. /* A couple of suites are placeholders for special options,
  28168. * skip those. */
  28169. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  28170. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  28171. suites->suites[i+1])) {
  28172. continue;
  28173. }
  28174. add = wolfSSL_sk_new_node(ssl->heap);
  28175. if (add != NULL) {
  28176. add->type = STACK_TYPE_CIPHER;
  28177. add->data.cipher.cipherSuite0 = suites->suites[i];
  28178. add->data.cipher.cipherSuite = suites->suites[i+1];
  28179. add->data.cipher.ssl = ssl;
  28180. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  28181. for (j = 0; j < cipherSz; j++) {
  28182. if (cipher_names[j].cipherSuite0 ==
  28183. add->data.cipher.cipherSuite0 &&
  28184. cipher_names[j].cipherSuite ==
  28185. add->data.cipher.cipherSuite) {
  28186. add->data.cipher.offset = j;
  28187. break;
  28188. }
  28189. }
  28190. #endif
  28191. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  28192. /* in_stack is checked in wolfSSL_CIPHER_description */
  28193. add->data.cipher.in_stack = 1;
  28194. #endif
  28195. add->next = ret;
  28196. if (ret != NULL) {
  28197. add->num = ret->num + 1;
  28198. }
  28199. else {
  28200. add->num = 1;
  28201. }
  28202. ret = add;
  28203. }
  28204. }
  28205. suites->stack = ret;
  28206. }
  28207. return suites->stack;
  28208. }
  28209. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  28210. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  28211. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK)
  28212. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  28213. {
  28214. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  28215. if (ctx == NULL)
  28216. return 0;
  28217. return ctx->timeout;
  28218. }
  28219. /* returns the time in seconds of the current timeout */
  28220. long wolfSSL_get_timeout(WOLFSSL* ssl)
  28221. {
  28222. WOLFSSL_ENTER("wolfSSL_get_timeout");
  28223. if (ssl == NULL)
  28224. return 0;
  28225. return ssl->timeout;
  28226. }
  28227. #endif
  28228. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  28229. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  28230. #ifdef HAVE_ECC
  28231. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  28232. {
  28233. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  28234. if (ctx == NULL || ecdh == NULL)
  28235. return BAD_FUNC_ARG;
  28236. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  28237. return WOLFSSL_SUCCESS;
  28238. }
  28239. #endif
  28240. /* Assumes that the session passed in is from the cache. */
  28241. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  28242. {
  28243. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  28244. s = ClientSessionToSession(s);
  28245. if (ctx == NULL || s == NULL)
  28246. return BAD_FUNC_ARG;
  28247. #ifdef HAVE_EXT_CACHE
  28248. if (!ctx->internalCacheOff)
  28249. #endif
  28250. {
  28251. /* Don't remove session just timeout session. */
  28252. s->timeout = 0;
  28253. #ifndef NO_SESSION_CACHE
  28254. /* Clear the timeout in the cache */
  28255. {
  28256. int row;
  28257. int i;
  28258. SessionRow* sessRow = NULL;
  28259. WOLFSSL_SESSION *cacheSession;
  28260. const byte* id;
  28261. int ret = 0;
  28262. id = s->sessionID;
  28263. if (s->haveAltSessionID)
  28264. id = s->altSessionID;
  28265. row = (int)(HashSession(id, ID_LEN, &ret) % SESSION_ROWS);
  28266. if (ret != 0) {
  28267. WOLFSSL_MSG("Hash session failed");
  28268. return ret;
  28269. }
  28270. sessRow = &SessionCache[row];
  28271. if (SESSION_ROW_LOCK(sessRow) != 0) {
  28272. WOLFSSL_MSG("Session row lock failed");
  28273. return BAD_MUTEX_E;
  28274. }
  28275. for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) {
  28276. cacheSession = &sessRow->Sessions[i];
  28277. if (XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0) {
  28278. if (ctx->method->side != cacheSession->side)
  28279. continue;
  28280. cacheSession->timeout = 0;
  28281. #ifdef HAVE_EX_DATA
  28282. if (cacheSession->ownExData) {
  28283. /* Most recent version of ex data is in cache. Copy it
  28284. * over so the user can free it. */
  28285. XMEMCPY(&s->ex_data, &cacheSession->ex_data,
  28286. sizeof(WOLFSSL_CRYPTO_EX_DATA));
  28287. }
  28288. cacheSession->ownExData = 0; /* We clear below */
  28289. s->ownExData = 1;
  28290. #endif
  28291. break;
  28292. }
  28293. }
  28294. SESSION_ROW_UNLOCK(sessRow);
  28295. }
  28296. #endif
  28297. }
  28298. #if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA)
  28299. if (ctx->rem_sess_cb != NULL) {
  28300. ctx->rem_sess_cb(ctx, s);
  28301. }
  28302. #endif
  28303. return 0;
  28304. }
  28305. #ifndef NO_BIO
  28306. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  28307. {
  28308. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  28309. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  28310. * The setting buffer size doesn't do anything so return NULL for both.
  28311. */
  28312. if (s == NULL)
  28313. return NULL;
  28314. return s->biord;
  28315. }
  28316. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  28317. {
  28318. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  28319. (void)s;
  28320. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  28321. * The setting buffer size doesn't do anything so return NULL for both.
  28322. */
  28323. if (s == NULL)
  28324. return NULL;
  28325. return s->biowr;
  28326. }
  28327. #endif /* !NO_BIO */
  28328. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  28329. {
  28330. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  28331. if (s == NULL)
  28332. return WOLFSSL_FAILURE;
  28333. if (s->options.side == WOLFSSL_CLIENT_END) {
  28334. #ifndef NO_WOLFSSL_CLIENT
  28335. return wolfSSL_connect(s);
  28336. #else
  28337. WOLFSSL_MSG("Client not compiled in");
  28338. return WOLFSSL_FAILURE;
  28339. #endif
  28340. }
  28341. #ifndef NO_WOLFSSL_SERVER
  28342. return wolfSSL_accept(s);
  28343. #else
  28344. WOLFSSL_MSG("Server not compiled in");
  28345. return WOLFSSL_FAILURE;
  28346. #endif
  28347. }
  28348. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  28349. int wolfSSL_SSL_in_init(const WOLFSSL *ssl)
  28350. #else
  28351. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  28352. #endif
  28353. {
  28354. WOLFSSL_ENTER("SSL_in_init");
  28355. if (ssl == NULL)
  28356. return WOLFSSL_FAILURE;
  28357. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  28358. return ssl->options.connectState < SECOND_REPLY_DONE;
  28359. }
  28360. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  28361. }
  28362. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  28363. {
  28364. WOLFSSL_ENTER("SSL_connect_init");
  28365. if (ssl == NULL)
  28366. return WOLFSSL_FAILURE;
  28367. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  28368. return ssl->options.connectState > CONNECT_BEGIN &&
  28369. ssl->options.connectState < SECOND_REPLY_DONE;
  28370. }
  28371. return ssl->options.acceptState > ACCEPT_BEGIN &&
  28372. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  28373. }
  28374. #ifndef NO_SESSION_CACHE
  28375. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  28376. {
  28377. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  28378. return ssl->session;
  28379. }
  28380. #endif /* NO_SESSION_CACHE */
  28381. #ifndef NO_BIO
  28382. int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
  28383. char *buf, int size)
  28384. {
  28385. int readNextLine;
  28386. int lineLen;
  28387. int len;
  28388. byte isNumCheck;
  28389. word32 outLen;
  28390. const int extraTagSz = MAX_LENGTH_SZ + 1;
  28391. byte intTag[MAX_LENGTH_SZ + 1];
  28392. int idx = 0;
  28393. WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
  28394. if (!bio || !asn1 || !buf || size <= 0) {
  28395. WOLFSSL_MSG("Bad parameter");
  28396. return WOLFSSL_FAILURE;
  28397. }
  28398. /* Reset asn1 */
  28399. if (asn1->isDynamic && asn1->data) {
  28400. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  28401. }
  28402. XMEMSET(asn1->intData, 0, WOLFSSL_ASN1_INTEGER_MAX);
  28403. asn1->data = asn1->intData;
  28404. asn1->isDynamic = 0;
  28405. asn1->length = 0;
  28406. asn1->negative = 0;
  28407. asn1->type = V_ASN1_INTEGER;
  28408. lineLen = wolfSSL_BIO_gets(bio, buf, size);
  28409. do {
  28410. readNextLine = 0;
  28411. if (lineLen <= 0) {
  28412. WOLFSSL_MSG("wolfSSL_BIO_gets error");
  28413. return WOLFSSL_FAILURE;
  28414. }
  28415. while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
  28416. lineLen--;
  28417. if (buf[lineLen-1] == '\\')
  28418. readNextLine = 1;
  28419. /* Ignore none-hex chars at the end of the line */
  28420. outLen = 1;
  28421. while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
  28422. &isNumCheck, &outLen) == ASN_INPUT_E)
  28423. lineLen--;
  28424. if (!lineLen || lineLen % 2) {
  28425. WOLFSSL_MSG("Invalid line length");
  28426. return WOLFSSL_FAILURE;
  28427. }
  28428. len = asn1->length + (lineLen/2);
  28429. /* Check if it will fit in static memory and
  28430. * save space for the ASN tag in front */
  28431. if (len > (int)(WOLFSSL_ASN1_INTEGER_MAX - extraTagSz)) {
  28432. /* Allocate mem for data */
  28433. if (asn1->isDynamic) {
  28434. byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
  28435. DYNAMIC_TYPE_OPENSSL);
  28436. if (!tmp) {
  28437. WOLFSSL_MSG("realloc error");
  28438. return WOLFSSL_FAILURE;
  28439. }
  28440. asn1->data = tmp;
  28441. }
  28442. else {
  28443. /* Up to this point asn1->data pointed to asn1->intData.
  28444. * Now that the size has grown larger than intData can handle
  28445. * the asn1 structure moves to a dynamic type with isDynamic
  28446. * flag being set and asn1->data being malloc'd. */
  28447. asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  28448. DYNAMIC_TYPE_OPENSSL);
  28449. if (!asn1->data) {
  28450. WOLFSSL_MSG("malloc error");
  28451. return WOLFSSL_FAILURE;
  28452. }
  28453. asn1->isDynamic = 1;
  28454. XMEMCPY(asn1->data, asn1->intData, asn1->length);
  28455. }
  28456. }
  28457. len = lineLen/2;
  28458. if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
  28459. (word32*)&len) != 0) {
  28460. WOLFSSL_MSG("Base16_Decode error");
  28461. return WOLFSSL_FAILURE;
  28462. }
  28463. asn1->length += len;
  28464. } while (readNextLine);
  28465. /* Write ASN tag */
  28466. idx = SetASNInt(asn1->length, asn1->data[0], intTag);
  28467. XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
  28468. XMEMCPY(asn1->data, intTag, idx);
  28469. asn1->dataMax = asn1->length += idx;
  28470. return WOLFSSL_SUCCESS;
  28471. }
  28472. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  28473. {
  28474. word32 idx = 1;
  28475. int len = 0;
  28476. byte buf[512];
  28477. word32 bufLen = 512;
  28478. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  28479. if (bp == NULL || a == NULL)
  28480. return WOLFSSL_FAILURE;
  28481. /* Skip ASN.1 INTEGER (type) byte. */
  28482. if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
  28483. GetLength(a->data, &idx, &len, a->length) < 0) {
  28484. return 0;
  28485. }
  28486. /* Zero length integer is the value zero. */
  28487. if (len == 0) {
  28488. return wolfSSL_BIO_write(bp, "00", 2);
  28489. }
  28490. if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
  28491. bufLen == 0) {
  28492. return 0;
  28493. }
  28494. return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
  28495. }
  28496. #endif /* !NO_BIO */
  28497. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  28498. /* Expected return values from implementations of OpenSSL ticket key callback.
  28499. */
  28500. #define TICKET_KEY_CB_RET_FAILURE (-1)
  28501. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  28502. #define TICKET_KEY_CB_RET_OK 1
  28503. #define TICKET_KEY_CB_RET_RENEW 2
  28504. /* Implementation of session ticket encryption/decryption using OpenSSL
  28505. * callback to initialize the cipher and HMAC.
  28506. *
  28507. * ssl The SSL/TLS object.
  28508. * keyName The key name - used to identify the key to be used.
  28509. * iv The IV to use.
  28510. * mac The MAC of the encrypted data.
  28511. * enc Encrypt ticket.
  28512. * encTicket The ticket data.
  28513. * encTicketLen The length of the ticket data.
  28514. * encLen The encrypted/decrypted ticket length - output length.
  28515. * ctx Ignored. Application specific data.
  28516. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  28517. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  28518. * WOLFSSL_TICKET_RET_FATAL on error.
  28519. */
  28520. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  28521. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  28522. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  28523. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  28524. int enc, unsigned char* encTicket,
  28525. int encTicketLen, int* encLen, void* ctx)
  28526. {
  28527. byte digest[WC_MAX_DIGEST_SIZE];
  28528. #ifdef WOLFSSL_SMALL_STACK
  28529. WOLFSSL_EVP_CIPHER_CTX *evpCtx;
  28530. #else
  28531. WOLFSSL_EVP_CIPHER_CTX evpCtx[1];
  28532. #endif
  28533. WOLFSSL_HMAC_CTX hmacCtx;
  28534. unsigned int mdSz = 0;
  28535. int len = 0;
  28536. int ret = WOLFSSL_TICKET_RET_FATAL;
  28537. int res;
  28538. (void)ctx;
  28539. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  28540. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncWrapCb == NULL) {
  28541. WOLFSSL_MSG("Bad parameter");
  28542. return WOLFSSL_TICKET_RET_FATAL;
  28543. }
  28544. #ifdef WOLFSSL_SMALL_STACK
  28545. evpCtx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(sizeof(*evpCtx), ssl->heap,
  28546. DYNAMIC_TYPE_TMP_BUFFER);
  28547. if (evpCtx == NULL) {
  28548. WOLFSSL_MSG("out of memory");
  28549. return WOLFSSL_TICKET_RET_FATAL;
  28550. }
  28551. #endif
  28552. /* Initialize the cipher and HMAC. */
  28553. wolfSSL_EVP_CIPHER_CTX_init(evpCtx);
  28554. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  28555. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  28556. #ifdef WOLFSSL_SMALL_STACK
  28557. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28558. #endif
  28559. return WOLFSSL_TICKET_RET_FATAL;
  28560. }
  28561. res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
  28562. iv, evpCtx, &hmacCtx, enc);
  28563. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  28564. WOLFSSL_MSG("Ticket callback error");
  28565. ret = WOLFSSL_TICKET_RET_FATAL;
  28566. goto end;
  28567. }
  28568. if (enc)
  28569. {
  28570. /* Encrypt in place. */
  28571. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  28572. encTicket, encTicketLen))
  28573. goto end;
  28574. encTicketLen = len;
  28575. if (!wolfSSL_EVP_EncryptFinal(evpCtx, &encTicket[encTicketLen], &len))
  28576. goto end;
  28577. /* Total length of encrypted data. */
  28578. encTicketLen += len;
  28579. *encLen = encTicketLen;
  28580. /* HMAC the encrypted data into the parameter 'mac'. */
  28581. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  28582. goto end;
  28583. #ifdef WOLFSSL_SHA512
  28584. /* Check for SHA512, which would overrun the mac buffer */
  28585. if (hmacCtx.hmac.macType == WC_SHA512)
  28586. goto end;
  28587. #endif
  28588. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  28589. goto end;
  28590. }
  28591. else
  28592. {
  28593. /* HMAC the encrypted data and compare it to the passed in data. */
  28594. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  28595. goto end;
  28596. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  28597. goto end;
  28598. if (XMEMCMP(mac, digest, mdSz) != 0)
  28599. goto end;
  28600. /* Decrypt the ticket data in place. */
  28601. if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
  28602. encTicket, encTicketLen))
  28603. goto end;
  28604. encTicketLen = len;
  28605. if (!wolfSSL_EVP_DecryptFinal(evpCtx, &encTicket[encTicketLen], &len))
  28606. goto end;
  28607. /* Total length of decrypted data. */
  28608. *encLen = encTicketLen + len;
  28609. }
  28610. if (res == TICKET_KEY_CB_RET_RENEW && !IsAtLeastTLSv1_3(ssl->version)
  28611. && !enc)
  28612. ret = WOLFSSL_TICKET_RET_CREATE;
  28613. else
  28614. ret = WOLFSSL_TICKET_RET_OK;
  28615. end:
  28616. (void)wc_HmacFree(&hmacCtx.hmac);
  28617. #ifdef WOLFSSL_SMALL_STACK
  28618. XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28619. #endif
  28620. return ret;
  28621. }
  28622. /* Set the callback to use when encrypting/decrypting tickets.
  28623. *
  28624. * ctx The SSL/TLS context object.
  28625. * cb The OpenSSL session ticket callback.
  28626. * returns WOLFSSL_SUCCESS to indicate success.
  28627. */
  28628. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  28629. {
  28630. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  28631. * callback.
  28632. */
  28633. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  28634. ctx->ticketEncWrapCb = cb;
  28635. return WOLFSSL_SUCCESS;
  28636. }
  28637. #endif /* HAVE_SESSION_TICKET */
  28638. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  28639. OPENSSL_EXTRA || HAVE_LIGHTY */
  28640. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  28641. !defined(NO_WOLFSSL_SERVER)
  28642. /* Serialize the session ticket encryption keys.
  28643. *
  28644. * @param [in] ctx SSL/TLS context object.
  28645. * @param [in] keys Buffer to hold session ticket keys.
  28646. * @param [in] keylen Length of buffer.
  28647. * @return WOLFSSL_SUCCESS on success.
  28648. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  28649. * correct length.
  28650. */
  28651. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  28652. unsigned char *keys, int keylen)
  28653. {
  28654. if (ctx == NULL || keys == NULL) {
  28655. return WOLFSSL_FAILURE;
  28656. }
  28657. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  28658. return WOLFSSL_FAILURE;
  28659. }
  28660. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  28661. keys += WOLFSSL_TICKET_NAME_SZ;
  28662. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  28663. keys += WOLFSSL_TICKET_KEY_SZ;
  28664. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  28665. keys += WOLFSSL_TICKET_KEY_SZ;
  28666. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  28667. keys += OPAQUE32_LEN;
  28668. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  28669. return WOLFSSL_SUCCESS;
  28670. }
  28671. /* Deserialize the session ticket encryption keys.
  28672. *
  28673. * @param [in] ctx SSL/TLS context object.
  28674. * @param [in] keys Session ticket keys.
  28675. * @param [in] keylen Length of data.
  28676. * @return WOLFSSL_SUCCESS on success.
  28677. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  28678. * correct length.
  28679. */
  28680. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  28681. unsigned char *keys, int keylen)
  28682. {
  28683. if (ctx == NULL || keys == NULL) {
  28684. return WOLFSSL_FAILURE;
  28685. }
  28686. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  28687. return WOLFSSL_FAILURE;
  28688. }
  28689. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  28690. keys += WOLFSSL_TICKET_NAME_SZ;
  28691. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  28692. keys += WOLFSSL_TICKET_KEY_SZ;
  28693. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  28694. keys += WOLFSSL_TICKET_KEY_SZ;
  28695. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  28696. keys += OPAQUE32_LEN;
  28697. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  28698. return WOLFSSL_SUCCESS;
  28699. }
  28700. #endif
  28701. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  28702. #ifdef HAVE_OCSP
  28703. /* Not an OpenSSL API. */
  28704. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  28705. {
  28706. *response = ssl->ocspResp;
  28707. return ssl->ocspRespSz;
  28708. }
  28709. /* Not an OpenSSL API. */
  28710. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  28711. {
  28712. return ssl->url;
  28713. }
  28714. /* Not an OpenSSL API. */
  28715. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  28716. {
  28717. if (ssl == NULL)
  28718. return WOLFSSL_FAILURE;
  28719. ssl->url = url;
  28720. return WOLFSSL_SUCCESS;
  28721. }
  28722. #endif /* OCSP */
  28723. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  28724. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  28725. int wolfSSL_get_ocsp_producedDate(
  28726. WOLFSSL *ssl,
  28727. byte *producedDate,
  28728. size_t producedDate_space,
  28729. int *producedDateFormat)
  28730. {
  28731. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  28732. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  28733. return BAD_FUNC_ARG;
  28734. if ((producedDate == NULL) || (producedDateFormat == NULL))
  28735. return BAD_FUNC_ARG;
  28736. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  28737. return BUFFER_E;
  28738. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  28739. *producedDateFormat = ssl->ocspProducedDateFormat;
  28740. return 0;
  28741. }
  28742. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  28743. int idx = 0;
  28744. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  28745. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  28746. return BAD_FUNC_ARG;
  28747. if (produced_tm == NULL)
  28748. return BAD_FUNC_ARG;
  28749. if (ExtractDate(ssl->ocspProducedDate,
  28750. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  28751. return 0;
  28752. else
  28753. return ASN_PARSE_E;
  28754. }
  28755. #endif
  28756. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  28757. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  28758. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  28759. {
  28760. word32 idx;
  28761. word32 length;
  28762. WOLFSSL_STACK* node;
  28763. WOLFSSL_STACK* last = NULL;
  28764. if (ctx == NULL || chain == NULL) {
  28765. chain = NULL;
  28766. return WOLFSSL_FAILURE;
  28767. }
  28768. if (ctx->x509Chain != NULL) {
  28769. *chain = ctx->x509Chain;
  28770. return WOLFSSL_SUCCESS;
  28771. }
  28772. /* If there are no chains then success! */
  28773. *chain = NULL;
  28774. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  28775. return WOLFSSL_SUCCESS;
  28776. }
  28777. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  28778. for (idx = 0; idx < ctx->certChain->length; ) {
  28779. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  28780. DYNAMIC_TYPE_OPENSSL);
  28781. if (node == NULL)
  28782. return WOLFSSL_FAILURE;
  28783. node->next = NULL;
  28784. /* 3 byte length | X509 DER data */
  28785. ato24(ctx->certChain->buffer + idx, &length);
  28786. idx += 3;
  28787. /* Create a new X509 from DER encoded data. */
  28788. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  28789. length);
  28790. if (node->data.x509 == NULL) {
  28791. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  28792. /* Return as much of the chain as we created. */
  28793. ctx->x509Chain = *chain;
  28794. return WOLFSSL_FAILURE;
  28795. }
  28796. idx += length;
  28797. /* Add object to the end of the stack. */
  28798. if (last == NULL) {
  28799. node->num = 1;
  28800. *chain = node;
  28801. }
  28802. else {
  28803. (*chain)->num++;
  28804. last->next = node;
  28805. }
  28806. last = node;
  28807. }
  28808. ctx->x509Chain = *chain;
  28809. return WOLFSSL_SUCCESS;
  28810. }
  28811. int wolfSSL_CTX_get_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb* cb)
  28812. {
  28813. if (ctx == NULL || ctx->cm == NULL || cb == NULL)
  28814. return WOLFSSL_FAILURE;
  28815. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  28816. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  28817. if (ctx->cm->ocsp_stapling == NULL)
  28818. return WOLFSSL_FAILURE;
  28819. *cb = ctx->cm->ocsp_stapling->statusCb;
  28820. #else
  28821. (void)cb;
  28822. *cb = NULL;
  28823. #endif
  28824. return WOLFSSL_SUCCESS;
  28825. }
  28826. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb cb)
  28827. {
  28828. if (ctx == NULL || ctx->cm == NULL)
  28829. return WOLFSSL_FAILURE;
  28830. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  28831. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  28832. /* Ensure stapling is on for callback to be used. */
  28833. wolfSSL_CTX_EnableOCSPStapling(ctx);
  28834. if (ctx->cm->ocsp_stapling == NULL)
  28835. return WOLFSSL_FAILURE;
  28836. ctx->cm->ocsp_stapling->statusCb = cb;
  28837. #else
  28838. (void)cb;
  28839. #endif
  28840. return WOLFSSL_SUCCESS;
  28841. }
  28842. int wolfSSL_CTX_get0_chain_certs(WOLFSSL_CTX *ctx,
  28843. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  28844. {
  28845. WOLFSSL_ENTER("wolfSSL_CTX_get0_chain_certs");
  28846. if (ctx == NULL || sk == NULL) {
  28847. WOLFSSL_MSG("Bad parameter");
  28848. return WOLFSSL_FAILURE;
  28849. }
  28850. *sk = ctx->x509Chain;
  28851. return WOLFSSL_SUCCESS;
  28852. }
  28853. #ifdef KEEP_OUR_CERT
  28854. int wolfSSL_get0_chain_certs(WOLFSSL *ssl,
  28855. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  28856. {
  28857. WOLFSSL_ENTER("wolfSSL_get0_chain_certs");
  28858. if (ssl == NULL || sk == NULL) {
  28859. WOLFSSL_MSG("Bad parameter");
  28860. return WOLFSSL_FAILURE;
  28861. }
  28862. *sk = ssl->ourCertChain;
  28863. return WOLFSSL_SUCCESS;
  28864. }
  28865. #endif
  28866. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  28867. {
  28868. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  28869. if (ret) {
  28870. ret->type = STACK_TYPE_STRING;
  28871. }
  28872. return ret;
  28873. }
  28874. void wolfSSL_WOLFSSL_STRING_free(WOLFSSL_STRING s)
  28875. {
  28876. WOLFSSL_ENTER("wolfSSL_WOLFSSL_STRING_free");
  28877. if (s != NULL)
  28878. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  28879. }
  28880. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  28881. {
  28882. WOLFSSL_STACK* tmp;
  28883. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  28884. if (sk == NULL)
  28885. return;
  28886. /* parse through stack freeing each node */
  28887. while (sk) {
  28888. tmp = sk->next;
  28889. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  28890. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  28891. sk = tmp;
  28892. }
  28893. }
  28894. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  28895. int idx)
  28896. {
  28897. for (; idx > 0 && strings != NULL; idx--)
  28898. strings = strings->next;
  28899. if (strings == NULL)
  28900. return NULL;
  28901. return strings->data.string;
  28902. }
  28903. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  28904. {
  28905. if (strings)
  28906. return (int)strings->num;
  28907. return 0;
  28908. }
  28909. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  28910. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  28911. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) || \
  28912. defined(WOLFSSL_QUIC)
  28913. #ifdef HAVE_ALPN
  28914. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  28915. unsigned int *len)
  28916. {
  28917. word16 nameLen;
  28918. if (ssl != NULL && data != NULL && len != NULL) {
  28919. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  28920. *len = nameLen;
  28921. }
  28922. }
  28923. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  28924. const unsigned char *in, unsigned int inLen,
  28925. const unsigned char *clientNames,
  28926. unsigned int clientLen)
  28927. {
  28928. unsigned int i, j;
  28929. byte lenIn, lenClient;
  28930. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  28931. return OPENSSL_NPN_UNSUPPORTED;
  28932. for (i = 0; i < inLen; i += lenIn) {
  28933. lenIn = in[i++];
  28934. for (j = 0; j < clientLen; j += lenClient) {
  28935. lenClient = clientNames[j++];
  28936. if (lenIn != lenClient)
  28937. continue;
  28938. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  28939. *out = (unsigned char *)(in + i);
  28940. *outLen = lenIn;
  28941. return OPENSSL_NPN_NEGOTIATED;
  28942. }
  28943. }
  28944. }
  28945. *out = (unsigned char *)clientNames + 1;
  28946. *outLen = clientNames[0];
  28947. return OPENSSL_NPN_NO_OVERLAP;
  28948. }
  28949. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  28950. int (*cb) (WOLFSSL *ssl,
  28951. const unsigned char **out,
  28952. unsigned char *outlen,
  28953. const unsigned char *in,
  28954. unsigned int inlen,
  28955. void *arg), void *arg)
  28956. {
  28957. if (ctx != NULL) {
  28958. ctx->alpnSelect = cb;
  28959. ctx->alpnSelectArg = arg;
  28960. }
  28961. }
  28962. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  28963. int (*cb) (WOLFSSL *ssl,
  28964. const unsigned char
  28965. **out,
  28966. unsigned int *outlen,
  28967. void *arg), void *arg)
  28968. {
  28969. (void)s;
  28970. (void)cb;
  28971. (void)arg;
  28972. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  28973. }
  28974. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  28975. int (*cb) (WOLFSSL *ssl,
  28976. unsigned char **out,
  28977. unsigned char *outlen,
  28978. const unsigned char *in,
  28979. unsigned int inlen,
  28980. void *arg), void *arg)
  28981. {
  28982. (void)s;
  28983. (void)cb;
  28984. (void)arg;
  28985. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  28986. }
  28987. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  28988. unsigned *len)
  28989. {
  28990. (void)s;
  28991. (void)data;
  28992. (void)len;
  28993. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  28994. }
  28995. #endif /* HAVE_ALPN */
  28996. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  28997. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  28998. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  28999. {
  29000. int idx, start = 0, len;
  29001. word16 curve;
  29002. char name[MAX_CURVE_NAME_SZ];
  29003. if (ctx == NULL || names == NULL) {
  29004. WOLFSSL_MSG("ctx or names was NULL");
  29005. return WOLFSSL_FAILURE;
  29006. }
  29007. /* Disable all curves so that only the ones the user wants are enabled. */
  29008. ctx->disabledCurves = 0xFFFFFFFFUL;
  29009. for (idx = 1; names[idx-1] != '\0'; idx++) {
  29010. if (names[idx] != ':' && names[idx] != '\0')
  29011. continue;
  29012. len = idx - start;
  29013. if (len > MAX_CURVE_NAME_SZ - 1)
  29014. return WOLFSSL_FAILURE;
  29015. XMEMCPY(name, names + start, len);
  29016. name[len] = 0;
  29017. if ((XSTRCMP(name, "prime256v1") == 0) ||
  29018. (XSTRCMP(name, "secp256r1") == 0) ||
  29019. (XSTRCMP(name, "P-256") == 0))
  29020. {
  29021. curve = WOLFSSL_ECC_SECP256R1;
  29022. }
  29023. else if ((XSTRCMP(name, "secp384r1") == 0) ||
  29024. (XSTRCMP(name, "P-384") == 0))
  29025. {
  29026. curve = WOLFSSL_ECC_SECP384R1;
  29027. }
  29028. else if ((XSTRCMP(name, "secp521r1") == 0) ||
  29029. (XSTRCMP(name, "P-521") == 0))
  29030. {
  29031. curve = WOLFSSL_ECC_SECP521R1;
  29032. }
  29033. else if (XSTRCMP(name, "X25519") == 0)
  29034. {
  29035. curve = WOLFSSL_ECC_X25519;
  29036. }
  29037. else if (XSTRCMP(name, "X448") == 0)
  29038. {
  29039. curve = WOLFSSL_ECC_X448;
  29040. }
  29041. else {
  29042. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  29043. int ret;
  29044. const ecc_set_type *eccSet;
  29045. ret = wc_ecc_get_curve_idx_from_name(name);
  29046. if (ret < 0) {
  29047. WOLFSSL_MSG("Could not find name in set");
  29048. return WOLFSSL_FAILURE;
  29049. }
  29050. eccSet = wc_ecc_get_curve_params(ret);
  29051. if (eccSet == NULL) {
  29052. WOLFSSL_MSG("NULL set returned");
  29053. return WOLFSSL_FAILURE;
  29054. }
  29055. curve = GetCurveByOID(eccSet->oidSum);
  29056. #else
  29057. WOLFSSL_MSG("API not present to search farther using name");
  29058. return WOLFSSL_FAILURE;
  29059. #endif
  29060. }
  29061. if (curve >= (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  29062. /* shift left more than size of ctx->disabledCurves causes static
  29063. * analysis report */
  29064. WOLFSSL_MSG("curve value is too large for upcoming shift");
  29065. return WOLFSSL_FAILURE;
  29066. }
  29067. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  29068. /* set the supported curve so client TLS extension contains only the
  29069. * desired curves */
  29070. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  29071. WOLFSSL_MSG("Unable to set supported curve");
  29072. return WOLFSSL_FAILURE;
  29073. }
  29074. #endif
  29075. /* Switch the bit to off and therefore is enabled. */
  29076. ctx->disabledCurves &= ~(1U << curve);
  29077. start = idx + 1;
  29078. }
  29079. return WOLFSSL_SUCCESS;
  29080. }
  29081. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  29082. {
  29083. if (ssl == NULL) {
  29084. return WOLFSSL_FAILURE;
  29085. }
  29086. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  29087. }
  29088. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  29089. #ifdef OPENSSL_EXTRA
  29090. /* Sets a callback for when sending and receiving protocol messages.
  29091. * This callback is copied to all WOLFSSL objects created from the ctx.
  29092. *
  29093. * ctx WOLFSSL_CTX structure to set callback in
  29094. * cb callback to use
  29095. *
  29096. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  29097. */
  29098. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  29099. {
  29100. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback");
  29101. if (ctx == NULL) {
  29102. WOLFSSL_MSG("Null ctx passed in");
  29103. return WOLFSSL_FAILURE;
  29104. }
  29105. ctx->protoMsgCb = cb;
  29106. return WOLFSSL_SUCCESS;
  29107. }
  29108. /* Sets a callback for when sending and receiving protocol messages.
  29109. *
  29110. * ssl WOLFSSL structure to set callback in
  29111. * cb callback to use
  29112. *
  29113. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  29114. */
  29115. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  29116. {
  29117. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  29118. if (ssl == NULL) {
  29119. return SSL_FAILURE;
  29120. }
  29121. if (cb != NULL) {
  29122. ssl->toInfoOn = 1;
  29123. }
  29124. ssl->protoMsgCb = cb;
  29125. return WOLFSSL_SUCCESS;
  29126. }
  29127. /* set the user argument to pass to the msg callback when called
  29128. * return WOLFSSL_SUCCESS on success */
  29129. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  29130. {
  29131. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback_arg");
  29132. if (ctx == NULL) {
  29133. WOLFSSL_MSG("Null WOLFSSL_CTX passed in");
  29134. return WOLFSSL_FAILURE;
  29135. }
  29136. ctx->protoMsgCtx = arg;
  29137. return WOLFSSL_SUCCESS;
  29138. }
  29139. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  29140. {
  29141. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  29142. if (ssl == NULL)
  29143. return WOLFSSL_FAILURE;
  29144. ssl->protoMsgCtx = arg;
  29145. return WOLFSSL_SUCCESS;
  29146. }
  29147. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  29148. {
  29149. void *ret;
  29150. (void)file;
  29151. (void)line;
  29152. if (data == NULL || siz >= INT_MAX)
  29153. return NULL;
  29154. ret = OPENSSL_malloc(siz);
  29155. if (ret == NULL) {
  29156. return NULL;
  29157. }
  29158. return XMEMCPY(ret, data, siz);
  29159. }
  29160. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  29161. {
  29162. if (ptr)
  29163. ForceZero(ptr, (word32)len);
  29164. }
  29165. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  29166. unsigned int p_len)
  29167. {
  29168. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  29169. if (ctx == NULL)
  29170. return BAD_FUNC_ARG;
  29171. if (ctx->alpn_cli_protos != NULL) {
  29172. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  29173. }
  29174. ctx->alpn_cli_protos = (const unsigned char*)XMALLOC(p_len,
  29175. ctx->heap, DYNAMIC_TYPE_OPENSSL);
  29176. if (ctx->alpn_cli_protos == NULL) {
  29177. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29178. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29179. * the function reverses the return value convention.
  29180. */
  29181. return 1;
  29182. #else
  29183. return WOLFSSL_FAILURE;
  29184. #endif
  29185. }
  29186. XMEMCPY((void*)ctx->alpn_cli_protos, p, p_len);
  29187. ctx->alpn_cli_protos_len = p_len;
  29188. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29189. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29190. * the function reverses the return value convention.
  29191. */
  29192. return 0;
  29193. #else
  29194. return WOLFSSL_SUCCESS;
  29195. #endif
  29196. }
  29197. #ifdef HAVE_ALPN
  29198. #ifndef NO_BIO
  29199. /* Sets the ALPN extension protos
  29200. *
  29201. * example format is
  29202. * unsigned char p[] = {
  29203. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  29204. * };
  29205. *
  29206. * returns WOLFSSL_SUCCESS on success */
  29207. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  29208. const unsigned char* p, unsigned int p_len)
  29209. {
  29210. WOLFSSL_BIO* bio;
  29211. char* pt;
  29212. unsigned int sz;
  29213. unsigned int idx = 0;
  29214. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  29215. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  29216. if (ssl == NULL || p_len <= 1) {
  29217. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29218. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29219. * the function reverses the return value convention.
  29220. */
  29221. return 1;
  29222. #else
  29223. return WOLFSSL_FAILURE;
  29224. #endif
  29225. }
  29226. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  29227. if (bio == NULL) {
  29228. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29229. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29230. * the function reverses the return value convention.
  29231. */
  29232. return 1;
  29233. #else
  29234. return WOLFSSL_FAILURE;
  29235. #endif
  29236. }
  29237. /* convert into comma separated list */
  29238. while (idx < p_len - 1) {
  29239. unsigned int i;
  29240. sz = p[idx++];
  29241. if (idx + sz > p_len) {
  29242. WOLFSSL_MSG("Bad list format");
  29243. wolfSSL_BIO_free(bio);
  29244. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29245. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29246. * the function reverses the return value convention.
  29247. */
  29248. return 1;
  29249. #else
  29250. return WOLFSSL_FAILURE;
  29251. #endif
  29252. }
  29253. if (sz > 0) {
  29254. for (i = 0; i < sz; i++) {
  29255. wolfSSL_BIO_write(bio, &p[idx++], 1);
  29256. }
  29257. if (idx < p_len - 1)
  29258. wolfSSL_BIO_write(bio, ",", 1);
  29259. }
  29260. }
  29261. wolfSSL_BIO_write(bio, "\0", 1);
  29262. /* clears out all current ALPN extensions set */
  29263. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  29264. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  29265. wolfSSL_UseALPN(ssl, pt, sz, (byte) alpn_opt);
  29266. }
  29267. wolfSSL_BIO_free(bio);
  29268. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  29269. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  29270. * the function reverses the return value convention.
  29271. */
  29272. return 0;
  29273. #else
  29274. return WOLFSSL_SUCCESS;
  29275. #endif
  29276. }
  29277. #endif /* !NO_BIO */
  29278. #endif /* HAVE_ALPN */
  29279. #endif /* OPENSSL_EXTRA */
  29280. #if defined(OPENSSL_EXTRA)
  29281. #ifndef NO_BIO
  29282. #define WOLFSSL_BIO_INCLUDED
  29283. #include "src/bio.c"
  29284. #endif
  29285. word32 nid2oid(int nid, int grp)
  29286. {
  29287. /* get OID type */
  29288. switch (grp) {
  29289. /* oidHashType */
  29290. case oidHashType:
  29291. switch (nid) {
  29292. #ifdef WOLFSSL_MD2
  29293. case NID_md2:
  29294. return MD2h;
  29295. #endif
  29296. #ifndef NO_MD5
  29297. case NID_md5:
  29298. return MD5h;
  29299. #endif
  29300. #ifndef NO_SHA
  29301. case NID_sha1:
  29302. return SHAh;
  29303. #endif
  29304. case NID_sha224:
  29305. return SHA224h;
  29306. #ifndef NO_SHA256
  29307. case NID_sha256:
  29308. return SHA256h;
  29309. #endif
  29310. #ifdef WOLFSSL_SHA384
  29311. case NID_sha384:
  29312. return SHA384h;
  29313. #endif
  29314. #ifdef WOLFSSL_SHA512
  29315. case NID_sha512:
  29316. return SHA512h;
  29317. #endif
  29318. #ifndef WOLFSSL_NOSHA3_224
  29319. case NID_sha3_224:
  29320. return SHA3_224h;
  29321. #endif
  29322. #ifndef WOLFSSL_NOSHA3_256
  29323. case NID_sha3_256:
  29324. return SHA3_256h;
  29325. #endif
  29326. #ifndef WOLFSSL_NOSHA3_384
  29327. case NID_sha3_384:
  29328. return SHA3_384h;
  29329. #endif
  29330. #ifndef WOLFSSL_NOSHA3_512
  29331. case NID_sha3_512:
  29332. return SHA3_512h;
  29333. #endif
  29334. }
  29335. break;
  29336. /* oidSigType */
  29337. case oidSigType:
  29338. switch (nid) {
  29339. #ifndef NO_DSA
  29340. case NID_dsaWithSHA1:
  29341. return CTC_SHAwDSA;
  29342. case NID_dsa_with_SHA256:
  29343. return CTC_SHA256wDSA;
  29344. #endif /* NO_DSA */
  29345. #ifndef NO_RSA
  29346. case NID_md2WithRSAEncryption:
  29347. return CTC_MD2wRSA;
  29348. case NID_md5WithRSAEncryption:
  29349. return CTC_MD5wRSA;
  29350. case NID_sha1WithRSAEncryption:
  29351. return CTC_SHAwRSA;
  29352. case NID_sha224WithRSAEncryption:
  29353. return CTC_SHA224wRSA;
  29354. case NID_sha256WithRSAEncryption:
  29355. return CTC_SHA256wRSA;
  29356. case NID_sha384WithRSAEncryption:
  29357. return CTC_SHA384wRSA;
  29358. case NID_sha512WithRSAEncryption:
  29359. return CTC_SHA512wRSA;
  29360. #ifdef WOLFSSL_SHA3
  29361. case NID_RSA_SHA3_224:
  29362. return CTC_SHA3_224wRSA;
  29363. case NID_RSA_SHA3_256:
  29364. return CTC_SHA3_256wRSA;
  29365. case NID_RSA_SHA3_384:
  29366. return CTC_SHA3_384wRSA;
  29367. case NID_RSA_SHA3_512:
  29368. return CTC_SHA3_512wRSA;
  29369. #endif
  29370. #endif /* NO_RSA */
  29371. #ifdef HAVE_ECC
  29372. case NID_ecdsa_with_SHA1:
  29373. return CTC_SHAwECDSA;
  29374. case NID_ecdsa_with_SHA224:
  29375. return CTC_SHA224wECDSA;
  29376. case NID_ecdsa_with_SHA256:
  29377. return CTC_SHA256wECDSA;
  29378. case NID_ecdsa_with_SHA384:
  29379. return CTC_SHA384wECDSA;
  29380. case NID_ecdsa_with_SHA512:
  29381. return CTC_SHA512wECDSA;
  29382. #ifdef WOLFSSL_SHA3
  29383. case NID_ecdsa_with_SHA3_224:
  29384. return CTC_SHA3_224wECDSA;
  29385. case NID_ecdsa_with_SHA3_256:
  29386. return CTC_SHA3_256wECDSA;
  29387. case NID_ecdsa_with_SHA3_384:
  29388. return CTC_SHA3_384wECDSA;
  29389. case NID_ecdsa_with_SHA3_512:
  29390. return CTC_SHA3_512wECDSA;
  29391. #endif
  29392. #endif /* HAVE_ECC */
  29393. }
  29394. break;
  29395. /* oidKeyType */
  29396. case oidKeyType:
  29397. switch (nid) {
  29398. #ifndef NO_DSA
  29399. case NID_dsa:
  29400. return DSAk;
  29401. #endif /* NO_DSA */
  29402. #ifndef NO_RSA
  29403. case NID_rsaEncryption:
  29404. return RSAk;
  29405. #endif /* NO_RSA */
  29406. #ifdef HAVE_ECC
  29407. case NID_X9_62_id_ecPublicKey:
  29408. return ECDSAk;
  29409. #endif /* HAVE_ECC */
  29410. }
  29411. break;
  29412. #ifdef HAVE_ECC
  29413. case oidCurveType:
  29414. switch (nid) {
  29415. case NID_X9_62_prime192v1:
  29416. return ECC_SECP192R1_OID;
  29417. case NID_X9_62_prime192v2:
  29418. return ECC_PRIME192V2_OID;
  29419. case NID_X9_62_prime192v3:
  29420. return ECC_PRIME192V3_OID;
  29421. case NID_X9_62_prime239v1:
  29422. return ECC_PRIME239V1_OID;
  29423. case NID_X9_62_prime239v2:
  29424. return ECC_PRIME239V2_OID;
  29425. case NID_X9_62_prime239v3:
  29426. return ECC_PRIME239V3_OID;
  29427. case NID_X9_62_prime256v1:
  29428. return ECC_SECP256R1_OID;
  29429. case NID_secp112r1:
  29430. return ECC_SECP112R1_OID;
  29431. case NID_secp112r2:
  29432. return ECC_SECP112R2_OID;
  29433. case NID_secp128r1:
  29434. return ECC_SECP128R1_OID;
  29435. case NID_secp128r2:
  29436. return ECC_SECP128R2_OID;
  29437. case NID_secp160r1:
  29438. return ECC_SECP160R1_OID;
  29439. case NID_secp160r2:
  29440. return ECC_SECP160R2_OID;
  29441. case NID_secp224r1:
  29442. return ECC_SECP224R1_OID;
  29443. case NID_secp384r1:
  29444. return ECC_SECP384R1_OID;
  29445. case NID_secp521r1:
  29446. return ECC_SECP521R1_OID;
  29447. case NID_secp160k1:
  29448. return ECC_SECP160K1_OID;
  29449. case NID_secp192k1:
  29450. return ECC_SECP192K1_OID;
  29451. case NID_secp224k1:
  29452. return ECC_SECP224K1_OID;
  29453. case NID_secp256k1:
  29454. return ECC_SECP256K1_OID;
  29455. case NID_brainpoolP160r1:
  29456. return ECC_BRAINPOOLP160R1_OID;
  29457. case NID_brainpoolP192r1:
  29458. return ECC_BRAINPOOLP192R1_OID;
  29459. case NID_brainpoolP224r1:
  29460. return ECC_BRAINPOOLP224R1_OID;
  29461. case NID_brainpoolP256r1:
  29462. return ECC_BRAINPOOLP256R1_OID;
  29463. case NID_brainpoolP320r1:
  29464. return ECC_BRAINPOOLP320R1_OID;
  29465. case NID_brainpoolP384r1:
  29466. return ECC_BRAINPOOLP384R1_OID;
  29467. case NID_brainpoolP512r1:
  29468. return ECC_BRAINPOOLP512R1_OID;
  29469. }
  29470. break;
  29471. #endif /* HAVE_ECC */
  29472. /* oidBlkType */
  29473. case oidBlkType:
  29474. switch (nid) {
  29475. #ifdef WOLFSSL_AES_128
  29476. case AES128CBCb:
  29477. return AES128CBCb;
  29478. #endif
  29479. #ifdef WOLFSSL_AES_192
  29480. case AES192CBCb:
  29481. return AES192CBCb;
  29482. #endif
  29483. #ifdef WOLFSSL_AES_256
  29484. case AES256CBCb:
  29485. return AES256CBCb;
  29486. #endif
  29487. #ifndef NO_DES3
  29488. case NID_des:
  29489. return DESb;
  29490. case NID_des3:
  29491. return DES3b;
  29492. #endif
  29493. }
  29494. break;
  29495. #ifdef HAVE_OCSP
  29496. case oidOcspType:
  29497. switch (nid) {
  29498. case NID_id_pkix_OCSP_basic:
  29499. return OCSP_BASIC_OID;
  29500. case OCSP_NONCE_OID:
  29501. return OCSP_NONCE_OID;
  29502. }
  29503. break;
  29504. #endif /* HAVE_OCSP */
  29505. /* oidCertExtType */
  29506. case oidCertExtType:
  29507. switch (nid) {
  29508. case NID_basic_constraints:
  29509. return BASIC_CA_OID;
  29510. case NID_subject_alt_name:
  29511. return ALT_NAMES_OID;
  29512. case NID_crl_distribution_points:
  29513. return CRL_DIST_OID;
  29514. case NID_info_access:
  29515. return AUTH_INFO_OID;
  29516. case NID_authority_key_identifier:
  29517. return AUTH_KEY_OID;
  29518. case NID_subject_key_identifier:
  29519. return SUBJ_KEY_OID;
  29520. case NID_inhibit_any_policy:
  29521. return INHIBIT_ANY_OID;
  29522. case NID_key_usage:
  29523. return KEY_USAGE_OID;
  29524. case NID_name_constraints:
  29525. return NAME_CONS_OID;
  29526. case NID_certificate_policies:
  29527. return CERT_POLICY_OID;
  29528. case NID_ext_key_usage:
  29529. return EXT_KEY_USAGE_OID;
  29530. }
  29531. break;
  29532. /* oidCertAuthInfoType */
  29533. case oidCertAuthInfoType:
  29534. switch (nid) {
  29535. case NID_ad_OCSP:
  29536. return AIA_OCSP_OID;
  29537. case NID_ad_ca_issuers:
  29538. return AIA_CA_ISSUER_OID;
  29539. }
  29540. break;
  29541. /* oidCertPolicyType */
  29542. case oidCertPolicyType:
  29543. switch (nid) {
  29544. case NID_any_policy:
  29545. return CP_ANY_OID;
  29546. }
  29547. break;
  29548. /* oidCertAltNameType */
  29549. case oidCertAltNameType:
  29550. switch (nid) {
  29551. case NID_hw_name_oid:
  29552. return HW_NAME_OID;
  29553. }
  29554. break;
  29555. /* oidCertKeyUseType */
  29556. case oidCertKeyUseType:
  29557. switch (nid) {
  29558. case NID_anyExtendedKeyUsage:
  29559. return EKU_ANY_OID;
  29560. case EKU_SERVER_AUTH_OID:
  29561. return EKU_SERVER_AUTH_OID;
  29562. case EKU_CLIENT_AUTH_OID:
  29563. return EKU_CLIENT_AUTH_OID;
  29564. case EKU_OCSP_SIGN_OID:
  29565. return EKU_OCSP_SIGN_OID;
  29566. }
  29567. break;
  29568. /* oidKdfType */
  29569. case oidKdfType:
  29570. switch (nid) {
  29571. case PBKDF2_OID:
  29572. return PBKDF2_OID;
  29573. }
  29574. break;
  29575. /* oidPBEType */
  29576. case oidPBEType:
  29577. switch (nid) {
  29578. case PBE_SHA1_RC4_128:
  29579. return PBE_SHA1_RC4_128;
  29580. case PBE_SHA1_DES:
  29581. return PBE_SHA1_DES;
  29582. case PBE_SHA1_DES3:
  29583. return PBE_SHA1_DES3;
  29584. }
  29585. break;
  29586. /* oidKeyWrapType */
  29587. case oidKeyWrapType:
  29588. switch (nid) {
  29589. #ifdef WOLFSSL_AES_128
  29590. case AES128_WRAP:
  29591. return AES128_WRAP;
  29592. #endif
  29593. #ifdef WOLFSSL_AES_192
  29594. case AES192_WRAP:
  29595. return AES192_WRAP;
  29596. #endif
  29597. #ifdef WOLFSSL_AES_256
  29598. case AES256_WRAP:
  29599. return AES256_WRAP;
  29600. #endif
  29601. }
  29602. break;
  29603. /* oidCmsKeyAgreeType */
  29604. case oidCmsKeyAgreeType:
  29605. switch (nid) {
  29606. #ifndef NO_SHA
  29607. case dhSinglePass_stdDH_sha1kdf_scheme:
  29608. return dhSinglePass_stdDH_sha1kdf_scheme;
  29609. #endif
  29610. #ifdef WOLFSSL_SHA224
  29611. case dhSinglePass_stdDH_sha224kdf_scheme:
  29612. return dhSinglePass_stdDH_sha224kdf_scheme;
  29613. #endif
  29614. #ifndef NO_SHA256
  29615. case dhSinglePass_stdDH_sha256kdf_scheme:
  29616. return dhSinglePass_stdDH_sha256kdf_scheme;
  29617. #endif
  29618. #ifdef WOLFSSL_SHA384
  29619. case dhSinglePass_stdDH_sha384kdf_scheme:
  29620. return dhSinglePass_stdDH_sha384kdf_scheme;
  29621. #endif
  29622. #ifdef WOLFSSL_SHA512
  29623. case dhSinglePass_stdDH_sha512kdf_scheme:
  29624. return dhSinglePass_stdDH_sha512kdf_scheme;
  29625. #endif
  29626. }
  29627. break;
  29628. default:
  29629. WOLFSSL_MSG("NID not in table");
  29630. /* MSVC warns without the cast */
  29631. return (word32)-1;
  29632. }
  29633. /* MSVC warns without the cast */
  29634. return (word32)-1;
  29635. }
  29636. int oid2nid(word32 oid, int grp)
  29637. {
  29638. size_t i;
  29639. /* get OID type */
  29640. switch (grp) {
  29641. /* oidHashType */
  29642. case oidHashType:
  29643. switch (oid) {
  29644. #ifdef WOLFSSL_MD2
  29645. case MD2h:
  29646. return NID_md2;
  29647. #endif
  29648. #ifndef NO_MD5
  29649. case MD5h:
  29650. return NID_md5;
  29651. #endif
  29652. #ifndef NO_SHA
  29653. case SHAh:
  29654. return NID_sha1;
  29655. #endif
  29656. case SHA224h:
  29657. return NID_sha224;
  29658. #ifndef NO_SHA256
  29659. case SHA256h:
  29660. return NID_sha256;
  29661. #endif
  29662. #ifdef WOLFSSL_SHA384
  29663. case SHA384h:
  29664. return NID_sha384;
  29665. #endif
  29666. #ifdef WOLFSSL_SHA512
  29667. case SHA512h:
  29668. return NID_sha512;
  29669. #endif
  29670. }
  29671. break;
  29672. /* oidSigType */
  29673. case oidSigType:
  29674. switch (oid) {
  29675. #ifndef NO_DSA
  29676. case CTC_SHAwDSA:
  29677. return NID_dsaWithSHA1;
  29678. case CTC_SHA256wDSA:
  29679. return NID_dsa_with_SHA256;
  29680. #endif /* NO_DSA */
  29681. #ifndef NO_RSA
  29682. case CTC_MD2wRSA:
  29683. return NID_md2WithRSAEncryption;
  29684. case CTC_MD5wRSA:
  29685. return NID_md5WithRSAEncryption;
  29686. case CTC_SHAwRSA:
  29687. return NID_sha1WithRSAEncryption;
  29688. case CTC_SHA224wRSA:
  29689. return NID_sha224WithRSAEncryption;
  29690. case CTC_SHA256wRSA:
  29691. return NID_sha256WithRSAEncryption;
  29692. case CTC_SHA384wRSA:
  29693. return NID_sha384WithRSAEncryption;
  29694. case CTC_SHA512wRSA:
  29695. return NID_sha512WithRSAEncryption;
  29696. #ifdef WOLFSSL_SHA3
  29697. case CTC_SHA3_224wRSA:
  29698. return NID_RSA_SHA3_224;
  29699. case CTC_SHA3_256wRSA:
  29700. return NID_RSA_SHA3_256;
  29701. case CTC_SHA3_384wRSA:
  29702. return NID_RSA_SHA3_384;
  29703. case CTC_SHA3_512wRSA:
  29704. return NID_RSA_SHA3_512;
  29705. #endif
  29706. #endif /* NO_RSA */
  29707. #ifdef HAVE_ECC
  29708. case CTC_SHAwECDSA:
  29709. return NID_ecdsa_with_SHA1;
  29710. case CTC_SHA224wECDSA:
  29711. return NID_ecdsa_with_SHA224;
  29712. case CTC_SHA256wECDSA:
  29713. return NID_ecdsa_with_SHA256;
  29714. case CTC_SHA384wECDSA:
  29715. return NID_ecdsa_with_SHA384;
  29716. case CTC_SHA512wECDSA:
  29717. return NID_ecdsa_with_SHA512;
  29718. #ifdef WOLFSSL_SHA3
  29719. case CTC_SHA3_224wECDSA:
  29720. return NID_ecdsa_with_SHA3_224;
  29721. case CTC_SHA3_256wECDSA:
  29722. return NID_ecdsa_with_SHA3_256;
  29723. case CTC_SHA3_384wECDSA:
  29724. return NID_ecdsa_with_SHA3_384;
  29725. case CTC_SHA3_512wECDSA:
  29726. return NID_ecdsa_with_SHA3_512;
  29727. #endif
  29728. #endif /* HAVE_ECC */
  29729. }
  29730. break;
  29731. /* oidKeyType */
  29732. case oidKeyType:
  29733. switch (oid) {
  29734. #ifndef NO_DSA
  29735. case DSAk:
  29736. return NID_dsa;
  29737. #endif /* NO_DSA */
  29738. #ifndef NO_RSA
  29739. case RSAk:
  29740. return NID_rsaEncryption;
  29741. #endif /* NO_RSA */
  29742. #ifdef HAVE_ECC
  29743. case ECDSAk:
  29744. return NID_X9_62_id_ecPublicKey;
  29745. #endif /* HAVE_ECC */
  29746. }
  29747. break;
  29748. #ifdef HAVE_ECC
  29749. case oidCurveType:
  29750. switch (oid) {
  29751. case ECC_SECP192R1_OID:
  29752. return NID_X9_62_prime192v1;
  29753. case ECC_PRIME192V2_OID:
  29754. return NID_X9_62_prime192v2;
  29755. case ECC_PRIME192V3_OID:
  29756. return NID_X9_62_prime192v3;
  29757. case ECC_PRIME239V1_OID:
  29758. return NID_X9_62_prime239v1;
  29759. case ECC_PRIME239V2_OID:
  29760. return NID_X9_62_prime239v2;
  29761. case ECC_PRIME239V3_OID:
  29762. return NID_X9_62_prime239v3;
  29763. case ECC_SECP256R1_OID:
  29764. return NID_X9_62_prime256v1;
  29765. case ECC_SECP112R1_OID:
  29766. return NID_secp112r1;
  29767. case ECC_SECP112R2_OID:
  29768. return NID_secp112r2;
  29769. case ECC_SECP128R1_OID:
  29770. return NID_secp128r1;
  29771. case ECC_SECP128R2_OID:
  29772. return NID_secp128r2;
  29773. case ECC_SECP160R1_OID:
  29774. return NID_secp160r1;
  29775. case ECC_SECP160R2_OID:
  29776. return NID_secp160r2;
  29777. case ECC_SECP224R1_OID:
  29778. return NID_secp224r1;
  29779. case ECC_SECP384R1_OID:
  29780. return NID_secp384r1;
  29781. case ECC_SECP521R1_OID:
  29782. return NID_secp521r1;
  29783. case ECC_SECP160K1_OID:
  29784. return NID_secp160k1;
  29785. case ECC_SECP192K1_OID:
  29786. return NID_secp192k1;
  29787. case ECC_SECP224K1_OID:
  29788. return NID_secp224k1;
  29789. case ECC_SECP256K1_OID:
  29790. return NID_secp256k1;
  29791. case ECC_BRAINPOOLP160R1_OID:
  29792. return NID_brainpoolP160r1;
  29793. case ECC_BRAINPOOLP192R1_OID:
  29794. return NID_brainpoolP192r1;
  29795. case ECC_BRAINPOOLP224R1_OID:
  29796. return NID_brainpoolP224r1;
  29797. case ECC_BRAINPOOLP256R1_OID:
  29798. return NID_brainpoolP256r1;
  29799. case ECC_BRAINPOOLP320R1_OID:
  29800. return NID_brainpoolP320r1;
  29801. case ECC_BRAINPOOLP384R1_OID:
  29802. return NID_brainpoolP384r1;
  29803. case ECC_BRAINPOOLP512R1_OID:
  29804. return NID_brainpoolP512r1;
  29805. }
  29806. break;
  29807. #endif /* HAVE_ECC */
  29808. /* oidBlkType */
  29809. case oidBlkType:
  29810. switch (oid) {
  29811. #ifdef WOLFSSL_AES_128
  29812. case AES128CBCb:
  29813. return AES128CBCb;
  29814. #endif
  29815. #ifdef WOLFSSL_AES_192
  29816. case AES192CBCb:
  29817. return AES192CBCb;
  29818. #endif
  29819. #ifdef WOLFSSL_AES_256
  29820. case AES256CBCb:
  29821. return AES256CBCb;
  29822. #endif
  29823. #ifndef NO_DES3
  29824. case DESb:
  29825. return NID_des;
  29826. case DES3b:
  29827. return NID_des3;
  29828. #endif
  29829. }
  29830. break;
  29831. #ifdef HAVE_OCSP
  29832. case oidOcspType:
  29833. switch (oid) {
  29834. case OCSP_BASIC_OID:
  29835. return NID_id_pkix_OCSP_basic;
  29836. case OCSP_NONCE_OID:
  29837. return OCSP_NONCE_OID;
  29838. }
  29839. break;
  29840. #endif /* HAVE_OCSP */
  29841. /* oidCertExtType */
  29842. case oidCertExtType:
  29843. switch (oid) {
  29844. case BASIC_CA_OID:
  29845. return NID_basic_constraints;
  29846. case ALT_NAMES_OID:
  29847. return NID_subject_alt_name;
  29848. case CRL_DIST_OID:
  29849. return NID_crl_distribution_points;
  29850. case AUTH_INFO_OID:
  29851. return NID_info_access;
  29852. case AUTH_KEY_OID:
  29853. return NID_authority_key_identifier;
  29854. case SUBJ_KEY_OID:
  29855. return NID_subject_key_identifier;
  29856. case INHIBIT_ANY_OID:
  29857. return NID_inhibit_any_policy;
  29858. case KEY_USAGE_OID:
  29859. return NID_key_usage;
  29860. case NAME_CONS_OID:
  29861. return NID_name_constraints;
  29862. case CERT_POLICY_OID:
  29863. return NID_certificate_policies;
  29864. case EXT_KEY_USAGE_OID:
  29865. return NID_ext_key_usage;
  29866. }
  29867. break;
  29868. /* oidCertAuthInfoType */
  29869. case oidCertAuthInfoType:
  29870. switch (oid) {
  29871. case AIA_OCSP_OID:
  29872. return NID_ad_OCSP;
  29873. case AIA_CA_ISSUER_OID:
  29874. return NID_ad_ca_issuers;
  29875. }
  29876. break;
  29877. /* oidCertPolicyType */
  29878. case oidCertPolicyType:
  29879. switch (oid) {
  29880. case CP_ANY_OID:
  29881. return NID_any_policy;
  29882. }
  29883. break;
  29884. /* oidCertAltNameType */
  29885. case oidCertAltNameType:
  29886. switch (oid) {
  29887. case HW_NAME_OID:
  29888. return NID_hw_name_oid;
  29889. }
  29890. break;
  29891. /* oidCertKeyUseType */
  29892. case oidCertKeyUseType:
  29893. switch (oid) {
  29894. case EKU_ANY_OID:
  29895. return NID_anyExtendedKeyUsage;
  29896. case EKU_SERVER_AUTH_OID:
  29897. return EKU_SERVER_AUTH_OID;
  29898. case EKU_CLIENT_AUTH_OID:
  29899. return EKU_CLIENT_AUTH_OID;
  29900. case EKU_OCSP_SIGN_OID:
  29901. return EKU_OCSP_SIGN_OID;
  29902. }
  29903. break;
  29904. /* oidKdfType */
  29905. case oidKdfType:
  29906. switch (oid) {
  29907. case PBKDF2_OID:
  29908. return PBKDF2_OID;
  29909. }
  29910. break;
  29911. /* oidPBEType */
  29912. case oidPBEType:
  29913. switch (oid) {
  29914. case PBE_SHA1_RC4_128:
  29915. return PBE_SHA1_RC4_128;
  29916. case PBE_SHA1_DES:
  29917. return PBE_SHA1_DES;
  29918. case PBE_SHA1_DES3:
  29919. return PBE_SHA1_DES3;
  29920. }
  29921. break;
  29922. /* oidKeyWrapType */
  29923. case oidKeyWrapType:
  29924. switch (oid) {
  29925. #ifdef WOLFSSL_AES_128
  29926. case AES128_WRAP:
  29927. return AES128_WRAP;
  29928. #endif
  29929. #ifdef WOLFSSL_AES_192
  29930. case AES192_WRAP:
  29931. return AES192_WRAP;
  29932. #endif
  29933. #ifdef WOLFSSL_AES_256
  29934. case AES256_WRAP:
  29935. return AES256_WRAP;
  29936. #endif
  29937. }
  29938. break;
  29939. /* oidCmsKeyAgreeType */
  29940. case oidCmsKeyAgreeType:
  29941. switch (oid) {
  29942. #ifndef NO_SHA
  29943. case dhSinglePass_stdDH_sha1kdf_scheme:
  29944. return dhSinglePass_stdDH_sha1kdf_scheme;
  29945. #endif
  29946. #ifdef WOLFSSL_SHA224
  29947. case dhSinglePass_stdDH_sha224kdf_scheme:
  29948. return dhSinglePass_stdDH_sha224kdf_scheme;
  29949. #endif
  29950. #ifndef NO_SHA256
  29951. case dhSinglePass_stdDH_sha256kdf_scheme:
  29952. return dhSinglePass_stdDH_sha256kdf_scheme;
  29953. #endif
  29954. #ifdef WOLFSSL_SHA384
  29955. case dhSinglePass_stdDH_sha384kdf_scheme:
  29956. return dhSinglePass_stdDH_sha384kdf_scheme;
  29957. #endif
  29958. #ifdef WOLFSSL_SHA512
  29959. case dhSinglePass_stdDH_sha512kdf_scheme:
  29960. return dhSinglePass_stdDH_sha512kdf_scheme;
  29961. #endif
  29962. }
  29963. break;
  29964. #ifdef WOLFSSL_CERT_REQ
  29965. case oidCsrAttrType:
  29966. switch (oid) {
  29967. case PKCS9_CONTENT_TYPE_OID:
  29968. return NID_pkcs9_contentType;
  29969. case CHALLENGE_PASSWORD_OID:
  29970. return NID_pkcs9_challengePassword;
  29971. case SERIAL_NUMBER_OID:
  29972. return NID_serialNumber;
  29973. case USER_ID_OID:
  29974. return NID_userId;
  29975. }
  29976. break;
  29977. #endif
  29978. default:
  29979. WOLFSSL_MSG("NID not in table");
  29980. }
  29981. /* If not found in above switch then try the table */
  29982. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  29983. if (wolfssl_object_info[i].id == (int)oid) {
  29984. return wolfssl_object_info[i].nid;
  29985. }
  29986. }
  29987. return -1;
  29988. }
  29989. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  29990. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  29991. * disabled since a copy of mpi is made by this function and placed into bn.
  29992. */
  29993. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  29994. {
  29995. WOLFSSL_MSG("Entering SetIndividualInternal");
  29996. if (bn == NULL || bn->internal == NULL) {
  29997. WOLFSSL_MSG("bn NULL error");
  29998. return WOLFSSL_FATAL_ERROR;
  29999. }
  30000. if (mpi == NULL) {
  30001. WOLFSSL_MSG("mpi NULL error");
  30002. return WOLFSSL_FATAL_ERROR;
  30003. }
  30004. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  30005. WOLFSSL_MSG("mp_copy error");
  30006. return WOLFSSL_FATAL_ERROR;
  30007. }
  30008. return WOLFSSL_SUCCESS;
  30009. }
  30010. #ifndef NO_ASN
  30011. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  30012. WOLFSSL_BIGNUM *bn)
  30013. {
  30014. #ifdef WOLFSSL_SMALL_STACK
  30015. mp_int* mpi = NULL;
  30016. #else
  30017. mp_int mpi[1];
  30018. #endif
  30019. word32 idx = 0;
  30020. int ret;
  30021. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  30022. if (ai == NULL) {
  30023. return NULL;
  30024. }
  30025. #ifdef WOLFSSL_SMALL_STACK
  30026. mpi = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  30027. if (mpi == NULL) {
  30028. return NULL;
  30029. }
  30030. #endif
  30031. ret = GetInt(mpi, ai->data, &idx, ai->dataMax);
  30032. if (ret != 0) {
  30033. #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY)
  30034. ret = mp_init(mpi); /* must init mpi */
  30035. if (ret != MP_OKAY) {
  30036. #ifdef WOLFSSL_SMALL_STACK
  30037. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30038. #endif
  30039. return NULL;
  30040. }
  30041. /* Serial number in QT starts at index 0 of data */
  30042. if (mp_read_unsigned_bin(mpi, (byte*)ai->data, ai->length) != 0) {
  30043. mp_clear(mpi);
  30044. #ifdef WOLFSSL_SMALL_STACK
  30045. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30046. #endif
  30047. return NULL;
  30048. }
  30049. #else
  30050. /* expecting ASN1 format for INTEGER */
  30051. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  30052. #ifdef WOLFSSL_SMALL_STACK
  30053. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30054. #endif
  30055. return NULL;
  30056. #endif
  30057. }
  30058. /* mp_clear needs called because mpi is copied and causes memory leak with
  30059. * --disable-fastmath */
  30060. ret = SetIndividualExternal(&bn, mpi);
  30061. mp_clear(mpi);
  30062. #ifdef WOLFSSL_SMALL_STACK
  30063. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  30064. #endif
  30065. if (ret != WOLFSSL_SUCCESS) {
  30066. return NULL;
  30067. }
  30068. return bn;
  30069. }
  30070. #endif /* !NO_ASN */
  30071. /* frees all nodes in the current threads error queue
  30072. *
  30073. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  30074. * current threads queue will be free'd.
  30075. */
  30076. void wolfSSL_ERR_remove_state(unsigned long id)
  30077. {
  30078. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  30079. (void)id;
  30080. if (wc_ERR_remove_state() != 0) {
  30081. WOLFSSL_MSG("Error with removing the state");
  30082. }
  30083. }
  30084. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  30085. {
  30086. static int ctx; /* wolfcrypt doesn't now need ctx */
  30087. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  30088. return (WOLFSSL_BN_CTX*)&ctx;
  30089. }
  30090. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  30091. {
  30092. (void)ctx;
  30093. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  30094. }
  30095. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  30096. {
  30097. (void)ctx;
  30098. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  30099. /* do free since static ctx that does nothing */
  30100. }
  30101. /* WOLFSSL_SUCCESS on ok */
  30102. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  30103. const WOLFSSL_BIGNUM* b)
  30104. {
  30105. WOLFSSL_MSG("wolfSSL_BN_sub");
  30106. if (r == NULL || a == NULL || b == NULL)
  30107. return 0;
  30108. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  30109. (mp_int*)r->internal) == MP_OKAY)
  30110. return WOLFSSL_SUCCESS;
  30111. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  30112. return 0;
  30113. }
  30114. WOLFSSL_API int wolfSSL_BN_mul(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b,
  30115. WOLFSSL_BN_CTX *ctx)
  30116. {
  30117. int ret = WOLFSSL_SUCCESS;
  30118. (void)ctx;
  30119. WOLFSSL_ENTER("wolfSSL_BN_mul");
  30120. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  30121. a->internal == NULL || b->internal == NULL) {
  30122. ret = WOLFSSL_FAILURE;
  30123. }
  30124. if (ret == WOLFSSL_SUCCESS) {
  30125. ret = mp_mul((mp_int*)a->internal, (mp_int*)b->internal,
  30126. (mp_int*)r->internal);
  30127. if (ret == MP_OKAY) {
  30128. ret = WOLFSSL_SUCCESS;
  30129. }
  30130. else {
  30131. ret = WOLFSSL_FAILURE;
  30132. }
  30133. }
  30134. WOLFSSL_LEAVE("wolfSSL_BN_mul", ret);
  30135. return ret;
  30136. }
  30137. #ifndef WOLFSSL_SP_MATH
  30138. int wolfSSL_BN_div(WOLFSSL_BIGNUM* dv, WOLFSSL_BIGNUM* rem,
  30139. const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* d,
  30140. WOLFSSL_BN_CTX* ctx)
  30141. {
  30142. int ret = WOLFSSL_SUCCESS;
  30143. (void)ctx;
  30144. WOLFSSL_ENTER("wolfSSL_BN_div");
  30145. if (dv == NULL || rem == NULL || a == NULL || d == NULL ||
  30146. dv->internal == NULL || rem->internal == NULL || a->internal == NULL ||
  30147. d->internal == NULL) {
  30148. ret = WOLFSSL_FAILURE;
  30149. }
  30150. if (ret == WOLFSSL_SUCCESS) {
  30151. ret = mp_div((mp_int*)a->internal, (mp_int*)d->internal,
  30152. (mp_int*)dv->internal, (mp_int*)rem->internal);
  30153. if (ret == MP_OKAY) {
  30154. ret = WOLFSSL_SUCCESS;
  30155. }
  30156. else {
  30157. ret = WOLFSSL_FAILURE;
  30158. }
  30159. }
  30160. WOLFSSL_LEAVE("wolfSSL_BN_div", ret);
  30161. return ret;
  30162. }
  30163. #endif
  30164. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Needed to get mp_gcd. */
  30165. int wolfSSL_BN_gcd(WOLFSSL_BIGNUM* r, WOLFSSL_BIGNUM* a, WOLFSSL_BIGNUM* b,
  30166. WOLFSSL_BN_CTX* ctx)
  30167. {
  30168. int ret = WOLFSSL_SUCCESS;
  30169. (void)ctx;
  30170. WOLFSSL_ENTER("wolfSSL_BN_gcd");
  30171. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  30172. a->internal == NULL || b->internal == NULL) {
  30173. ret = WOLFSSL_FAILURE;
  30174. }
  30175. if (ret == WOLFSSL_SUCCESS) {
  30176. ret = mp_gcd((mp_int*)a->internal, (mp_int*)b->internal,
  30177. (mp_int*)r->internal);
  30178. if (ret == MP_OKAY) {
  30179. ret = WOLFSSL_SUCCESS;
  30180. }
  30181. else {
  30182. ret = WOLFSSL_FAILURE;
  30183. }
  30184. }
  30185. WOLFSSL_LEAVE("wolfSSL_BN_gcd", ret);
  30186. return ret;
  30187. }
  30188. #endif /* !NO_RSA && WOLFSSL_KEY_GEN */
  30189. /* WOLFSSL_SUCCESS on ok */
  30190. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  30191. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  30192. {
  30193. (void)c;
  30194. WOLFSSL_MSG("wolfSSL_BN_mod");
  30195. if (r == NULL || a == NULL || b == NULL)
  30196. return 0;
  30197. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  30198. (mp_int*)r->internal) == MP_OKAY)
  30199. return WOLFSSL_SUCCESS;
  30200. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  30201. return 0;
  30202. }
  30203. /* r = (a^p) % m */
  30204. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  30205. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  30206. {
  30207. int ret;
  30208. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  30209. (void) ctx;
  30210. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  30211. WOLFSSL_MSG("Bad Argument");
  30212. return WOLFSSL_FAILURE;
  30213. }
  30214. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  30215. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  30216. return WOLFSSL_SUCCESS;
  30217. }
  30218. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  30219. (void)ret;
  30220. return WOLFSSL_FAILURE;
  30221. }
  30222. /* r = (a * p) % m */
  30223. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  30224. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  30225. {
  30226. int ret;
  30227. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  30228. (void) ctx;
  30229. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  30230. WOLFSSL_MSG("Bad Argument");
  30231. return SSL_FAILURE;
  30232. }
  30233. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  30234. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  30235. return WOLFSSL_SUCCESS;
  30236. }
  30237. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  30238. (void)ret;
  30239. return SSL_FAILURE;
  30240. }
  30241. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  30242. {
  30243. WOLFSSL_MSG("wolfSSL_BN_value_one");
  30244. if (bn_one == NULL) {
  30245. bn_one = wolfSSL_BN_new();
  30246. if (bn_one) {
  30247. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  30248. /* handle error by freeing BN and returning NULL */
  30249. wolfSSL_BN_free(bn_one);
  30250. bn_one = NULL;
  30251. }
  30252. }
  30253. }
  30254. return bn_one;
  30255. }
  30256. /* return compliant with OpenSSL
  30257. * size of BIGNUM in bytes, 0 if error */
  30258. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  30259. {
  30260. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  30261. if (bn == NULL || bn->internal == NULL)
  30262. return WOLFSSL_FAILURE;
  30263. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30264. }
  30265. /* return compliant with OpenSSL
  30266. * size of BIGNUM in bits, 0 if error */
  30267. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  30268. {
  30269. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  30270. if (bn == NULL || bn->internal == NULL)
  30271. return WOLFSSL_FAILURE;
  30272. return mp_count_bits((mp_int*)bn->internal);
  30273. }
  30274. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  30275. {
  30276. if (bn == NULL)
  30277. return WOLFSSL_FAILURE;
  30278. return mp_isneg((mp_int*)bn->internal);
  30279. }
  30280. WOLFSSL_API void wolfSSL_BN_zero(WOLFSSL_BIGNUM* bn)
  30281. {
  30282. if (bn == NULL || bn->internal == NULL) {
  30283. return;
  30284. }
  30285. mp_zero((mp_int*)bn->internal);
  30286. }
  30287. WOLFSSL_API int wolfSSL_BN_one(WOLFSSL_BIGNUM* bn)
  30288. {
  30289. int ret = WOLFSSL_SUCCESS;
  30290. if (bn == NULL || bn->internal == NULL) {
  30291. return WOLFSSL_FAILURE;
  30292. }
  30293. if (ret == WOLFSSL_SUCCESS) {
  30294. ret = wolfSSL_BN_set_word(bn, 1);
  30295. }
  30296. return ret;
  30297. }
  30298. /* return compliant with OpenSSL
  30299. * 1 if BIGNUM is zero, 0 else */
  30300. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  30301. {
  30302. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  30303. if (bn == NULL || bn->internal == NULL)
  30304. return WOLFSSL_FAILURE;
  30305. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  30306. return WOLFSSL_SUCCESS;
  30307. return WOLFSSL_FAILURE;
  30308. }
  30309. /* return compliant with OpenSSL
  30310. * 1 if BIGNUM is one, 0 else */
  30311. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  30312. {
  30313. WOLFSSL_MSG("wolfSSL_BN_is_one");
  30314. if (bn == NULL || bn->internal == NULL)
  30315. return WOLFSSL_FAILURE;
  30316. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  30317. return WOLFSSL_SUCCESS;
  30318. return WOLFSSL_FAILURE;
  30319. }
  30320. /* return compliant with OpenSSL
  30321. * 1 if BIGNUM is odd, 0 else */
  30322. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  30323. {
  30324. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  30325. if (bn == NULL || bn->internal == NULL)
  30326. return WOLFSSL_FAILURE;
  30327. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  30328. return WOLFSSL_SUCCESS;
  30329. return WOLFSSL_FAILURE;
  30330. }
  30331. /* return compliant with OpenSSL
  30332. * 1 if BIGNUM is word, 0 else */
  30333. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  30334. {
  30335. WOLFSSL_MSG("wolfSSL_BN_is_word");
  30336. if (bn == NULL || bn->internal == NULL) {
  30337. WOLFSSL_MSG("bn NULL error");
  30338. return WOLFSSL_FAILURE;
  30339. }
  30340. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  30341. if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
  30342. return WOLFSSL_SUCCESS;
  30343. }
  30344. } else {
  30345. int ret;
  30346. mp_int w_mp;
  30347. if (mp_init(&w_mp) != MP_OKAY)
  30348. return WOLFSSL_FAILURE;
  30349. if (mp_set_int(&w_mp, w) != MP_OKAY)
  30350. return WOLFSSL_FAILURE;
  30351. ret = mp_cmp((mp_int *)bn->internal, &w_mp);
  30352. mp_free(&w_mp);
  30353. if (ret == MP_EQ)
  30354. return WOLFSSL_SUCCESS;
  30355. }
  30356. return WOLFSSL_FAILURE;
  30357. }
  30358. /* return compliant with OpenSSL
  30359. * -1 if a < b, 0 if a == b and 1 if a > b
  30360. */
  30361. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  30362. {
  30363. int ret;
  30364. WOLFSSL_MSG("wolfSSL_BN_cmp");
  30365. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  30366. return WOLFSSL_FATAL_ERROR;
  30367. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  30368. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  30369. }
  30370. /* return compliant with OpenSSL
  30371. * length of BIGNUM in bytes, -1 if error */
  30372. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  30373. {
  30374. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  30375. if (bn == NULL || bn->internal == NULL) {
  30376. WOLFSSL_MSG("NULL bn error");
  30377. return WOLFSSL_FATAL_ERROR;
  30378. }
  30379. if (r == NULL)
  30380. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30381. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  30382. WOLFSSL_MSG("mp_to_unsigned_bin error");
  30383. return WOLFSSL_FATAL_ERROR;
  30384. }
  30385. return mp_unsigned_bin_size((mp_int*)bn->internal);
  30386. }
  30387. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  30388. WOLFSSL_BIGNUM* ret)
  30389. {
  30390. int weOwn = 0;
  30391. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  30392. /* if ret is null create a BN */
  30393. if (ret == NULL) {
  30394. ret = wolfSSL_BN_new();
  30395. weOwn = 1;
  30396. if (ret == NULL)
  30397. return NULL;
  30398. }
  30399. /* check ret and ret->internal then read in value */
  30400. if (ret && ret->internal) {
  30401. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  30402. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  30403. if (weOwn)
  30404. wolfSSL_BN_free(ret);
  30405. return NULL;
  30406. }
  30407. } else {
  30408. /* This may be overly defensive */
  30409. if (weOwn)
  30410. wolfSSL_BN_free(ret);
  30411. return NULL;
  30412. }
  30413. return ret;
  30414. }
  30415. /* return compliant with OpenSSL
  30416. * 1 if success, 0 if error */
  30417. #ifndef NO_WOLFSSL_STUB
  30418. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  30419. {
  30420. (void)bn;
  30421. (void)n;
  30422. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  30423. WOLFSSL_STUB("BN_mask_bits");
  30424. return SSL_FAILURE;
  30425. }
  30426. #endif
  30427. /* WOLFSSL_SUCCESS on ok */
  30428. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  30429. {
  30430. int ret = WOLFSSL_SUCCESS;
  30431. int len = (bits + 7) / 8;
  30432. WC_RNG* rng = &globalRNG;
  30433. byte* buff = NULL;
  30434. WOLFSSL_ENTER("wolfSSL_BN_rand");
  30435. if ((bn == NULL || bn->internal == NULL) || bits < 0 ||
  30436. (bits == 0 && (bottom != 0 || top != -1)) || (bits == 1 && top > 0)) {
  30437. WOLFSSL_MSG("Bad argument");
  30438. ret = WOLFSSL_FAILURE;
  30439. }
  30440. if (ret == WOLFSSL_SUCCESS) {
  30441. if (len == 0) {
  30442. mp_zero((mp_int*)bn->internal);
  30443. }
  30444. else {
  30445. buff = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30446. if (buff == NULL) {
  30447. WOLFSSL_MSG("Failed to allocate buffer.");
  30448. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30449. ret = WOLFSSL_FAILURE;
  30450. }
  30451. if (ret == WOLFSSL_SUCCESS && initGlobalRNG == 0 &&
  30452. wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  30453. WOLFSSL_MSG("Failed to use global RNG.");
  30454. ret = WOLFSSL_FAILURE;
  30455. }
  30456. if (ret == WOLFSSL_SUCCESS &&
  30457. wc_RNG_GenerateBlock(rng, buff, len) != 0) {
  30458. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  30459. ret = WOLFSSL_FAILURE;
  30460. }
  30461. if (ret == WOLFSSL_SUCCESS &&
  30462. mp_read_unsigned_bin((mp_int*)bn->internal,buff,len)
  30463. != MP_OKAY) {
  30464. WOLFSSL_MSG("mp_read_unsigned_bin failed");
  30465. ret = WOLFSSL_FAILURE;
  30466. }
  30467. if (ret == WOLFSSL_SUCCESS) {
  30468. /* Truncate to requested bit length. */
  30469. mp_rshb((mp_int*)bn->internal, 8 - (bits % 8));
  30470. if (top == 0) {
  30471. if (mp_set_bit((mp_int*)bn->internal, bits - 1)
  30472. != MP_OKAY) {
  30473. WOLFSSL_MSG("Failed to set top bit");
  30474. ret = WOLFSSL_FAILURE;
  30475. }
  30476. }
  30477. else if (top > 0) {
  30478. if (mp_set_bit((mp_int*)bn->internal, bits - 1)
  30479. != MP_OKAY ||
  30480. mp_set_bit((mp_int*)bn->internal, bits - 2)
  30481. != MP_OKAY) {
  30482. WOLFSSL_MSG("Failed to set top 2 bits");
  30483. ret = WOLFSSL_FAILURE;
  30484. }
  30485. }
  30486. }
  30487. if (ret == WOLFSSL_SUCCESS && bottom &&
  30488. mp_set_bit((mp_int*)bn->internal, 0) != MP_OKAY) {
  30489. WOLFSSL_MSG("Failed to set 0th bit");
  30490. ret = WOLFSSL_FAILURE;
  30491. }
  30492. if (buff != NULL) {
  30493. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30494. }
  30495. }
  30496. }
  30497. WOLFSSL_LEAVE("wolfSSL_BN_rand", ret);
  30498. return ret;
  30499. }
  30500. /**
  30501. * N = length of range input var
  30502. * Generate N-bit length numbers until generated number is less than range
  30503. * @param r Output number
  30504. * @param range The upper limit of generated output
  30505. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  30506. */
  30507. int wolfSSL_BN_rand_range(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *range)
  30508. {
  30509. int n;
  30510. int iter = 0;
  30511. WOLFSSL_MSG("wolfSSL_BN_rand_range");
  30512. if (r == NULL || range == NULL) {
  30513. WOLFSSL_MSG("Bad parameter");
  30514. return WOLFSSL_FAILURE;
  30515. }
  30516. n = wolfSSL_BN_num_bits(range);
  30517. if (n <= 1) {
  30518. wolfSSL_BN_zero(r);
  30519. }
  30520. else {
  30521. do {
  30522. if (iter >= 100) {
  30523. WOLFSSL_MSG("wolfSSL_BN_rand_range too many iterations");
  30524. return WOLFSSL_FAILURE;
  30525. }
  30526. iter++;
  30527. if (wolfSSL_BN_pseudo_rand(r, n, -1, 0) == WOLFSSL_FAILURE) {
  30528. WOLFSSL_MSG("wolfSSL_BN_rand error");
  30529. return WOLFSSL_FAILURE;
  30530. }
  30531. } while(wolfSSL_BN_cmp(r, range) >= 0);
  30532. }
  30533. return WOLFSSL_SUCCESS;
  30534. }
  30535. /* WOLFSSL_SUCCESS on ok
  30536. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  30537. * top -1 then leave most sig bit alone
  30538. * top 0 then most sig is set to 1
  30539. * top is 1 then first two most sig bits are 1
  30540. *
  30541. * bottom is hot then odd number */
  30542. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  30543. {
  30544. int ret = 0;
  30545. int len;
  30546. int initTmpRng = 0;
  30547. WC_RNG* rng = NULL;
  30548. #ifdef WOLFSSL_SMALL_STACK
  30549. WC_RNG* tmpRNG = NULL;
  30550. byte* buff = NULL;
  30551. #else
  30552. WC_RNG tmpRNG[1];
  30553. byte buff[1024];
  30554. #endif
  30555. WOLFSSL_ENTER("wolfSSL_BN_pseudo_rand");
  30556. if (bits <= 0) {
  30557. return WOLFSSL_FAILURE;
  30558. }
  30559. len = bits / 8;
  30560. if (bits % 8)
  30561. len++;
  30562. /* has to be a length of at least 1 since we set buf[0] and buf[len-1] */
  30563. if (top == 1 || top == 0 || bottom == 1) {
  30564. if (len < 1) {
  30565. return WOLFSSL_FAILURE;
  30566. }
  30567. }
  30568. #ifdef WOLFSSL_SMALL_STACK
  30569. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30570. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30571. if (buff == NULL || tmpRNG == NULL) {
  30572. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30573. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30574. return ret;
  30575. }
  30576. #endif
  30577. if (bn == NULL || bn->internal == NULL)
  30578. WOLFSSL_MSG("Bad function arguments");
  30579. else if (wc_InitRng(tmpRNG) == 0) {
  30580. rng = tmpRNG;
  30581. initTmpRng = 1;
  30582. }
  30583. else if (initGlobalRNG)
  30584. rng = &globalRNG;
  30585. if (rng) {
  30586. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  30587. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  30588. else {
  30589. switch (top) {
  30590. case -1:
  30591. break;
  30592. case 0:
  30593. buff[0] |= 0x80;
  30594. break;
  30595. case 1:
  30596. buff[0] |= 0x80 | 0x40;
  30597. break;
  30598. }
  30599. if (bottom == 1) {
  30600. buff[len-1] |= 0x01;
  30601. }
  30602. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  30603. WOLFSSL_MSG("mp read bin failed");
  30604. else
  30605. ret = WOLFSSL_SUCCESS;
  30606. }
  30607. }
  30608. if (initTmpRng)
  30609. wc_FreeRng(tmpRNG);
  30610. #ifdef WOLFSSL_SMALL_STACK
  30611. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30612. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30613. #endif
  30614. return ret;
  30615. }
  30616. /* return code compliant with OpenSSL :
  30617. * 1 if bit set, 0 else
  30618. */
  30619. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  30620. {
  30621. if (bn == NULL || bn->internal == NULL) {
  30622. WOLFSSL_MSG("bn NULL error");
  30623. return WOLFSSL_FAILURE;
  30624. }
  30625. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  30626. }
  30627. /* return code compliant with OpenSSL :
  30628. * 1 if success, 0 else
  30629. */
  30630. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  30631. {
  30632. if (bn == NULL || bn->internal == NULL) {
  30633. WOLFSSL_MSG("bn NULL error");
  30634. return WOLFSSL_FAILURE;
  30635. }
  30636. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  30637. WOLFSSL_MSG("mp_set_bit error");
  30638. return WOLFSSL_FAILURE;
  30639. }
  30640. return WOLFSSL_SUCCESS;
  30641. }
  30642. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  30643. {
  30644. int ret = WOLFSSL_FAILURE;
  30645. #ifndef WOLFSSL_SMALL_STACK
  30646. mp_int tmp[1];
  30647. #else
  30648. mp_int* tmp = NULL;
  30649. #endif
  30650. if (bn == NULL || bn->internal == NULL) {
  30651. WOLFSSL_MSG("bn NULL error");
  30652. goto end;
  30653. }
  30654. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  30655. #ifdef WOLFSSL_SMALL_STACK
  30656. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  30657. if (tmp == NULL) {
  30658. goto end;
  30659. }
  30660. #endif
  30661. if (mp_init(tmp) != MP_OKAY) {
  30662. goto end;
  30663. }
  30664. if (mp_set_bit(tmp, n) != MP_OKAY) {
  30665. goto cleanup;
  30666. }
  30667. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  30668. goto cleanup;
  30669. }
  30670. } else {
  30671. goto end;
  30672. }
  30673. ret = WOLFSSL_SUCCESS;
  30674. cleanup:
  30675. mp_clear(tmp);
  30676. end:
  30677. #ifdef WOLFSSL_SMALL_STACK
  30678. if (tmp)
  30679. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  30680. #endif
  30681. return ret;
  30682. }
  30683. /* WOLFSSL_SUCCESS on ok */
  30684. /* Note on use: this function expects str to be an even length. It is
  30685. * converting pairs of bytes into 8-bit values. As an example, the RSA
  30686. * public exponent is commonly 0x010001. To get it to convert, you need
  30687. * to pass in the string "010001", it will fail if you use "10001". This
  30688. * is an affect of how Base16_Decode() works.
  30689. */
  30690. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  30691. {
  30692. int ret = 0;
  30693. word32 decSz = 1024;
  30694. #ifdef WOLFSSL_SMALL_STACK
  30695. byte* decoded;
  30696. #else
  30697. byte decoded[1024];
  30698. #endif
  30699. int weOwn = 0;
  30700. int strLen;
  30701. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  30702. #ifdef WOLFSSL_SMALL_STACK
  30703. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  30704. if (decoded == NULL)
  30705. return ret;
  30706. #endif
  30707. if (str == NULL || str[0] == '\0') {
  30708. WOLFSSL_MSG("Bad function argument");
  30709. ret = WOLFSSL_FAILURE;
  30710. } else {
  30711. strLen = (int)XSTRLEN(str);
  30712. /* ignore trailing new lines */
  30713. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  30714. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  30715. WOLFSSL_MSG("Bad Base16_Decode error");
  30716. else if (bn == NULL)
  30717. ret = decSz;
  30718. else {
  30719. if (*bn == NULL) {
  30720. *bn = wolfSSL_BN_new();
  30721. if (*bn != NULL) {
  30722. weOwn = 1;
  30723. }
  30724. }
  30725. if (*bn == NULL)
  30726. WOLFSSL_MSG("BN new failed");
  30727. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  30728. WOLFSSL_MSG("Bad bin2bn error");
  30729. if (weOwn == 1) {
  30730. wolfSSL_BN_free(*bn); /* Free new BN */
  30731. }
  30732. }
  30733. else
  30734. ret = WOLFSSL_SUCCESS;
  30735. }
  30736. }
  30737. #ifdef WOLFSSL_SMALL_STACK
  30738. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  30739. #endif
  30740. return ret;
  30741. }
  30742. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  30743. {
  30744. WOLFSSL_BIGNUM* ret;
  30745. WOLFSSL_MSG("wolfSSL_BN_dup");
  30746. if (bn == NULL || bn->internal == NULL) {
  30747. WOLFSSL_MSG("bn NULL error");
  30748. return NULL;
  30749. }
  30750. ret = wolfSSL_BN_new();
  30751. if (ret == NULL) {
  30752. WOLFSSL_MSG("bn new error");
  30753. return NULL;
  30754. }
  30755. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  30756. WOLFSSL_MSG("mp_copy error");
  30757. wolfSSL_BN_free(ret);
  30758. return NULL;
  30759. }
  30760. ret->neg = bn->neg;
  30761. return ret;
  30762. }
  30763. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  30764. {
  30765. WOLFSSL_MSG("wolfSSL_BN_copy");
  30766. if (r == NULL || bn == NULL) {
  30767. WOLFSSL_MSG("r or bn NULL error");
  30768. return NULL;
  30769. }
  30770. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  30771. WOLFSSL_MSG("mp_copy error");
  30772. return NULL;
  30773. }
  30774. r->neg = bn->neg;
  30775. return r;
  30776. }
  30777. /* return code compliant with OpenSSL :
  30778. * 1 if success, 0 else
  30779. */
  30780. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
  30781. {
  30782. WOLFSSL_MSG("wolfSSL_BN_set_word");
  30783. if (bn == NULL) {
  30784. WOLFSSL_MSG("bn NULL error");
  30785. return WOLFSSL_FAILURE;
  30786. }
  30787. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  30788. WOLFSSL_MSG("mp_init_set_int error");
  30789. return WOLFSSL_FAILURE;
  30790. }
  30791. return WOLFSSL_SUCCESS;
  30792. }
  30793. static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
  30794. #if DIGIT_BIT >= (SIZEOF_LONG * CHAR_BIT)
  30795. return (WOLFSSL_BN_ULONG)mp->dp[0];
  30796. #else
  30797. WOLFSSL_BN_ULONG ret = 0UL;
  30798. int digit_i;
  30799. for (digit_i = 0; digit_i < mp->used; ++digit_i)
  30800. ret |= ((WOLFSSL_BN_ULONG)mp->dp[digit_i]) << (DIGIT_BIT * digit_i);
  30801. return ret;
  30802. #endif
  30803. }
  30804. /* Returns the big number as an unsigned long if possible.
  30805. *
  30806. * bn big number structure to get value from
  30807. *
  30808. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  30809. */
  30810. WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  30811. {
  30812. WOLFSSL_MSG("wolfSSL_BN_get_word");
  30813. if (bn == NULL) {
  30814. WOLFSSL_MSG("Invalid argument");
  30815. return 0;
  30816. }
  30817. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  30818. WOLFSSL_MSG("bignum is larger than unsigned long");
  30819. return 0xFFFFFFFFL;
  30820. }
  30821. return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
  30822. }
  30823. /* return code compliant with OpenSSL :
  30824. * number length in decimal if success, 0 if error
  30825. */
  30826. #ifndef NO_WOLFSSL_STUB
  30827. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  30828. {
  30829. (void)bn;
  30830. (void)str;
  30831. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  30832. WOLFSSL_STUB("BN_dec2bn");
  30833. return SSL_FAILURE;
  30834. }
  30835. #endif
  30836. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  30837. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  30838. {
  30839. int len = 0;
  30840. char *buf;
  30841. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  30842. if (bn == NULL || bn->internal == NULL) {
  30843. WOLFSSL_MSG("bn NULL error");
  30844. return NULL;
  30845. }
  30846. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  30847. WOLFSSL_MSG("mp_radix_size failure");
  30848. return NULL;
  30849. }
  30850. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  30851. if (buf == NULL) {
  30852. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  30853. return NULL;
  30854. }
  30855. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  30856. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  30857. return NULL;
  30858. }
  30859. return buf;
  30860. }
  30861. #else
  30862. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  30863. {
  30864. (void)bn;
  30865. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  30866. return NULL;
  30867. }
  30868. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  30869. /* Internal function for adding/subtracting an unsigned long from a
  30870. * WOLFSSL_BIGNUM. To add, pass "sub" as 0. To subtract, pass it as 1.
  30871. * Returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on failure.
  30872. */
  30873. static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
  30874. int sub)
  30875. {
  30876. int ret = WOLFSSL_SUCCESS;
  30877. int rc = 0;
  30878. #ifdef WOLFSSL_SMALL_STACK
  30879. mp_int *w_mp = (mp_int *)XMALLOC(sizeof(*w_mp), NULL,
  30880. DYNAMIC_TYPE_TMP_BUFFER);
  30881. if (w_mp == NULL)
  30882. return WOLFSSL_FAILURE;
  30883. #else
  30884. mp_int w_mp[1];
  30885. #endif
  30886. XMEMSET(w_mp, 0, sizeof(*w_mp));
  30887. if (bn == NULL || bn->internal == NULL) {
  30888. WOLFSSL_MSG("bn NULL error");
  30889. ret = WOLFSSL_FAILURE;
  30890. }
  30891. if (ret == WOLFSSL_SUCCESS) {
  30892. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  30893. if (sub == 1) {
  30894. rc = mp_sub_d((mp_int*)bn->internal, (mp_digit)w,
  30895. (mp_int*)bn->internal);
  30896. }
  30897. else {
  30898. rc = mp_add_d((mp_int*)bn->internal, (mp_digit)w,
  30899. (mp_int*)bn->internal);
  30900. }
  30901. if (rc != MP_OKAY) {
  30902. WOLFSSL_MSG("mp_add/sub_d error");
  30903. ret = WOLFSSL_FAILURE;
  30904. }
  30905. }
  30906. else {
  30907. if (mp_init(w_mp) != MP_OKAY) {
  30908. ret = WOLFSSL_FAILURE;
  30909. }
  30910. if (ret == WOLFSSL_SUCCESS) {
  30911. if (mp_set_int(w_mp, w) != MP_OKAY) {
  30912. ret = WOLFSSL_FAILURE;
  30913. }
  30914. }
  30915. if (ret == WOLFSSL_SUCCESS) {
  30916. if (sub == 1) {
  30917. rc = mp_sub((mp_int *)bn->internal, w_mp,
  30918. (mp_int *)bn->internal);
  30919. }
  30920. else {
  30921. rc = mp_add((mp_int *)bn->internal, w_mp,
  30922. (mp_int *)bn->internal);
  30923. }
  30924. if (rc != MP_OKAY) {
  30925. WOLFSSL_MSG("mp_add/sub error");
  30926. ret = WOLFSSL_FAILURE;
  30927. }
  30928. }
  30929. }
  30930. }
  30931. mp_free(w_mp);
  30932. #ifdef WOLFSSL_SMALL_STACK
  30933. XFREE(w_mp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30934. #endif
  30935. return ret;
  30936. }
  30937. /* return code compliant with OpenSSL :
  30938. * 1 if success, 0 else
  30939. */
  30940. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  30941. {
  30942. int ret;
  30943. WOLFSSL_ENTER("wolfSSL_BN_add_word");
  30944. ret = wolfSSL_BN_add_word_int(bn, w, 0);
  30945. WOLFSSL_LEAVE("wolfSSL_BN_add_word", ret);
  30946. return ret;
  30947. }
  30948. /* return code compliant with OpenSSL :
  30949. * 1 if success, 0 else
  30950. */
  30951. WOLFSSL_API int wolfSSL_BN_sub_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  30952. {
  30953. int ret;
  30954. WOLFSSL_ENTER("wolfSSL_BN_sub_word");
  30955. ret = wolfSSL_BN_add_word_int(bn, w, 1);
  30956. WOLFSSL_LEAVE("wolfSSL_BN_sub_word", ret);
  30957. return ret;
  30958. }
  30959. #ifndef WOLFSSL_SP_MATH
  30960. /* return code compliant with OpenSSL :
  30961. * 1 if success, 0 else
  30962. */
  30963. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  30964. {
  30965. WOLFSSL_MSG("wolfSSL_BN_lshift");
  30966. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  30967. WOLFSSL_MSG("bn NULL error");
  30968. return WOLFSSL_FAILURE;
  30969. }
  30970. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  30971. WOLFSSL_MSG("mp_mul_2d error");
  30972. return WOLFSSL_FAILURE;
  30973. }
  30974. return WOLFSSL_SUCCESS;
  30975. }
  30976. /* return code compliant with OpenSSL :
  30977. * 1 if success, 0 else
  30978. */
  30979. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  30980. {
  30981. WOLFSSL_MSG("wolfSSL_BN_rshift");
  30982. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  30983. WOLFSSL_MSG("bn NULL error");
  30984. return WOLFSSL_FAILURE;
  30985. }
  30986. if (mp_div_2d((mp_int*)bn->internal, n,
  30987. (mp_int*)r->internal, NULL) != MP_OKAY) {
  30988. WOLFSSL_MSG("mp_mul_2d error");
  30989. return WOLFSSL_FAILURE;
  30990. }
  30991. return WOLFSSL_SUCCESS;
  30992. }
  30993. #endif
  30994. /* return code compliant with OpenSSL :
  30995. * 1 if success, 0 else
  30996. */
  30997. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  30998. {
  30999. WOLFSSL_MSG("wolfSSL_BN_add");
  31000. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  31001. b == NULL || b->internal == NULL) {
  31002. WOLFSSL_MSG("bn NULL error");
  31003. return WOLFSSL_FAILURE;
  31004. }
  31005. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  31006. (mp_int*)r->internal) != MP_OKAY) {
  31007. WOLFSSL_MSG("mp_add_d error");
  31008. return WOLFSSL_FAILURE;
  31009. }
  31010. return WOLFSSL_SUCCESS;
  31011. }
  31012. #ifndef WOLFSSL_SP_MATH
  31013. /* r = a + b (mod m) */
  31014. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  31015. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  31016. WOLFSSL_BN_CTX *ctx)
  31017. {
  31018. (void)ctx;
  31019. WOLFSSL_MSG("wolfSSL_BN_add");
  31020. if (r == NULL || r->internal == NULL ||
  31021. a == NULL || a->internal == NULL ||
  31022. b == NULL || b->internal == NULL ||
  31023. m == NULL || m->internal == NULL) {
  31024. WOLFSSL_MSG("bn NULL error");
  31025. return WOLFSSL_FAILURE;
  31026. }
  31027. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  31028. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  31029. WOLFSSL_MSG("mp_add_d error");
  31030. return WOLFSSL_FAILURE;
  31031. }
  31032. return WOLFSSL_SUCCESS;
  31033. }
  31034. #endif
  31035. #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA))
  31036. int wolfSSL_BN_generate_prime_ex(WOLFSSL_BIGNUM* prime, int bits,
  31037. int safe, const WOLFSSL_BIGNUM* add, const WOLFSSL_BIGNUM* rem,
  31038. WOLFSSL_BN_GENCB* cb)
  31039. {
  31040. int ret = WOLFSSL_SUCCESS;
  31041. #ifdef WOLFSSL_SMALL_STACK
  31042. WC_RNG* rng = NULL;
  31043. #else
  31044. WC_RNG rng[1];
  31045. #endif
  31046. (void)cb;
  31047. WOLFSSL_ENTER("wolfSSL_BN_generate_prime_ex");
  31048. if (safe == 1 || add != NULL || rem != NULL) {
  31049. /* These parameters aren't supported, yet. */
  31050. ret = WOLFSSL_FAILURE;
  31051. }
  31052. if (prime == NULL || prime->internal == NULL) {
  31053. ret = WOLFSSL_FAILURE;
  31054. }
  31055. #ifdef WOLFSSL_SMALL_STACK
  31056. if (ret == WOLFSSL_SUCCESS) {
  31057. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31058. if (rng == NULL) {
  31059. ret = WOLFSSL_FAILURE;
  31060. }
  31061. }
  31062. #endif
  31063. if (ret == WOLFSSL_SUCCESS) {
  31064. XMEMSET(rng, 0, sizeof(WC_RNG));
  31065. if (wc_InitRng(rng) != 0) {
  31066. ret = WOLFSSL_FAILURE;
  31067. }
  31068. }
  31069. if (ret == WOLFSSL_SUCCESS) {
  31070. if (mp_rand_prime((mp_int*)prime->internal, (bits + 7) / 8, rng, NULL)
  31071. != MP_OKAY) {
  31072. ret = WOLFSSL_FAILURE;
  31073. }
  31074. }
  31075. wc_FreeRng(rng);
  31076. #ifdef WOLFSSL_SMALL_STACK
  31077. if (rng != NULL)
  31078. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  31079. #endif
  31080. WOLFSSL_LEAVE("wolfSSL_BN_generate_prime_ex", ret);
  31081. return ret;
  31082. }
  31083. /* return code compliant with OpenSSL :
  31084. * 1 if prime, 0 if not, -1 if error
  31085. */
  31086. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  31087. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  31088. {
  31089. WC_RNG* rng = NULL;
  31090. #ifdef WOLFSSL_SMALL_STACK
  31091. WC_RNG* tmpRNG = NULL;
  31092. #else
  31093. WC_RNG tmpRNG[1];
  31094. #endif
  31095. int initTmpRng = 0;
  31096. int res = MP_NO;
  31097. (void)ctx;
  31098. (void)cb;
  31099. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  31100. if (bn == NULL || bn->internal == NULL) {
  31101. WOLFSSL_MSG("bn NULL error");
  31102. return WOLFSSL_FATAL_ERROR;
  31103. }
  31104. #ifdef WOLFSSL_SMALL_STACK
  31105. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31106. if (tmpRNG == NULL)
  31107. return WOLFSSL_FAILURE;
  31108. #endif
  31109. if (wc_InitRng(tmpRNG) == 0) {
  31110. rng = tmpRNG;
  31111. initTmpRng = 1;
  31112. }
  31113. else {
  31114. WOLFSSL_MSG("Bad RNG Init, trying global");
  31115. if (initGlobalRNG == 0) {
  31116. WOLFSSL_MSG("Global RNG no Init");
  31117. }
  31118. else
  31119. rng = &globalRNG;
  31120. }
  31121. if (rng) {
  31122. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  31123. nbchecks, &res, rng) != MP_OKAY) {
  31124. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  31125. res = MP_NO;
  31126. }
  31127. }
  31128. if (initTmpRng)
  31129. wc_FreeRng(tmpRNG);
  31130. #ifdef WOLFSSL_SMALL_STACK
  31131. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  31132. #endif
  31133. if (res != MP_YES) {
  31134. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  31135. return WOLFSSL_FAILURE;
  31136. }
  31137. return WOLFSSL_SUCCESS;
  31138. }
  31139. /* return code compliant with OpenSSL :
  31140. * (bn mod w) if success, -1 if error
  31141. */
  31142. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  31143. WOLFSSL_BN_ULONG w)
  31144. {
  31145. WOLFSSL_BN_ULONG ret = 0;
  31146. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  31147. if (bn == NULL || bn->internal == NULL) {
  31148. WOLFSSL_MSG("bn NULL error");
  31149. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  31150. }
  31151. if (w <= (WOLFSSL_BN_ULONG)MP_MASK) {
  31152. mp_digit bn_ret;
  31153. if (mp_mod_d((mp_int*)bn->internal, (mp_digit)w, &bn_ret) != MP_OKAY) {
  31154. WOLFSSL_MSG("mp_add_d error");
  31155. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  31156. }
  31157. ret = (WOLFSSL_BN_ULONG)bn_ret;
  31158. } else {
  31159. int mp_ret;
  31160. mp_int w_mp, r_mp;
  31161. if (mp_init(&w_mp) != MP_OKAY)
  31162. return (unsigned long)WOLFSSL_FAILURE;
  31163. if (mp_init(&r_mp) != MP_OKAY)
  31164. return (unsigned long)WOLFSSL_FAILURE;
  31165. if (mp_set_int(&w_mp, w) != MP_OKAY)
  31166. return (unsigned long)WOLFSSL_FAILURE;
  31167. mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
  31168. ret = wolfSSL_BN_get_word_1(&r_mp);
  31169. mp_free(&r_mp);
  31170. mp_free(&w_mp);
  31171. if (mp_ret != MP_OKAY) {
  31172. WOLFSSL_MSG("mp_mod error");
  31173. return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
  31174. }
  31175. }
  31176. return ret;
  31177. }
  31178. #endif /* WOLFSSL_KEY_GEN && (!NO_RSA || !NO_DH || !NO_DSA) */
  31179. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  31180. {
  31181. int len = 0;
  31182. char *buf;
  31183. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  31184. if (bn == NULL || bn->internal == NULL) {
  31185. WOLFSSL_MSG("bn NULL error");
  31186. return NULL;
  31187. }
  31188. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  31189. WOLFSSL_MSG("mp_radix_size failure");
  31190. return NULL;
  31191. }
  31192. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  31193. if (buf == NULL) {
  31194. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  31195. return NULL;
  31196. }
  31197. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  31198. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  31199. return NULL;
  31200. }
  31201. return buf;
  31202. }
  31203. #ifndef NO_FILESYSTEM
  31204. /* return code compliant with OpenSSL :
  31205. * 1 if success, 0 if error
  31206. */
  31207. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  31208. {
  31209. char *buf;
  31210. int ret;
  31211. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  31212. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  31213. WOLFSSL_MSG("bn NULL error");
  31214. return WOLFSSL_FAILURE;
  31215. }
  31216. buf = wolfSSL_BN_bn2hex(bn);
  31217. if (buf == NULL) {
  31218. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  31219. return WOLFSSL_FAILURE;
  31220. }
  31221. if (XFPRINTF(fp, "%s", buf) < 0)
  31222. ret = WOLFSSL_FAILURE;
  31223. else
  31224. ret = WOLFSSL_SUCCESS;
  31225. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  31226. return ret;
  31227. }
  31228. #endif /* !NO_FILESYSTEM */
  31229. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  31230. {
  31231. /* ctx is not used, return new Bignum */
  31232. (void)ctx;
  31233. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  31234. return wolfSSL_BN_new();
  31235. }
  31236. #ifndef NO_WOLFSSL_STUB
  31237. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  31238. {
  31239. (void)ctx;
  31240. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  31241. WOLFSSL_STUB("BN_CTX_start");
  31242. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  31243. }
  31244. #endif
  31245. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  31246. WOLFSSL_BIGNUM *a,
  31247. const WOLFSSL_BIGNUM *n,
  31248. WOLFSSL_BN_CTX *ctx)
  31249. {
  31250. int dynamic = 0;
  31251. /* ctx is not used */
  31252. (void)ctx;
  31253. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  31254. /* check parameter */
  31255. if (r == NULL) {
  31256. r = wolfSSL_BN_new();
  31257. if (r == NULL){
  31258. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  31259. return NULL;
  31260. }
  31261. dynamic = 1;
  31262. }
  31263. if (a == NULL) {
  31264. WOLFSSL_MSG("a NULL error");
  31265. if (dynamic == 1) {
  31266. wolfSSL_BN_free(r);
  31267. }
  31268. return NULL;
  31269. }
  31270. if (n == NULL) {
  31271. WOLFSSL_MSG("n NULL error");
  31272. if (dynamic == 1) {
  31273. wolfSSL_BN_free(r);
  31274. }
  31275. return NULL;
  31276. }
  31277. /* Compute inverse of a modulo n and return r */
  31278. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  31279. (mp_int*)r->internal) == MP_VAL){
  31280. WOLFSSL_MSG("mp_invmod() error");
  31281. if (dynamic == 1) {
  31282. wolfSSL_BN_free(r);
  31283. }
  31284. return NULL;
  31285. }
  31286. return r;
  31287. }
  31288. #endif /* OPENSSL_EXTRA */
  31289. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) && \
  31290. !defined(NO_ASN)
  31291. #ifndef NO_BIO
  31292. static int unprintable_char(char c)
  31293. {
  31294. const unsigned char last_unprintable = 31;
  31295. const unsigned char LF = 10;
  31296. const unsigned char CR = 13;
  31297. if (c <= last_unprintable && c != LF && c != CR) {
  31298. return 1;
  31299. }
  31300. return 0;
  31301. }
  31302. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  31303. {
  31304. int i;
  31305. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  31306. if (out == NULL || str == NULL)
  31307. return WOLFSSL_FAILURE;
  31308. for (i=0; i < str->length; i++) {
  31309. if (unprintable_char(str->data[i])) {
  31310. str->data[i] = '.';
  31311. }
  31312. }
  31313. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  31314. return WOLFSSL_FAILURE;
  31315. }
  31316. return str->length;
  31317. }
  31318. #endif /* !NO_BIO */
  31319. #endif /* (WOLFSSL_QT || OPENSSL_ALL || OPENSSL_EXTRA) && !NO_ASN */
  31320. #if defined(OPENSSL_EXTRA)
  31321. const char *wolfSSL_ASN1_tag2str(int tag)
  31322. {
  31323. static const char *const tag_label[31] = {
  31324. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  31325. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  31326. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  31327. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  31328. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  31329. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  31330. "<ASN1 29>", "BMPSTRING"
  31331. };
  31332. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  31333. tag &= ~0x100;
  31334. if (tag < 0 || tag > 30)
  31335. return "(unknown)";
  31336. return tag_label[tag];
  31337. }
  31338. #ifndef NO_BIO
  31339. static int check_esc_char(char c, char *esc)
  31340. {
  31341. char *ptr;
  31342. ptr = esc;
  31343. while(*ptr != 0){
  31344. if (c == *ptr)
  31345. return 1;
  31346. ptr++;
  31347. }
  31348. return 0;
  31349. }
  31350. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  31351. unsigned long flags)
  31352. {
  31353. size_t str_len = 0, type_len = 0;
  31354. unsigned char *typebuf = NULL;
  31355. const char *hash="#";
  31356. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  31357. if (out == NULL || str == NULL)
  31358. return WOLFSSL_FAILURE;
  31359. /* add ASN1 type tag */
  31360. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  31361. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  31362. /* colon len + tag len + null*/
  31363. type_len = XSTRLEN(tag) + 2;
  31364. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31365. if (typebuf == NULL){
  31366. WOLFSSL_MSG("memory alloc failed.");
  31367. return WOLFSSL_FAILURE;
  31368. }
  31369. XMEMSET(typebuf, 0, type_len);
  31370. if (XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag)
  31371. >= (int)type_len)
  31372. {
  31373. WOLFSSL_MSG("Buffer overrun.");
  31374. return WOLFSSL_FAILURE;
  31375. }
  31376. type_len--;
  31377. }
  31378. /* dump hex */
  31379. if (flags & ASN1_STRFLGS_DUMP_ALL){
  31380. char hex_tmp[4];
  31381. char *str_ptr, *str_end;
  31382. if (type_len > 0){
  31383. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  31384. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31385. return WOLFSSL_FAILURE;
  31386. }
  31387. str_len += type_len;
  31388. }
  31389. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  31390. goto err_exit;
  31391. }
  31392. str_len++;
  31393. if (flags & ASN1_STRFLGS_DUMP_DER){
  31394. ByteToHexStr((byte)str->type, &hex_tmp[0]);
  31395. ByteToHexStr((byte)str->length, &hex_tmp[2]);
  31396. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  31397. goto err_exit;
  31398. }
  31399. str_len += 4;
  31400. XMEMSET(hex_tmp, 0, 4);
  31401. }
  31402. str_ptr = str->data;
  31403. str_end = str->data + str->length;
  31404. while (str_ptr < str_end){
  31405. ByteToHexStr((byte)*str_ptr, &hex_tmp[0]);
  31406. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  31407. goto err_exit;
  31408. }
  31409. str_ptr++;
  31410. str_len += 2;
  31411. }
  31412. if (type_len > 0)
  31413. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31414. return (int)str_len;
  31415. }
  31416. if (type_len > 0){
  31417. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  31418. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31419. return WOLFSSL_FAILURE;
  31420. }
  31421. str_len += type_len;
  31422. }
  31423. if (flags & ASN1_STRFLGS_ESC_2253){
  31424. char esc_ch[] = "+;<>\\";
  31425. char* esc_ptr;
  31426. esc_ptr = str->data;
  31427. while (*esc_ptr != 0){
  31428. if (check_esc_char(*esc_ptr, esc_ch)){
  31429. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  31430. goto err_exit;
  31431. str_len++;
  31432. }
  31433. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  31434. goto err_exit;
  31435. str_len++;
  31436. esc_ptr++;
  31437. }
  31438. if (type_len > 0)
  31439. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31440. return (int)str_len;
  31441. }
  31442. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  31443. goto err_exit;
  31444. }
  31445. str_len += str->length;
  31446. if (type_len > 0)
  31447. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31448. return (int)str_len;
  31449. err_exit:
  31450. if (type_len > 0)
  31451. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31452. return WOLFSSL_FAILURE;
  31453. }
  31454. #endif /* !NO_BIO */
  31455. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  31456. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  31457. int offset_day, long offset_sec)
  31458. {
  31459. const time_t sec_per_day = 24*60*60;
  31460. time_t t_adj = 0;
  31461. time_t offset_day_sec = 0;
  31462. char time_str[MAX_TIME_STRING_SZ];
  31463. int time_get;
  31464. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  31465. if (s == NULL) {
  31466. s = wolfSSL_ASN1_TIME_new();
  31467. if (s == NULL) {
  31468. return NULL;
  31469. }
  31470. }
  31471. /* compute GMT time with offset */
  31472. offset_day_sec = offset_day * sec_per_day;
  31473. t_adj = t + offset_day_sec + offset_sec;
  31474. /* Get time string as either UTC or GeneralizedTime */
  31475. time_get = GetFormattedTime(&t_adj, (byte*)time_str,
  31476. (word32)sizeof(time_str));
  31477. if (time_get <= 0) {
  31478. wolfSSL_ASN1_TIME_free(s);
  31479. return NULL;
  31480. }
  31481. if (wolfSSL_ASN1_TIME_set_string(s, time_str) != WOLFSSL_SUCCESS) {
  31482. wolfSSL_ASN1_TIME_free(s);
  31483. return NULL;
  31484. }
  31485. return s;
  31486. }
  31487. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  31488. #ifndef NO_ASN_TIME
  31489. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  31490. {
  31491. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  31492. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  31493. if (!ret)
  31494. return NULL;
  31495. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  31496. return ret;
  31497. }
  31498. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  31499. {
  31500. if (t) {
  31501. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  31502. }
  31503. }
  31504. /* not a compatibility function - length getter for opaque type */
  31505. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  31506. {
  31507. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  31508. if (t == NULL)
  31509. return WOLFSSL_FAILURE;
  31510. return t->length;
  31511. }
  31512. /* not a compatibility function - data getter for opaque type */
  31513. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  31514. {
  31515. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  31516. if (t == NULL)
  31517. return NULL;
  31518. return t->data;
  31519. }
  31520. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  31521. WOLFSSL_ASN1_TIME **out)
  31522. {
  31523. int time_type = 0;
  31524. WOLFSSL_ASN1_TIME *ret = NULL;
  31525. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  31526. if (t == NULL) {
  31527. WOLFSSL_MSG("Invalid ASN_TIME value");
  31528. } else {
  31529. time_type = t->type;
  31530. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  31531. WOLFSSL_MSG("Invalid ASN_TIME type.");
  31532. } else {
  31533. if (out == NULL || *out == NULL) {
  31534. ret = wolfSSL_ASN1_TIME_new();
  31535. if (ret == NULL){
  31536. WOLFSSL_MSG("memory alloc failed.");
  31537. }
  31538. } else {
  31539. ret = *out;
  31540. }
  31541. }
  31542. }
  31543. if (ret != NULL) {
  31544. if (time_type == ASN_GENERALIZED_TIME){
  31545. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  31546. } else { /* ASN_UTC_TIME */
  31547. /* convert UTC to generalized time */
  31548. ret->type = ASN_GENERALIZED_TIME;
  31549. ret->length = ASN_GENERALIZED_TIME_SIZE;
  31550. if (t->data[0] >= '5') {
  31551. ret->data[0] = '1'; ret->data[1] = '9';
  31552. } else {
  31553. ret->data[0] = '2'; ret->data[1] = '0';
  31554. }
  31555. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  31556. }
  31557. }
  31558. return ret;
  31559. }
  31560. #endif /* !NO_ASN_TIME */
  31561. #ifndef NO_ASN
  31562. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  31563. {
  31564. unsigned char *pptr = NULL;
  31565. char pad = 0 ;
  31566. unsigned char pad_val = 0;
  31567. int ret_size = 0;
  31568. unsigned char data1 = 0;
  31569. unsigned char neg = 0;
  31570. int i = 0;
  31571. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  31572. if (a == NULL)
  31573. return WOLFSSL_FAILURE;
  31574. ret_size = a->intData[1];
  31575. if (ret_size == 0)
  31576. ret_size = 1;
  31577. else{
  31578. ret_size = (int)a->intData[1];
  31579. neg = a->negative;
  31580. data1 = a->intData[2];
  31581. if (ret_size == 1 && data1 == 0)
  31582. neg = 0;
  31583. /* 0x80 or greater positive number in first byte */
  31584. if (!neg && (data1 > 127)){
  31585. pad = 1;
  31586. pad_val = 0;
  31587. } else if (neg){
  31588. /* negative number */
  31589. if (data1 > 128){
  31590. pad = 1;
  31591. pad_val = 0xff;
  31592. } else if (data1 == 128){
  31593. for (i = 3; i < a->intData[1] + 2; i++){
  31594. if (a->intData[i]){
  31595. pad = 1;
  31596. pad_val = 0xff;
  31597. break;
  31598. }
  31599. }
  31600. }
  31601. }
  31602. ret_size += (int)pad;
  31603. }
  31604. if (pp == NULL)
  31605. return ret_size;
  31606. pptr = *pp;
  31607. if (pad)
  31608. *(pptr++) = pad_val;
  31609. if (a->intData[1] == 0)
  31610. *(pptr++) = 0;
  31611. else if (!neg){
  31612. /* positive number */
  31613. for (i=0; i < a->intData[1]; i++){
  31614. *pptr = a->intData[i+2];
  31615. pptr++;
  31616. }
  31617. } else {
  31618. /* negative number */
  31619. int str_len = 0;
  31620. /* 0 padding from end of buffer */
  31621. str_len = (int)a->intData[1];
  31622. pptr += a->intData[1] - 1;
  31623. while (!a->intData[str_len + 2] && str_len > 1){
  31624. *(pptr--) = 0;
  31625. str_len--;
  31626. }
  31627. /* 2's complement next octet */
  31628. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  31629. str_len--;
  31630. /* Complement any octets left */
  31631. while (str_len > 0){
  31632. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  31633. str_len--;
  31634. }
  31635. }
  31636. *pp += ret_size;
  31637. return ret_size;
  31638. }
  31639. #endif /* !NO_ASN */
  31640. #endif /* OPENSSL_EXTRA */
  31641. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  31642. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  31643. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  31644. * disabled since a copy of mpi is made by this function and placed into bn.
  31645. */
  31646. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  31647. {
  31648. byte dynamic = 0;
  31649. #ifdef WOLFSSL_DEBUG_OPENSSL
  31650. WOLFSSL_MSG("Entering SetIndividualExternal");
  31651. #endif
  31652. if (mpi == NULL || bn == NULL) {
  31653. WOLFSSL_MSG("mpi NULL error");
  31654. return WOLFSSL_FATAL_ERROR;
  31655. }
  31656. if (*bn == NULL) {
  31657. *bn = wolfSSL_BN_new();
  31658. if (*bn == NULL) {
  31659. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  31660. return WOLFSSL_FATAL_ERROR;
  31661. }
  31662. dynamic = 1;
  31663. }
  31664. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  31665. WOLFSSL_MSG("mp_copy error");
  31666. if (dynamic == 1) {
  31667. wolfSSL_BN_free(*bn);
  31668. }
  31669. return WOLFSSL_FATAL_ERROR;
  31670. }
  31671. return WOLFSSL_SUCCESS;
  31672. }
  31673. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  31674. {
  31675. if (bn)
  31676. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  31677. }
  31678. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  31679. {
  31680. WOLFSSL_BIGNUM* external;
  31681. mp_int* mpi;
  31682. #ifdef WOLFSSL_DEBUG_OPENSSL
  31683. WOLFSSL_MSG("wolfSSL_BN_new");
  31684. #endif
  31685. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  31686. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  31687. if (mpi == NULL) {
  31688. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  31689. return NULL;
  31690. }
  31691. #endif
  31692. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  31693. DYNAMIC_TYPE_BIGINT);
  31694. if (external == NULL) {
  31695. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  31696. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  31697. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  31698. #endif
  31699. return NULL;
  31700. }
  31701. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  31702. mpi = &external->fp;
  31703. #endif
  31704. InitwolfSSL_BigNum(external);
  31705. if (mp_init(mpi) != MP_OKAY) {
  31706. wolfSSL_BN_free(external);
  31707. return NULL;
  31708. }
  31709. external->internal = mpi;
  31710. return external;
  31711. }
  31712. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  31713. /* This function works without BN_free only with TFM */
  31714. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  31715. {
  31716. if(bn == NULL)return;
  31717. #ifdef WOLFSSL_DEBUG_OPENSSL
  31718. WOLFSSL_MSG("wolfSSL_BN_init");
  31719. #endif
  31720. InitwolfSSL_BigNum(bn);
  31721. if (mp_init(&bn->fp) != MP_OKAY)
  31722. return;
  31723. bn->internal = (void *)&bn->fp;
  31724. }
  31725. #endif
  31726. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  31727. {
  31728. #ifdef WOLFSSL_DEBUG_OPENSSL
  31729. WOLFSSL_MSG("wolfSSL_BN_free");
  31730. #endif
  31731. if (bn) {
  31732. if (bn->internal) {
  31733. mp_int* bni = (mp_int*)bn->internal;
  31734. mp_free(bni);
  31735. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  31736. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  31737. #endif
  31738. bn->internal = NULL;
  31739. }
  31740. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  31741. /* bn = NULL, don't try to access or double free it */
  31742. }
  31743. }
  31744. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  31745. {
  31746. #ifdef WOLFSSL_DEBUG_OPENSSL
  31747. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  31748. #endif
  31749. if (bn) {
  31750. if (bn->internal) {
  31751. mp_int* bni = (mp_int*)bn->internal;
  31752. mp_forcezero(bni);
  31753. }
  31754. wolfSSL_BN_free(bn);
  31755. }
  31756. }
  31757. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  31758. {
  31759. #ifdef WOLFSSL_DEBUG_OPENSSL
  31760. WOLFSSL_MSG("wolfSSL_BN_clear");
  31761. #endif
  31762. if (bn && bn->internal) {
  31763. mp_forcezero((mp_int*)bn->internal);
  31764. }
  31765. }
  31766. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  31767. #ifdef OPENSSL_ALL
  31768. #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8)
  31769. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  31770. WOLFSSL_EVP_PKEY* pkey,
  31771. const WOLFSSL_EVP_CIPHER* enc,
  31772. char* passwd, int passwdSz,
  31773. wc_pem_password_cb* cb, void* ctx)
  31774. {
  31775. int ret = 0;
  31776. char password[NAME_SZ];
  31777. byte* key = NULL;
  31778. word32 keySz;
  31779. byte* pem = NULL;
  31780. int pemSz;
  31781. int type = PKCS8_PRIVATEKEY_TYPE;
  31782. int algId;
  31783. const byte* curveOid;
  31784. word32 oidSz;
  31785. int encAlgId = 0;
  31786. if (bio == NULL || pkey == NULL)
  31787. return -1;
  31788. keySz = pkey->pkey_sz + 128;
  31789. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31790. if (key == NULL)
  31791. ret = MEMORY_E;
  31792. if (ret == 0 && enc != NULL && passwd == NULL) {
  31793. passwdSz = cb(password, sizeof(password), 1, ctx);
  31794. if (passwdSz < 0)
  31795. ret = WOLFSSL_FAILURE;
  31796. passwd = password;
  31797. }
  31798. if (ret == 0 && enc != NULL) {
  31799. WC_RNG rng;
  31800. ret = wc_InitRng(&rng);
  31801. if (ret == 0) {
  31802. #ifndef NO_DES3
  31803. if (enc == EVP_DES_CBC)
  31804. encAlgId = DESb;
  31805. else if (enc == EVP_DES_EDE3_CBC)
  31806. encAlgId = DES3b;
  31807. else
  31808. #endif
  31809. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  31810. #ifdef WOLFSSL_AES_256
  31811. if (enc == EVP_AES_256_CBC)
  31812. encAlgId = AES256CBCb;
  31813. else
  31814. #endif
  31815. #endif
  31816. ret = -1;
  31817. if (ret == 0) {
  31818. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  31819. &keySz, passwd, passwdSz, PKCS5, PBES2,
  31820. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  31821. &rng, NULL);
  31822. if (ret > 0) {
  31823. keySz = ret;
  31824. ret = 0;
  31825. }
  31826. }
  31827. wc_FreeRng(&rng);
  31828. }
  31829. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  31830. }
  31831. if (ret == 0 && enc == NULL) {
  31832. type = PKCS8_PRIVATEKEY_TYPE;
  31833. #ifdef HAVE_ECC
  31834. if (pkey->type == EVP_PKEY_EC) {
  31835. algId = ECDSAk;
  31836. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  31837. &oidSz);
  31838. }
  31839. else
  31840. #endif
  31841. {
  31842. algId = RSAk;
  31843. curveOid = NULL;
  31844. oidSz = 0;
  31845. }
  31846. #ifdef HAVE_ECC
  31847. if (ret >= 0)
  31848. #endif
  31849. {
  31850. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  31851. pkey->pkey_sz, algId, curveOid, oidSz);
  31852. keySz = ret;
  31853. }
  31854. }
  31855. if (password == passwd)
  31856. XMEMSET(password, 0, passwdSz);
  31857. if (ret >= 0) {
  31858. pemSz = 2 * keySz + 2 * 64;
  31859. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31860. if (pem == NULL)
  31861. ret = MEMORY_E;
  31862. }
  31863. if (ret >= 0)
  31864. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  31865. if (key != NULL)
  31866. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31867. if (ret >= 0) {
  31868. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  31869. ret = -1;
  31870. }
  31871. if (pem != NULL)
  31872. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31873. return ret < 0 ? 0 : ret;
  31874. }
  31875. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  31876. int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey,
  31877. const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz,
  31878. wc_pem_password_cb* cb, void* ctx)
  31879. {
  31880. int ret = WOLFSSL_SUCCESS;
  31881. BIO *b;
  31882. WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey");
  31883. b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE);
  31884. if (b == NULL) {
  31885. ret = WOLFSSL_FAILURE;
  31886. }
  31887. if (ret == WOLFSSL_SUCCESS) {
  31888. ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd,
  31889. passwdSz, cb, ctx);
  31890. }
  31891. wolfSSL_BIO_free(b);
  31892. return ret;
  31893. }
  31894. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  31895. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  31896. {
  31897. int ret = 0;
  31898. byte* mem = NULL;
  31899. #ifndef NO_FILESYSTEM
  31900. long memSz;
  31901. XFILE file;
  31902. long curr;
  31903. #endif
  31904. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  31905. }
  31906. #ifndef NO_FILESYSTEM
  31907. else if (bio->type == WOLFSSL_BIO_FILE) {
  31908. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  31909. ret = BAD_FUNC_ARG;
  31910. if (ret == 0) {
  31911. curr = XFTELL(file);
  31912. if (curr < 0) {
  31913. ret = WOLFSSL_BAD_FILE;
  31914. }
  31915. if (XFSEEK(file, 0, XSEEK_END) != 0)
  31916. ret = WOLFSSL_BAD_FILE;
  31917. }
  31918. if (ret == 0) {
  31919. memSz = XFTELL(file);
  31920. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  31921. ret = WOLFSSL_BAD_FILE;
  31922. }
  31923. }
  31924. if (ret == 0) {
  31925. memSz -= curr;
  31926. ret = (int)memSz;
  31927. if (XFSEEK(file, curr, SEEK_SET) != 0)
  31928. ret = WOLFSSL_BAD_FILE;
  31929. }
  31930. }
  31931. #endif
  31932. if (ret > 0) {
  31933. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31934. if (mem == NULL) {
  31935. WOLFSSL_MSG("Memory error");
  31936. ret = MEMORY_E;
  31937. }
  31938. if (ret >= 0) {
  31939. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  31940. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31941. ret = MEMORY_E;
  31942. mem = NULL;
  31943. }
  31944. }
  31945. }
  31946. *data = mem;
  31947. return ret;
  31948. }
  31949. /* DER data is PKCS#8 encrypted. */
  31950. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  31951. WOLFSSL_EVP_PKEY** pkey,
  31952. wc_pem_password_cb* cb,
  31953. void* ctx)
  31954. {
  31955. int ret;
  31956. byte* der;
  31957. int len;
  31958. byte* p;
  31959. word32 algId;
  31960. WOLFSSL_EVP_PKEY* key;
  31961. if ((len = bio_get_data(bio, &der)) < 0)
  31962. return NULL;
  31963. if (cb != NULL) {
  31964. char password[NAME_SZ];
  31965. int passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  31966. if (passwordSz < 0) {
  31967. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31968. return NULL;
  31969. }
  31970. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31971. wc_MemZero_Add("wolfSSL_d2i_PKCS8PrivateKey_bio password", password,
  31972. passwordSz);
  31973. #endif
  31974. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  31975. if (ret < 0) {
  31976. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31977. return NULL;
  31978. }
  31979. ForceZero(password, passwordSz);
  31980. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31981. wc_MemZero_Check(password, passwordSz);
  31982. #endif
  31983. }
  31984. p = der;
  31985. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  31986. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31987. return key;
  31988. }
  31989. #endif /* !NO_BIO && !NO_PWDBASED && HAVE_PKCS8 */
  31990. /* Detect which type of key it is before decoding. */
  31991. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  31992. const unsigned char** pp,
  31993. long length)
  31994. {
  31995. int ret;
  31996. WOLFSSL_EVP_PKEY* key = NULL;
  31997. const byte* der = *pp;
  31998. word32 idx = 0;
  31999. int len = 0;
  32000. word32 end = 0;
  32001. int cnt = 0;
  32002. int type;
  32003. word32 algId;
  32004. word32 keyLen = (word32)length;
  32005. /* Take off PKCS#8 wrapper if found. */
  32006. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  32007. der += idx;
  32008. keyLen = len;
  32009. }
  32010. idx = 0;
  32011. len = 0;
  32012. /* Use the number of elements in the outer sequence to determine key type.
  32013. */
  32014. ret = GetSequence(der, &idx, &len, keyLen);
  32015. if (ret >= 0) {
  32016. end = idx + len;
  32017. while (ret >= 0 && idx < end) {
  32018. /* Skip type */
  32019. idx++;
  32020. /* Get length and skip over - keeping count */
  32021. len = 0;
  32022. ret = GetLength(der, &idx, &len, keyLen);
  32023. if (ret >= 0) {
  32024. if (idx + len > end)
  32025. ret = ASN_PARSE_E;
  32026. else {
  32027. idx += len;
  32028. cnt++;
  32029. }
  32030. }
  32031. }
  32032. }
  32033. if (ret >= 0) {
  32034. /* ECC includes version, private[, curve][, public key] */
  32035. if (cnt >= 2 && cnt <= 4)
  32036. type = EVP_PKEY_EC;
  32037. else
  32038. type = EVP_PKEY_RSA;
  32039. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  32040. *pp = der;
  32041. }
  32042. return key;
  32043. }
  32044. #endif /* OPENSSL_ALL */
  32045. #ifdef WOLFSSL_STATIC_EPHEMERAL
  32046. int wolfSSL_StaticEphemeralKeyLoad(WOLFSSL* ssl, int keyAlgo, void* keyPtr)
  32047. {
  32048. int ret;
  32049. word32 idx = 0;
  32050. DerBuffer* der = NULL;
  32051. if (ssl == NULL || ssl->ctx == NULL || keyPtr == NULL) {
  32052. return BAD_FUNC_ARG;
  32053. }
  32054. #ifndef SINGLE_THREADED
  32055. if (!ssl->ctx->staticKELockInit) {
  32056. return BUFFER_E; /* no keys set */
  32057. }
  32058. ret = wc_LockMutex(&ssl->ctx->staticKELock);
  32059. if (ret != 0) {
  32060. return ret;
  32061. }
  32062. #endif
  32063. ret = BUFFER_E; /* set default error */
  32064. switch (keyAlgo) {
  32065. #ifndef NO_DH
  32066. case WC_PK_TYPE_DH:
  32067. if (ssl != NULL)
  32068. der = ssl->staticKE.dhKey;
  32069. if (der == NULL)
  32070. der = ssl->ctx->staticKE.dhKey;
  32071. if (der != NULL) {
  32072. DhKey* key = (DhKey*)keyPtr;
  32073. WOLFSSL_MSG("Using static DH key");
  32074. ret = wc_DhKeyDecode(der->buffer, &idx, key, der->length);
  32075. }
  32076. break;
  32077. #endif
  32078. #ifdef HAVE_ECC
  32079. case WC_PK_TYPE_ECDH:
  32080. if (ssl != NULL)
  32081. der = ssl->staticKE.ecKey;
  32082. if (der == NULL)
  32083. der = ssl->ctx->staticKE.ecKey;
  32084. if (der != NULL) {
  32085. ecc_key* key = (ecc_key*)keyPtr;
  32086. WOLFSSL_MSG("Using static ECDH key");
  32087. ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length);
  32088. }
  32089. break;
  32090. #endif
  32091. #ifdef HAVE_CURVE25519
  32092. case WC_PK_TYPE_CURVE25519:
  32093. if (ssl != NULL)
  32094. der = ssl->staticKE.x25519Key;
  32095. if (der == NULL)
  32096. der = ssl->ctx->staticKE.x25519Key;
  32097. if (der != NULL) {
  32098. curve25519_key* key = (curve25519_key*)keyPtr;
  32099. WOLFSSL_MSG("Using static X25519 key");
  32100. ret = wc_Curve25519PrivateKeyDecode(der->buffer, &idx, key,
  32101. der->length);
  32102. }
  32103. break;
  32104. #endif
  32105. #ifdef HAVE_CURVE448
  32106. case WC_PK_TYPE_CURVE448:
  32107. if (ssl != NULL)
  32108. der = ssl->staticKE.x448Key;
  32109. if (der == NULL)
  32110. der = ssl->ctx->staticKE.x448Key;
  32111. if (der != NULL) {
  32112. curve448_key* key = (curve448_key*)keyPtr;
  32113. WOLFSSL_MSG("Using static X448 key");
  32114. ret = wc_Curve448PrivateKeyDecode(der->buffer, &idx, key,
  32115. der->length);
  32116. }
  32117. break;
  32118. #endif
  32119. default:
  32120. /* not supported */
  32121. ret = NOT_COMPILED_IN;
  32122. break;
  32123. }
  32124. #ifndef SINGLE_THREADED
  32125. wc_UnLockMutex(&ssl->ctx->staticKELock);
  32126. #endif
  32127. return ret;
  32128. }
  32129. static int SetStaticEphemeralKey(WOLFSSL_CTX* ctx,
  32130. StaticKeyExchangeInfo_t* staticKE, int keyAlgo, const char* key,
  32131. unsigned int keySz, int format, void* heap)
  32132. {
  32133. int ret = 0;
  32134. DerBuffer* der = NULL;
  32135. byte* keyBuf = NULL;
  32136. #ifndef NO_FILESYSTEM
  32137. const char* keyFile = NULL;
  32138. #endif
  32139. /* allow empty key to free buffer */
  32140. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  32141. return BAD_FUNC_ARG;
  32142. }
  32143. WOLFSSL_ENTER("SetStaticEphemeralKey");
  32144. /* if just free'ing key then skip loading */
  32145. if (key != NULL) {
  32146. #ifndef NO_FILESYSTEM
  32147. /* load file from filesystem */
  32148. if (key != NULL && keySz == 0) {
  32149. size_t keyBufSz = 0;
  32150. keyFile = (const char*)key;
  32151. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  32152. if (ret != 0) {
  32153. return ret;
  32154. }
  32155. keySz = (unsigned int)keyBufSz;
  32156. }
  32157. else
  32158. #endif
  32159. {
  32160. /* use as key buffer directly */
  32161. keyBuf = (byte*)key;
  32162. }
  32163. if (format == WOLFSSL_FILETYPE_PEM) {
  32164. #ifdef WOLFSSL_PEM_TO_DER
  32165. int keyFormat = 0;
  32166. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  32167. heap, NULL, &keyFormat);
  32168. /* auto detect key type */
  32169. if (ret == 0 && keyAlgo == WC_PK_TYPE_NONE) {
  32170. if (keyFormat == ECDSAk)
  32171. keyAlgo = WC_PK_TYPE_ECDH;
  32172. else if (keyFormat == X25519k)
  32173. keyAlgo = WC_PK_TYPE_CURVE25519;
  32174. else
  32175. keyAlgo = WC_PK_TYPE_DH;
  32176. }
  32177. #else
  32178. ret = NOT_COMPILED_IN;
  32179. #endif
  32180. }
  32181. else {
  32182. /* Detect PK type (if required) */
  32183. #ifdef HAVE_ECC
  32184. if (keyAlgo == WC_PK_TYPE_NONE) {
  32185. word32 idx = 0;
  32186. ecc_key eccKey;
  32187. ret = wc_ecc_init_ex(&eccKey, heap, INVALID_DEVID);
  32188. if (ret == 0) {
  32189. ret = wc_EccPrivateKeyDecode(keyBuf, &idx, &eccKey, keySz);
  32190. if (ret == 0)
  32191. keyAlgo = WC_PK_TYPE_ECDH;
  32192. wc_ecc_free(&eccKey);
  32193. }
  32194. }
  32195. #endif
  32196. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
  32197. if (keyAlgo == WC_PK_TYPE_NONE) {
  32198. word32 idx = 0;
  32199. DhKey dhKey;
  32200. ret = wc_InitDhKey_ex(&dhKey, heap, INVALID_DEVID);
  32201. if (ret == 0) {
  32202. ret = wc_DhKeyDecode(keyBuf, &idx, &dhKey, keySz);
  32203. if (ret == 0)
  32204. keyAlgo = WC_PK_TYPE_DH;
  32205. wc_FreeDhKey(&dhKey);
  32206. }
  32207. }
  32208. #endif
  32209. #ifdef HAVE_CURVE25519
  32210. if (keyAlgo == WC_PK_TYPE_NONE) {
  32211. word32 idx = 0;
  32212. curve25519_key x25519Key;
  32213. ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID);
  32214. if (ret == 0) {
  32215. ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key,
  32216. keySz);
  32217. if (ret == 0)
  32218. keyAlgo = WC_PK_TYPE_CURVE25519;
  32219. wc_curve25519_free(&x25519Key);
  32220. }
  32221. }
  32222. #endif
  32223. #ifdef HAVE_CURVE448
  32224. if (keyAlgo == WC_PK_TYPE_NONE) {
  32225. word32 idx = 0;
  32226. curve448_key x448Key;
  32227. ret = wc_curve448_init(&x448Key);
  32228. if (ret == 0) {
  32229. ret = wc_Curve448PrivateKeyDecode(keyBuf, &idx, &x448Key,
  32230. keySz);
  32231. if (ret == 0)
  32232. keyAlgo = WC_PK_TYPE_CURVE448;
  32233. wc_curve448_free(&x448Key);
  32234. }
  32235. }
  32236. #endif
  32237. if (keyAlgo != WC_PK_TYPE_NONE) {
  32238. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  32239. if (ret == 0) {
  32240. XMEMCPY(der->buffer, keyBuf, keySz);
  32241. }
  32242. }
  32243. }
  32244. }
  32245. #ifndef NO_FILESYSTEM
  32246. /* done with keyFile buffer */
  32247. if (keyFile && keyBuf) {
  32248. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  32249. }
  32250. #endif
  32251. #ifndef SINGLE_THREADED
  32252. if (ret == 0 && !ctx->staticKELockInit) {
  32253. ret = wc_InitMutex(&ctx->staticKELock);
  32254. if (ret == 0) {
  32255. ctx->staticKELockInit = 1;
  32256. }
  32257. }
  32258. #endif
  32259. if (ret == 0
  32260. #ifndef SINGLE_THREADED
  32261. && (ret = wc_LockMutex(&ctx->staticKELock)) == 0
  32262. #endif
  32263. ) {
  32264. switch (keyAlgo) {
  32265. #ifndef NO_DH
  32266. case WC_PK_TYPE_DH:
  32267. FreeDer(&staticKE->dhKey);
  32268. staticKE->dhKey = der; der = NULL;
  32269. break;
  32270. #endif
  32271. #ifdef HAVE_ECC
  32272. case WC_PK_TYPE_ECDH:
  32273. FreeDer(&staticKE->ecKey);
  32274. staticKE->ecKey = der; der = NULL;
  32275. break;
  32276. #endif
  32277. #ifdef HAVE_CURVE25519
  32278. case WC_PK_TYPE_CURVE25519:
  32279. FreeDer(&staticKE->x25519Key);
  32280. staticKE->x25519Key = der; der = NULL;
  32281. break;
  32282. #endif
  32283. #ifdef HAVE_CURVE448
  32284. case WC_PK_TYPE_CURVE448:
  32285. FreeDer(&staticKE->x448Key);
  32286. staticKE->x448Key = der; der = NULL;
  32287. break;
  32288. #endif
  32289. default:
  32290. /* not supported */
  32291. ret = NOT_COMPILED_IN;
  32292. break;
  32293. }
  32294. #ifndef SINGLE_THREADED
  32295. wc_UnLockMutex(&ctx->staticKELock);
  32296. #endif
  32297. }
  32298. if (ret != 0) {
  32299. FreeDer(&der);
  32300. }
  32301. (void)ctx; /* not used for single threaded */
  32302. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  32303. return ret;
  32304. }
  32305. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  32306. const char* key, unsigned int keySz, int format)
  32307. {
  32308. if (ctx == NULL) {
  32309. return BAD_FUNC_ARG;
  32310. }
  32311. return SetStaticEphemeralKey(ctx, &ctx->staticKE, keyAlgo,
  32312. key, keySz, format, ctx->heap);
  32313. }
  32314. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  32315. const char* key, unsigned int keySz, int format)
  32316. {
  32317. if (ssl == NULL || ssl->ctx == NULL) {
  32318. return BAD_FUNC_ARG;
  32319. }
  32320. return SetStaticEphemeralKey(ssl->ctx, &ssl->staticKE, keyAlgo,
  32321. key, keySz, format, ssl->heap);
  32322. }
  32323. static int GetStaticEphemeralKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  32324. int keyAlgo, const unsigned char** key, unsigned int* keySz)
  32325. {
  32326. int ret = 0;
  32327. DerBuffer* der = NULL;
  32328. if (key) *key = NULL;
  32329. if (keySz) *keySz = 0;
  32330. #ifndef SINGLE_THREADED
  32331. if (ctx->staticKELockInit &&
  32332. (ret = wc_LockMutex(&ctx->staticKELock)) != 0) {
  32333. return ret;
  32334. }
  32335. #endif
  32336. switch (keyAlgo) {
  32337. #ifndef NO_DH
  32338. case WC_PK_TYPE_DH:
  32339. if (ssl != NULL)
  32340. der = ssl->staticKE.dhKey;
  32341. if (der == NULL)
  32342. der = ctx->staticKE.dhKey;
  32343. break;
  32344. #endif
  32345. #ifdef HAVE_ECC
  32346. case WC_PK_TYPE_ECDH:
  32347. if (ssl != NULL)
  32348. der = ssl->staticKE.ecKey;
  32349. if (der == NULL)
  32350. der = ctx->staticKE.ecKey;
  32351. break;
  32352. #endif
  32353. #ifdef HAVE_CURVE25519
  32354. case WC_PK_TYPE_CURVE25519:
  32355. if (ssl != NULL)
  32356. der = ssl->staticKE.x25519Key;
  32357. if (der == NULL)
  32358. der = ctx->staticKE.x25519Key;
  32359. break;
  32360. #endif
  32361. #ifdef HAVE_CURVE448
  32362. case WC_PK_TYPE_CURVE448:
  32363. if (ssl != NULL)
  32364. der = ssl->staticKE.x448Key;
  32365. if (der == NULL)
  32366. der = ctx->staticKE.x448Key;
  32367. break;
  32368. #endif
  32369. default:
  32370. /* not supported */
  32371. ret = NOT_COMPILED_IN;
  32372. break;
  32373. }
  32374. if (der) {
  32375. if (key)
  32376. *key = der->buffer;
  32377. if (keySz)
  32378. *keySz = der->length;
  32379. }
  32380. #ifndef SINGLE_THREADED
  32381. wc_UnLockMutex(&ctx->staticKELock);
  32382. #endif
  32383. return ret;
  32384. }
  32385. /* returns pointer to currently loaded static ephemeral as ASN.1 */
  32386. /* this can be converted to PEM using wc_DerToPem */
  32387. int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  32388. const unsigned char** key, unsigned int* keySz)
  32389. {
  32390. if (ctx == NULL) {
  32391. return BAD_FUNC_ARG;
  32392. }
  32393. return GetStaticEphemeralKey(ctx, NULL, keyAlgo, key, keySz);
  32394. }
  32395. int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  32396. const unsigned char** key, unsigned int* keySz)
  32397. {
  32398. if (ssl == NULL || ssl->ctx == NULL) {
  32399. return BAD_FUNC_ARG;
  32400. }
  32401. return GetStaticEphemeralKey(ssl->ctx, ssl, keyAlgo, key, keySz);
  32402. }
  32403. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  32404. #if defined(OPENSSL_EXTRA)
  32405. /* wolfSSL_THREADID_current is provided as a compat API with
  32406. * CRYPTO_THREADID_current to register current thread id into given id object.
  32407. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  32408. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  32409. * like as existing wolfSSL_THREADID_set_numeric.
  32410. */
  32411. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  32412. {
  32413. (void)id;
  32414. return;
  32415. }
  32416. /* wolfSSL_THREADID_hash is provided as a compatible API with
  32417. * CRYPTO_THREADID_hash which returns a hash value calcurated from the
  32418. * specified thread id. However, CRYPTO_THREADID_hash API has been
  32419. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  32420. * This API only works as a stub to returns 0. This behavior is
  32421. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  32422. */
  32423. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  32424. {
  32425. (void)id;
  32426. return 0UL;
  32427. }
  32428. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  32429. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  32430. * Since this functionality is enabled by default in wolfSSL,
  32431. * this API exists as a stub.
  32432. */
  32433. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  32434. {
  32435. (void)ctx;
  32436. (void)onoff;
  32437. return WOLFSSL_SUCCESS;
  32438. }
  32439. /**
  32440. * set security level (wolfSSL doesn't support security level)
  32441. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  32442. * @param level security level
  32443. */
  32444. void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
  32445. {
  32446. WOLFSSL_ENTER("wolfSSL_CTX_set_security_level");
  32447. (void)ctx;
  32448. (void)level;
  32449. }
  32450. /**
  32451. * get security level (wolfSSL doesn't support security level)
  32452. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  32453. * @return always 0(level 0)
  32454. */
  32455. int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
  32456. {
  32457. WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
  32458. (void)ctx;
  32459. return 0;
  32460. }
  32461. /**
  32462. * Determine whether a WOLFSSL_SESSION object can be used for resumption
  32463. * @param s a pointer to WOLFSSL_SESSION structure
  32464. * @return return 1 if session is resumable, otherwise 0.
  32465. */
  32466. int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s)
  32467. {
  32468. s = ClientSessionToSession(s);
  32469. if (s == NULL)
  32470. return 0;
  32471. #ifdef HAVE_SESSION_TICKET
  32472. if (s->ticketLen > 0)
  32473. return 1;
  32474. #endif
  32475. if (s->sessionIDSz > 0)
  32476. return 1;
  32477. return 0;
  32478. }
  32479. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  32480. /*
  32481. * This API accepts a user callback which puts key-log records into
  32482. * a KEY LOGFILE. The callback is stored into a CTX and propagated to
  32483. * each SSL object on its creation timing.
  32484. */
  32485. void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb)
  32486. {
  32487. WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
  32488. /* stores the callback into WOLFSSL_CTX */
  32489. if (ctx != NULL) {
  32490. ctx->keyLogCb = cb;
  32491. }
  32492. }
  32493. wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
  32494. const WOLFSSL_CTX* ctx)
  32495. {
  32496. WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
  32497. if (ctx != NULL)
  32498. return ctx->keyLogCb;
  32499. else
  32500. return NULL;
  32501. }
  32502. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  32503. #endif /* OPENSSL_EXTRA */
  32504. #ifndef NO_CERT
  32505. #define WOLFSSL_X509_INCLUDED
  32506. #include "src/x509.c"
  32507. #endif
  32508. /*******************************************************************************
  32509. * START OF standard C library wrapping APIs
  32510. ******************************************************************************/
  32511. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  32512. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  32513. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  32514. #ifndef NO_WOLFSSL_STUB
  32515. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  32516. void *(*r) (void *, size_t, const char *,
  32517. int), void (*f) (void *))
  32518. {
  32519. (void) m;
  32520. (void) r;
  32521. (void) f;
  32522. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  32523. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  32524. return WOLFSSL_FAILURE;
  32525. }
  32526. #endif
  32527. #endif
  32528. #if defined(OPENSSL_EXTRA)
  32529. /**
  32530. * free allocated memory resouce
  32531. * @param str a pointer to resource to be freed
  32532. * @param file dummy argument
  32533. * @param line dummy argument
  32534. */
  32535. void wolfSSL_CRYPTO_free(void *str, const char *file, int line)
  32536. {
  32537. (void)file;
  32538. (void)line;
  32539. XFREE(str, 0, DYNAMIC_TYPE_TMP_BUFFER);
  32540. }
  32541. /**
  32542. * allocate memory with size of num
  32543. * @param num size of memory allocation to be malloced
  32544. * @param file dummy argument
  32545. * @param line dummy argument
  32546. * @return a pointer to allocated memory on succssesful, otherwise NULL
  32547. */
  32548. void *wolfSSL_CRYPTO_malloc(size_t num, const char *file, int line)
  32549. {
  32550. (void)file;
  32551. (void)line;
  32552. return XMALLOC(num, 0, DYNAMIC_TYPE_TMP_BUFFER);
  32553. }
  32554. #endif
  32555. /*******************************************************************************
  32556. * END OF standard C library wrapping APIs
  32557. ******************************************************************************/
  32558. /*******************************************************************************
  32559. * START OF EX_DATA APIs
  32560. ******************************************************************************/
  32561. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  32562. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  32563. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  32564. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  32565. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  32566. }
  32567. #endif
  32568. #ifdef HAVE_EX_DATA
  32569. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  32570. {
  32571. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  32572. #ifdef MAX_EX_DATA
  32573. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  32574. return ex_data->ex_data[idx];
  32575. }
  32576. #else
  32577. (void)ex_data;
  32578. (void)idx;
  32579. #endif
  32580. return NULL;
  32581. }
  32582. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  32583. {
  32584. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  32585. #ifdef MAX_EX_DATA
  32586. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  32587. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  32588. if (ex_data->ex_data_cleanup_routines[idx]) {
  32589. if (ex_data->ex_data[idx])
  32590. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  32591. ex_data->ex_data_cleanup_routines[idx] = NULL;
  32592. }
  32593. #endif
  32594. ex_data->ex_data[idx] = data;
  32595. return WOLFSSL_SUCCESS;
  32596. }
  32597. #else
  32598. (void)ex_data;
  32599. (void)idx;
  32600. (void)data;
  32601. #endif
  32602. return WOLFSSL_FAILURE;
  32603. }
  32604. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  32605. int wolfSSL_CRYPTO_set_ex_data_with_cleanup(
  32606. WOLFSSL_CRYPTO_EX_DATA* ex_data,
  32607. int idx,
  32608. void *data,
  32609. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  32610. {
  32611. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data_with_cleanup");
  32612. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  32613. if (ex_data->ex_data_cleanup_routines[idx] && ex_data->ex_data[idx])
  32614. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  32615. ex_data->ex_data[idx] = data;
  32616. ex_data->ex_data_cleanup_routines[idx] = cleanup_routine;
  32617. return WOLFSSL_SUCCESS;
  32618. }
  32619. return WOLFSSL_FAILURE;
  32620. }
  32621. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  32622. /**
  32623. * Issues unique index for the class specified by class_index.
  32624. * Other parameter except class_index are ignored.
  32625. * Currently, following class_index are accepted:
  32626. * - WOLF_CRYPTO_EX_INDEX_SSL
  32627. * - WOLF_CRYPTO_EX_INDEX_SSL_CTX
  32628. * - WOLF_CRYPTO_EX_INDEX_X509
  32629. * @param class_index index one of CRYPTO_EX_INDEX_xxx
  32630. * @param argp parameters to be saved
  32631. * @param argl parameters to be saved
  32632. * @param new_func a pointer to WOLFSSL_CRYPTO_EX_new
  32633. * @param dup_func a pointer to WOLFSSL_CRYPTO_EX_dup
  32634. * @param free_func a pointer to WOLFSSL_CRYPTO_EX_free
  32635. * @return index value grater or equal to zero on success, -1 on failure.
  32636. */
  32637. int wolfSSL_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
  32638. WOLFSSL_CRYPTO_EX_new* new_func,
  32639. WOLFSSL_CRYPTO_EX_dup* dup_func,
  32640. WOLFSSL_CRYPTO_EX_free* free_func)
  32641. {
  32642. WOLFSSL_ENTER("wolfSSL_CRYPTO_get_ex_new_index");
  32643. (void)argl;
  32644. (void)argp;
  32645. (void)new_func;
  32646. (void)dup_func;
  32647. (void)free_func;
  32648. return wolfssl_get_ex_new_index(class_index);
  32649. }
  32650. #endif /* HAVE_EX_DATA */
  32651. /*******************************************************************************
  32652. * END OF EX_DATA APIs
  32653. ******************************************************************************/
  32654. /*******************************************************************************
  32655. * START OF BUF_MEM API
  32656. ******************************************************************************/
  32657. #if defined(OPENSSL_EXTRA)
  32658. /* Begin functions for openssl/buffer.h */
  32659. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  32660. {
  32661. WOLFSSL_BUF_MEM* buf;
  32662. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  32663. DYNAMIC_TYPE_OPENSSL);
  32664. if (buf) {
  32665. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  32666. }
  32667. return buf;
  32668. }
  32669. /* non-compat API returns length of buffer on success */
  32670. int wolfSSL_BUF_MEM_grow_ex(WOLFSSL_BUF_MEM* buf, size_t len,
  32671. char zeroFill)
  32672. {
  32673. int len_int = (int)len;
  32674. int mx;
  32675. char* tmp;
  32676. /* verify provided arguments */
  32677. if (buf == NULL || len_int < 0) {
  32678. return 0; /* BAD_FUNC_ARG; */
  32679. }
  32680. /* check to see if fits in existing length */
  32681. if (buf->length > len) {
  32682. buf->length = len;
  32683. return len_int;
  32684. }
  32685. /* check to see if fits in max buffer */
  32686. if (buf->max >= len) {
  32687. if (buf->data != NULL && zeroFill) {
  32688. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  32689. }
  32690. buf->length = len;
  32691. return len_int;
  32692. }
  32693. /* expand size, to handle growth */
  32694. mx = (len_int + 3) / 3 * 4;
  32695. /* use realloc */
  32696. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  32697. if (tmp == NULL) {
  32698. return 0; /* ERR_R_MALLOC_FAILURE; */
  32699. }
  32700. buf->data = tmp;
  32701. buf->max = mx;
  32702. if (zeroFill)
  32703. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  32704. buf->length = len;
  32705. return len_int;
  32706. }
  32707. /* returns length of buffer on success */
  32708. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  32709. {
  32710. return wolfSSL_BUF_MEM_grow_ex(buf, len, 1);
  32711. }
  32712. /* non-compat API returns length of buffer on success */
  32713. int wolfSSL_BUF_MEM_resize(WOLFSSL_BUF_MEM* buf, size_t len)
  32714. {
  32715. char* tmp;
  32716. int mx;
  32717. /* verify provided arguments */
  32718. if (buf == NULL || len == 0 || (int)len <= 0) {
  32719. return 0; /* BAD_FUNC_ARG; */
  32720. }
  32721. if (len == buf->length)
  32722. return (int)len;
  32723. if (len > buf->length)
  32724. return wolfSSL_BUF_MEM_grow_ex(buf, len, 0);
  32725. /* expand size, to handle growth */
  32726. mx = ((int)len + 3) / 3 * 4;
  32727. /* We want to shrink the internal buffer */
  32728. tmp = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_OPENSSL);
  32729. if (tmp == NULL)
  32730. return 0;
  32731. buf->data = tmp;
  32732. buf->length = len;
  32733. buf->max = mx;
  32734. return (int)len;
  32735. }
  32736. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  32737. {
  32738. if (buf) {
  32739. if (buf->data) {
  32740. XFREE(buf->data, NULL, DYNAMIC_TYPE_OPENSSL);
  32741. buf->data = NULL;
  32742. }
  32743. buf->max = 0;
  32744. buf->length = 0;
  32745. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  32746. }
  32747. }
  32748. /* End Functions for openssl/buffer.h */
  32749. #endif /* OPENSSL_EXTRA */
  32750. /*******************************************************************************
  32751. * END OF BUF_MEM API
  32752. ******************************************************************************/
  32753. #define WOLFSSL_CONF_INCLUDED
  32754. #include <src/conf.c>
  32755. /*******************************************************************************
  32756. * START OF RAND API
  32757. ******************************************************************************/
  32758. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  32759. static int wolfSSL_RAND_InitMutex(void)
  32760. {
  32761. if (gRandMethodsInit == 0) {
  32762. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  32763. WOLFSSL_MSG("Bad Init Mutex rand methods");
  32764. return BAD_MUTEX_E;
  32765. }
  32766. gRandMethodsInit = 1;
  32767. }
  32768. return 0;
  32769. }
  32770. #endif
  32771. #ifdef OPENSSL_EXTRA
  32772. /* Checks if the global RNG has been created. If not then one is created.
  32773. *
  32774. * Returns WOLFSSL_SUCCESS when no error is encountered.
  32775. */
  32776. int wolfSSL_RAND_Init(void)
  32777. {
  32778. int ret = WOLFSSL_FAILURE;
  32779. #ifdef HAVE_GLOBAL_RNG
  32780. if (wc_LockMutex(&globalRNGMutex) == 0) {
  32781. if (initGlobalRNG == 0) {
  32782. ret = wc_InitRng(&globalRNG);
  32783. if (ret == 0) {
  32784. initGlobalRNG = 1;
  32785. ret = WOLFSSL_SUCCESS;
  32786. }
  32787. }
  32788. wc_UnLockMutex(&globalRNGMutex);
  32789. }
  32790. #endif
  32791. return ret;
  32792. }
  32793. /* WOLFSSL_SUCCESS on ok */
  32794. int wolfSSL_RAND_seed(const void* seed, int len)
  32795. {
  32796. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  32797. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  32798. if (gRandMethods && gRandMethods->seed) {
  32799. int ret = gRandMethods->seed(seed, len);
  32800. wc_UnLockMutex(&gRandMethodMutex);
  32801. return ret;
  32802. }
  32803. wc_UnLockMutex(&gRandMethodMutex);
  32804. }
  32805. #else
  32806. (void)seed;
  32807. (void)len;
  32808. #endif
  32809. /* Make sure global shared RNG (globalRNG) is initialized */
  32810. return wolfSSL_RAND_Init();
  32811. }
  32812. /* Returns the path for reading seed data from.
  32813. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  32814. *
  32815. * Note uses stdlib by default unless XGETENV macro is overwritten
  32816. *
  32817. * fname buffer to hold path
  32818. * len length of fname buffer
  32819. *
  32820. * Returns a pointer to fname on success and NULL on failure
  32821. */
  32822. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  32823. {
  32824. #ifndef NO_FILESYSTEM
  32825. char* rt;
  32826. char ap[] = "/.rnd";
  32827. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  32828. if (fname == NULL) {
  32829. return NULL;
  32830. }
  32831. XMEMSET(fname, 0, len);
  32832. /* if access to stdlib.h */
  32833. if ((rt = XGETENV("RANDFILE")) != NULL) {
  32834. if (len > XSTRLEN(rt)) {
  32835. XMEMCPY(fname, rt, XSTRLEN(rt));
  32836. }
  32837. else {
  32838. WOLFSSL_MSG("RANDFILE too large for buffer");
  32839. rt = NULL;
  32840. }
  32841. }
  32842. /* $RANDFILE was not set or is too large, check $HOME */
  32843. if (rt == NULL) {
  32844. WOLFSSL_MSG("Environment variable RANDFILE not set");
  32845. if ((rt = XGETENV("HOME")) == NULL) {
  32846. WOLFSSL_MSG("Environment variable HOME not set");
  32847. return NULL;
  32848. }
  32849. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  32850. fname[0] = '\0';
  32851. XSTRNCAT(fname, rt, len);
  32852. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  32853. return fname;
  32854. }
  32855. else {
  32856. WOLFSSL_MSG("HOME too large for buffer");
  32857. return NULL;
  32858. }
  32859. }
  32860. return fname;
  32861. #else
  32862. /* no filesystem defined */
  32863. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  32864. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  32865. (void)fname;
  32866. (void)len;
  32867. return NULL;
  32868. #endif
  32869. }
  32870. /* Writes 1024 bytes from the RNG to the given file name.
  32871. *
  32872. * fname name of file to write to
  32873. *
  32874. * Returns the number of bytes written
  32875. */
  32876. int wolfSSL_RAND_write_file(const char* fname)
  32877. {
  32878. int bytes = 0;
  32879. WOLFSSL_ENTER("RAND_write_file");
  32880. if (fname == NULL) {
  32881. return SSL_FAILURE;
  32882. }
  32883. #ifndef NO_FILESYSTEM
  32884. {
  32885. #ifndef WOLFSSL_SMALL_STACK
  32886. unsigned char buf[1024];
  32887. #else
  32888. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  32889. DYNAMIC_TYPE_TMP_BUFFER);
  32890. if (buf == NULL) {
  32891. WOLFSSL_MSG("malloc failed");
  32892. return SSL_FAILURE;
  32893. }
  32894. #endif
  32895. bytes = 1024; /* default size of buf */
  32896. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  32897. WOLFSSL_MSG("No RNG to use");
  32898. #ifdef WOLFSSL_SMALL_STACK
  32899. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32900. #endif
  32901. return 0;
  32902. }
  32903. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  32904. WOLFSSL_MSG("Error generating random buffer");
  32905. bytes = 0;
  32906. }
  32907. else {
  32908. XFILE f;
  32909. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32910. wc_MemZero_Add("wolfSSL_RAND_write_file buf", buf, bytes);
  32911. #endif
  32912. f = XFOPEN(fname, "wb");
  32913. if (f == XBADFILE) {
  32914. WOLFSSL_MSG("Error opening the file");
  32915. bytes = 0;
  32916. }
  32917. else {
  32918. size_t bytes_written = XFWRITE(buf, 1, bytes, f);
  32919. bytes = (int)bytes_written;
  32920. XFCLOSE(f);
  32921. }
  32922. }
  32923. ForceZero(buf, bytes);
  32924. #ifdef WOLFSSL_SMALL_STACK
  32925. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32926. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  32927. wc_MemZero_Check(buf, sizeof(buf));
  32928. #endif
  32929. }
  32930. #endif
  32931. return bytes;
  32932. }
  32933. #ifndef FREERTOS_TCP
  32934. /* These constant values are protocol values made by egd */
  32935. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  32936. defined(HAVE_HASHDRBG) && !defined(NETOS) && defined(HAVE_SYS_UN_H)
  32937. #define WOLFSSL_EGD_NBLOCK 0x01
  32938. #include <sys/un.h>
  32939. #endif
  32940. /* This collects entropy from the path nm and seeds the global PRNG with it.
  32941. *
  32942. * nm is the file path to the egd server
  32943. *
  32944. * Returns the number of bytes read.
  32945. */
  32946. int wolfSSL_RAND_egd(const char* nm)
  32947. {
  32948. #ifdef WOLFSSL_EGD_NBLOCK
  32949. struct sockaddr_un rem;
  32950. int fd;
  32951. int ret = WOLFSSL_SUCCESS;
  32952. word32 bytes = 0;
  32953. word32 idx = 0;
  32954. #ifndef WOLFSSL_SMALL_STACK
  32955. unsigned char buf[256];
  32956. #else
  32957. unsigned char* buf;
  32958. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32959. if (buf == NULL) {
  32960. WOLFSSL_MSG("Not enough memory");
  32961. return WOLFSSL_FATAL_ERROR;
  32962. }
  32963. #endif
  32964. XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
  32965. if (nm == NULL) {
  32966. #ifdef WOLFSSL_SMALL_STACK
  32967. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32968. #endif
  32969. return WOLFSSL_FATAL_ERROR;
  32970. }
  32971. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  32972. if (fd < 0) {
  32973. WOLFSSL_MSG("Error creating socket");
  32974. #ifdef WOLFSSL_SMALL_STACK
  32975. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32976. #endif
  32977. return WOLFSSL_FATAL_ERROR;
  32978. }
  32979. rem.sun_family = AF_UNIX;
  32980. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  32981. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  32982. /* connect to egd server */
  32983. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un)) == -1) {
  32984. WOLFSSL_MSG("error connecting to egd server");
  32985. ret = WOLFSSL_FATAL_ERROR;
  32986. }
  32987. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32988. if (ret == WOLFSSL_SUCCESS) {
  32989. wc_MemZero_Add("wolfSSL_RAND_egd buf", buf, 256);
  32990. }
  32991. #endif
  32992. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  32993. buf[idx] = WOLFSSL_EGD_NBLOCK;
  32994. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  32995. ret = (int)write(fd, buf + idx, 2);
  32996. if (ret != 2) {
  32997. if (errno == EAGAIN) {
  32998. ret = WOLFSSL_SUCCESS;
  32999. continue;
  33000. }
  33001. WOLFSSL_MSG("error requesting entropy from egd server");
  33002. ret = WOLFSSL_FATAL_ERROR;
  33003. break;
  33004. }
  33005. /* attempting to read */
  33006. buf[idx] = 0;
  33007. ret = (int)read(fd, buf + idx, 256 - bytes);
  33008. if (ret == 0) {
  33009. WOLFSSL_MSG("error reading entropy from egd server");
  33010. ret = WOLFSSL_FATAL_ERROR;
  33011. break;
  33012. }
  33013. if (ret > 0 && buf[idx] > 0) {
  33014. bytes += buf[idx]; /* egd stores amount sent in first byte */
  33015. if (bytes + idx > 255 || buf[idx] > ret) {
  33016. WOLFSSL_MSG("Buffer error");
  33017. ret = WOLFSSL_FATAL_ERROR;
  33018. break;
  33019. }
  33020. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  33021. idx = bytes;
  33022. ret = WOLFSSL_SUCCESS;
  33023. if (bytes >= 255) {
  33024. break;
  33025. }
  33026. }
  33027. else {
  33028. if (errno == EAGAIN || errno == EINTR) {
  33029. WOLFSSL_MSG("EGD would read");
  33030. ret = WOLFSSL_SUCCESS; /* try again */
  33031. }
  33032. else if (buf[idx] == 0) {
  33033. /* if egd returned 0 then there is no more entropy to be had.
  33034. Do not try more reads. */
  33035. ret = WOLFSSL_SUCCESS;
  33036. break;
  33037. }
  33038. else {
  33039. WOLFSSL_MSG("Error with read");
  33040. ret = WOLFSSL_FATAL_ERROR;
  33041. }
  33042. }
  33043. }
  33044. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  33045. /* call to check global RNG is created */
  33046. if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
  33047. WOLFSSL_MSG("Error with initializing global RNG structure");
  33048. ret = WOLFSSL_FATAL_ERROR;
  33049. }
  33050. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  33051. != 0) {
  33052. WOLFSSL_MSG("Error with reseeding DRBG structure");
  33053. ret = WOLFSSL_FATAL_ERROR;
  33054. }
  33055. #ifdef SHOW_SECRETS
  33056. else { /* print out entropy found only when no error occured */
  33057. word32 i;
  33058. printf("EGD Entropy = ");
  33059. for (i = 0; i < bytes; i++) {
  33060. printf("%02X", buf[i]);
  33061. }
  33062. printf("\n");
  33063. }
  33064. #endif
  33065. }
  33066. ForceZero(buf, bytes);
  33067. #ifdef WOLFSSL_SMALL_STACK
  33068. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33069. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  33070. wc_MemZero_Check(buf, 256);
  33071. #endif
  33072. close(fd);
  33073. if (ret == WOLFSSL_SUCCESS) {
  33074. return bytes;
  33075. }
  33076. else {
  33077. return ret;
  33078. }
  33079. #else
  33080. WOLFSSL_MSG("Type of socket needed is not available");
  33081. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  33082. (void)nm;
  33083. return WOLFSSL_FATAL_ERROR;
  33084. #endif /* WOLFSSL_EGD_NBLOCK */
  33085. }
  33086. #endif /* !FREERTOS_TCP */
  33087. void wolfSSL_RAND_Cleanup(void)
  33088. {
  33089. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33090. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33091. if (gRandMethods && gRandMethods->cleanup)
  33092. gRandMethods->cleanup();
  33093. wc_UnLockMutex(&gRandMethodMutex);
  33094. }
  33095. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  33096. gRandMethodsInit = 0;
  33097. #endif
  33098. #ifdef HAVE_GLOBAL_RNG
  33099. if (wc_LockMutex(&globalRNGMutex) == 0) {
  33100. if (initGlobalRNG) {
  33101. wc_FreeRng(&globalRNG);
  33102. initGlobalRNG = 0;
  33103. }
  33104. wc_UnLockMutex(&globalRNGMutex);
  33105. }
  33106. #endif
  33107. }
  33108. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  33109. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  33110. {
  33111. int ret;
  33112. int hash;
  33113. byte secret[DRBG_SEED_LEN]; /* secret length arbitraily choosen */
  33114. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33115. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33116. if (gRandMethods && gRandMethods->pseudorand) {
  33117. ret = gRandMethods->pseudorand(buf, num);
  33118. wc_UnLockMutex(&gRandMethodMutex);
  33119. return ret;
  33120. }
  33121. wc_UnLockMutex(&gRandMethodMutex);
  33122. }
  33123. #endif
  33124. #ifdef WOLFSSL_HAVE_PRF
  33125. #ifndef NO_SHA256
  33126. hash = WC_SHA256;
  33127. #elif defined(WOLFSSL_SHA384)
  33128. hash = WC_SHA384;
  33129. #elif !defined(NO_SHA)
  33130. hash = WC_SHA;
  33131. #elif !defined(NO_MD5)
  33132. hash = WC_MD5;
  33133. #endif
  33134. /* get secret value from source of entropy */
  33135. ret = wolfSSL_RAND_bytes(secret, DRBG_SEED_LEN);
  33136. /* uses input buffer to seed for pseudo random number generation, each
  33137. * thread will potentially have different results this way */
  33138. if (ret == WOLFSSL_SUCCESS) {
  33139. PRIVATE_KEY_UNLOCK();
  33140. ret = wc_PRF(buf, num, secret, DRBG_SEED_LEN, (const byte*)buf, num,
  33141. hash, NULL, INVALID_DEVID);
  33142. PRIVATE_KEY_LOCK();
  33143. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  33144. }
  33145. #else
  33146. /* fall back to just doing wolfSSL_RAND_bytes if PRF not avialbale */
  33147. ret = wolfSSL_RAND_bytes(buf, num);
  33148. (void)hash;
  33149. (void)secret;
  33150. #endif
  33151. return ret;
  33152. }
  33153. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  33154. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  33155. {
  33156. int ret = 0;
  33157. WC_RNG* rng = NULL;
  33158. #ifdef WOLFSSL_SMALL_STACK
  33159. WC_RNG* tmpRNG = NULL;
  33160. #else
  33161. WC_RNG tmpRNG[1];
  33162. #endif
  33163. int initTmpRng = 0;
  33164. int blockCount = 0;
  33165. #ifdef HAVE_GLOBAL_RNG
  33166. int used_global = 0;
  33167. #endif
  33168. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  33169. /* sanity check */
  33170. if (buf == NULL || num < 0)
  33171. /* return code compliant with OpenSSL */
  33172. return 0;
  33173. /* if a RAND callback has been set try and use it */
  33174. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33175. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33176. if (gRandMethods && gRandMethods->bytes) {
  33177. ret = gRandMethods->bytes(buf, num);
  33178. wc_UnLockMutex(&gRandMethodMutex);
  33179. return ret;
  33180. }
  33181. wc_UnLockMutex(&gRandMethodMutex);
  33182. }
  33183. #endif
  33184. #ifdef HAVE_GLOBAL_RNG
  33185. if (initGlobalRNG) {
  33186. if (wc_LockMutex(&globalRNGMutex) != 0) {
  33187. WOLFSSL_MSG("Bad Lock Mutex rng");
  33188. return ret;
  33189. }
  33190. rng = &globalRNG;
  33191. used_global = 1;
  33192. }
  33193. else
  33194. #endif
  33195. {
  33196. #ifdef WOLFSSL_SMALL_STACK
  33197. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  33198. if (tmpRNG == NULL)
  33199. return ret;
  33200. #endif
  33201. if (wc_InitRng(tmpRNG) == 0) {
  33202. rng = tmpRNG;
  33203. initTmpRng = 1;
  33204. }
  33205. }
  33206. if (rng) {
  33207. /* handles size greater than RNG_MAX_BLOCK_LEN */
  33208. blockCount = num / RNG_MAX_BLOCK_LEN;
  33209. while (blockCount--) {
  33210. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  33211. if (ret != 0) {
  33212. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33213. break;
  33214. }
  33215. num -= RNG_MAX_BLOCK_LEN;
  33216. buf += RNG_MAX_BLOCK_LEN;
  33217. }
  33218. if (ret == 0 && num)
  33219. ret = wc_RNG_GenerateBlock(rng, buf, num);
  33220. if (ret != 0)
  33221. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33222. else
  33223. ret = WOLFSSL_SUCCESS;
  33224. }
  33225. #ifdef HAVE_GLOBAL_RNG
  33226. if (used_global == 1)
  33227. wc_UnLockMutex(&globalRNGMutex);
  33228. #endif
  33229. if (initTmpRng)
  33230. wc_FreeRng(tmpRNG);
  33231. #ifdef WOLFSSL_SMALL_STACK
  33232. if (tmpRNG)
  33233. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  33234. #endif
  33235. return ret;
  33236. }
  33237. int wolfSSL_RAND_poll(void)
  33238. {
  33239. byte entropy[16];
  33240. int ret = 0;
  33241. word32 entropy_sz = 16;
  33242. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  33243. if (initGlobalRNG == 0){
  33244. WOLFSSL_MSG("Global RNG no Init");
  33245. return WOLFSSL_FAILURE;
  33246. }
  33247. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  33248. if (ret != 0){
  33249. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  33250. ret = WOLFSSL_FAILURE;
  33251. }else
  33252. ret = WOLFSSL_SUCCESS;
  33253. return ret;
  33254. }
  33255. /* If a valid struct is provided with function pointers, will override
  33256. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  33257. pointer is passed in, it will cancel any previous function overrides.
  33258. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  33259. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  33260. {
  33261. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33262. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33263. gRandMethods = methods;
  33264. wc_UnLockMutex(&gRandMethodMutex);
  33265. return WOLFSSL_SUCCESS;
  33266. }
  33267. #else
  33268. (void)methods;
  33269. #endif
  33270. return WOLFSSL_FAILURE;
  33271. }
  33272. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  33273. int wolfSSL_RAND_status(void)
  33274. {
  33275. int ret = WOLFSSL_SUCCESS;
  33276. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33277. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33278. if (gRandMethods && gRandMethods->status)
  33279. ret = gRandMethods->status();
  33280. wc_UnLockMutex(&gRandMethodMutex);
  33281. }
  33282. else {
  33283. ret = WOLFSSL_FAILURE;
  33284. }
  33285. #else
  33286. /* wolfCrypt provides enough seed internally, so return success */
  33287. #endif
  33288. return ret;
  33289. }
  33290. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  33291. {
  33292. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  33293. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  33294. if (gRandMethods && gRandMethods->add) {
  33295. /* callback has return code, but RAND_add does not */
  33296. (void)gRandMethods->add(add, len, entropy);
  33297. }
  33298. wc_UnLockMutex(&gRandMethodMutex);
  33299. }
  33300. #else
  33301. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  33302. to take control */
  33303. (void)add;
  33304. (void)len;
  33305. (void)entropy;
  33306. #endif
  33307. }
  33308. #endif /* OPENSSL_EXTRA */
  33309. /*******************************************************************************
  33310. * END OF RAND API
  33311. ******************************************************************************/
  33312. /*******************************************************************************
  33313. * START OF EVP_CIPHER API
  33314. ******************************************************************************/
  33315. #ifdef OPENSSL_EXTRA
  33316. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  33317. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  33318. {
  33319. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  33320. if (ctx == NULL) {
  33321. WOLFSSL_MSG("Bad function argument");
  33322. return WOLFSSL_FATAL_ERROR;
  33323. }
  33324. switch (ctx->cipherType) {
  33325. #ifndef NO_AES
  33326. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  33327. case AES_128_CBC_TYPE :
  33328. case AES_192_CBC_TYPE :
  33329. case AES_256_CBC_TYPE :
  33330. WOLFSSL_MSG("AES CBC");
  33331. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33332. break;
  33333. #endif
  33334. #ifdef HAVE_AESGCM
  33335. case AES_128_GCM_TYPE :
  33336. case AES_192_GCM_TYPE :
  33337. case AES_256_GCM_TYPE :
  33338. WOLFSSL_MSG("AES GCM");
  33339. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33340. break;
  33341. #endif /* HAVE_AESGCM */
  33342. #ifdef HAVE_AES_ECB
  33343. case AES_128_ECB_TYPE :
  33344. case AES_192_ECB_TYPE :
  33345. case AES_256_ECB_TYPE :
  33346. WOLFSSL_MSG("AES ECB");
  33347. break;
  33348. #endif
  33349. #ifdef WOLFSSL_AES_COUNTER
  33350. case AES_128_CTR_TYPE :
  33351. case AES_192_CTR_TYPE :
  33352. case AES_256_CTR_TYPE :
  33353. WOLFSSL_MSG("AES CTR");
  33354. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33355. break;
  33356. #endif /* WOLFSSL_AES_COUNTER */
  33357. #ifdef WOLFSSL_AES_CFB
  33358. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  33359. case AES_128_CFB1_TYPE:
  33360. case AES_192_CFB1_TYPE:
  33361. case AES_256_CFB1_TYPE:
  33362. WOLFSSL_MSG("AES CFB1");
  33363. break;
  33364. case AES_128_CFB8_TYPE:
  33365. case AES_192_CFB8_TYPE:
  33366. case AES_256_CFB8_TYPE:
  33367. WOLFSSL_MSG("AES CFB8");
  33368. break;
  33369. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  33370. case AES_128_CFB128_TYPE:
  33371. case AES_192_CFB128_TYPE:
  33372. case AES_256_CFB128_TYPE:
  33373. WOLFSSL_MSG("AES CFB128");
  33374. break;
  33375. #endif /* WOLFSSL_AES_CFB */
  33376. #if defined(WOLFSSL_AES_OFB)
  33377. case AES_128_OFB_TYPE:
  33378. case AES_192_OFB_TYPE:
  33379. case AES_256_OFB_TYPE:
  33380. WOLFSSL_MSG("AES OFB");
  33381. break;
  33382. #endif /* WOLFSSL_AES_OFB */
  33383. #ifdef WOLFSSL_AES_XTS
  33384. case AES_128_XTS_TYPE:
  33385. case AES_256_XTS_TYPE:
  33386. WOLFSSL_MSG("AES XTS");
  33387. break;
  33388. #endif /* WOLFSSL_AES_XTS */
  33389. #endif /* NO_AES */
  33390. #ifndef NO_DES3
  33391. case DES_CBC_TYPE :
  33392. WOLFSSL_MSG("DES CBC");
  33393. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  33394. break;
  33395. case DES_EDE3_CBC_TYPE :
  33396. WOLFSSL_MSG("DES EDE3 CBC");
  33397. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  33398. break;
  33399. #endif
  33400. #ifdef WOLFSSL_DES_ECB
  33401. case DES_ECB_TYPE :
  33402. WOLFSSL_MSG("DES ECB");
  33403. break;
  33404. case DES_EDE3_ECB_TYPE :
  33405. WOLFSSL_MSG("DES3 ECB");
  33406. break;
  33407. #endif
  33408. case ARC4_TYPE :
  33409. WOLFSSL_MSG("ARC4");
  33410. break;
  33411. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  33412. case CHACHA20_POLY1305_TYPE:
  33413. break;
  33414. #endif
  33415. case NULL_CIPHER_TYPE :
  33416. WOLFSSL_MSG("NULL");
  33417. break;
  33418. default: {
  33419. WOLFSSL_MSG("bad type");
  33420. return WOLFSSL_FATAL_ERROR;
  33421. }
  33422. }
  33423. return WOLFSSL_SUCCESS;
  33424. }
  33425. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  33426. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  33427. {
  33428. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  33429. if (ctx == NULL) {
  33430. WOLFSSL_MSG("Bad function argument");
  33431. return WOLFSSL_FATAL_ERROR;
  33432. }
  33433. switch (ctx->cipherType) {
  33434. #ifndef NO_AES
  33435. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  33436. case AES_128_CBC_TYPE :
  33437. case AES_192_CBC_TYPE :
  33438. case AES_256_CBC_TYPE :
  33439. WOLFSSL_MSG("AES CBC");
  33440. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33441. break;
  33442. #endif
  33443. #ifdef HAVE_AESGCM
  33444. case AES_128_GCM_TYPE :
  33445. case AES_192_GCM_TYPE :
  33446. case AES_256_GCM_TYPE :
  33447. WOLFSSL_MSG("AES GCM");
  33448. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33449. break;
  33450. #endif
  33451. #ifdef HAVE_AES_ECB
  33452. case AES_128_ECB_TYPE :
  33453. case AES_192_ECB_TYPE :
  33454. case AES_256_ECB_TYPE :
  33455. WOLFSSL_MSG("AES ECB");
  33456. break;
  33457. #endif
  33458. #ifdef WOLFSSL_AES_COUNTER
  33459. case AES_128_CTR_TYPE :
  33460. case AES_192_CTR_TYPE :
  33461. case AES_256_CTR_TYPE :
  33462. WOLFSSL_MSG("AES CTR");
  33463. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  33464. break;
  33465. #endif
  33466. #endif /* NO_AES */
  33467. #ifndef NO_DES3
  33468. case DES_CBC_TYPE :
  33469. WOLFSSL_MSG("DES CBC");
  33470. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  33471. break;
  33472. case DES_EDE3_CBC_TYPE :
  33473. WOLFSSL_MSG("DES EDE3 CBC");
  33474. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  33475. break;
  33476. #endif
  33477. #ifdef WOLFSSL_DES_ECB
  33478. case DES_ECB_TYPE :
  33479. WOLFSSL_MSG("DES ECB");
  33480. break;
  33481. case DES_EDE3_ECB_TYPE :
  33482. WOLFSSL_MSG("DES3 ECB");
  33483. break;
  33484. #endif
  33485. case ARC4_TYPE :
  33486. WOLFSSL_MSG("ARC4");
  33487. break;
  33488. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  33489. case CHACHA20_POLY1305_TYPE:
  33490. break;
  33491. #endif
  33492. case NULL_CIPHER_TYPE :
  33493. WOLFSSL_MSG("NULL");
  33494. break;
  33495. default: {
  33496. WOLFSSL_MSG("bad type");
  33497. return WOLFSSL_FATAL_ERROR;
  33498. }
  33499. }
  33500. return WOLFSSL_SUCCESS;
  33501. }
  33502. #ifndef NO_DES3
  33503. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  33504. unsigned char* iv, int len)
  33505. {
  33506. (void)len;
  33507. WOLFSSL_MSG("wolfSSL_3des_iv");
  33508. if (ctx == NULL || iv == NULL) {
  33509. WOLFSSL_MSG("Bad function argument");
  33510. return;
  33511. }
  33512. if (doset)
  33513. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  33514. else
  33515. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  33516. }
  33517. #endif /* NO_DES3 */
  33518. #ifndef NO_AES
  33519. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  33520. unsigned char* iv, int len)
  33521. {
  33522. (void)len;
  33523. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  33524. if (ctx == NULL || iv == NULL) {
  33525. WOLFSSL_MSG("Bad function argument");
  33526. return;
  33527. }
  33528. if (doset)
  33529. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  33530. else
  33531. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  33532. }
  33533. #endif /* NO_AES */
  33534. #endif /* OPENSSL_EXTRA */
  33535. /*******************************************************************************
  33536. * END OF EVP_CIPHER API
  33537. ******************************************************************************/
  33538. #ifndef NO_CERTS
  33539. #define WOLFSSL_X509_STORE_INCLUDED
  33540. #include <src/x509_str.c>
  33541. /*******************************************************************************
  33542. * START OF PKCS7 APIs
  33543. ******************************************************************************/
  33544. #ifdef HAVE_PKCS7
  33545. #ifdef OPENSSL_ALL
  33546. PKCS7* wolfSSL_PKCS7_new(void)
  33547. {
  33548. WOLFSSL_PKCS7* pkcs7;
  33549. int ret = 0;
  33550. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL,
  33551. DYNAMIC_TYPE_PKCS7);
  33552. if (pkcs7 != NULL) {
  33553. XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7));
  33554. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  33555. }
  33556. if (ret != 0 && pkcs7 != NULL) {
  33557. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  33558. pkcs7 = NULL;
  33559. }
  33560. return (PKCS7*)pkcs7;
  33561. }
  33562. /******************************************************************************
  33563. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  33564. *
  33565. * RETURNS:
  33566. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  33567. */
  33568. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  33569. {
  33570. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  33571. PKCS7* pkcs7 = NULL;
  33572. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  33573. return NULL;
  33574. pkcs7->contentOID = SIGNED_DATA;
  33575. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  33576. if (pkcs7) {
  33577. wolfSSL_PKCS7_free(pkcs7);
  33578. return NULL;
  33579. }
  33580. }
  33581. return pkcs7;
  33582. }
  33583. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  33584. {
  33585. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  33586. if (p7 != NULL) {
  33587. if (p7->data != NULL)
  33588. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  33589. wc_PKCS7_Free(&p7->pkcs7);
  33590. if (p7->certs)
  33591. wolfSSL_sk_pop_free(p7->certs, NULL);
  33592. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  33593. }
  33594. }
  33595. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  33596. {
  33597. wolfSSL_PKCS7_free(p7);
  33598. return;
  33599. }
  33600. /**
  33601. * Convert DER/ASN.1 encoded signedData structure to internal PKCS7
  33602. * structure. Note, does not support detached content.
  33603. *
  33604. * p7 - pointer to set to address of newly created PKCS7 structure on return
  33605. * in - pointer to pointer of DER/ASN.1 data
  33606. * len - length of input data, bytes
  33607. *
  33608. * Returns newly allocated and populated PKCS7 structure or NULL on error.
  33609. */
  33610. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  33611. {
  33612. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  33613. }
  33614. /*****************************************************************************
  33615. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  33616. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  33617. * is stored as the PKCS7 object's content, to support detached signatures.
  33618. * @param content The content which is signed, in case the signature is
  33619. * detached. Ignored if NULL.
  33620. * @param contentSz The size of the passed in content.
  33621. *
  33622. * RETURNS:
  33623. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  33624. */
  33625. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  33626. byte* content, word32 contentSz)
  33627. {
  33628. WOLFSSL_PKCS7* pkcs7 = NULL;
  33629. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  33630. if (in == NULL || *in == NULL || len < 0)
  33631. return NULL;
  33632. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  33633. return NULL;
  33634. pkcs7->len = len;
  33635. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  33636. if (pkcs7->data == NULL) {
  33637. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  33638. return NULL;
  33639. }
  33640. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  33641. if (content != NULL) {
  33642. pkcs7->pkcs7.content = content;
  33643. pkcs7->pkcs7.contentSz = contentSz;
  33644. }
  33645. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  33646. != 0) {
  33647. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  33648. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  33649. return NULL;
  33650. }
  33651. if (p7 != NULL)
  33652. *p7 = (PKCS7*)pkcs7;
  33653. *in += pkcs7->len;
  33654. return (PKCS7*)pkcs7;
  33655. }
  33656. /**
  33657. * This API was added as a helper function for libest. It
  33658. * extracts a stack of certificates from the pkcs7 object.
  33659. * @param pkcs7 PKCS7 parameter object
  33660. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  33661. */
  33662. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  33663. {
  33664. int i;
  33665. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  33666. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  33667. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  33668. if (!p7) {
  33669. WOLFSSL_MSG("Bad parameter");
  33670. return NULL;
  33671. }
  33672. if (p7->certs)
  33673. return p7->certs;
  33674. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  33675. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  33676. p7->pkcs7.certSz[i]);
  33677. if (!ret)
  33678. ret = wolfSSL_sk_X509_new();
  33679. if (x509) {
  33680. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  33681. wolfSSL_X509_free(x509);
  33682. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  33683. goto error;
  33684. }
  33685. }
  33686. else {
  33687. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  33688. goto error;
  33689. }
  33690. }
  33691. /* Save stack to free later */
  33692. if (p7->certs)
  33693. wolfSSL_sk_pop_free(p7->certs, NULL);
  33694. p7->certs = ret;
  33695. return ret;
  33696. error:
  33697. if (ret) {
  33698. wolfSSL_sk_pop_free(ret, NULL);
  33699. }
  33700. return NULL;
  33701. }
  33702. /**
  33703. * Return stack of signers contained in PKCS7 cert.
  33704. * Notes:
  33705. * - Currently only PKCS#7 messages with a single signer cert is supported.
  33706. * - Returned WOLFSSL_STACK must be freed by caller.
  33707. *
  33708. * pkcs7 - PKCS7 struct to retrieve signer certs from.
  33709. * certs - currently unused
  33710. * flags - flags to control function behavior.
  33711. *
  33712. * Return WOLFSSL_STACK of signers on success, NULL on error.
  33713. */
  33714. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  33715. int flags)
  33716. {
  33717. WOLFSSL_X509* x509 = NULL;
  33718. WOLFSSL_STACK* signers = NULL;
  33719. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  33720. if (p7 == NULL)
  33721. return NULL;
  33722. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  33723. * is supported.
  33724. */
  33725. if (flags & PKCS7_NOINTERN) {
  33726. WOLFSSL_MSG("PKCS7_NOINTERN flag not supported");
  33727. return NULL;
  33728. }
  33729. signers = wolfSSL_sk_X509_new();
  33730. if (signers == NULL)
  33731. return NULL;
  33732. if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert,
  33733. p7->pkcs7.singleCertSz) == NULL) {
  33734. wolfSSL_sk_X509_pop_free(signers, NULL);
  33735. return NULL;
  33736. }
  33737. if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) {
  33738. wolfSSL_sk_X509_pop_free(signers, NULL);
  33739. return NULL;
  33740. }
  33741. (void)certs;
  33742. return signers;
  33743. }
  33744. #ifndef NO_BIO
  33745. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  33746. {
  33747. WOLFSSL_PKCS7* pkcs7;
  33748. int ret;
  33749. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  33750. if (bio == NULL)
  33751. return NULL;
  33752. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  33753. return NULL;
  33754. pkcs7->len = wolfSSL_BIO_get_len(bio);
  33755. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  33756. if (pkcs7->data == NULL) {
  33757. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  33758. return NULL;
  33759. }
  33760. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  33761. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  33762. return NULL;
  33763. }
  33764. /* pkcs7->len may change if using b64 for example */
  33765. pkcs7->len = ret;
  33766. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  33767. != 0) {
  33768. WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed");
  33769. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  33770. return NULL;
  33771. }
  33772. if (p7 != NULL)
  33773. *p7 = (PKCS7*)pkcs7;
  33774. return (PKCS7*)pkcs7;
  33775. }
  33776. int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out)
  33777. {
  33778. byte* output = NULL;
  33779. int localBuf = 0;
  33780. int len;
  33781. WC_RNG rng;
  33782. int ret = WOLFSSL_FAILURE;
  33783. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7");
  33784. if (!out || !p7) {
  33785. WOLFSSL_MSG("Bad parameter");
  33786. return WOLFSSL_FAILURE;
  33787. }
  33788. if (!p7->rng) {
  33789. if (wc_InitRng(&rng) != 0) {
  33790. WOLFSSL_MSG("wc_InitRng error");
  33791. return WOLFSSL_FAILURE;
  33792. }
  33793. p7->rng = &rng; // cppcheck-suppress autoVariables
  33794. }
  33795. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  33796. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  33797. goto cleanup;
  33798. }
  33799. if (*out == NULL) {
  33800. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33801. if (!output) {
  33802. WOLFSSL_MSG("malloc error");
  33803. goto cleanup;
  33804. }
  33805. localBuf = 1;
  33806. }
  33807. else {
  33808. output = *out;
  33809. }
  33810. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  33811. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  33812. goto cleanup;
  33813. }
  33814. ret = len;
  33815. cleanup:
  33816. if (p7->rng == &rng) {
  33817. wc_FreeRng(&rng);
  33818. p7->rng = NULL;
  33819. }
  33820. if (ret == WOLFSSL_FAILURE && localBuf && output)
  33821. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33822. if (ret != WOLFSSL_FAILURE)
  33823. *out = output;
  33824. return ret;
  33825. }
  33826. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  33827. {
  33828. byte* output = NULL;
  33829. int len;
  33830. int ret = WOLFSSL_FAILURE;
  33831. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  33832. if (!bio || !p7) {
  33833. WOLFSSL_MSG("Bad parameter");
  33834. return WOLFSSL_FAILURE;
  33835. }
  33836. if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) {
  33837. WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error");
  33838. goto cleanup;
  33839. }
  33840. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  33841. WOLFSSL_MSG("wolfSSL_BIO_write error");
  33842. goto cleanup;
  33843. }
  33844. ret = WOLFSSL_SUCCESS;
  33845. cleanup:
  33846. if (output)
  33847. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33848. return ret;
  33849. }
  33850. /**
  33851. * Creates and returns a PKCS7 signedData structure.
  33852. *
  33853. * Inner content type is set to DATA to match OpenSSL behavior.
  33854. *
  33855. * signer - certificate to sign bundle with
  33856. * pkey - private key matching signer
  33857. * certs - optional additional set of certificates to include
  33858. * in - input data to be signed
  33859. * flags - optional set of flags to control sign behavior
  33860. *
  33861. * PKCS7_BINARY - Do not translate input data to MIME canonical
  33862. * format (\r\n line endings), thus preventing corruption of
  33863. * binary content.
  33864. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  33865. * PKCS7_DETACHED - Set signature detached, omit content from output bundle.
  33866. * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data.
  33867. *
  33868. * Flags not currently supported:
  33869. * PKCS7_NOCERTS - Do not include the signer cert in the output bundle.
  33870. * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up,
  33871. * then signers etc to be added separately before
  33872. * calling PKCS7_final().
  33873. *
  33874. * Returns valid PKCS7 structure pointer, or NULL if an error occurred.
  33875. */
  33876. PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey,
  33877. WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags)
  33878. {
  33879. int err = 0;
  33880. WOLFSSL_PKCS7* p7 = NULL;
  33881. WOLFSSL_STACK* cert = certs;
  33882. WOLFSSL_ENTER("wolfSSL_PKCS7_sign");
  33883. if (flags & PKCS7_NOCERTS) {
  33884. WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported");
  33885. err = 1;
  33886. }
  33887. if (flags & PKCS7_PARTIAL) {
  33888. WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported");
  33889. err = 1;
  33890. }
  33891. if ((err == 0) && (signer == NULL || signer->derCert == NULL ||
  33892. signer->derCert->length == 0)) {
  33893. WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete");
  33894. err = 1;
  33895. }
  33896. if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL ||
  33897. pkey->pkey_sz <= 0)) {
  33898. WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete");
  33899. err = 1;
  33900. }
  33901. if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) {
  33902. WOLFSSL_MSG("input data required unless PKCS7_STREAM used");
  33903. err = 1;
  33904. }
  33905. if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) {
  33906. WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7");
  33907. err = 1;
  33908. }
  33909. /* load signer certificate */
  33910. if (err == 0) {
  33911. if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer,
  33912. signer->derCert->length) != 0) {
  33913. WOLFSSL_MSG("Failed to load signer certificate");
  33914. err = 1;
  33915. }
  33916. }
  33917. /* set signer private key, data types, defaults */
  33918. if (err == 0) {
  33919. p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr;
  33920. p7->pkcs7.privateKeySz = pkey->pkey_sz;
  33921. p7->pkcs7.contentOID = DATA; /* inner content default is DATA */
  33922. p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */
  33923. p7->type = SIGNED_DATA; /* PKCS7_final switches on type */
  33924. }
  33925. /* add additional chain certs if provided */
  33926. while (cert && (err == 0)) {
  33927. if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) {
  33928. if (wc_PKCS7_AddCertificate(&p7->pkcs7,
  33929. cert->data.x509->derCert->buffer,
  33930. cert->data.x509->derCert->length) != 0) {
  33931. WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate");
  33932. err = 1;
  33933. }
  33934. }
  33935. cert = cert->next;
  33936. }
  33937. if ((err == 0) && (flags & PKCS7_DETACHED)) {
  33938. if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) {
  33939. WOLFSSL_MSG("Failed to set signature detached");
  33940. err = 1;
  33941. }
  33942. }
  33943. if ((err == 0) && (flags & PKCS7_STREAM)) {
  33944. /* if streaming, return before finalizing */
  33945. return (PKCS7*)p7;
  33946. }
  33947. if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) {
  33948. WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final");
  33949. err = 1;
  33950. }
  33951. if ((err != 0) && (p7 != NULL)) {
  33952. wolfSSL_PKCS7_free((PKCS7*)p7);
  33953. p7 = NULL;
  33954. }
  33955. return (PKCS7*)p7;
  33956. }
  33957. #ifdef HAVE_SMIME
  33958. #ifndef MAX_MIME_LINE_LEN
  33959. #define MAX_MIME_LINE_LEN 1024
  33960. #endif
  33961. /**
  33962. * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n),
  33963. * used by PKCS7_final().
  33964. *
  33965. * in - input WOLFSSL_BIO to be converted
  33966. * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted
  33967. *
  33968. * Return 0 on success, negative on error
  33969. */
  33970. static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out)
  33971. {
  33972. int ret = 0;
  33973. int lineLen = 0;
  33974. word32 canonLineLen = 0;
  33975. char* canonLine = NULL;
  33976. #ifdef WOLFSSL_SMALL_STACK
  33977. char* line = NULL;
  33978. #else
  33979. char line[MAX_MIME_LINE_LEN];
  33980. #endif
  33981. if (in == NULL || out == NULL) {
  33982. return BAD_FUNC_ARG;
  33983. }
  33984. #ifdef WOLFSSL_SMALL_STACK
  33985. line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap,
  33986. DYNAMIC_TYPE_TMP_BUFFER);
  33987. if (line == NULL) {
  33988. return MEMORY_E;
  33989. }
  33990. #endif
  33991. XMEMSET(line, 0, MAX_MIME_LINE_LEN);
  33992. while ((lineLen = wolfSSL_BIO_gets(in, line, (int)sizeof(line))) > 0) {
  33993. if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') {
  33994. canonLineLen = (word32)lineLen;
  33995. if ((canonLine = wc_MIME_single_canonicalize(
  33996. line, &canonLineLen)) == NULL) {
  33997. ret = -1;
  33998. break;
  33999. }
  34000. /* remove trailing null */
  34001. if (canonLine[canonLineLen] == '\0') {
  34002. canonLineLen--;
  34003. }
  34004. if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) {
  34005. ret = -1;
  34006. break;
  34007. }
  34008. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  34009. canonLine = NULL;
  34010. }
  34011. else {
  34012. /* no line ending in current line, write direct to out */
  34013. if (wolfSSL_BIO_write(out, line, lineLen) < 0) {
  34014. ret = -1;
  34015. break;
  34016. }
  34017. }
  34018. }
  34019. if (canonLine != NULL) {
  34020. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  34021. }
  34022. #ifdef WOLFSSL_SMALL_STACK
  34023. XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34024. #endif
  34025. return ret;
  34026. }
  34027. #endif /* HAVE_SMIME */
  34028. /* Used by both PKCS7_final() and PKCS7_verify() */
  34029. static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n";
  34030. /**
  34031. * Finalize PKCS7 structure, currently supports signedData only.
  34032. *
  34033. * Does not generate final bundle (ie: signedData), but finalizes
  34034. * the PKCS7 structure in preparation for a output function to be called next.
  34035. *
  34036. * pkcs7 - initialized PKCS7 structure, populated with signer, etc
  34037. * in - input data
  34038. * flags - flags to control PKCS7 behavior. Other flags except those noted
  34039. * below are ignored:
  34040. *
  34041. * PKCS7_BINARY - Do not translate input data to MIME canonical
  34042. * format (\r\n line endings), thus preventing corruption of
  34043. * binary content.
  34044. * PKCS7_TEXT - Prepend MIME headers for text/plain to content.
  34045. *
  34046. * Returns 1 on success, 0 on error
  34047. */
  34048. int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags)
  34049. {
  34050. int ret = 1;
  34051. int memSz = 0;
  34052. unsigned char* mem = NULL;
  34053. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34054. WOLFSSL_BIO* data = NULL;
  34055. WOLFSSL_ENTER("wolfSSL_PKCS7_final");
  34056. if (p7 == NULL || in == NULL) {
  34057. WOLFSSL_MSG("Bad input args to PKCS7_final");
  34058. ret = 0;
  34059. }
  34060. if (ret == 1) {
  34061. if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) {
  34062. WOLFSSL_MSG("Error in wolfSSL_BIO_new");
  34063. ret = 0;
  34064. }
  34065. }
  34066. /* prepend Content-Type header if PKCS7_TEXT */
  34067. if ((ret == 1) && (flags & PKCS7_TEXT)) {
  34068. if (wolfSSL_BIO_write(data, contTypeText,
  34069. (int)XSTR_SIZEOF(contTypeText)) < 0) {
  34070. WOLFSSL_MSG("Error prepending Content-Type header");
  34071. ret = 0;
  34072. }
  34073. }
  34074. /* convert line endings to CRLF if !PKCS7_BINARY */
  34075. if (ret == 1) {
  34076. if (flags & PKCS7_BINARY) {
  34077. /* no CRLF conversion, direct copy content */
  34078. if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) {
  34079. ret = 0;
  34080. }
  34081. if (ret == 1) {
  34082. mem = (unsigned char*)XMALLOC(memSz, in->heap,
  34083. DYNAMIC_TYPE_TMP_BUFFER);
  34084. if (mem == NULL) {
  34085. WOLFSSL_MSG("Failed to allocate memory for input data");
  34086. ret = 0;
  34087. }
  34088. }
  34089. if (ret == 1) {
  34090. if (wolfSSL_BIO_read(in, mem, memSz) != memSz) {
  34091. WOLFSSL_MSG("Error reading from input BIO");
  34092. ret = 0;
  34093. }
  34094. else if (wolfSSL_BIO_write(data, mem, memSz) < 0) {
  34095. ret = 0;
  34096. }
  34097. }
  34098. if (mem != NULL) {
  34099. XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34100. }
  34101. }
  34102. else {
  34103. #ifdef HAVE_SMIME
  34104. /* convert content line endings to CRLF */
  34105. if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) {
  34106. WOLFSSL_MSG("Error converting line endings to CRLF");
  34107. ret = 0;
  34108. }
  34109. else {
  34110. p7->pkcs7.contentCRLF = 1;
  34111. }
  34112. #else
  34113. WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built "
  34114. "with HAVE_SMIME");
  34115. ret = 0;
  34116. #endif
  34117. }
  34118. }
  34119. if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) {
  34120. WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data");
  34121. ret = 0;
  34122. }
  34123. if (ret == 1) {
  34124. if (p7->data != NULL) {
  34125. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  34126. }
  34127. p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7);
  34128. if (p7->data == NULL) {
  34129. ret = 0;
  34130. }
  34131. else {
  34132. XMEMCPY(p7->data, mem, memSz);
  34133. p7->len = memSz;
  34134. }
  34135. }
  34136. if (ret == 1) {
  34137. p7->pkcs7.content = p7->data;
  34138. p7->pkcs7.contentSz = p7->len;
  34139. }
  34140. if (data != NULL) {
  34141. wolfSSL_BIO_free(data);
  34142. }
  34143. return ret;
  34144. }
  34145. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  34146. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags)
  34147. {
  34148. int i, ret = 0;
  34149. unsigned char* mem = NULL;
  34150. int memSz = 0;
  34151. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34152. int contTypeLen;
  34153. WOLFSSL_X509* signer = NULL;
  34154. WOLFSSL_STACK* signers = NULL;
  34155. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  34156. if (pkcs7 == NULL)
  34157. return WOLFSSL_FAILURE;
  34158. if (in != NULL) {
  34159. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  34160. return WOLFSSL_FAILURE;
  34161. p7->pkcs7.content = mem;
  34162. p7->pkcs7.contentSz = memSz;
  34163. }
  34164. /* certs is the list of certificates to find the cert with issuer/serial. */
  34165. (void)certs;
  34166. /* store is the certificate store to use to verify signer certificate
  34167. * associated with the signers.
  34168. */
  34169. (void)store;
  34170. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  34171. if (ret != 0)
  34172. return WOLFSSL_FAILURE;
  34173. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  34174. /* Verify signer certificates */
  34175. if (store == NULL || store->cm == NULL) {
  34176. WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set");
  34177. return WOLFSSL_FAILURE;
  34178. }
  34179. signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags);
  34180. if (signers == NULL) {
  34181. WOLFSSL_MSG("No signers found to verify");
  34182. return WOLFSSL_FAILURE;
  34183. }
  34184. for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) {
  34185. signer = wolfSSL_sk_X509_value(signers, i);
  34186. if (wolfSSL_CertManagerVerifyBuffer(store->cm,
  34187. signer->derCert->buffer,
  34188. signer->derCert->length,
  34189. WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
  34190. WOLFSSL_MSG("Failed to verify signer certificate");
  34191. wolfSSL_sk_X509_pop_free(signers, NULL);
  34192. return WOLFSSL_FAILURE;
  34193. }
  34194. }
  34195. wolfSSL_sk_X509_pop_free(signers, NULL);
  34196. }
  34197. if (flags & PKCS7_TEXT) {
  34198. /* strip MIME header for text/plain, otherwise error */
  34199. contTypeLen = XSTR_SIZEOF(contTypeText);
  34200. if ((p7->pkcs7.contentSz < (word32)contTypeLen) ||
  34201. (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) {
  34202. WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT");
  34203. return WOLFSSL_FAILURE;
  34204. }
  34205. p7->pkcs7.content += contTypeLen;
  34206. p7->pkcs7.contentSz -= contTypeLen;
  34207. }
  34208. if (out != NULL) {
  34209. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  34210. }
  34211. WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS);
  34212. return WOLFSSL_SUCCESS;
  34213. }
  34214. /**
  34215. * This API was added as a helper function for libest. It
  34216. * encodes a stack of certificates to pkcs7 format.
  34217. * @param pkcs7 PKCS7 parameter object
  34218. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  34219. * @param out Output bio
  34220. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  34221. */
  34222. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  34223. WOLFSSL_BIO* out)
  34224. {
  34225. int ret;
  34226. WOLFSSL_PKCS7* p7;
  34227. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  34228. if (!pkcs7 || !certs || !out) {
  34229. WOLFSSL_MSG("Bad parameter");
  34230. return WOLFSSL_FAILURE;
  34231. }
  34232. p7 = (WOLFSSL_PKCS7*)pkcs7;
  34233. /* take ownership of certs */
  34234. p7->certs = certs;
  34235. if (pkcs7->certList) {
  34236. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  34237. "struct");
  34238. return WOLFSSL_FAILURE;
  34239. }
  34240. if (certs) {
  34241. /* Save some of the values */
  34242. int hashOID = pkcs7->hashOID;
  34243. byte version = pkcs7->version;
  34244. if (!certs->data.x509 || !certs->data.x509->derCert) {
  34245. WOLFSSL_MSG("Missing cert");
  34246. return WOLFSSL_FAILURE;
  34247. }
  34248. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  34249. certs->data.x509->derCert->length) != 0) {
  34250. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  34251. return WOLFSSL_FAILURE;
  34252. }
  34253. certs = certs->next;
  34254. pkcs7->hashOID = hashOID;
  34255. pkcs7->version = version;
  34256. }
  34257. /* Add the certs to the PKCS7 struct */
  34258. while (certs) {
  34259. if (!certs->data.x509 || !certs->data.x509->derCert) {
  34260. WOLFSSL_MSG("Missing cert");
  34261. return WOLFSSL_FAILURE;
  34262. }
  34263. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  34264. certs->data.x509->derCert->length) != 0) {
  34265. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  34266. return WOLFSSL_FAILURE;
  34267. }
  34268. certs = certs->next;
  34269. }
  34270. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  34271. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  34272. return WOLFSSL_FAILURE;
  34273. }
  34274. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  34275. return ret;
  34276. }
  34277. /******************************************************************************
  34278. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  34279. *
  34280. * RETURNS:
  34281. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  34282. */
  34283. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  34284. {
  34285. #ifdef WOLFSSL_SMALL_STACK
  34286. byte* outputHead;
  34287. byte* outputFoot;
  34288. #else
  34289. byte outputHead[2048];
  34290. byte outputFoot[2048];
  34291. #endif
  34292. word32 outputHeadSz = 2048;
  34293. word32 outputFootSz = 2048;
  34294. word32 outputSz = 0;
  34295. byte* output = NULL;
  34296. byte* pem = NULL;
  34297. int pemSz = -1;
  34298. enum wc_HashType hashType;
  34299. byte hashBuf[WC_MAX_DIGEST_SIZE];
  34300. word32 hashSz = -1;
  34301. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  34302. if (bio == NULL || p7 == NULL)
  34303. return WOLFSSL_FAILURE;
  34304. #ifdef WOLFSSL_SMALL_STACK
  34305. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap,
  34306. DYNAMIC_TYPE_TMP_BUFFER);
  34307. if (outputHead == NULL)
  34308. return MEMORY_E;
  34309. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap,
  34310. DYNAMIC_TYPE_TMP_BUFFER);
  34311. if (outputFoot == NULL)
  34312. goto error;
  34313. #endif
  34314. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  34315. XMEMSET(outputHead, 0, outputHeadSz);
  34316. XMEMSET(outputFoot, 0, outputFootSz);
  34317. hashType = wc_OidGetHash(p7->hashOID);
  34318. hashSz = wc_HashGetDigestSize(hashType);
  34319. if (hashSz > WC_MAX_DIGEST_SIZE)
  34320. return WOLFSSL_FAILURE;
  34321. /* only SIGNED_DATA is supported */
  34322. switch (p7->contentOID) {
  34323. case SIGNED_DATA:
  34324. break;
  34325. default:
  34326. WOLFSSL_MSG("Unknown PKCS#7 Type");
  34327. return WOLFSSL_FAILURE;
  34328. };
  34329. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  34330. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  34331. return WOLFSSL_FAILURE;
  34332. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  34333. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34334. if (!output)
  34335. return WOLFSSL_FAILURE;
  34336. XMEMSET(output, 0, outputSz);
  34337. outputSz = 0;
  34338. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  34339. outputSz += outputHeadSz;
  34340. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  34341. outputSz += p7->contentSz;
  34342. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  34343. outputSz += outputFootSz;
  34344. /* get PEM size */
  34345. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  34346. if (pemSz < 0)
  34347. goto error;
  34348. pemSz++; /* for '\0'*/
  34349. /* create PEM buffer and convert from DER to PEM*/
  34350. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER))
  34351. == NULL)
  34352. goto error;
  34353. XMEMSET(pem, 0, pemSz);
  34354. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  34355. goto error;
  34356. }
  34357. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  34358. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34359. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34360. #ifdef WOLFSSL_SMALL_STACK
  34361. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34362. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34363. #endif
  34364. return WOLFSSL_SUCCESS;
  34365. }
  34366. error:
  34367. #ifdef WOLFSSL_SMALL_STACK
  34368. if (outputHead) {
  34369. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34370. }
  34371. if (outputFoot) {
  34372. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34373. }
  34374. #endif
  34375. if (output) {
  34376. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34377. }
  34378. if (pem) {
  34379. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34380. }
  34381. return WOLFSSL_FAILURE;
  34382. }
  34383. #ifdef HAVE_SMIME
  34384. /*****************************************************************************
  34385. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  34386. * a PKCS7 object. In case of a multipart message, stores the signed data in
  34387. * bcont.
  34388. *
  34389. * RETURNS:
  34390. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  34391. */
  34392. WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  34393. WOLFSSL_BIO** bcont)
  34394. {
  34395. MimeHdr* allHdrs = NULL;
  34396. MimeHdr* curHdr = NULL;
  34397. MimeParam* curParam = NULL;
  34398. int inLen = 0;
  34399. byte* bcontMem = NULL;
  34400. int bcontMemSz = 0;
  34401. int sectionLen = 0;
  34402. int ret = -1;
  34403. char* section = NULL;
  34404. char* canonLine = NULL;
  34405. char* canonSection = NULL;
  34406. PKCS7* pkcs7 = NULL;
  34407. word32 outLen = 0;
  34408. word32 canonLineLen = 0;
  34409. byte* out = NULL;
  34410. byte* outHead = NULL;
  34411. int canonPos = 0;
  34412. int lineLen = 0;
  34413. int remainLen = 0;
  34414. byte isEnd = 0;
  34415. size_t canonSize = 0;
  34416. size_t boundLen = 0;
  34417. char* boundary = NULL;
  34418. static const char kContType[] = "Content-Type";
  34419. static const char kCTE[] = "Content-Transfer-Encoding";
  34420. static const char kMultSigned[] = "multipart/signed";
  34421. static const char kAppPkcsSign[] = "application/pkcs7-signature";
  34422. static const char kAppXPkcsSign[] = "application/x-pkcs7-signature";
  34423. static const char kAppPkcs7Mime[] = "application/pkcs7-mime";
  34424. static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime";
  34425. WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7");
  34426. if (in == NULL || bcont == NULL) {
  34427. goto error;
  34428. }
  34429. inLen = wolfSSL_BIO_get_len(in);
  34430. if (inLen <= 0) {
  34431. goto error;
  34432. }
  34433. remainLen = wolfSSL_BIO_get_len(in);
  34434. if (remainLen <= 0) {
  34435. goto error;
  34436. }
  34437. section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  34438. if (section == NULL) {
  34439. goto error;
  34440. }
  34441. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34442. if (lineLen <= 0) {
  34443. goto error;
  34444. }
  34445. while (isEnd == 0 && remainLen > 0) {
  34446. sectionLen += lineLen;
  34447. remainLen -= lineLen;
  34448. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  34449. if (lineLen <= 0) {
  34450. goto error;
  34451. }
  34452. /* Line with just newline signals end of headers. */
  34453. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  34454. "\r\n", 2)) ||
  34455. (lineLen==1 && (section[sectionLen] == '\r' ||
  34456. section[sectionLen] == '\n'))) {
  34457. isEnd = 1;
  34458. }
  34459. }
  34460. section[sectionLen] = '\0';
  34461. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  34462. if (ret < 0) {
  34463. WOLFSSL_MSG("Parsing MIME headers failed.");
  34464. goto error;
  34465. }
  34466. isEnd = 0;
  34467. section[0] = '\0';
  34468. sectionLen = 0;
  34469. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  34470. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  34471. XSTR_SIZEOF(kMultSigned))) {
  34472. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  34473. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  34474. XSTR_SIZEOF(kAppPkcsSign)) ||
  34475. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  34476. XSTR_SIZEOF(kAppXPkcsSign)))) {
  34477. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  34478. if (curParam == NULL) {
  34479. goto error;
  34480. }
  34481. boundLen = XSTRLEN(curParam->value) + 2;
  34482. boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  34483. if (boundary == NULL) {
  34484. goto error;
  34485. }
  34486. XMEMSET(boundary, 0, (word32)(boundLen+1));
  34487. boundary[0] = boundary[1] = '-';
  34488. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  34489. /* Parse up to first boundary, ignore everything here. */
  34490. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34491. if (lineLen <= 0) {
  34492. goto error;
  34493. }
  34494. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  34495. remainLen > 0) {
  34496. sectionLen += lineLen;
  34497. remainLen -= lineLen;
  34498. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  34499. remainLen);
  34500. if (lineLen <= 0) {
  34501. goto error;
  34502. }
  34503. }
  34504. section[0] = '\0';
  34505. sectionLen = 0;
  34506. canonSize = remainLen + 1;
  34507. canonSection = (char*)XMALLOC(canonSize, NULL,
  34508. DYNAMIC_TYPE_PKCS7);
  34509. if (canonSection == NULL) {
  34510. goto error;
  34511. }
  34512. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34513. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  34514. remainLen > 0) {
  34515. canonLineLen = lineLen;
  34516. canonLine = wc_MIME_single_canonicalize(&section[sectionLen],
  34517. &canonLineLen);
  34518. if (canonLine == NULL) {
  34519. goto error;
  34520. }
  34521. /* If line endings were added, the initial length may be
  34522. * exceeded. */
  34523. if ((canonPos + canonLineLen) >= canonSize) {
  34524. canonSize = canonPos + canonLineLen;
  34525. canonSection = (char*)XREALLOC(canonSection, canonSize,
  34526. NULL, DYNAMIC_TYPE_PKCS7);
  34527. if (canonSection == NULL) {
  34528. goto error;
  34529. }
  34530. }
  34531. XMEMCPY(&canonSection[canonPos], canonLine,
  34532. (int)canonLineLen - 1);
  34533. canonPos += canonLineLen - 1;
  34534. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  34535. canonLine = NULL;
  34536. sectionLen += lineLen;
  34537. remainLen -= lineLen;
  34538. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  34539. remainLen);
  34540. if (lineLen <= 0) {
  34541. goto error;
  34542. }
  34543. }
  34544. if (canonPos > 0) {
  34545. canonPos--;
  34546. }
  34547. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  34548. if (canonSection[canonPos] == '\n') {
  34549. if (canonPos > 0) {
  34550. canonPos--;
  34551. }
  34552. }
  34553. if (canonSection[canonPos] == '\r') {
  34554. if (canonPos > 0) {
  34555. canonPos--;
  34556. }
  34557. }
  34558. canonSection[canonPos+1] = '\0';
  34559. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  34560. ret = wolfSSL_BIO_write(*bcont, canonSection,
  34561. canonPos + 1);
  34562. if (ret != (canonPos+1)) {
  34563. goto error;
  34564. }
  34565. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem))
  34566. < 0) {
  34567. goto error;
  34568. }
  34569. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  34570. canonSection = NULL;
  34571. wc_MIME_free_hdrs(allHdrs);
  34572. allHdrs = NULL;
  34573. section[0] = '\0';
  34574. sectionLen = 0;
  34575. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34576. if (lineLen <= 0) {
  34577. goto error;
  34578. }
  34579. while (isEnd == 0 && remainLen > 0) {
  34580. sectionLen += lineLen;
  34581. remainLen -= lineLen;
  34582. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  34583. remainLen);
  34584. if (lineLen <= 0) {
  34585. goto error;
  34586. }
  34587. /* Line with just newline signals end of headers. */
  34588. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  34589. "\r\n", 2)) ||
  34590. (lineLen==1 && (section[sectionLen] == '\r' ||
  34591. section[sectionLen] == '\n'))) {
  34592. isEnd = 1;
  34593. }
  34594. }
  34595. section[sectionLen] = '\0';
  34596. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  34597. if (ret < 0) {
  34598. WOLFSSL_MSG("Parsing MIME headers failed.");
  34599. goto error;
  34600. }
  34601. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  34602. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  34603. XSTR_SIZEOF(kAppPkcsSign)) &&
  34604. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  34605. XSTR_SIZEOF(kAppXPkcsSign)))) {
  34606. WOLFSSL_MSG("S/MIME headers not found inside "
  34607. "multipart message.\n");
  34608. goto error;
  34609. }
  34610. section[0] = '\0';
  34611. sectionLen = 0;
  34612. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  34613. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  34614. remainLen > 0) {
  34615. sectionLen += lineLen;
  34616. remainLen -= lineLen;
  34617. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  34618. remainLen);
  34619. if (lineLen <= 0) {
  34620. goto error;
  34621. }
  34622. }
  34623. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  34624. boundary = NULL;
  34625. }
  34626. }
  34627. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  34628. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  34629. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  34630. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  34631. sectionLen = wolfSSL_BIO_get_len(in);
  34632. if (sectionLen <= 0) {
  34633. goto error;
  34634. }
  34635. ret = wolfSSL_BIO_read(in, section, sectionLen);
  34636. if (ret < 0 || ret != sectionLen) {
  34637. WOLFSSL_MSG("Error reading input BIO.");
  34638. goto error;
  34639. }
  34640. }
  34641. else {
  34642. WOLFSSL_MSG("S/MIME headers not found.");
  34643. goto error;
  34644. }
  34645. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  34646. if (curHdr == NULL) {
  34647. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  34648. "assuming base64 encoding.");
  34649. }
  34650. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  34651. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  34652. "currently supported.\n");
  34653. goto error;
  34654. }
  34655. if (section == NULL || sectionLen <= 0) {
  34656. goto error;
  34657. }
  34658. outLen = ((sectionLen*3+3)/4)+1;
  34659. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  34660. outHead = out;
  34661. if (outHead == NULL) {
  34662. goto error;
  34663. }
  34664. /* Strip trailing newlines. */
  34665. while ((sectionLen > 0) &&
  34666. (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) {
  34667. sectionLen--;
  34668. }
  34669. section[sectionLen] = '\0';
  34670. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  34671. if (ret < 0) {
  34672. WOLFSSL_MSG("Error base64 decoding S/MIME message.");
  34673. goto error;
  34674. }
  34675. pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
  34676. bcontMem, bcontMemSz);
  34677. wc_MIME_free_hdrs(allHdrs);
  34678. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  34679. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  34680. return pkcs7;
  34681. error:
  34682. wc_MIME_free_hdrs(allHdrs);
  34683. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  34684. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  34685. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  34686. if (canonSection != NULL)
  34687. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  34688. if (bcont) {
  34689. wolfSSL_BIO_free(*bcont);
  34690. *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */
  34691. }
  34692. return NULL;
  34693. }
  34694. /* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent.
  34695. * Returns hash algorithm string or "unknown" if not found */
  34696. static const char* wolfSSL_SMIME_HashOIDToString(int hashOID)
  34697. {
  34698. switch (hashOID) {
  34699. case MD5h:
  34700. return "md5";
  34701. case SHAh:
  34702. return "sha1";
  34703. case SHA224h:
  34704. return "sha-224";
  34705. case SHA256h:
  34706. return "sha-256";
  34707. case SHA384h:
  34708. return "sha-384";
  34709. case SHA512h:
  34710. return "sha-512";
  34711. case SHA3_224h:
  34712. return "sha3-224";
  34713. case SHA3_384h:
  34714. return "sha3-384";
  34715. case SHA3_512h:
  34716. return "sha3-512";
  34717. default:
  34718. break;
  34719. }
  34720. return "unknown";
  34721. }
  34722. /* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string.
  34723. * RFC2633 only defines signed-data, enveloped-data, certs-only.
  34724. * Returns string on success, NULL on unknown type. */
  34725. static const char* wolfSSL_SMIME_PKCS7TypeToString(int type)
  34726. {
  34727. switch (type) {
  34728. case SIGNED_DATA:
  34729. return "signed-data";
  34730. case ENVELOPED_DATA:
  34731. return "enveloped-data";
  34732. default:
  34733. break;
  34734. }
  34735. return NULL;
  34736. }
  34737. /**
  34738. * Convert PKCS7 structure to SMIME format, adding necessary headers.
  34739. *
  34740. * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure
  34741. * should be set up beforehand with PKCS7_sign/final/etc. Output is always
  34742. * Base64 encoded.
  34743. *
  34744. * out - output BIO for SMIME formatted data to be placed
  34745. * pkcs7 - input PKCS7 structure, initialized and set up
  34746. * in - input content to be encoded into PKCS7
  34747. * flags - flags to control behavior of PKCS7 generation
  34748. *
  34749. * Returns 1 on success, 0 or negative on failure
  34750. */
  34751. int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in,
  34752. int flags)
  34753. {
  34754. int i;
  34755. int ret = 1;
  34756. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  34757. byte* p7out = NULL;
  34758. int len = 0;
  34759. char boundary[33]; /* 32 chars + \0 */
  34760. byte* sigBase64 = NULL;
  34761. word32 sigBase64Len = 0;
  34762. const char* p7TypeString = NULL;
  34763. static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  34764. if (out == NULL || p7 == NULL) {
  34765. WOLFSSL_MSG("Bad function arguments");
  34766. return 0;
  34767. }
  34768. if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 ||
  34769. p7->pkcs7.contentCRLF == 0)) {
  34770. /* store and adjust content line endings for CRLF if needed */
  34771. if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) {
  34772. ret = 0;
  34773. }
  34774. }
  34775. if (ret > 0) {
  34776. /* Generate signedData bundle, DER in output (dynamic) */
  34777. if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) {
  34778. WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7");
  34779. ret = 0;
  34780. }
  34781. }
  34782. /* Base64 encode signedData bundle */
  34783. if (ret > 0) {
  34784. if (Base64_Encode(p7out, len, NULL, &sigBase64Len) != LENGTH_ONLY_E) {
  34785. ret = 0;
  34786. }
  34787. else {
  34788. sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL,
  34789. DYNAMIC_TYPE_TMP_BUFFER);
  34790. if (sigBase64 == NULL) {
  34791. ret = 0;
  34792. }
  34793. }
  34794. }
  34795. if (ret > 0) {
  34796. XMEMSET(sigBase64, 0, sigBase64Len);
  34797. if (Base64_Encode(p7out, len, sigBase64, &sigBase64Len) < 0) {
  34798. WOLFSSL_MSG("Error in Base64_Encode of signature");
  34799. ret = 0;
  34800. }
  34801. }
  34802. /* build up SMIME message */
  34803. if (ret > 0) {
  34804. if (flags & PKCS7_DETACHED) {
  34805. /* generate random boundary */
  34806. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  34807. WOLFSSL_MSG("No RNG to use");
  34808. ret = 0;
  34809. }
  34810. /* no need to generate random byte for null terminator (size-1) */
  34811. if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary,
  34812. sizeof(boundary) - 1 ) != 0)) {
  34813. WOLFSSL_MSG("Error in wc_RNG_GenerateBlock");
  34814. ret = 0;
  34815. }
  34816. if (ret > 0) {
  34817. for (i = 0; i < (int)sizeof(boundary) - 1; i++) {
  34818. boundary[i] =
  34819. alphanum[boundary[i] % XSTR_SIZEOF(alphanum)];
  34820. }
  34821. boundary[sizeof(boundary)-1] = 0;
  34822. }
  34823. if (ret > 0) {
  34824. /* S/MIME header beginning */
  34825. ret = wolfSSL_BIO_printf(out,
  34826. "MIME-Version: 1.0\n"
  34827. "Content-Type: multipart/signed; "
  34828. "protocol=\"application/x-pkcs7-signature\"; "
  34829. "micalg=\"%s\"; "
  34830. "boundary=\"----%s\"\n\n"
  34831. "This is an S/MIME signed message\n\n"
  34832. "------%s\n",
  34833. wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID),
  34834. boundary, boundary);
  34835. }
  34836. if (ret > 0) {
  34837. /* S/MIME content */
  34838. ret = wolfSSL_BIO_write(out,
  34839. p7->pkcs7.content, p7->pkcs7.contentSz);
  34840. }
  34841. if (ret > 0) {
  34842. /* S/SMIME header end boundary */
  34843. ret = wolfSSL_BIO_printf(out,
  34844. "\n------%s\n", boundary);
  34845. }
  34846. if (ret > 0) {
  34847. /* Signature and header */
  34848. ret = wolfSSL_BIO_printf(out,
  34849. "Content-Type: application/x-pkcs7-signature; "
  34850. "name=\"smime.p7s\"\n"
  34851. "Content-Transfer-Encoding: base64\n"
  34852. "Content-Disposition: attachment; "
  34853. "filename=\"smime.p7s\"\n\n"
  34854. "%.*s\n" /* Base64 encoded signature */
  34855. "------%s--\n\n",
  34856. sigBase64Len, sigBase64,
  34857. boundary);
  34858. }
  34859. }
  34860. else {
  34861. p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type);
  34862. if (p7TypeString == NULL) {
  34863. WOLFSSL_MSG("Unsupported PKCS7 SMIME type");
  34864. ret = 0;
  34865. }
  34866. if (ret > 0) {
  34867. /* not detached */
  34868. ret = wolfSSL_BIO_printf(out,
  34869. "MIME-Version: 1.0\n"
  34870. "Content-Disposition: attachment; "
  34871. "filename=\"smime.p7m\"\n"
  34872. "Content-Type: application/x-pkcs7-mime; "
  34873. "smime-type=%s; name=\"smime.p7m\"\n"
  34874. "Content-Transfer-Encoding: base64\n\n"
  34875. "%.*s\n" /* signature */,
  34876. p7TypeString, sigBase64Len, sigBase64);
  34877. }
  34878. }
  34879. }
  34880. if (p7out != NULL) {
  34881. XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34882. }
  34883. if (sigBase64 != NULL) {
  34884. XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34885. }
  34886. if (ret > 0) {
  34887. return WOLFSSL_SUCCESS;
  34888. }
  34889. return WOLFSSL_FAILURE;
  34890. }
  34891. #endif /* HAVE_SMIME */
  34892. #endif /* !NO_BIO */
  34893. #endif /* OPENSSL_ALL */
  34894. #endif /* HAVE_PKCS7 */
  34895. /*******************************************************************************
  34896. * END OF PKCS7 APIs
  34897. ******************************************************************************/
  34898. /*******************************************************************************
  34899. * START OF PKCS12 APIs
  34900. ******************************************************************************/
  34901. #ifdef OPENSSL_EXTRA
  34902. /* no-op function. Was initially used for adding encryption algorithms available
  34903. * for PKCS12 */
  34904. void wolfSSL_PKCS12_PBE_add(void)
  34905. {
  34906. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  34907. }
  34908. #if !defined(NO_FILESYSTEM)
  34909. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp,
  34910. WOLFSSL_X509_PKCS12 **pkcs12)
  34911. {
  34912. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  34913. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12,
  34914. PKCS12_TYPE);
  34915. }
  34916. #endif /* !NO_FILESYSTEM */
  34917. #endif /* OPENSSL_EXTRA */
  34918. #if defined(HAVE_PKCS12)
  34919. #ifdef OPENSSL_EXTRA
  34920. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  34921. #ifndef NO_BIO
  34922. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  34923. {
  34924. WC_PKCS12* localPkcs12 = NULL;
  34925. unsigned char* mem = NULL;
  34926. long memSz;
  34927. int ret = -1;
  34928. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  34929. if (bio == NULL) {
  34930. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  34931. return NULL;
  34932. }
  34933. memSz = wolfSSL_BIO_get_len(bio);
  34934. if (memSz <= 0) {
  34935. return NULL;
  34936. }
  34937. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34938. if (mem == NULL) {
  34939. return NULL;
  34940. }
  34941. if (mem != NULL) {
  34942. localPkcs12 = wc_PKCS12_new();
  34943. if (localPkcs12 == NULL) {
  34944. WOLFSSL_MSG("Memory error");
  34945. }
  34946. }
  34947. if (mem != NULL && localPkcs12 != NULL) {
  34948. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  34949. ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12);
  34950. if (ret < 0) {
  34951. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  34952. }
  34953. }
  34954. else {
  34955. WOLFSSL_MSG("Failed to get data from bio struct");
  34956. }
  34957. }
  34958. /* cleanup */
  34959. if (mem != NULL)
  34960. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34961. if (ret < 0 && localPkcs12 != NULL) {
  34962. wc_PKCS12_free(localPkcs12);
  34963. localPkcs12 = NULL;
  34964. }
  34965. if (pkcs12 != NULL)
  34966. *pkcs12 = localPkcs12;
  34967. return localPkcs12;
  34968. }
  34969. /* Converts the PKCS12 to DER format and outputs it into bio.
  34970. *
  34971. * bio is the structure to hold output DER
  34972. * pkcs12 structure to create DER from
  34973. *
  34974. * return 1 for success or 0 if an error occurs
  34975. */
  34976. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  34977. {
  34978. int ret = WOLFSSL_FAILURE;
  34979. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  34980. if ((bio != NULL) && (pkcs12 != NULL)) {
  34981. word32 certSz = 0;
  34982. byte *certDer = NULL;
  34983. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  34984. if ((certSz > 0) && (certDer != NULL)) {
  34985. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  34986. ret = WOLFSSL_SUCCESS;
  34987. }
  34988. }
  34989. if (certDer != NULL) {
  34990. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  34991. }
  34992. }
  34993. return ret;
  34994. }
  34995. #endif /* !NO_BIO */
  34996. /* Creates a new WC_PKCS12 structure
  34997. *
  34998. * pass password to use
  34999. * name friendlyName to use
  35000. * pkey private key to go into PKCS12 bundle
  35001. * cert certificate to go into PKCS12 bundle
  35002. * ca extra certificates that can be added to bundle. Can be NULL
  35003. * keyNID type of encryption to use on the key (-1 means no encryption)
  35004. * certNID type of encryption to use on the certificate
  35005. * itt number of iterations with encryption
  35006. * macItt number of iterations with mac creation
  35007. * keyType flag for signature and/or encryption key
  35008. *
  35009. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  35010. */
  35011. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey,
  35012. WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID,
  35013. int certNID, int itt, int macItt, int keyType)
  35014. {
  35015. WC_PKCS12* pkcs12;
  35016. WC_DerCertList* list = NULL;
  35017. word32 passSz;
  35018. byte* keyDer = NULL;
  35019. word32 keyDerSz;
  35020. byte* certDer;
  35021. int certDerSz;
  35022. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  35023. if (pass == NULL || pkey == NULL || cert == NULL) {
  35024. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  35025. return NULL;
  35026. }
  35027. passSz = (word32)XSTRLEN(pass);
  35028. keyDer = (byte*)pkey->pkey.ptr;
  35029. keyDerSz = pkey->pkey_sz;
  35030. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  35031. if (certDer == NULL) {
  35032. return NULL;
  35033. }
  35034. if (ca != NULL) {
  35035. WC_DerCertList* cur;
  35036. unsigned long numCerts = ca->num;
  35037. byte* curDer;
  35038. int curDerSz = 0;
  35039. WOLFSSL_STACK* sk = ca;
  35040. while (numCerts > 0 && sk != NULL) {
  35041. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  35042. DYNAMIC_TYPE_PKCS);
  35043. if (cur == NULL) {
  35044. wc_FreeCertList(list, NULL);
  35045. return NULL;
  35046. }
  35047. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  35048. if (curDer == NULL || curDerSz < 0) {
  35049. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  35050. wc_FreeCertList(list, NULL);
  35051. return NULL;
  35052. }
  35053. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  35054. if (cur->buffer == NULL) {
  35055. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  35056. wc_FreeCertList(list, NULL);
  35057. return NULL;
  35058. }
  35059. XMEMCPY(cur->buffer, curDer, curDerSz);
  35060. cur->bufferSz = curDerSz;
  35061. cur->next = list;
  35062. list = cur;
  35063. sk = sk->next;
  35064. numCerts--;
  35065. }
  35066. }
  35067. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  35068. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  35069. keyType, NULL);
  35070. if (ca != NULL) {
  35071. wc_FreeCertList(list, NULL);
  35072. }
  35073. return pkcs12;
  35074. }
  35075. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  35076. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  35077. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
  35078. WOLF_STACK_OF(WOLFSSL_X509)** ca)
  35079. {
  35080. void* heap = NULL;
  35081. int ret;
  35082. byte* certData = NULL;
  35083. word32 certDataSz;
  35084. byte* pk = NULL;
  35085. word32 pkSz;
  35086. WC_DerCertList* certList = NULL;
  35087. #ifdef WOLFSSL_SMALL_STACK
  35088. DecodedCert *DeCert;
  35089. #else
  35090. DecodedCert DeCert[1];
  35091. #endif
  35092. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  35093. /* make sure we init return args */
  35094. if (pkey) *pkey = NULL;
  35095. if (cert) *cert = NULL;
  35096. if (ca) *ca = NULL;
  35097. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  35098. WOLFSSL_MSG("Bad argument value");
  35099. return WOLFSSL_FAILURE;
  35100. }
  35101. heap = wc_PKCS12_GetHeap(pkcs12);
  35102. if (ca == NULL) {
  35103. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  35104. NULL);
  35105. }
  35106. else {
  35107. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  35108. &certList);
  35109. }
  35110. if (ret < 0) {
  35111. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  35112. return WOLFSSL_FAILURE;
  35113. }
  35114. #ifdef WOLFSSL_SMALL_STACK
  35115. DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap,
  35116. DYNAMIC_TYPE_DCERT);
  35117. if (DeCert == NULL) {
  35118. WOLFSSL_MSG("out of memory");
  35119. return WOLFSSL_FAILURE;
  35120. }
  35121. #endif
  35122. /* Decode cert and place in X509 stack struct */
  35123. if (certList != NULL) {
  35124. WC_DerCertList* current = certList;
  35125. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(
  35126. sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509);
  35127. if (*ca == NULL) {
  35128. if (pk != NULL) {
  35129. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35130. }
  35131. if (certData != NULL) {
  35132. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  35133. }
  35134. /* Free up WC_DerCertList and move on */
  35135. while (current != NULL) {
  35136. WC_DerCertList* next = current->next;
  35137. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35138. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35139. current = next;
  35140. }
  35141. ret = WOLFSSL_FAILURE;
  35142. goto out;
  35143. }
  35144. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  35145. /* add list of DER certs as X509's to stack */
  35146. while (current != NULL) {
  35147. WC_DerCertList* toFree = current;
  35148. WOLFSSL_X509* x509;
  35149. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  35150. DYNAMIC_TYPE_X509);
  35151. InitX509(x509, 1, heap);
  35152. InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap);
  35153. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  35154. WOLFSSL_MSG("Issue with parsing certificate");
  35155. FreeDecodedCert(DeCert);
  35156. wolfSSL_X509_free(x509);
  35157. }
  35158. else {
  35159. if (CopyDecodedToX509(x509, DeCert) != 0) {
  35160. WOLFSSL_MSG("Failed to copy decoded cert");
  35161. FreeDecodedCert(DeCert);
  35162. wolfSSL_X509_free(x509);
  35163. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35164. if (pk != NULL) {
  35165. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35166. }
  35167. if (certData != NULL) {
  35168. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35169. }
  35170. /* Free up WC_DerCertList */
  35171. while (current != NULL) {
  35172. WC_DerCertList* next = current->next;
  35173. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35174. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35175. current = next;
  35176. }
  35177. ret = WOLFSSL_FAILURE;
  35178. goto out;
  35179. }
  35180. FreeDecodedCert(DeCert);
  35181. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  35182. WOLFSSL_MSG("Failed to push x509 onto stack");
  35183. wolfSSL_X509_free(x509);
  35184. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35185. if (pk != NULL) {
  35186. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35187. }
  35188. if (certData != NULL) {
  35189. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35190. }
  35191. /* Free up WC_DerCertList */
  35192. while (current != NULL) {
  35193. WC_DerCertList* next = current->next;
  35194. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  35195. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  35196. current = next;
  35197. }
  35198. ret = WOLFSSL_FAILURE;
  35199. goto out;
  35200. }
  35201. }
  35202. current = current->next;
  35203. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  35204. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  35205. }
  35206. }
  35207. /* Decode cert and place in X509 struct */
  35208. if (certData != NULL) {
  35209. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  35210. DYNAMIC_TYPE_X509);
  35211. if (*cert == NULL) {
  35212. if (pk != NULL) {
  35213. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35214. }
  35215. if (ca != NULL) {
  35216. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35217. }
  35218. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35219. ret = WOLFSSL_FAILURE;
  35220. goto out;
  35221. }
  35222. InitX509(*cert, 1, heap);
  35223. InitDecodedCert(DeCert, certData, certDataSz, heap);
  35224. if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  35225. WOLFSSL_MSG("Issue with parsing certificate");
  35226. }
  35227. if (CopyDecodedToX509(*cert, DeCert) != 0) {
  35228. WOLFSSL_MSG("Failed to copy decoded cert");
  35229. FreeDecodedCert(DeCert);
  35230. if (pk != NULL) {
  35231. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35232. }
  35233. if (ca != NULL) {
  35234. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35235. }
  35236. wolfSSL_X509_free(*cert); *cert = NULL;
  35237. ret = WOLFSSL_FAILURE;
  35238. goto out;
  35239. }
  35240. FreeDecodedCert(DeCert);
  35241. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  35242. }
  35243. /* get key type */
  35244. ret = BAD_STATE_E;
  35245. if (pk != NULL) { /* decode key if present */
  35246. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  35247. if (*pkey == NULL) {
  35248. wolfSSL_X509_free(*cert); *cert = NULL;
  35249. if (ca != NULL) {
  35250. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35251. }
  35252. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  35253. ret = WOLFSSL_FAILURE;
  35254. goto out;
  35255. }
  35256. #ifndef NO_RSA
  35257. {
  35258. const unsigned char* pt = pk;
  35259. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) !=
  35260. NULL) {
  35261. ret = 0;
  35262. }
  35263. }
  35264. #endif /* NO_RSA */
  35265. #ifdef HAVE_ECC
  35266. if (ret != 0) { /* if is in fail state check if ECC key */
  35267. const unsigned char* pt = pk;
  35268. if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) !=
  35269. NULL) {
  35270. ret = 0;
  35271. }
  35272. }
  35273. #endif /* HAVE_ECC */
  35274. if (pk != NULL)
  35275. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  35276. if (ret != 0) { /* if is in fail state and no PKEY then fail */
  35277. wolfSSL_X509_free(*cert); *cert = NULL;
  35278. if (ca != NULL) {
  35279. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  35280. }
  35281. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  35282. WOLFSSL_MSG("Bad PKCS12 key format");
  35283. ret = WOLFSSL_FAILURE;
  35284. goto out;
  35285. }
  35286. if (pkey != NULL && *pkey != NULL) {
  35287. (*pkey)->save_type = 0;
  35288. }
  35289. }
  35290. (void)ret;
  35291. (void)ca;
  35292. ret = WOLFSSL_SUCCESS;
  35293. out:
  35294. #ifdef WOLFSSL_SMALL_STACK
  35295. XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT);
  35296. #endif
  35297. return ret;
  35298. }
  35299. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  35300. int pswLen)
  35301. {
  35302. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  35303. if (!pkcs12) {
  35304. return WOLFSSL_FAILURE;
  35305. }
  35306. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  35307. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  35308. }
  35309. #endif /* !NO_ASN && !NO_PWDBASED */
  35310. #endif /* OPENSSL_EXTRA */
  35311. #endif /* HAVE_PKCS12 */
  35312. /*******************************************************************************
  35313. * END OF PKCS12 APIs
  35314. ******************************************************************************/
  35315. #endif /* !NO_CERTS */
  35316. /*******************************************************************************
  35317. * BEGIN OPENSSL FIPS DRBG APIs
  35318. ******************************************************************************/
  35319. #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG)
  35320. int wolfSSL_FIPS_drbg_init(WOLFSSL_DRBG_CTX *ctx, int type, unsigned int flags)
  35321. {
  35322. int ret = WOLFSSL_FAILURE;
  35323. if (ctx != NULL) {
  35324. XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX));
  35325. ctx->type = type;
  35326. ctx->xflags = flags;
  35327. ctx->status = DRBG_STATUS_UNINITIALISED;
  35328. ret = WOLFSSL_SUCCESS;
  35329. }
  35330. return ret;
  35331. }
  35332. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_drbg_new(int type, unsigned int flags)
  35333. {
  35334. int ret = WOLFSSL_FAILURE;
  35335. WOLFSSL_DRBG_CTX* ctx = (WOLFSSL_DRBG_CTX*)XMALLOC(sizeof(WOLFSSL_DRBG_CTX),
  35336. NULL, DYNAMIC_TYPE_OPENSSL);
  35337. ret = wolfSSL_FIPS_drbg_init(ctx, type, flags);
  35338. if (ret == WOLFSSL_SUCCESS && type != 0) {
  35339. ret = wolfSSL_FIPS_drbg_instantiate(ctx, NULL, 0);
  35340. }
  35341. if (ret != WOLFSSL_SUCCESS) {
  35342. WOLFSSL_ERROR(ret);
  35343. wolfSSL_FIPS_drbg_free(ctx);
  35344. ctx = NULL;
  35345. }
  35346. return ctx;
  35347. }
  35348. int wolfSSL_FIPS_drbg_instantiate(WOLFSSL_DRBG_CTX* ctx,
  35349. const unsigned char* pers, size_t perslen)
  35350. {
  35351. int ret = WOLFSSL_FAILURE;
  35352. if (ctx != NULL && ctx->rng == NULL) {
  35353. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35354. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  35355. ctx->rng = wc_rng_new((byte*)pers, (word32)perslen, NULL);
  35356. #else
  35357. ctx->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35358. if (ctx->rng != NULL) {
  35359. #if defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)
  35360. ret = wc_InitRngNonce(ctx->rng, (byte*)pers, (word32)perslen);
  35361. #else
  35362. ret = wc_InitRng(ctx->rng);
  35363. (void)pers;
  35364. (void)perslen;
  35365. #endif
  35366. if (ret != 0) {
  35367. WOLFSSL_ERROR(ret);
  35368. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  35369. ctx->rng = NULL;
  35370. }
  35371. }
  35372. #endif
  35373. }
  35374. if (ctx != NULL && ctx->rng != NULL) {
  35375. ctx->status = DRBG_STATUS_READY;
  35376. ret = WOLFSSL_SUCCESS;
  35377. }
  35378. return ret;
  35379. }
  35380. int wolfSSL_FIPS_drbg_set_callbacks(WOLFSSL_DRBG_CTX* ctx,
  35381. drbg_entropy_get entropy_get, drbg_entropy_clean entropy_clean,
  35382. size_t entropy_blocklen,
  35383. drbg_nonce_get none_get, drbg_nonce_clean nonce_clean)
  35384. {
  35385. int ret = WOLFSSL_FAILURE;
  35386. if (ctx != NULL) {
  35387. ctx->entropy_get = entropy_get;
  35388. ctx->entropy_clean = entropy_clean;
  35389. ctx->entropy_blocklen = entropy_blocklen;
  35390. ctx->none_get = none_get;
  35391. ctx->nonce_clean = nonce_clean;
  35392. ret = WOLFSSL_SUCCESS;
  35393. }
  35394. return ret;
  35395. }
  35396. void wolfSSL_FIPS_rand_add(const void* buf, int num, double entropy)
  35397. {
  35398. /* not implemented */
  35399. (void)buf;
  35400. (void)num;
  35401. (void)entropy;
  35402. }
  35403. int wolfSSL_FIPS_drbg_reseed(WOLFSSL_DRBG_CTX* ctx, const unsigned char* adin,
  35404. size_t adinlen)
  35405. {
  35406. int ret = WOLFSSL_FAILURE;
  35407. if (ctx != NULL && ctx->rng != NULL) {
  35408. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35409. (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)))
  35410. if (wc_RNG_DRBG_Reseed(ctx->rng, adin, (word32)adinlen) == 0) {
  35411. ret = WOLFSSL_SUCCESS;
  35412. }
  35413. #else
  35414. ret = WOLFSSL_SUCCESS;
  35415. (void)adin;
  35416. (void)adinlen;
  35417. #endif
  35418. }
  35419. return ret;
  35420. }
  35421. int wolfSSL_FIPS_drbg_generate(WOLFSSL_DRBG_CTX* ctx, unsigned char* out,
  35422. size_t outlen, int prediction_resistance, const unsigned char* adin,
  35423. size_t adinlen)
  35424. {
  35425. int ret = WOLFSSL_FAILURE;
  35426. if (ctx != NULL && ctx->rng != NULL) {
  35427. ret = wc_RNG_GenerateBlock(ctx->rng, out, (word32)outlen);
  35428. if (ret == 0) {
  35429. ret = WOLFSSL_SUCCESS;
  35430. }
  35431. }
  35432. (void)prediction_resistance;
  35433. (void)adin;
  35434. (void)adinlen;
  35435. return ret;
  35436. }
  35437. int wolfSSL_FIPS_drbg_uninstantiate(WOLFSSL_DRBG_CTX *ctx)
  35438. {
  35439. if (ctx != NULL && ctx->rng != NULL) {
  35440. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  35441. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  35442. wc_rng_free(ctx->rng);
  35443. #else
  35444. wc_FreeRng(ctx->rng);
  35445. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  35446. #endif
  35447. ctx->rng = NULL;
  35448. ctx->status = DRBG_STATUS_UNINITIALISED;
  35449. }
  35450. return WOLFSSL_SUCCESS;
  35451. }
  35452. void wolfSSL_FIPS_drbg_free(WOLFSSL_DRBG_CTX *ctx)
  35453. {
  35454. if (ctx != NULL) {
  35455. /* As saftey check if free'ing the default drbg, then mark global NULL.
  35456. * Technically the user should not call free on the default drbg. */
  35457. if (ctx == gDrbgDefCtx) {
  35458. gDrbgDefCtx = NULL;
  35459. }
  35460. wolfSSL_FIPS_drbg_uninstantiate(ctx);
  35461. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  35462. }
  35463. }
  35464. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_get_default_drbg(void)
  35465. {
  35466. if (gDrbgDefCtx == NULL) {
  35467. gDrbgDefCtx = wolfSSL_FIPS_drbg_new(0, 0);
  35468. }
  35469. return gDrbgDefCtx;
  35470. }
  35471. void wolfSSL_FIPS_get_timevec(unsigned char* buf, unsigned long* pctr)
  35472. {
  35473. /* not implemented */
  35474. (void)buf;
  35475. (void)pctr;
  35476. }
  35477. void* wolfSSL_FIPS_drbg_get_app_data(WOLFSSL_DRBG_CTX *ctx)
  35478. {
  35479. if (ctx != NULL) {
  35480. return ctx->app_data;
  35481. }
  35482. return NULL;
  35483. }
  35484. void wolfSSL_FIPS_drbg_set_app_data(WOLFSSL_DRBG_CTX *ctx, void *app_data)
  35485. {
  35486. if (ctx != NULL) {
  35487. ctx->app_data = app_data;
  35488. }
  35489. }
  35490. #endif
  35491. /*******************************************************************************
  35492. * END OF OPENSSL FIPS DRBG APIs
  35493. ******************************************************************************/
  35494. #endif /* !WOLFCRYPT_ONLY */
  35495. /*******************************************************************************
  35496. * START OF CRYPTO-ONLY APIs
  35497. ******************************************************************************/
  35498. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  35499. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  35500. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  35501. defined(WOLFSSL_HAPROXY)
  35502. #ifndef NO_SHA
  35503. /* One shot SHA1 hash of message.
  35504. *
  35505. * d message to hash
  35506. * n size of d buffer
  35507. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  35508. *
  35509. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  35510. * When the static buffer is used this function is not thread safe.
  35511. *
  35512. * Returns a pointer to the message digest on success and NULL on failure.
  35513. */
  35514. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  35515. unsigned char *md)
  35516. {
  35517. static byte dig[WC_SHA_DIGEST_SIZE];
  35518. byte* ret = md;
  35519. wc_Sha sha;
  35520. WOLFSSL_ENTER("wolfSSL_SHA1");
  35521. if (wc_InitSha_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35522. WOLFSSL_MSG("SHA1 Init failed");
  35523. return NULL;
  35524. }
  35525. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  35526. WOLFSSL_MSG("SHA1 Update failed");
  35527. return NULL;
  35528. }
  35529. if (md == NULL) {
  35530. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
  35531. "THREAD SAFE WHEN md == NULL");
  35532. ret = dig;
  35533. }
  35534. if (wc_ShaFinal(&sha, ret) != 0) {
  35535. WOLFSSL_MSG("SHA1 Final failed");
  35536. wc_ShaFree(&sha);
  35537. return NULL;
  35538. }
  35539. wc_ShaFree(&sha);
  35540. return ret;
  35541. }
  35542. #endif /* ! NO_SHA */
  35543. #ifdef WOLFSSL_SHA224
  35544. /* One shot SHA224 hash of message.
  35545. *
  35546. * d message to hash
  35547. * n size of d buffer
  35548. * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE.
  35549. *
  35550. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  35551. * When the static buffer is used this function is not thread safe.
  35552. *
  35553. * Returns a pointer to the message digest on success and NULL on failure.
  35554. */
  35555. unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n,
  35556. unsigned char *md)
  35557. {
  35558. static byte dig[WC_SHA224_DIGEST_SIZE];
  35559. byte* ret = md;
  35560. wc_Sha256 sha;
  35561. WOLFSSL_ENTER("wolfSSL_SHA224");
  35562. if (wc_InitSha224_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35563. WOLFSSL_MSG("SHA224 Init failed");
  35564. return NULL;
  35565. }
  35566. if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) {
  35567. WOLFSSL_MSG("SHA224 Update failed");
  35568. return NULL;
  35569. }
  35570. if (md == NULL) {
  35571. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT "
  35572. "THREAD SAFE WHEN md == NULL");
  35573. ret = dig;
  35574. }
  35575. if (wc_Sha224Final(&sha, ret) != 0) {
  35576. WOLFSSL_MSG("SHA224 Final failed");
  35577. wc_Sha224Free(&sha);
  35578. return NULL;
  35579. }
  35580. wc_Sha224Free(&sha);
  35581. return ret;
  35582. }
  35583. #endif
  35584. #ifndef NO_SHA256
  35585. /* One shot SHA256 hash of message.
  35586. *
  35587. * d message to hash
  35588. * n size of d buffer
  35589. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  35590. *
  35591. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  35592. * When the static buffer is used this function is not thread safe.
  35593. *
  35594. * Returns a pointer to the message digest on success and NULL on failure.
  35595. */
  35596. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  35597. unsigned char *md)
  35598. {
  35599. static byte dig[WC_SHA256_DIGEST_SIZE];
  35600. byte* ret = md;
  35601. wc_Sha256 sha;
  35602. WOLFSSL_ENTER("wolfSSL_SHA256");
  35603. if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35604. WOLFSSL_MSG("SHA256 Init failed");
  35605. return NULL;
  35606. }
  35607. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  35608. WOLFSSL_MSG("SHA256 Update failed");
  35609. return NULL;
  35610. }
  35611. if (md == NULL) {
  35612. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
  35613. "THREAD SAFE WHEN md == NULL");
  35614. ret = dig;
  35615. }
  35616. if (wc_Sha256Final(&sha, ret) != 0) {
  35617. WOLFSSL_MSG("SHA256 Final failed");
  35618. wc_Sha256Free(&sha);
  35619. return NULL;
  35620. }
  35621. wc_Sha256Free(&sha);
  35622. return ret;
  35623. }
  35624. #endif /* ! NO_SHA256 */
  35625. #ifdef WOLFSSL_SHA384
  35626. /* One shot SHA384 hash of message.
  35627. *
  35628. * d message to hash
  35629. * n size of d buffer
  35630. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  35631. *
  35632. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  35633. * When the static buffer is used this function is not thread safe.
  35634. *
  35635. * Returns a pointer to the message digest on success and NULL on failure.
  35636. */
  35637. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  35638. unsigned char *md)
  35639. {
  35640. static byte dig[WC_SHA384_DIGEST_SIZE];
  35641. byte* ret = md;
  35642. wc_Sha384 sha;
  35643. WOLFSSL_ENTER("wolfSSL_SHA384");
  35644. if (wc_InitSha384_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35645. WOLFSSL_MSG("SHA384 Init failed");
  35646. return NULL;
  35647. }
  35648. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  35649. WOLFSSL_MSG("SHA384 Update failed");
  35650. return NULL;
  35651. }
  35652. if (md == NULL) {
  35653. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
  35654. "THREAD SAFE WHEN md == NULL");
  35655. ret = dig;
  35656. }
  35657. if (wc_Sha384Final(&sha, ret) != 0) {
  35658. WOLFSSL_MSG("SHA384 Final failed");
  35659. wc_Sha384Free(&sha);
  35660. return NULL;
  35661. }
  35662. wc_Sha384Free(&sha);
  35663. return ret;
  35664. }
  35665. #endif /* WOLFSSL_SHA384 */
  35666. #if defined(WOLFSSL_SHA512)
  35667. /* One shot SHA512 hash of message.
  35668. *
  35669. * d message to hash
  35670. * n size of d buffer
  35671. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  35672. *
  35673. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  35674. * When the static buffer is used this function is not thread safe.
  35675. *
  35676. * Returns a pointer to the message digest on success and NULL on failure.
  35677. */
  35678. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  35679. unsigned char *md)
  35680. {
  35681. static byte dig[WC_SHA512_DIGEST_SIZE];
  35682. byte* ret = md;
  35683. wc_Sha512 sha;
  35684. WOLFSSL_ENTER("wolfSSL_SHA512");
  35685. if (wc_InitSha512_ex(&sha, NULL, INVALID_DEVID) != 0) {
  35686. WOLFSSL_MSG("SHA512 Init failed");
  35687. return NULL;
  35688. }
  35689. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  35690. WOLFSSL_MSG("SHA512 Update failed");
  35691. return NULL;
  35692. }
  35693. if (md == NULL) {
  35694. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
  35695. "THREAD SAFE WHEN md == NULL");
  35696. ret = dig;
  35697. }
  35698. if (wc_Sha512Final(&sha, ret) != 0) {
  35699. WOLFSSL_MSG("SHA512 Final failed");
  35700. wc_Sha512Free(&sha);
  35701. return NULL;
  35702. }
  35703. wc_Sha512Free(&sha);
  35704. return ret;
  35705. }
  35706. #endif /* WOLFSSL_SHA512 */
  35707. #endif /* OPENSSL_EXTRA || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  35708. * HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  35709. /*******************************************************************************
  35710. * END OF CRYPTO-ONLY APIs
  35711. ******************************************************************************/